on master help sign in
gh-pages: updated
commite77ac05b7653d1f1f9615c68249d0a131a06392c authorMarkus Heiser <markus.heiser@darmarit.de> dateFri 19 Jun 2020, 11:15 (6 years ago) parent925d1a4
88 files changed+7773−1820
_downloads/ad0ebe55d6b53b1559e0ca8dee6f30b9/reST.rst+5−5 _images/DOT-57a4a7f78690d0b6b884bc59f36e84cfb0b61f76.svg+8−8 _images/arch_public.dot+4−4 _images/arch_public.svg+58−58 _images/hello.svg+7−7 _images/math/07c9ff4251510b06013159f4e45ec9ab97044096.svg+25 _images/math/3b8127a8eed95247f9249ea6c85e8e86df1baa82.svg+25 _images/math/6673b43f9fe29455c1fcd1164e5844698cc64d38.svg+22 _images/math/a6a994cb6e7278ec30eaebe7e636046d3deccb5b.svg+43 _sources/admin/architecture.rst.txt+9−5 _sources/admin/buildhosts.rst.txt+63−11 _sources/admin/engines.rst.txt+4 _sources/admin/filtron.rst.txt+145−102 _sources/admin/index.rst.txt+8−1 _sources/admin/installation-apache.rst.txt+514 _sources/admin/installation-docker.rst.txt+28 _sources/admin/installation-nginx.rst.txt+381 _sources/admin/installation-searx.rst.txt+92 _sources/admin/installation-uwsgi.rst.txt+149 _sources/admin/installation.rst.txt+37−320 _sources/admin/morty.rst.txt+7 _sources/admin/settings.rst.txt+11−2 _sources/admin/update-searx.rst.txt+23 _sources/blog/index.rst.txt+2−1 _sources/dev/contribution_guide.rst.txt+5 _sources/dev/engine_overview.rst.txt+1 _sources/dev/index.rst.txt+2−1 _sources/dev/makefile.rst.txt+24−24 _sources/dev/quickstart.rst.txt+5−5 _sources/dev/reST.rst.txt+5−5 _sources/index.rst.txt+10−8 _sources/user/index.rst.txt+2−1 _sources/user/own-instance.rst.txt+4−2 _sources/user/public_instances.rst.txt−3 _sources/utils/filtron.sh.rst.txt+80 _sources/utils/index.rst.txt+53 _sources/utils/lxc.sh.rst.txt+148 _sources/utils/morty.sh.rst.txt+80 _sources/utils/searx.sh.rst.txt+39 _static/basic.css+94−27 _static/documentation_options.js+1 _static/jquery-3.4.1.js → _static/jquery-3.5.1.js+756−482 _static/jquery.js+2−2 _static/searchtools.js+4−1 _static/searx.css+40−1 admin/api.html+6−3 admin/architecture.html+16−8 admin/buildhosts.html+158−13 admin/engines.html+299−90 admin/filtron.html+144−103 admin/index.html+63−8 admin/installation-apache.html+651 user/public_instances.html → admin/installation-docker.html+39−6 admin/installation-nginx.html+508 admin/installation-searx.html+367 admin/installation-uwsgi.html+517 admin/installation.html+42−289 admin/morty.html+13−4 admin/plugins.html+6−7 admin/settings.html+23−10 admin/update-searx.html+137 blog/admin.html+6−3 blog/index.html+34−10 blog/intro-offline.html+6−3 blog/private-engines.html+6−3 blog/python3.html+6−3 dev/contribution_guide.html+31−10 dev/engine_overview.html+10−3 dev/index.html+72−11 dev/makefile.html+66−38 dev/plugins.html+6−3 dev/quickstart.html+11−8 dev/reST.html+39−58 dev/search_api.html+6−3 dev/translation.html+6−3 genindex.html+6−4 index.html+30−9 objects.inv search.html+8−7 searchindex.js+1−1 user/index.html+16−5 user/own-instance.html+11−5 user/search_syntax.html+6−3 utils/filtron.sh.html+304 utils/index.html+220 utils/lxc.sh.html+364 utils/morty.sh.html+308 utils/searx.sh.html+180
_downloads/ad0ebe55d6b53b1559e0ca8dee6f30b9/reST.rst+5−5
@@ -325,8 +325,9 @@ Literal blocks
325325
326326The simplest form of :duref:`literal-blocks` is a indented block introduced by
327327two colons (``::``). For highlighting use :dudir:`highlight` or :ref:`reST
328−code` directive. To include literals from external files use directive
329−:dudir:`literalinclude`.
328+code` directive. To include literals from external files use
329+:rst:dir:`literalinclude` or :ref:`kernel-include <kernel-include-directive>`
330+directive (latter one expands environment variables in the path name).
330331
331332.. _reST literal:
332333
@@ -1312,9 +1313,8 @@ others are basic-tabs_ and code-tabs_. Below a *group-tab* example from
13121313
13131314.. literalinclude:: ../admin/buildhosts.rst
13141315 :language: reST
1315− :start-after: .. _system requirements:
1316− :end-before: .. _system requirements END:
1317−
1316+ :start-after: .. SNIP sh lint requirements
1317+ :end-before: .. SNAP sh lint requirements
13181318
13191319.. _math:
13201320
_images/DOT-57a4a7f78690d0b6b884bc59f36e84cfb0b61f76.svg+8−8
@@ -1,31 +1,31 @@
11<?xml version="1.0" encoding="UTF-8" standalone="no"?>
22<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
33 "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
4−<!-- Generated by graphviz version 2.43.0 (0)
4+<!-- Generated by graphviz version 2.40.1 (20161225.0304)
55 -->
66<!-- Title: foo Pages: 1 -->
77<svg width="62pt" height="116pt"
88 viewBox="0.00 0.00 62.00 116.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
99<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 112)">
1010<title>foo</title>
11−<polygon fill="white" stroke="transparent" points="-4,4 -4,-112 58,-112 58,4 -4,4"/>
11+<polygon fill="#ffffff" stroke="transparent" points="-4,4 -4,-112 58,-112 58,4 -4,4"/>
1212<!-- bar -->
1313<g id="node1" class="node">
1414<title>bar</title>
15−<ellipse fill="none" stroke="black" cx="27" cy="-90" rx="27" ry="18"/>
16−<text text-anchor="middle" x="27" y="-86.3" font-family="Times,serif" font-size="14.00">bar</text>
15+<ellipse fill="none" stroke="#000000" cx="27" cy="-90" rx="27" ry="18"/>
16+<text text-anchor="middle" x="27" y="-86.3" font-family="Times,serif" font-size="14.00" fill="#000000">bar</text>
1717</g>
1818<!-- baz -->
1919<g id="node2" class="node">
2020<title>baz</title>
21−<ellipse fill="none" stroke="black" cx="27" cy="-18" rx="27" ry="18"/>
22−<text text-anchor="middle" x="27" y="-14.3" font-family="Times,serif" font-size="14.00">baz</text>
21+<ellipse fill="none" stroke="#000000" cx="27" cy="-18" rx="27" ry="18"/>
22+<text text-anchor="middle" x="27" y="-14.3" font-family="Times,serif" font-size="14.00" fill="#000000">baz</text>
2323</g>
2424<!-- bar&#45;&gt;baz -->
2525<g id="edge1" class="edge">
2626<title>bar&#45;&gt;baz</title>
27−<path fill="none" stroke="black" d="M27,-71.7C27,-63.98 27,-54.71 27,-46.11"/>
28−<polygon fill="black" stroke="black" points="30.5,-46.1 27,-36.1 23.5,-46.1 30.5,-46.1"/>
27+<path fill="none" stroke="#000000" d="M27,-71.8314C27,-64.131 27,-54.9743 27,-46.4166"/>
28+<polygon fill="#000000" stroke="#000000" points="30.5001,-46.4132 27,-36.4133 23.5001,-46.4133 30.5001,-46.4132"/>
2929</g>
3030</g>
3131</svg>
_images/arch_public.dot+4−4
@@ -4,11 +4,11 @@ digraph G {
44 edge [fontname="Sans"];
55
66 browser [label="Browser", shape=Mdiamond];
7− rp [label="Reverse Proxy", href="url to configure reverse proxy"];
8− filtron [label="Filtron", href="https://github.com/asciimoo/filtron"];
9− morty [label="Morty", href="https://github.com/asciimoo/morty"];
7+ rp [label="Reverse Proxy", href="https://asciimoo.github.io/searx/utils/filtron.sh.html#public-reverse-proxy"];
8+ filtron [label="Filtron", href="https://asciimoo.github.io/searx/utils/filtron.sh.html"];
9+ morty [label="Morty", href="https://asciimoo.github.io/searx/utils/morty.sh.html"];
1010 static [label="Static files", href="url to configure static files"];
11− uwsgi [label="uwsgi", href="url to configure uwsgi"]
11+ uwsgi [label="uwsgi", href="https://asciimoo.github.io/searx/utils/searx.sh.html"]
1212 searx1 [label="Searx #1"];
1313 searx2 [label="Searx #2"];
1414 searx3 [label="Searx #3"];
_images/arch_public.svg+58−58
@@ -1,156 +1,156 @@
11<?xml version="1.0" encoding="UTF-8" standalone="no"?>
22<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
33 "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
4−<!-- Generated by graphviz version 2.43.0 (0)
4+<!-- Generated by graphviz version 2.40.1 (20161225.0304)
55 -->
66<!-- Title: G Pages: 1 -->
7−<svg width="618pt" height="415pt"
8− viewBox="0.00 0.00 618.00 415.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
9−<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 411)">
7+<svg width="618pt" height="529pt"
8+ viewBox="0.00 0.00 618.00 529.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
9+<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 525)">
1010<title>G</title>
11−<polygon fill="white" stroke="transparent" points="-4,4 -4,-411 614,-411 614,4 -4,4"/>
11+<polygon fill="#ffffff" stroke="transparent" points="-4,4 -4,-525 614,-525 614,4 -4,4"/>
1212<g id="clust1" class="cluster">
1313<title>cluster_searx</title>
14−<polygon fill="#fafafa" stroke="black" points="8,-8 8,-330 602,-330 602,-8 8,-8"/>
15−<text text-anchor="middle" x="305" y="-314.8" font-family="Sans" font-size="14.00">Searx instance</text>
14+<polygon fill="#fafafa" stroke="#000000" points="8,-8 8,-444 602,-444 602,-8 8,-8"/>
15+<text text-anchor="middle" x="305" y="-428.8" font-family="Sans" font-size="14.00" fill="#000000">Searx instance</text>
1616</g>
1717<!-- browser -->
1818<g id="node1" class="node">
1919<title>browser</title>
20−<polygon fill="#ffffcc" stroke="black" points="75,-407 5.29,-389 75,-371 144.71,-389 75,-407"/>
21−<polyline fill="none" stroke="black" points="16.91,-392 16.91,-386 "/>
22−<polyline fill="none" stroke="black" points="63.38,-374 86.62,-374 "/>
23−<polyline fill="none" stroke="black" points="133.09,-386 133.09,-392 "/>
24−<polyline fill="none" stroke="black" points="86.62,-404 63.38,-404 "/>
25−<text text-anchor="middle" x="75" y="-385.3" font-family="Sans" font-size="14.00">Browser</text>
20+<polygon fill="#ffffcc" stroke="#000000" points="75,-521 5.2878,-503 75,-485 144.7122,-503 75,-521"/>
21+<polyline fill="none" stroke="#000000" points="16.9067,-506.0001 16.9067,-499.9999 "/>
22+<polyline fill="none" stroke="#000000" points="63.3811,-488.0001 86.6189,-488.0001 "/>
23+<polyline fill="none" stroke="#000000" points="133.0933,-499.9999 133.0933,-506.0001 "/>
24+<polyline fill="none" stroke="#000000" points="86.6189,-517.9999 63.3811,-517.9999 "/>
25+<text text-anchor="middle" x="75" y="-499.3" font-family="Sans" font-size="14.00" fill="#000000">Browser</text>
2626</g>
2727<!-- rp -->
2828<g id="node2" class="node">
2929<title>rp</title>
30−<g id="a_node2"><a xlink:href="url to configure reverse proxy" xlink:title="Reverse Proxy">
31−<polygon fill="#ffffcc" stroke="black" points="134,-299 16,-299 16,-263 134,-263 134,-299"/>
32−<text text-anchor="middle" x="75" y="-277.3" font-family="Sans" font-size="14.00">Reverse Proxy</text>
30+<g id="a_node2"><a xlink:href="https://asciimoo.github.io/searx/utils/filtron.sh.html#public-reverse-proxy" xlink:title="Reverse Proxy">
31+<polygon fill="#ffffcc" stroke="#000000" points="134,-413 16,-413 16,-377 134,-377 134,-413"/>
32+<text text-anchor="middle" x="75" y="-391.3" font-family="Sans" font-size="14.00" fill="#000000">Reverse Proxy</text>
3333</a>
3434</g>
3535</g>
3636<!-- browser&#45;&gt;rp -->
3737<g id="edge1" class="edge">
3838<title>browser&#45;&gt;rp</title>
39−<path fill="none" stroke="black" d="M75,-370.97C75,-354.38 75,-328.88 75,-309.43"/>
40−<polygon fill="black" stroke="black" points="78.5,-309.34 75,-299.34 71.5,-309.34 78.5,-309.34"/>
41−<text text-anchor="middle" x="98" y="-341.8" font-family="Sans" font-size="14.00">HTTPS</text>
39+<path fill="none" stroke="#000000" d="M75,-484.6793C75,-467.821 75,-442.5651 75,-423.147"/>
40+<polygon fill="#000000" stroke="#000000" points="78.5001,-423.0501 75,-413.0502 71.5001,-423.0502 78.5001,-423.0501"/>
41+<text text-anchor="middle" x="98" y="-455.8" font-family="Sans" font-size="14.00" fill="#000000">HTTPS</text>
4242</g>
4343<!-- filtron -->
4444<g id="node3" class="node">
4545<title>filtron</title>
46−<g id="a_node3"><a xlink:href="https://github.com/asciimoo/filtron" xlink:title="Filtron">
47−<polygon fill="#ffffcc" stroke="black" points="105.5,-212 44.5,-212 44.5,-176 105.5,-176 105.5,-212"/>
48−<text text-anchor="middle" x="75" y="-190.3" font-family="Sans" font-size="14.00">Filtron</text>
46+<g id="a_node3"><a xlink:href="https://asciimoo.github.io/searx/utils/filtron.sh.html" xlink:title="Filtron">
47+<polygon fill="#ffffcc" stroke="#000000" points="105.5,-288 44.5,-288 44.5,-252 105.5,-252 105.5,-288"/>
48+<text text-anchor="middle" x="75" y="-266.3" font-family="Sans" font-size="14.00" fill="#000000">Filtron</text>
4949</a>
5050</g>
5151</g>
5252<!-- rp&#45;&gt;filtron -->
5353<g id="edge4" class="edge">
5454<title>rp&#45;&gt;filtron</title>
55−<path fill="none" stroke="black" d="M75,-262.8C75,-251.16 75,-235.55 75,-222.24"/>
56−<polygon fill="black" stroke="black" points="78.5,-222.18 75,-212.18 71.5,-222.18 78.5,-222.18"/>
57−<text text-anchor="middle" x="93.5" y="-233.8" font-family="Sans" font-size="14.00">HTTP</text>
55+<path fill="none" stroke="#000000" d="M75,-376.8239C75,-356.2723 75,-322.5472 75,-298.4893"/>
56+<polygon fill="#000000" stroke="#000000" points="78.5001,-298.198 75,-288.198 71.5001,-298.198 78.5001,-298.198"/>
57+<text text-anchor="middle" x="93.5" y="-328.8" font-family="Sans" font-size="14.00" fill="#000000">HTTP</text>
5858</g>
5959<!-- morty -->
6060<g id="node4" class="node">
6161<title>morty</title>
62−<g id="a_node4"><a xlink:href="https://github.com/asciimoo/morty" xlink:title="Morty">
63−<polygon fill="#ffffcc" stroke="black" points="180.5,-212 123.5,-212 123.5,-176 180.5,-176 180.5,-212"/>
64−<text text-anchor="middle" x="152" y="-190.3" font-family="Sans" font-size="14.00">Morty</text>
62+<g id="a_node4"><a xlink:href="https://asciimoo.github.io/searx/utils/morty.sh.html" xlink:title="Morty">
63+<polygon fill="#ffffcc" stroke="#000000" points="180.5,-288 123.5,-288 123.5,-252 180.5,-252 180.5,-288"/>
64+<text text-anchor="middle" x="152" y="-266.3" font-family="Sans" font-size="14.00" fill="#000000">Morty</text>
6565</a>
6666</g>
6767</g>
6868<!-- rp&#45;&gt;morty -->
6969<g id="edge2" class="edge">
7070<title>rp&#45;&gt;morty</title>
71−<path fill="none" stroke="black" d="M97.16,-262.75C103.53,-257.36 110.29,-251.2 116,-245 122.81,-237.6 129.47,-228.9 135.18,-220.84"/>
72−<polygon fill="black" stroke="black" points="138.17,-222.67 140.96,-212.45 132.4,-218.7 138.17,-222.67"/>
73−<text text-anchor="middle" x="271" y="-233.8" font-family="Sans" font-size="14.00">optional: images and HTML pages proxy</text>
71+<path fill="none" stroke="#000000" d="M89.8355,-376.705C98.0006,-366.2543 108.0569,-352.7317 116,-340 124.4983,-326.3785 132.7784,-310.5167 139.2508,-297.3397"/>
72+<polygon fill="#000000" stroke="#000000" points="142.4243,-298.8167 143.6215,-288.2897 136.1209,-295.7724 142.4243,-298.8167"/>
73+<text text-anchor="middle" x="268" y="-328.8" font-family="Sans" font-size="14.00" fill="#000000">optional: images and HTML pages proxy</text>
7474</g>
7575<!-- static -->
7676<g id="node5" class="node">
7777<title>static</title>
7878<g id="a_node5"><a xlink:href="url to configure static files" xlink:title="Static files">
79−<polygon fill="#ffffcc" stroke="black" points="594,-299 504,-299 504,-263 594,-263 594,-299"/>
80−<text text-anchor="middle" x="549" y="-277.3" font-family="Sans" font-size="14.00">Static files</text>
79+<polygon fill="#ffffcc" stroke="#000000" points="594,-413 504,-413 504,-377 594,-377 594,-413"/>
80+<text text-anchor="middle" x="549" y="-391.3" font-family="Sans" font-size="14.00" fill="#000000">Static files</text>
8181</a>
8282</g>
8383</g>
8484<!-- rp&#45;&gt;static -->
8585<g id="edge3" class="edge">
8686<title>rp&#45;&gt;static</title>
87−<path fill="none" stroke="black" d="M134.07,-281C226.43,-281 403.75,-281 493.72,-281"/>
88−<polygon fill="black" stroke="black" points="493.72,-284.5 503.72,-281 493.72,-277.5 493.72,-284.5"/>
89−<text text-anchor="middle" x="319" y="-287.8" font-family="Sans" font-size="14.00">optional: reverse proxy serves directly static files</text>
87+<path fill="none" stroke="#000000" d="M134.074,-395C226.433,-395 403.7479,-395 493.718,-395"/>
88+<polygon fill="#000000" stroke="#000000" points="493.7212,-398.5001 503.7212,-395 493.7211,-391.5001 493.7212,-398.5001"/>
89+<text text-anchor="middle" x="319" y="-401.8" font-family="Sans" font-size="14.00" fill="#000000">optional: reverse proxy serves directly static files</text>
9090</g>
9191<!-- uwsgi -->
9292<g id="node6" class="node">
9393<title>uwsgi</title>
94−<g id="a_node6"><a xlink:href="url to configure uwsgi" xlink:title="uwsgi">
95−<polygon fill="#ffffcc" stroke="black" points="188,-125 130,-125 130,-89 188,-89 188,-125"/>
96−<text text-anchor="middle" x="159" y="-103.3" font-family="Sans" font-size="14.00">uwsgi</text>
94+<g id="a_node6"><a xlink:href="https://asciimoo.github.io/searx/utils/searx.sh.html" xlink:title="uwsgi">
95+<polygon fill="#ffffcc" stroke="#000000" points="188,-163 130,-163 130,-127 188,-127 188,-163"/>
96+<text text-anchor="middle" x="159" y="-141.3" font-family="Sans" font-size="14.00" fill="#000000">uwsgi</text>
9797</a>
9898</g>
9999</g>
100100<!-- filtron&#45;&gt;uwsgi -->
101101<g id="edge5" class="edge">
102102<title>filtron&#45;&gt;uwsgi</title>
103−<path fill="none" stroke="black" d="M92,-175.8C104.3,-163.36 121.09,-146.36 134.78,-132.5"/>
104−<polygon fill="black" stroke="black" points="137.49,-134.75 142.03,-125.18 132.51,-129.83 137.49,-134.75"/>
105−<text text-anchor="middle" x="140.5" y="-146.8" font-family="Sans" font-size="14.00">HTTP</text>
103+<path fill="none" stroke="#000000" d="M87.2143,-251.8239C101.3983,-230.7169 124.9198,-195.7146 141.1515,-171.5603"/>
104+<polygon fill="#000000" stroke="#000000" points="144.0983,-173.4502 146.7709,-163.198 138.2883,-169.5459 144.0983,-173.4502"/>
105+<text text-anchor="middle" x="139.5" y="-203.8" font-family="Sans" font-size="14.00" fill="#000000">HTTP</text>
106106</g>
107107<!-- searx1 -->
108108<g id="node7" class="node">
109109<title>searx1</title>
110−<polygon fill="#ffffcc" stroke="black" points="99.5,-52 16.5,-52 16.5,-16 99.5,-16 99.5,-52"/>
111−<text text-anchor="middle" x="58" y="-30.3" font-family="Sans" font-size="14.00">Searx #1</text>
110+<polygon fill="#ffffcc" stroke="#000000" points="99.5,-52 16.5,-52 16.5,-16 99.5,-16 99.5,-52"/>
111+<text text-anchor="middle" x="58" y="-30.3" font-family="Sans" font-size="14.00" fill="#000000">Searx #1</text>
112112</g>
113113<!-- uwsgi&#45;&gt;searx1 -->
114114<g id="edge6" class="edge">
115115<title>uwsgi&#45;&gt;searx1</title>
116−<path fill="none" stroke="black" d="M134.81,-88.99C121.66,-79.75 105.22,-68.19 90.92,-58.14"/>
117−<polygon fill="black" stroke="black" points="92.54,-55 82.34,-52.11 88.51,-60.73 92.54,-55"/>
116+<path fill="none" stroke="#000000" d="M142.3219,-126.6706C125.7281,-108.4339 100.1175,-80.2876 81.4738,-59.7979"/>
117+<polygon fill="#000000" stroke="#000000" points="84.0217,-57.3975 74.7029,-52.3566 78.8442,-62.1086 84.0217,-57.3975"/>
118118</g>
119119<!-- searx2 -->
120120<g id="node8" class="node">
121121<title>searx2</title>
122−<polygon fill="#ffffcc" stroke="black" points="200.5,-52 117.5,-52 117.5,-16 200.5,-16 200.5,-52"/>
123−<text text-anchor="middle" x="159" y="-30.3" font-family="Sans" font-size="14.00">Searx #2</text>
122+<polygon fill="#ffffcc" stroke="#000000" points="200.5,-52 117.5,-52 117.5,-16 200.5,-16 200.5,-52"/>
123+<text text-anchor="middle" x="159" y="-30.3" font-family="Sans" font-size="14.00" fill="#000000">Searx #2</text>
124124</g>
125125<!-- uwsgi&#45;&gt;searx2 -->
126126<g id="edge7" class="edge">
127127<title>uwsgi&#45;&gt;searx2</title>
128−<path fill="none" stroke="black" d="M159,-88.81C159,-80.79 159,-71.05 159,-62.07"/>
129−<polygon fill="black" stroke="black" points="162.5,-62.03 159,-52.03 155.5,-62.03 162.5,-62.03"/>
128+<path fill="none" stroke="#000000" d="M159,-126.6706C159,-109.2373 159,-82.7482 159,-62.5489"/>
129+<polygon fill="#000000" stroke="#000000" points="162.5001,-62.3566 159,-52.3566 155.5001,-62.3567 162.5001,-62.3566"/>
130130</g>
131131<!-- searx3 -->
132132<g id="node9" class="node">
133133<title>searx3</title>
134−<polygon fill="#ffffcc" stroke="black" points="301.5,-52 218.5,-52 218.5,-16 301.5,-16 301.5,-52"/>
135−<text text-anchor="middle" x="260" y="-30.3" font-family="Sans" font-size="14.00">Searx #3</text>
134+<polygon fill="#ffffcc" stroke="#000000" points="301.5,-52 218.5,-52 218.5,-16 301.5,-16 301.5,-52"/>
135+<text text-anchor="middle" x="260" y="-30.3" font-family="Sans" font-size="14.00" fill="#000000">Searx #3</text>
136136</g>
137137<!-- uwsgi&#45;&gt;searx3 -->
138138<g id="edge8" class="edge">
139139<title>uwsgi&#45;&gt;searx3</title>
140−<path fill="none" stroke="black" d="M183.19,-88.99C196.34,-79.75 212.78,-68.19 227.08,-58.14"/>
141−<polygon fill="black" stroke="black" points="229.49,-60.73 235.66,-52.11 225.46,-55 229.49,-60.73"/>
140+<path fill="none" stroke="#000000" d="M175.6781,-126.6706C192.2719,-108.4339 217.8825,-80.2876 236.5262,-59.7979"/>
141+<polygon fill="#000000" stroke="#000000" points="239.1558,-62.1086 243.2971,-52.3566 233.9783,-57.3975 239.1558,-62.1086"/>
142142</g>
143143<!-- searx4 -->
144144<g id="node10" class="node">
145145<title>searx4</title>
146−<polygon fill="#ffffcc" stroke="black" points="402.5,-52 319.5,-52 319.5,-16 402.5,-16 402.5,-52"/>
147−<text text-anchor="middle" x="361" y="-30.3" font-family="Sans" font-size="14.00">Searx #4</text>
146+<polygon fill="#ffffcc" stroke="#000000" points="402.5,-52 319.5,-52 319.5,-16 402.5,-16 402.5,-52"/>
147+<text text-anchor="middle" x="361" y="-30.3" font-family="Sans" font-size="14.00" fill="#000000">Searx #4</text>
148148</g>
149149<!-- uwsgi&#45;&gt;searx4 -->
150150<g id="edge9" class="edge">
151151<title>uwsgi&#45;&gt;searx4</title>
152−<path fill="none" stroke="black" d="M188.37,-95.68C220.15,-84.51 271.41,-66.49 309.83,-52.98"/>
153−<polygon fill="black" stroke="black" points="311.03,-56.27 319.31,-49.66 308.71,-49.67 311.03,-56.27"/>
152+<path fill="none" stroke="#000000" d="M188.3725,-128.8596C222.8149,-109.9334 280.1532,-78.4257 319.2181,-56.9594"/>
153+<polygon fill="#000000" stroke="#000000" points="321.1614,-59.8852 328.2399,-52.0018 317.7903,-53.7504 321.1614,-59.8852"/>
154154</g>
155155</g>
156156</svg>
_images/hello.svg+7−7
@@ -1,30 +1,30 @@
11<?xml version="1.0" encoding="UTF-8" standalone="no"?>
22<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
33 "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
4−<!-- Generated by graphviz version 2.43.0 (0)
4+<!-- Generated by graphviz version 2.40.1 (20161225.0304)
55 -->
66<!-- Title: G Pages: 1 -->
77<svg width="76pt" height="116pt"
88 viewBox="0.00 0.00 75.59 116.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
99<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 112)">
1010<title>G</title>
11−<polygon fill="white" stroke="transparent" points="-4,4 -4,-112 71.59,-112 71.59,4 -4,4"/>
11+<polygon fill="#ffffff" stroke="transparent" points="-4,4 -4,-112 71.594,-112 71.594,4 -4,4"/>
1212<!-- Hello -->
1313<g id="node1" class="node">
1414<title>Hello</title>
15−<ellipse fill="none" stroke="black" cx="33.8" cy="-90" rx="30.59" ry="18"/>
16−<text text-anchor="middle" x="33.8" y="-86.3" font-family="Times,serif" font-size="14.00">Hello</text>
15+<ellipse fill="none" stroke="#000000" cx="33.797" cy="-90" rx="30.5947" ry="18"/>
16+<text text-anchor="middle" x="33.797" y="-86.3" font-family="Times,serif" font-size="14.00" fill="#000000">Hello</text>
1717</g>
1818<!-- World -->
1919<g id="node2" class="node">
2020<title>World</title>
21−<ellipse fill="none" stroke="black" cx="33.8" cy="-18" rx="33.6" ry="18"/>
22−<text text-anchor="middle" x="33.8" y="-14.3" font-family="Times,serif" font-size="14.00">World</text>
21+<ellipse fill="none" stroke="#000000" cx="33.797" cy="-18" rx="33.5952" ry="18"/>
22+<text text-anchor="middle" x="33.797" y="-14.3" font-family="Times,serif" font-size="14.00" fill="#000000">World</text>
2323</g>
2424<!-- Hello&#45;&#45;World -->
2525<g id="edge1" class="edge">
2626<title>Hello&#45;&#45;World</title>
27−<path fill="none" stroke="black" d="M33.8,-71.7C33.8,-60.85 33.8,-46.92 33.8,-36.1"/>
27+<path fill="none" stroke="#000000" d="M33.797,-71.8314C33.797,-61 33.797,-47.2876 33.797,-36.4133"/>
2828</g>
2929</g>
3030</svg>
_images/math/07c9ff4251510b06013159f4e45ec9ab97044096.svgnew file+25
@@ -0,0 +1,25 @@
1+<?xml version='1.0' encoding='UTF-8'?>
2+<!-- This file was generated by dvisvgm 2.6.3 -->
3+<svg version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' width='36.523255pt' height='48.422712pt' viewBox='57.608781 53.798251 36.523255 48.422712'>
4+<defs>
5+<path id='g0-0' d='M9.191532 -3.20797C9.428643 -3.20797 9.679701 -3.20797 9.679701 -3.486924S9.428643 -3.765878 9.191532 -3.765878H1.645828C1.408717 -3.765878 1.157659 -3.765878 1.157659 -3.486924S1.408717 -3.20797 1.645828 -3.20797H9.191532Z'/>
6+<path id='g2-43' d='M5.565131 -3.221918H9.414695C9.609963 -3.221918 9.861021 -3.221918 9.861021 -3.472976C9.861021 -3.737983 9.62391 -3.737983 9.414695 -3.737983H5.565131V-7.587547C5.565131 -7.782814 5.565131 -8.033873 5.314072 -8.033873C5.049066 -8.033873 5.049066 -7.796762 5.049066 -7.587547V-3.737983H1.199502C1.004234 -3.737983 0.753176 -3.737983 0.753176 -3.486924C0.753176 -3.221918 0.990286 -3.221918 1.199502 -3.221918H5.049066V0.627646C5.049066 0.822914 5.049066 1.073973 5.300125 1.073973C5.565131 1.073973 5.565131 0.836862 5.565131 0.627646V-3.221918Z'/>
7+<path id='g2-49' d='M4.016936 -8.940473C4.016936 -9.26127 4.016936 -9.275218 3.737983 -9.275218C3.403238 -8.89863 2.705853 -8.382565 1.26924 -8.382565V-7.978082C1.590037 -7.978082 2.287422 -7.978082 3.054545 -8.340722V-1.073973C3.054545 -0.571856 3.012702 -0.404483 1.785305 -0.404483H1.352927V0C1.729514 -0.027895 3.082441 -0.027895 3.542715 -0.027895S5.341968 -0.027895 5.718555 0V-0.404483H5.286177C4.05878 -0.404483 4.016936 -0.571856 4.016936 -1.073973V-8.940473Z'/>
8+<path id='g1-120' d='M6.611208 -5.69066C6.164882 -5.606974 5.997509 -5.272229 5.997509 -5.007223C5.997509 -4.672478 6.262516 -4.560897 6.457783 -4.560897C6.876214 -4.560897 7.169116 -4.923537 7.169116 -5.300125C7.169116 -5.885928 6.499626 -6.150934 5.913823 -6.150934C5.063014 -6.150934 4.588792 -5.314072 4.463263 -5.049066C4.142466 -6.095143 3.277709 -6.150934 3.02665 -6.150934C1.603985 -6.150934 0.850809 -4.323786 0.850809 -4.016936C0.850809 -3.961146 0.9066 -3.891407 1.004234 -3.891407C1.115816 -3.891407 1.143711 -3.975093 1.171606 -4.030884C1.645828 -5.579078 2.580324 -5.87198 2.984807 -5.87198C3.612453 -5.87198 3.737983 -5.286177 3.737983 -4.951432C3.737983 -4.644583 3.654296 -4.323786 3.486924 -3.654296L3.012702 -1.743462C2.803487 -0.9066 2.399004 -0.139477 1.659776 -0.139477C1.590037 -0.139477 1.241345 -0.139477 0.948443 -0.320797C1.45056 -0.418431 1.562142 -0.836862 1.562142 -1.004234C1.562142 -1.283188 1.352927 -1.45056 1.08792 -1.45056C0.753176 -1.45056 0.390535 -1.157659 0.390535 -0.711333C0.390535 -0.125529 1.046077 0.139477 1.645828 0.139477C2.315318 0.139477 2.789539 -0.390535 3.082441 -0.962391C3.305604 -0.139477 4.002989 0.139477 4.519054 0.139477C5.941719 0.139477 6.694894 -1.687671 6.694894 -1.994521C6.694894 -2.064259 6.639103 -2.12005 6.555417 -2.12005C6.429888 -2.12005 6.41594 -2.050311 6.374097 -1.93873C5.997509 -0.711333 5.188543 -0.139477 4.560897 -0.139477C4.072727 -0.139477 3.807721 -0.502117 3.807721 -1.073973C3.807721 -1.380822 3.863512 -1.603985 4.086675 -2.524533L4.574844 -4.42142C4.78406 -5.258281 5.258281 -5.87198 5.899875 -5.87198C5.927771 -5.87198 6.318306 -5.87198 6.611208 -5.69066Z'/>
9+<path id='g1-121' d='M3.668244 1.562142C3.291656 2.092154 2.747696 2.566376 2.064259 2.566376C1.896887 2.566376 1.227397 2.538481 1.018182 1.896887C1.060025 1.910834 1.129763 1.910834 1.157659 1.910834C1.57609 1.910834 1.855044 1.548194 1.855044 1.227397S1.590037 0.795019 1.380822 0.795019C1.157659 0.795019 0.669489 0.962391 0.669489 1.645828C0.669489 2.357161 1.26924 2.84533 2.064259 2.84533C3.459029 2.84533 4.867746 1.562142 5.258281 0.013948L6.625156 -5.425654C6.639103 -5.495392 6.666999 -5.579078 6.666999 -5.662765C6.666999 -5.87198 6.499626 -6.011457 6.290411 -6.011457C6.164882 -6.011457 5.87198 -5.955666 5.760399 -5.537235L4.728269 -1.436613C4.658531 -1.185554 4.658531 -1.157659 4.546949 -1.004234C4.267995 -0.613699 3.807721 -0.139477 3.138232 -0.139477C2.357161 -0.139477 2.287422 -0.9066 2.287422 -1.283188C2.287422 -2.078207 2.66401 -3.152179 3.040598 -4.156413C3.194022 -4.560897 3.277709 -4.756164 3.277709 -5.035118C3.277709 -5.620922 2.859278 -6.150934 2.175841 -6.150934C0.892653 -6.150934 0.376588 -4.128518 0.376588 -4.016936C0.376588 -3.961146 0.432379 -3.891407 0.530012 -3.891407C0.655542 -3.891407 0.669489 -3.947198 0.72528 -4.142466C1.060025 -5.314072 1.590037 -5.87198 2.133998 -5.87198C2.259527 -5.87198 2.496638 -5.87198 2.496638 -5.411706C2.496638 -5.049066 2.343213 -4.644583 2.133998 -4.11457C1.45056 -2.287422 1.45056 -1.827148 1.45056 -1.492403C1.45056 -0.167372 2.399004 0.139477 3.096389 0.139477C3.500872 0.139477 4.002989 0.013948 4.491158 -0.502117L4.505106 -0.488169C4.29589 0.334745 4.156413 0.878705 3.668244 1.562142Z'/>
10+<path id='g1-122' d='M1.771357 -1.129763C2.371108 -1.8132 2.859278 -2.245579 3.556663 -2.873225C4.393524 -3.598506 4.756164 -3.947198 4.951432 -4.156413C5.927771 -5.118804 6.41594 -5.927771 6.41594 -6.039352S6.304359 -6.150934 6.276463 -6.150934C6.178829 -6.150934 6.150934 -6.095143 6.081196 -5.997509C5.732503 -5.397758 5.397758 -5.104857 5.035118 -5.104857C4.742217 -5.104857 4.588792 -5.230386 4.323786 -5.565131C4.030884 -5.913823 3.793773 -6.150934 3.38929 -6.150934C2.371108 -6.150934 1.75741 -4.881694 1.75741 -4.588792C1.75741 -4.546949 1.771357 -4.463263 1.896887 -4.463263C2.008468 -4.463263 2.022416 -4.519054 2.064259 -4.616687C2.30137 -5.174595 2.970859 -5.272229 3.235866 -5.272229C3.528767 -5.272229 3.807721 -5.174595 4.100623 -5.049066C4.630635 -4.825903 4.853798 -4.825903 4.993275 -4.825903C5.090909 -4.825903 5.1467 -4.825903 5.216438 -4.839851C4.756164 -4.29589 4.002989 -3.626401 3.375342 -3.054545L1.966625 -1.75741C1.115816 -0.892653 0.599751 -0.069738 0.599751 0.027895C0.599751 0.111582 0.669489 0.139477 0.753176 0.139477S0.850809 0.125529 0.948443 -0.041843C1.171606 -0.390535 1.617933 -0.9066 2.133998 -0.9066C2.426899 -0.9066 2.566376 -0.808966 2.84533 -0.460274C3.110336 -0.153425 3.347447 0.139477 3.793773 0.139477C5.160648 0.139477 5.941719 -1.63188 5.941719 -1.952677C5.941719 -2.008468 5.927771 -2.092154 5.788294 -2.092154C5.676712 -2.092154 5.662765 -2.036364 5.620922 -1.896887C5.314072 -1.073973 4.491158 -0.739228 3.947198 -0.739228C3.654296 -0.739228 3.375342 -0.836862 3.082441 -0.962391C2.524533 -1.185554 2.371108 -1.185554 2.189788 -1.185554C2.050311 -1.185554 1.896887 -1.185554 1.771357 -1.129763Z'/>
11+</defs>
12+<g id='page1'>
13+<use x='59.270442' y='62.786766' xlink:href='#g2-49'/>
14+<rect x='58.804295' y='68.456606' height='0.55789' width='7.760768'/>
15+<use x='58.804295' y='81.789907' xlink:href='#g1-120'/>
16+<use x='70.860038' y='72.222482' xlink:href='#g2-43'/>
17+<use x='85.942577' y='62.786766' xlink:href='#g2-49'/>
18+<rect x='85.777106' y='68.456606' height='0.55789' width='7.159416'/>
19+<use x='85.777106' y='81.789907' xlink:href='#g1-121'/>
20+<rect x='57.608781' y='86.175621' height='0.55789' width='36.523255'/>
21+<use x='60.284264' y='99.508922' xlink:href='#g1-121'/>
22+<use x='70.543155' y='99.508922' xlink:href='#g0-0'/>
23+<use x='84.490862' y='99.508922' xlink:href='#g1-122'/>
24+</g>
25+</svg>
_images/math/3b8127a8eed95247f9249ea6c85e8e86df1baa82.svgnew file+25
@@ -0,0 +1,25 @@
1+<?xml version='1.0' encoding='UTF-8'?>
2+<!-- This file was generated by dvisvgm 2.6.3 -->
3+<svg version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' width='23.092891pt' height='29.523663pt' viewBox='57.608781 53.79825 23.092891 29.523663'>
4+<defs>
5+<path id='g0-0' d='M6.434044 -2.245569C6.600021 -2.245569 6.775761 -2.245569 6.775761 -2.440836S6.600021 -2.636103 6.434044 -2.636103H1.152075C0.986098 -2.636103 0.810358 -2.636103 0.810358 -2.440836S0.986098 -2.245569 1.152075 -2.245569H6.434044Z'/>
6+<path id='g2-43' d='M3.993208 -2.245569H6.717181C6.853868 -2.245569 7.039372 -2.245569 7.039372 -2.440836S6.853868 -2.636103 6.717181 -2.636103H3.993208V-5.36984C3.993208 -5.506526 3.993208 -5.69203 3.797941 -5.69203S3.602674 -5.506526 3.602674 -5.36984V-2.636103H0.868938C0.732251 -2.636103 0.546747 -2.636103 0.546747 -2.440836S0.732251 -2.245569 0.868938 -2.245569H3.602674V0.488167C3.602674 0.624854 3.602674 0.810358 3.797941 0.810358S3.993208 0.624854 3.993208 0.488167V-2.245569Z'/>
7+<path id='g2-49' d='M2.870423 -6.248541C2.870423 -6.482861 2.870423 -6.502388 2.645866 -6.502388C2.040539 -5.877534 1.181365 -5.877534 0.868938 -5.877534V-5.57487C1.064205 -5.57487 1.640242 -5.57487 2.147936 -5.828717V-0.771304C2.147936 -0.419824 2.118646 -0.302664 1.239945 -0.302664H0.927518V0C1.269235 -0.02929 2.118646 -0.02929 2.50918 -0.02929S3.749124 -0.02929 4.090841 0V-0.302664H3.778414C2.899713 -0.302664 2.870423 -0.41006 2.870423 -0.771304V-6.248541Z'/>
8+<path id='g1-120' d='M3.260957 -2.94853C3.319537 -3.202377 3.544094 -4.100605 4.227528 -4.100605C4.276345 -4.100605 4.510665 -4.100605 4.715696 -3.973681C4.442322 -3.924865 4.247055 -3.680781 4.247055 -3.446461C4.247055 -3.290247 4.354452 -3.104744 4.618062 -3.104744C4.832856 -3.104744 5.145283 -3.280484 5.145283 -3.671018C5.145283 -4.178712 4.569245 -4.315398 4.237292 -4.315398C3.671018 -4.315398 3.329301 -3.797941 3.21214 -3.573384C2.968057 -4.217765 2.440836 -4.315398 2.157699 -4.315398C1.142311 -4.315398 0.585801 -3.055927 0.585801 -2.811843C0.585801 -2.71421 0.683434 -2.71421 0.702961 -2.71421C0.781068 -2.71421 0.810358 -2.733737 0.829884 -2.821607C1.161838 -3.856521 1.806219 -4.100605 2.138172 -4.100605C2.323676 -4.100605 2.665393 -4.012735 2.665393 -3.446461C2.665393 -3.143797 2.499416 -2.489653 2.138172 -1.122785C1.981959 -0.517457 1.640242 -0.107397 1.210655 -0.107397C1.152075 -0.107397 0.927518 -0.107397 0.722488 -0.23432C0.966571 -0.283137 1.181365 -0.488167 1.181365 -0.761541C1.181365 -1.025151 0.966571 -1.103258 0.820121 -1.103258C0.527221 -1.103258 0.283137 -0.849411 0.283137 -0.536984C0.283137 -0.08787 0.771304 0.107397 1.200891 0.107397C1.845272 0.107397 2.196753 -0.576037 2.226043 -0.634617C2.343203 -0.273374 2.694683 0.107397 3.280484 0.107397C4.286108 0.107397 4.842619 -1.152075 4.842619 -1.396158C4.842619 -1.493792 4.754749 -1.493792 4.725459 -1.493792C4.637589 -1.493792 4.618062 -1.454738 4.598535 -1.386395C4.276345 -0.341717 3.612438 -0.107397 3.300011 -0.107397C2.91924 -0.107397 2.763027 -0.419824 2.763027 -0.751778C2.763027 -0.966571 2.821607 -1.181365 2.929003 -1.610952L3.260957 -2.94853Z'/>
9+<path id='g1-121' d='M4.744986 -3.719834C4.784039 -3.856521 4.784039 -3.876048 4.784039 -3.944391C4.784039 -4.120131 4.647352 -4.208002 4.500902 -4.208002C4.403268 -4.208002 4.247055 -4.149422 4.159185 -4.002971C4.139658 -3.954155 4.061551 -3.651491 4.022498 -3.475751C3.954155 -3.221904 3.885811 -2.958293 3.827231 -2.694683L3.387881 -0.937281C3.348827 -0.790831 2.929003 -0.107397 2.284623 -0.107397C1.786692 -0.107397 1.679295 -0.536984 1.679295 -0.898228C1.679295 -1.347342 1.845272 -1.952669 2.177226 -2.811843C2.333439 -3.21214 2.372493 -3.319537 2.372493 -3.514804C2.372493 -3.954155 2.060066 -4.315398 1.571899 -4.315398C0.644381 -4.315398 0.283137 -2.899713 0.283137 -2.811843C0.283137 -2.71421 0.38077 -2.71421 0.400297 -2.71421C0.497931 -2.71421 0.507694 -2.733737 0.556511 -2.88995C0.820121 -3.807704 1.210655 -4.100605 1.542608 -4.100605C1.620715 -4.100605 1.786692 -4.100605 1.786692 -3.788178C1.786692 -3.544094 1.689059 -3.290247 1.620715 -3.104744C1.230181 -2.069829 1.054441 -1.513318 1.054441 -1.054441C1.054441 -0.185504 1.669532 0.107397 2.245569 0.107397C2.62634 0.107397 2.958293 -0.05858 3.231667 -0.331954C3.104744 0.17574 2.987583 0.654144 2.59705 1.171601C2.343203 1.503555 1.972196 1.786692 1.523082 1.786692C1.386395 1.786692 0.947044 1.757402 0.781068 1.376632C0.937281 1.376632 1.064205 1.376632 1.200891 1.259471C1.298525 1.171601 1.396158 1.044678 1.396158 0.859174C1.396158 0.556511 1.132548 0.517457 1.034915 0.517457C0.810358 0.517457 0.488167 0.673671 0.488167 1.152075C0.488167 1.640242 0.917754 2.001486 1.523082 2.001486C2.528706 2.001486 3.534331 1.113021 3.807704 0.009763L4.744986 -3.719834Z'/>
10+<path id='g1-122' d='M1.298525 -0.810358C1.825745 -1.376632 2.108882 -1.620715 2.460363 -1.923379C2.460363 -1.933142 3.06569 -2.4506 3.417171 -2.80208C4.344688 -3.710071 4.559482 -4.178712 4.559482 -4.217765C4.559482 -4.315398 4.471612 -4.315398 4.452085 -4.315398C4.383742 -4.315398 4.354452 -4.295872 4.305635 -4.208002C4.012735 -3.739361 3.807704 -3.583148 3.573384 -3.583148S3.221904 -3.729598 3.075454 -3.895575C2.88995 -4.120131 2.723973 -4.315398 2.401783 -4.315398C1.669532 -4.315398 1.220418 -3.407407 1.220418 -3.202377C1.220418 -3.15356 1.249708 -3.09498 1.337578 -3.09498S1.444975 -3.143797 1.464502 -3.202377C1.650005 -3.651491 2.216279 -3.661254 2.294386 -3.661254C2.499416 -3.661254 2.68492 -3.592911 2.909477 -3.514804C3.300011 -3.368354 3.407407 -3.368354 3.661254 -3.368354C3.309774 -2.94853 2.489653 -2.245569 2.304149 -2.089356L1.425448 -1.269235C0.761541 -0.615091 0.419824 -0.05858 0.419824 0.009763C0.419824 0.107397 0.517457 0.107397 0.536984 0.107397C0.615091 0.107397 0.634617 0.08787 0.693197 -0.019527C0.917754 -0.361244 1.210655 -0.624854 1.523082 -0.624854C1.747639 -0.624854 1.845272 -0.536984 2.089356 -0.253847C2.255333 -0.048817 2.431073 0.107397 2.71421 0.107397C3.680781 0.107397 4.247055 -1.132548 4.247055 -1.396158C4.247055 -1.444975 4.208002 -1.493792 4.129895 -1.493792C4.042025 -1.493792 4.022498 -1.435212 3.993208 -1.366868C3.768651 -0.732251 3.143797 -0.546747 2.821607 -0.546747C2.62634 -0.546747 2.4506 -0.605327 2.245569 -0.673671C1.913616 -0.800594 1.767165 -0.839648 1.562135 -0.839648C1.542608 -0.839648 1.386395 -0.839648 1.298525 -0.810358Z'/>
11+</defs>
12+<g id='page1'>
13+<use x='59.153464' y='60.090183' xlink:href='#g2-49'/>
14+<rect x='58.804295' y='61.81595' height='0.55789' width='5.580027'/>
15+<use x='58.804295' y='70.391549' xlink:href='#g1-120'/>
16+<use x='65.579836' y='65.581827' xlink:href='#g2-43'/>
17+<use x='74.496784' y='60.090183' xlink:href='#g2-49'/>
18+<rect x='74.369089' y='61.81595' height='0.55789' width='5.137078'/>
19+<use x='74.369089' y='70.391549' xlink:href='#g1-121'/>
20+<rect x='57.608781' y='72.847884' height='0.55789' width='23.092891'/>
21+<use x='60.304908' y='81.423483' xlink:href='#g1-121'/>
22+<use x='65.441996' y='81.423483' xlink:href='#g0-0'/>
23+<use x='73.035735' y='81.423483' xlink:href='#g1-122'/>
24+</g>
25+</svg>
_images/math/6673b43f9fe29455c1fcd1164e5844698cc64d38.svgnew file+22
@@ -0,0 +1,22 @@
1+<?xml version='1.0' encoding='UTF-8'?>
2+<!-- This file was generated by dvisvgm 2.6.3 -->
3+<svg version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' width='69.686469pt' height='12.418845pt' viewBox='56.413267 54.399982 69.686469 12.418845'>
4+<defs>
5+<path id='g2-43' d='M5.565131 -3.221918H9.414695C9.609963 -3.221918 9.861021 -3.221918 9.861021 -3.472976C9.861021 -3.737983 9.62391 -3.737983 9.414695 -3.737983H5.565131V-7.587547C5.565131 -7.782814 5.565131 -8.033873 5.314072 -8.033873C5.049066 -8.033873 5.049066 -7.796762 5.049066 -7.587547V-3.737983H1.199502C1.004234 -3.737983 0.753176 -3.737983 0.753176 -3.486924C0.753176 -3.221918 0.990286 -3.221918 1.199502 -3.221918H5.049066V0.627646C5.049066 0.822914 5.049066 1.073973 5.300125 1.073973C5.565131 1.073973 5.565131 0.836862 5.565131 0.627646V-3.221918Z'/>
6+<path id='g2-61' d='M9.414695 -4.519054C9.609963 -4.519054 9.861021 -4.519054 9.861021 -4.770112C9.861021 -5.035118 9.62391 -5.035118 9.414695 -5.035118H1.199502C1.004234 -5.035118 0.753176 -5.035118 0.753176 -4.78406C0.753176 -4.519054 0.990286 -4.519054 1.199502 -4.519054H9.414695ZM9.414695 -1.924782C9.609963 -1.924782 9.861021 -1.924782 9.861021 -2.175841C9.861021 -2.440847 9.62391 -2.440847 9.414695 -2.440847H1.199502C1.004234 -2.440847 0.753176 -2.440847 0.753176 -2.189788C0.753176 -1.924782 0.990286 -1.924782 1.199502 -1.924782H9.414695Z'/>
7+<path id='g0-97' d='M4.198257 -1.659776C4.128518 -1.422665 4.128518 -1.39477 3.93325 -1.129763C3.626401 -0.739228 3.012702 -0.139477 2.357161 -0.139477C1.785305 -0.139477 1.464508 -0.655542 1.464508 -1.478456C1.464508 -2.245579 1.896887 -3.807721 2.161893 -4.393524C2.636115 -5.369863 3.291656 -5.87198 3.835616 -5.87198C4.756164 -5.87198 4.937484 -4.728269 4.937484 -4.616687C4.937484 -4.60274 4.895641 -4.42142 4.881694 -4.393524L4.198257 -1.659776ZM5.090909 -5.230386C4.937484 -5.593026 4.560897 -6.150934 3.835616 -6.150934C2.259527 -6.150934 0.557908 -4.11457 0.557908 -2.050311C0.557908 -0.669489 1.366874 0.139477 2.315318 0.139477C3.082441 0.139477 3.737983 -0.460274 4.128518 -0.920548C4.267995 -0.097634 4.923537 0.139477 5.341968 0.139477S6.095143 -0.111582 6.346202 -0.613699C6.569365 -1.08792 6.764633 -1.93873 6.764633 -1.994521C6.764633 -2.064259 6.708842 -2.12005 6.625156 -2.12005C6.499626 -2.12005 6.485679 -2.050311 6.429888 -1.841096C6.220672 -1.018182 5.955666 -0.139477 5.383811 -0.139477C4.979328 -0.139477 4.951432 -0.502117 4.951432 -0.781071C4.951432 -1.101868 4.993275 -1.255293 5.118804 -1.799253C5.216438 -2.147945 5.286177 -2.454795 5.397758 -2.859278C5.913823 -4.951432 6.039352 -5.453549 6.039352 -5.537235C6.039352 -5.732503 5.885928 -5.885928 5.676712 -5.885928C5.230386 -5.885928 5.118804 -5.397758 5.090909 -5.230386Z'/>
8+<path id='g0-98' d='M3.221918 -9.331009C3.235866 -9.3868 3.263761 -9.470486 3.263761 -9.540224C3.263761 -9.679701 3.124284 -9.679701 3.096389 -9.679701C3.082441 -9.679701 2.580324 -9.637858 2.329265 -9.609963C2.092154 -9.596015 1.882939 -9.56812 1.63188 -9.554172C1.297136 -9.526276 1.199502 -9.512329 1.199502 -9.26127C1.199502 -9.121793 1.338979 -9.121793 1.478456 -9.121793C2.189788 -9.121793 2.189788 -8.996264 2.189788 -8.856787C2.189788 -8.759153 2.078207 -8.35467 2.022416 -8.103611L1.687671 -6.764633C1.548194 -6.206725 0.753176 -3.040598 0.697385 -2.789539C0.627646 -2.440847 0.627646 -2.203736 0.627646 -2.022416C0.627646 -0.599751 1.422665 0.139477 2.329265 0.139477C3.947198 0.139477 5.620922 -1.93873 5.620922 -3.961146C5.620922 -5.244334 4.895641 -6.150934 3.849564 -6.150934C3.124284 -6.150934 2.468742 -5.551183 2.203736 -5.272229L3.221918 -9.331009ZM2.343213 -0.139477C1.896887 -0.139477 1.408717 -0.474222 1.408717 -1.562142C1.408717 -2.022416 1.45056 -2.287422 1.701619 -3.263761C1.743462 -3.445081 1.966625 -4.337733 2.022416 -4.519054C2.050311 -4.630635 2.873225 -5.87198 3.821669 -5.87198C4.435367 -5.87198 4.714321 -5.258281 4.714321 -4.533001C4.714321 -3.863512 4.323786 -2.287422 3.975093 -1.562142C3.626401 -0.808966 2.984807 -0.139477 2.343213 -0.139477Z'/>
9+<path id='g0-99' d='M5.453549 -5.244334C5.188543 -5.244334 5.063014 -5.244334 4.867746 -5.076961C4.78406 -5.007223 4.630635 -4.798007 4.630635 -4.574844C4.630635 -4.29589 4.839851 -4.128518 5.104857 -4.128518C5.439601 -4.128518 5.816189 -4.407472 5.816189 -4.96538C5.816189 -5.634869 5.174595 -6.150934 4.212204 -6.150934C2.385056 -6.150934 0.557908 -4.156413 0.557908 -2.175841C0.557908 -0.962391 1.311083 0.139477 2.733748 0.139477C4.630635 0.139477 5.830137 -1.338979 5.830137 -1.520299C5.830137 -1.603985 5.746451 -1.673724 5.69066 -1.673724C5.648817 -1.673724 5.634869 -1.659776 5.50934 -1.534247C4.616687 -0.348692 3.291656 -0.139477 2.761644 -0.139477C1.799253 -0.139477 1.492403 -0.976339 1.492403 -1.673724C1.492403 -2.161893 1.729514 -3.514819 2.231631 -4.463263C2.594271 -5.118804 3.347447 -5.87198 4.226152 -5.87198C4.407472 -5.87198 5.174595 -5.844085 5.453549 -5.244334Z'/>
10+<path id='g1-50' d='M1.239945 -0.751778L2.274859 -1.757402C3.797941 -3.104744 4.383742 -3.631964 4.383742 -4.608299C4.383742 -5.72132 3.505041 -6.502388 2.313913 -6.502388C1.210655 -6.502388 0.488167 -5.60416 0.488167 -4.735222C0.488167 -4.188475 0.976334 -4.188475 1.005625 -4.188475C1.171601 -4.188475 1.513318 -4.305635 1.513318 -4.705932C1.513318 -4.959779 1.337578 -5.213626 0.995861 -5.213626C0.917754 -5.213626 0.898228 -5.213626 0.868938 -5.203863C1.093495 -5.83848 1.620715 -6.199724 2.186989 -6.199724C3.075454 -6.199724 3.495277 -5.408893 3.495277 -4.608299C3.495277 -3.827231 3.00711 -3.055927 2.470126 -2.4506L0.595564 -0.361244C0.488167 -0.253847 0.488167 -0.23432 0.488167 0H4.110368L4.383742 -1.698822H4.139658C4.090841 -1.405922 4.022498 -0.976334 3.924865 -0.829884C3.856521 -0.751778 3.21214 -0.751778 2.997347 -0.751778H1.239945Z'/>
11+</defs>
12+<g id='page1'>
13+<use x='56.413267' y='65.753425' xlink:href='#g0-97'/>
14+<use x='63.582369' y='60.691915' xlink:href='#g1-50'/>
15+<use x='72.061649' y='65.753425' xlink:href='#g2-43'/>
16+<use x='85.783204' y='65.753425' xlink:href='#g0-98'/>
17+<use x='91.589827' y='60.691915' xlink:href='#g1-50'/>
18+<use x='100.843973' y='65.753425' xlink:href='#g2-61'/>
19+<use x='115.340392' y='65.753425' xlink:href='#g0-99'/>
20+<use x='121.218045' y='60.691915' xlink:href='#g1-50'/>
21+</g>
22+</svg>
_images/math/a6a994cb6e7278ec30eaebe7e636046d3deccb5b.svgnew file+43
@@ -0,0 +1,43 @@
1+<?xml version='1.0' encoding='UTF-8'?>
2+<!-- This file was generated by dvisvgm 2.6.3 -->
3+<svg version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' width='134.289458pt' height='28.68903pt' viewBox='165.981071 78.308016 134.289458 28.68903'>
4+<defs>
5+<path id='g2-32' d='M6.555417 -9.344956C6.555417 -9.358904 6.611208 -9.540224 6.611208 -9.554172C6.611208 -9.679701 6.499626 -9.679701 6.457783 -9.679701C6.332254 -9.679701 6.318306 -9.609963 6.262516 -9.400747L3.961146 -0.167372C2.803487 -0.306849 2.371108 -0.892653 2.371108 -1.729514C2.371108 -2.036364 2.371108 -2.357161 3.02665 -4.086675C3.20797 -4.588792 3.277709 -4.770112 3.277709 -5.021171C3.277709 -5.648817 2.831382 -6.150934 2.175841 -6.150934C0.892653 -6.150934 0.376588 -4.128518 0.376588 -4.016936C0.376588 -3.961146 0.432379 -3.891407 0.530012 -3.891407C0.655542 -3.891407 0.669489 -3.947198 0.72528 -4.142466C1.060025 -5.355915 1.617933 -5.87198 2.133998 -5.87198C2.259527 -5.87198 2.496638 -5.858032 2.496638 -5.411706C2.496638 -5.355915 2.496638 -5.049066 2.259527 -4.435367C1.506351 -2.454795 1.506351 -2.147945 1.506351 -1.827148C1.506351 -0.488169 2.622167 0.027895 3.87746 0.125529C3.765878 0.557908 3.668244 1.004234 3.556663 1.436613C3.333499 2.273474 3.235866 2.66401 3.235866 2.719801C3.235866 2.84533 3.347447 2.84533 3.38929 2.84533C3.417186 2.84533 3.472976 2.84533 3.500872 2.789539C3.556663 2.733748 4.128518 0.390535 4.184309 0.139477C4.700374 0.139477 5.802242 0.139477 7.057534 -1.157659C7.517808 -1.659776 7.936239 -2.30137 8.17335 -2.901121C8.312827 -3.263761 8.647572 -4.505106 8.647572 -5.216438C8.647572 -6.0533 8.229141 -6.150934 8.089664 -6.150934C7.754919 -6.150934 7.44807 -5.816189 7.44807 -5.537235C7.44807 -5.369863 7.545704 -5.272229 7.601494 -5.216438C7.727024 -5.090909 8.103611 -4.714321 8.103611 -3.989041C8.103611 -3.486924 7.824658 -2.454795 6.932005 -1.45056C5.760399 -0.139477 4.686426 -0.139477 4.267995 -0.139477L6.555417 -9.344956Z'/>
6+<path id='g2-58' d='M2.566376 -0.669489C2.566376 -1.073973 2.231631 -1.352927 1.896887 -1.352927C1.492403 -1.352927 1.21345 -1.018182 1.21345 -0.683437C1.21345 -0.278954 1.548194 0 1.882939 0C2.287422 0 2.566376 -0.334745 2.566376 -0.669489Z'/>
7+<path id='g2-64' d='M6.332254 -4.658531C6.248568 -5.439601 5.760399 -6.374097 4.505106 -6.374097C2.538481 -6.374097 0.530012 -4.379577 0.530012 -2.161893C0.530012 -1.311083 1.115816 0.292902 3.012702 0.292902C6.304359 0.292902 7.713076 -4.505106 7.713076 -6.41594C7.713076 -8.424408 6.583313 -9.972603 4.798007 -9.972603C2.775592 -9.972603 2.175841 -8.201245 2.175841 -7.824658C2.175841 -7.699128 2.259527 -7.392279 2.650062 -7.392279C3.138232 -7.392279 3.347447 -7.838605 3.347447 -8.075716C3.347447 -8.508095 2.915068 -8.508095 2.733748 -8.508095C3.305604 -9.540224 4.365629 -9.637858 4.742217 -9.637858C5.969614 -9.637858 6.750685 -8.661519 6.750685 -7.099377C6.750685 -6.206725 6.485679 -5.174595 6.346202 -4.658531H6.332254ZM3.054545 -0.083686C1.743462 -0.083686 1.520299 -1.115816 1.520299 -1.701619C1.520299 -2.315318 1.910834 -3.75193 2.12005 -4.267995C2.30137 -4.686426 3.096389 -6.095143 4.546949 -6.095143C5.816189 -6.095143 6.109091 -4.993275 6.109091 -4.2401C6.109091 -3.20797 5.202491 -0.083686 3.054545 -0.083686Z'/>
8+<path id='g2-72' d='M10.432877 -8.508095C10.558406 -8.982316 10.586301 -9.121793 11.576588 -9.121793C11.827646 -9.121793 11.967123 -9.121793 11.967123 -9.372852C11.967123 -9.526276 11.841594 -9.526276 11.757908 -9.526276C11.506849 -9.526276 11.213948 -9.498381 10.948941 -9.498381H9.303113C9.038107 -9.498381 8.745205 -9.526276 8.480199 -9.526276C8.382565 -9.526276 8.215193 -9.526276 8.215193 -9.26127C8.215193 -9.121793 8.312827 -9.121793 8.577833 -9.121793C9.414695 -9.121793 9.414695 -9.010212 9.414695 -8.856787C9.414695 -8.828892 9.414695 -8.745205 9.358904 -8.53599L8.508095 -5.160648H4.29589L5.132752 -8.508095C5.258281 -8.982316 5.286177 -9.121793 6.276463 -9.121793C6.527522 -9.121793 6.666999 -9.121793 6.666999 -9.372852C6.666999 -9.526276 6.541469 -9.526276 6.457783 -9.526276C6.206725 -9.526276 5.913823 -9.498381 5.648817 -9.498381H4.002989C3.737983 -9.498381 3.445081 -9.526276 3.180075 -9.526276C3.082441 -9.526276 2.915068 -9.526276 2.915068 -9.26127C2.915068 -9.121793 3.012702 -9.121793 3.277709 -9.121793C4.11457 -9.121793 4.11457 -9.010212 4.11457 -8.856787C4.11457 -8.828892 4.11457 -8.745205 4.05878 -8.53599L2.175841 -1.03213C2.050311 -0.54396 2.022416 -0.404483 1.060025 -0.404483C0.739228 -0.404483 0.641594 -0.404483 0.641594 -0.139477C0.641594 0 0.795019 0 0.836862 0C1.08792 0 1.380822 -0.027895 1.645828 -0.027895H3.291656C3.556663 -0.027895 3.849564 0 4.11457 0C4.226152 0 4.379577 0 4.379577 -0.265006C4.379577 -0.404483 4.254047 -0.404483 4.044832 -0.404483C3.194022 -0.404483 3.194022 -0.516065 3.194022 -0.655542C3.194022 -0.669489 3.194022 -0.767123 3.221918 -0.878705L4.184309 -4.756164H8.410461C8.17335 -3.835616 7.462017 -0.920548 7.434122 -0.836862C7.280697 -0.418431 7.057534 -0.418431 6.23462 -0.404483C6.067248 -0.404483 5.941719 -0.404483 5.941719 -0.139477C5.941719 0 6.095143 0 6.136986 0C6.388045 0 6.680946 -0.027895 6.945953 -0.027895H8.591781C8.856787 -0.027895 9.149689 0 9.414695 0C9.526276 0 9.679701 0 9.679701 -0.265006C9.679701 -0.404483 9.554172 -0.404483 9.344956 -0.404483C8.494147 -0.404483 8.494147 -0.516065 8.494147 -0.655542C8.494147 -0.669489 8.494147 -0.767123 8.522042 -0.878705L10.432877 -8.508095Z'/>
9+<path id='g2-116' d='M2.803487 -5.606974H4.086675C4.351681 -5.606974 4.491158 -5.606974 4.491158 -5.858032C4.491158 -6.011457 4.407472 -6.011457 4.128518 -6.011457H2.901121L3.417186 -8.047821C3.472976 -8.243088 3.472976 -8.270984 3.472976 -8.368618C3.472976 -8.591781 3.291656 -8.71731 3.110336 -8.71731C2.998755 -8.71731 2.677958 -8.675467 2.566376 -8.229141L2.022416 -6.011457H0.711333C0.432379 -6.011457 0.306849 -6.011457 0.306849 -5.746451C0.306849 -5.606974 0.404483 -5.606974 0.669489 -5.606974H1.910834L0.990286 -1.924782C0.878705 -1.436613 0.836862 -1.297136 0.836862 -1.115816C0.836862 -0.460274 1.297136 0.139477 2.078207 0.139477C3.486924 0.139477 4.2401 -1.896887 4.2401 -1.994521C4.2401 -2.078207 4.184309 -2.12005 4.100623 -2.12005C4.072727 -2.12005 4.016936 -2.12005 3.989041 -2.064259C3.975093 -2.050311 3.961146 -2.036364 3.863512 -1.8132C3.57061 -1.115816 2.929016 -0.139477 2.12005 -0.139477C1.701619 -0.139477 1.673724 -0.488169 1.673724 -0.795019C1.673724 -0.808966 1.673724 -1.073973 1.715567 -1.241345L2.803487 -5.606974Z'/>
10+<path id='g1-105' d='M3.807721 -3.249813C3.87746 -3.417186 3.87746 -3.445081 3.87746 -3.486924S3.87746 -3.556663 3.807721 -3.724035L1.366874 -10.139975C1.283188 -10.377086 1.199502 -10.460772 1.046077 -10.460772S0.767123 -10.335243 0.767123 -10.181818C0.767123 -10.139975 0.767123 -10.11208 0.836862 -9.958655L3.305604 -3.486924L0.836862 2.956912C0.767123 3.110336 0.767123 3.138232 0.767123 3.20797C0.767123 3.361395 0.892653 3.486924 1.046077 3.486924C1.227397 3.486924 1.283188 3.347447 1.338979 3.20797L3.807721 -3.249813Z'/>
11+<path id='g1-106' d='M2.217684 -9.958655C2.217684 -10.209714 2.217684 -10.460772 1.93873 -10.460772S1.659776 -10.209714 1.659776 -9.958655V2.984807C1.659776 3.235866 1.659776 3.486924 1.93873 3.486924S2.217684 3.235866 2.217684 2.984807V-9.958655Z'/>
12+<path id='g3-40' d='M4.533001 3.38929C4.533001 3.347447 4.533001 3.319552 4.29589 3.082441C2.901121 1.673724 2.12005 -0.627646 2.12005 -3.472976C2.12005 -6.178829 2.775592 -8.508095 4.393524 -10.153923C4.533001 -10.279452 4.533001 -10.307347 4.533001 -10.349191C4.533001 -10.432877 4.463263 -10.460772 4.407472 -10.460772C4.226152 -10.460772 3.082441 -9.456538 2.399004 -8.089664C1.687671 -6.680946 1.366874 -5.188543 1.366874 -3.472976C1.366874 -2.231631 1.562142 -0.571856 2.287422 0.920548C3.110336 2.594271 4.254047 3.500872 4.407472 3.500872C4.463263 3.500872 4.533001 3.472976 4.533001 3.38929Z'/>
13+<path id='g3-41' d='M3.93325 -3.472976C3.93325 -4.533001 3.793773 -6.262516 3.012702 -7.880448C2.189788 -9.554172 1.046077 -10.460772 0.892653 -10.460772C0.836862 -10.460772 0.767123 -10.432877 0.767123 -10.349191C0.767123 -10.307347 0.767123 -10.279452 1.004234 -10.042341C2.399004 -8.633624 3.180075 -6.332254 3.180075 -3.486924C3.180075 -0.781071 2.524533 1.548194 0.9066 3.194022C0.767123 3.319552 0.767123 3.347447 0.767123 3.38929C0.767123 3.472976 0.836862 3.500872 0.892653 3.500872C1.073973 3.500872 2.217684 2.496638 2.901121 1.129763C3.612453 -0.292902 3.93325 -1.799253 3.93325 -3.472976Z'/>
14+<path id='g3-61' d='M9.414695 -4.519054C9.609963 -4.519054 9.861021 -4.519054 9.861021 -4.770112C9.861021 -5.035118 9.62391 -5.035118 9.414695 -5.035118H1.199502C1.004234 -5.035118 0.753176 -5.035118 0.753176 -4.78406C0.753176 -4.519054 0.990286 -4.519054 1.199502 -4.519054H9.414695ZM9.414695 -1.924782C9.609963 -1.924782 9.861021 -1.924782 9.861021 -2.175841C9.861021 -2.440847 9.62391 -2.440847 9.414695 -2.440847H1.199502C1.004234 -2.440847 0.753176 -2.440847 0.753176 -2.189788C0.753176 -1.924782 0.990286 -1.924782 1.199502 -1.924782H9.414695Z'/>
15+<path id='g3-94' d='M3.417186 -9.679701L1.590037 -7.782814L1.8132 -7.573599L3.403238 -9.010212L5.007223 -7.573599L5.230386 -7.782814L3.417186 -9.679701Z'/>
16+<path id='g3-105' d='M2.426899 -8.591781C2.426899 -8.954421 2.133998 -9.275218 1.743462 -9.275218C1.380822 -9.275218 1.073973 -8.982316 1.073973 -8.605729C1.073973 -8.187298 1.408717 -7.922291 1.743462 -7.922291C2.175841 -7.922291 2.426899 -8.284932 2.426899 -8.591781ZM0.502117 -5.997509V-5.593026C1.39477 -5.593026 1.520299 -5.50934 1.520299 -4.825903V-1.03213C1.520299 -0.404483 1.366874 -0.404483 0.460274 -0.404483V0C0.850809 -0.027895 1.520299 -0.027895 1.924782 -0.027895C2.078207 -0.027895 2.887173 -0.027895 3.361395 0V-0.404483C2.454795 -0.404483 2.399004 -0.474222 2.399004 -1.018182V-6.150934L0.502117 -5.997509Z'/>
17+<path id='g0-126' d='M3.556663 -7.671233H6.262516C6.499626 -7.671233 6.653051 -7.671233 6.653051 -7.838605C6.653051 -8.019925 6.485679 -8.019925 6.220672 -8.019925H3.640349C3.737983 -8.368618 3.737983 -8.396513 3.821669 -8.745205C3.891407 -8.996264 4.016936 -9.484433 4.016936 -9.512329C4.016936 -9.637858 3.93325 -9.679701 3.821669 -9.679701C3.556663 -9.679701 2.454795 -9.56812 2.12005 -9.540224C2.008468 -9.526276 1.855044 -9.512329 1.855044 -9.247323C1.855044 -9.093898 1.994521 -9.093898 2.189788 -9.093898C2.859278 -9.093898 2.887173 -8.996264 2.887173 -8.856787C2.887173 -8.759153 2.761644 -8.298879 2.691905 -8.019925H1.910834C1.63188 -8.019925 1.478456 -8.019925 1.478456 -7.838605C1.478456 -7.671233 1.603985 -7.671233 1.868991 -7.671233H2.608219L0.822914 -0.557908C0.767123 -0.348692 0.767123 -0.320797 0.767123 -0.237111C0.767123 0.069738 1.004234 0.153425 1.171606 0.153425C1.436613 0.153425 1.63188 -0.041843 1.687671 -0.223163C1.715567 -0.292902 1.868991 -0.920548 1.952677 -1.26924L2.273474 -2.510585C2.315318 -2.719801 2.454795 -3.249813 2.496638 -3.459029C2.566376 -3.682192 2.66401 -4.11457 2.677958 -4.156413C2.789539 -4.393524 3.542715 -5.858032 4.937484 -5.858032C5.551183 -5.858032 5.69066 -5.355915 5.69066 -4.895641C5.69066 -4.030884 5.049066 -2.329265 4.798007 -1.687671C4.714321 -1.464508 4.644583 -1.26924 4.644583 -1.004234C4.644583 -0.278954 5.160648 0.153425 5.788294 0.153425C7.127273 0.153425 7.615442 -1.910834 7.615442 -1.994521C7.615442 -2.133998 7.489913 -2.133998 7.44807 -2.133998C7.308593 -2.133998 7.308593 -2.092154 7.238854 -1.882939C6.834371 -0.460274 6.206725 -0.153425 5.830137 -0.153425C5.565131 -0.153425 5.481445 -0.320797 5.481445 -0.613699C5.481445 -0.962391 5.634869 -1.352927 5.718555 -1.590037C5.955666 -2.203736 6.583313 -3.87746 6.583313 -4.658531C6.583313 -5.676712 5.941719 -6.164882 4.979328 -6.164882C4.546949 -6.164882 3.710087 -6.067248 2.915068 -5.104857L3.556663 -7.671233Z'/>
18+</defs>
19+<g id='page1'>
20+<use x='165.981071' y='97.429622' xlink:href='#g3-105'/>
21+<use x='169.774676' y='97.429622' xlink:href='#g0-126'/>
22+<use x='180.971707' y='87.993906' xlink:href='#g2-64'/>
23+<rect x='178.505856' y='93.663745' height='0.55789' width='12.899852'/>
24+<use x='178.505856' y='106.997046' xlink:href='#g2-64'/>
25+<use x='186.474036' y='106.997046' xlink:href='#g2-116'/>
26+<use x='192.601222' y='97.429622' xlink:href='#g1-106'/>
27+<use x='198.80019' y='97.429622' xlink:href='#g2-32'/>
28+<use x='208.179277' y='97.429622' xlink:href='#g3-40'/>
29+<use x='213.490324' y='97.429622' xlink:href='#g2-116'/>
30+<use x='218.42201' y='97.429622' xlink:href='#g3-41'/>
31+<use x='223.733057' y='97.429622' xlink:href='#g1-105'/>
32+<use x='233.031506' y='97.429622' xlink:href='#g3-61'/>
33+<use x='251.068923' y='93.903964' xlink:href='#g3-94'/>
34+<use x='247.527926' y='97.429622' xlink:href='#g2-72'/>
35+<use x='259.920966' y='97.429622' xlink:href='#g1-106'/>
36+<use x='266.119934' y='97.429622' xlink:href='#g2-32'/>
37+<use x='275.499021' y='97.429622' xlink:href='#g3-40'/>
38+<use x='280.810068' y='97.429622' xlink:href='#g2-116'/>
39+<use x='285.741754' y='97.429622' xlink:href='#g3-41'/>
40+<use x='291.052801' y='97.429622' xlink:href='#g1-105'/>
41+<use x='296.476924' y='97.429622' xlink:href='#g2-58'/>
42+</g>
43+</svg>
_sources/admin/architecture.rst.txt+9−5
@@ -4,17 +4,21 @@
44Architecture
55============
66
7−.. sidebar:: Needs work!
7+.. sidebar:: Further reading
88
9− This article needs some work / Searx is a collaborative effort. If you have
10− any contribution, feel welcome to send us your :pull:`PR <../pulls>`, see
11− :ref:`how to contribute`.
9+ - Reverse Proxy: :ref:`Apache <apache searx site>` & :ref:`nginx <nginx searx
10+ site>`
11+ - Filtron: :ref:`searx filtron`
12+ - Morty: :ref:`searx morty`
13+ - uWSGI: :ref:`searx uwsgi`
14+ - Searx: :ref:`installation basic`
1215
1316Herein you will find some hints and suggestions about typical architectures of
1417searx infrastructures.
1518
1619We start with a contribution from :pull:`@dalf <1776#issuecomment-567917320>`.
17−It shows a *reference* setup for public searx instances.
20+It shows a *reference* setup for public searx instances which can build up and
21+maintained by the scripts from our :ref:`toolboxing`.
1822
1923.. _arch public:
2024
_sources/admin/buildhosts.rst.txt+63−11
@@ -9,8 +9,27 @@ Buildhosts
99 If you have any contribution send us your :pull:`PR <../pulls>`, see
1010 :ref:`how to contribute`.
1111
12+.. contents:: Contents
13+ :depth: 2
14+ :local:
15+ :backlinks: entry
16+
1217To get best results from build, its recommend to install additional packages
13−on build hosts.
18+on build hosts (see :ref:`searx.sh`).::
19+
20+ sudo -H ./utils/searx.sh install buildhost
21+
22+This will install packages needed by searx:
23+
24+.. kernel-include:: $DOCS_BUILD/includes/searx.rst
25+ :start-after: START distro-packages
26+ :end-before: END distro-packages
27+
28+and packages needed to build docuemtation and run tests:
29+
30+.. kernel-include:: $DOCS_BUILD/includes/searx.rst
31+ :start-after: START build-packages
32+ :end-before: END build-packages
1433
1534.. _docs build:
1635
@@ -35,8 +54,17 @@ processing additional packages are needed. The XeTeX_ needed not only for PDF
3554creation, its also needed for :ref:`math` when HTML output is build.
3655
3756To be able to do :ref:`sphinx:math-support` without CDNs, the math are rendered
38−as images (``sphinx.ext.imgmath`` extension). If your docs build (``make
39−docs``) shows warnings like this::
57+as images (``sphinx.ext.imgmath`` extension).
58+
59+Here is the extract from the :origin:`docs/conf.py` file, setting math renderer
60+to ``imgmath``:
61+
62+.. literalinclude:: ../conf.py
63+ :language: python
64+ :start-after: # sphinx.ext.imgmath setup
65+ :end-before: # sphinx.ext.imgmath setup END
66+
67+If your docs build (``make docs``) shows warnings like this::
4068
4169 WARNING: dot(1) not found, for better output quality install \
4270 graphviz from http://www.graphviz.org
@@ -47,8 +75,6 @@ docs``) shows warnings like this::
4775you need to install additional packages on your build host, to get better HTML
4876output.
4977
50−.. _system requirements:
51−
5278.. tabs::
5379
5480 .. group-tab:: Ubuntu / debian
@@ -92,12 +118,38 @@ For PDF output you also need:
92118
93119 $ sudo dnf install \
94120 texlive-collection-fontsrecommended texlive-collection-latex \
95− dejavu-sans-fonts dejavu-serif-fonts dejavu-sans-mono-fonts
121+ dejavu-sans-fonts dejavu-serif-fonts dejavu-sans-mono-fonts \
122+ ImageMagick
96123
97−.. _system requirements END:
124+.. _sh lint:
98125
99−.. literalinclude:: ../conf.py
100− :language: python
101− :start-after: # sphinx.ext.imgmath setup
102− :end-before: # sphinx.ext.imgmath setup END
126+Lint shell scripts
127+==================
128+
129+.. _ShellCheck: https://github.com/koalaman/shellcheck
130+
131+To lint shell scripts, we use ShellCheck_ - A shell script static analysis tool.
132+
133+.. SNIP sh lint requirements
134+
135+.. tabs::
136+
137+ .. group-tab:: Ubuntu / debian
138+
139+ .. code-block:: sh
140+
141+ $ sudo apt install shellcheck
142+
143+ .. group-tab:: Arch Linux
144+
145+ .. code-block:: sh
146+
147+ $ sudo pacman -S shellcheck
148+
149+ .. group-tab:: Fedora / RHEL
150+
151+ .. code-block:: sh
152+
153+ $ sudo dnf install ShellCheck
103154
155+.. SNAP sh lint requirements
_sources/admin/engines.rst.txt+4
@@ -26,6 +26,8 @@ Safe search **SS**
2626Weigth **W**
2727------------- ----------- ---------------------------------
2828Disabled **D**
29+------------- ----------- ---------------------------------
30+Show errors **DE**
2931============= =========== =================================
3032
3133Configuration defaults (at built time):
@@ -51,6 +53,7 @@ Configuration defaults (at built time):
5153 - O
5254 - W
5355 - D
56+ - DE
5457
5558 {% for name, mod in engines.items() %}
5659
@@ -67,5 +70,6 @@ Configuration defaults (at built time):
6770 - {{(mod.offline and "y") or ""}}
6871 - {{mod.weight or 1 }}
6972 - {{(mod.disabled and "y") or ""}}
73+ - {{(mod.display_error_messages and "y") or ""}}
7074
7175 {% endfor %}
_sources/admin/filtron.rst.txt+145−102
@@ -1,18 +1,51 @@
1+
2+.. _searx filtron:
3+
14==========================
25How to protect an instance
36==========================
47
5−Searx depens on external search services. To avoid the abuse of these services
8+.. sidebar:: further reading
9+
10+ - :ref:`filtron.sh`
11+ - :ref:`nginx searx site`
12+
13+
14+.. contents:: Contents
15+ :depth: 2
16+ :local:
17+ :backlinks: entry
18+
19+.. _filtron: https://github.com/asciimoo/filtron
20+
21+Searx depends on external search services. To avoid the abuse of these services
622it is advised to limit the number of requests processed by searx.
723
8−An application firewall, ``filtron`` solves exactly this problem. Information
9−on how to install it can be found at the `project page of filtron
10−<https://github.com/asciimoo/filtron>`__.
24+An application firewall, filtron_ solves exactly this problem. Filtron is just
25+a middleware between your web server (nginx, apache, ...) and searx, we describe
26+such infratructures in chapter: :ref:`architecture`.
1127
1228
29+filtron & go
30+============
31+
32+.. _Go: https://golang.org/
33+.. _filtron README: https://github.com/asciimoo/filtron/blob/master/README.md
34+
35+Filtron needs Go_ installed. If Go_ is preinstalled, filtron_ is simply
36+installed by ``go get`` package management (see `filtron README`_). If you use
37+filtron as middleware, a more isolated setup is recommended. To simplify such
38+an installation and the maintenance of, use our script :ref:`filtron.sh`.
39+
40+.. _Sample configuration of filtron:
41+
1342Sample configuration of filtron
1443===============================
1544
45+.. sidebar:: Tooling box
46+
47+ - :origin:`/etc/filtron/rules.json <utils/templates/etc/filtron/rules.json>`
48+
1649An example configuration can be find below. This configuration limits the access
1750of:
1851
@@ -24,105 +57,104 @@ of:
2457
2558.. code:: json
2659
27− [{
28− "name":"search request",
29− "filters":[
30− "Param:q",
31− "Path=^(/|/search)$"
32− ],
33− "interval":"<time-interval-in-sec (int)>",
34− "limit":"<max-request-number-in-interval (int)>",
35− "subrules":[
36− {
37− "name":"roboagent limit",
38− "interval":"<time-interval-in-sec (int)>",
39− "limit":"<max-request-number-in-interval (int)>",
40− "filters":[
41− "Header:User-Agent=(curl|cURL|Wget|python-requests|Scrapy|FeedFetcher|Go-http-client)"
42− ],
43− "actions":[
44− {
45− "name":"block",
46− "params":{
47− "message":"Rate limit exceeded"
48− }
49− }
50− ]
51− },
52− {
53− "name":"botlimit",
54− "limit":0,
55− "stop":true,
56− "filters":[
57− "Header:User-Agent=(Googlebot|bingbot|Baiduspider|yacybot|YandexMobileBot|YandexBot|Yahoo! Slurp|MJ12bot|AhrefsBot|archive.org_bot|msnbot|MJ12bot|SeznamBot|linkdexbot|Netvibes|SMTBot|zgrab|James BOT)"
58− ],
59− "actions":[
60− {
61− "name":"block",
62− "params":{
63− "message":"Rate limit exceeded"
64− }
65− }
66− ]
67− },
68− {
69− "name":"IP limit",
70− "interval":"<time-interval-in-sec (int)>",
71− "limit":"<max-request-number-in-interval (int)>",
72− "stop":true,
73− "aggregations":[
74− "Header:X-Forwarded-For"
75− ],
76− "actions":[
77− {
78− "name":"block",
79− "params":{
80− "message":"Rate limit exceeded"
81− }
82− }
83− ]
84− },
85− {
86− "name":"rss/json limit",
87− "interval":"<time-interval-in-sec (int)>",
88− "limit":"<max-request-number-in-interval (int)>",
89− "stop":true,
90− "filters":[
91− "Param:format=(csv|json|rss)"
92− ],
93− "actions":[
94− {
95− "name":"block",
96− "params":{
97− "message":"Rate limit exceeded"
98− }
99− }
100− ]
101− },
102− {
103− "name":"useragent limit",
104− "interval":"<time-interval-in-sec (int)>",
105− "limit":"<max-request-number-in-interval (int)>",
106− "aggregations":[
107− "Header:User-Agent"
60+ [
61+ {
62+ "name": "search request",
63+ "filters": [
64+ "Param:q",
65+ "Path=^(/|/search)$"
10866 ],
109− "actions":[
110− {
111− "name":"block",
112− "params":{
113− "message":"Rate limit exceeded"
114− }
115− }
67+ "interval": "<time-interval-in-sec (int)>"
68+ "limit": "<max-request-number-in-interval (int)>",
69+ "subrules": [
70+ {
71+ "name": "missing Accept-Language",
72+ "filters": ["!Header:Accept-Language"],
73+ "limit": "<max-request-number-in-interval (int)>",
74+ "stop": true,
75+ "actions": [
76+ {"name":"log"},
77+ {"name": "block",
78+ "params": {"message": "Rate limit exceeded"}}
79+ ]
80+ },
81+ {
82+ "name": "suspiciously Connection=close header",
83+ "filters": ["Header:Connection=close"],
84+ "limit": "<max-request-number-in-interval (int)>",
85+ "stop": true,
86+ "actions": [
87+ {"name":"log"},
88+ {"name": "block",
89+ "params": {"message": "Rate limit exceeded"}}
90+ ]
91+ },
92+ {
93+ "name": "IP limit",
94+ "interval": "<time-interval-in-sec (int)>"
95+ "limit": "<max-request-number-in-interval (int)>",
96+ "stop": true,
97+ "aggregations": [
98+ "Header:X-Forwarded-For"
99+ ],
100+ "actions": [
101+ { "name": "log"},
102+ { "name": "block",
103+ "params": {
104+ "message": "Rate limit exceeded"
105+ }
106+ }
107+ ]
108+ },
109+ {
110+ "name": "rss/json limit",
111+ "filters": [
112+ "Param:format=(csv|json|rss)"
113+ ],
114+ "interval": "<time-interval-in-sec (int)>"
115+ "limit": "<max-request-number-in-interval (int)>",
116+ "stop": true,
117+ "actions": [
118+ { "name": "log"},
119+ { "name": "block",
120+ "params": {
121+ "message": "Rate limit exceeded"
122+ }
123+ }
124+ ]
125+ },
126+ {
127+ "name": "useragent limit",
128+ "interval": "<time-interval-in-sec (int)>"
129+ "limit": "<max-request-number-in-interval (int)>",
130+ "aggregations": [
131+ "Header:User-Agent"
132+ ],
133+ "actions": [
134+ { "name": "log"},
135+ { "name": "block",
136+ "params": {
137+ "message": "Rate limit exceeded"
138+ }
139+ }
140+ ]
141+ }
116142 ]
117− }
118− ]
119− }]
143+ }
144+ ]
120145
121146
147+.. _filtron route request:
122148
123149Route request through filtron
124150=============================
125151
152+.. sidebar:: further reading
153+
154+ - :ref:`filtron.sh overview`
155+ - :ref:`installation nginx`
156+ - :ref:`installation apache`
157+
126158Filtron can be started using the following command:
127159
128160.. code:: sh
@@ -136,13 +168,24 @@ Use it along with ``nginx`` with the following example configuration.
136168
137169.. code:: nginx
138170
139− location / {
140− proxy_set_header Host $http_host;
141− proxy_set_header X-Real-IP $remote_addr;
142− proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
143− proxy_set_header X-Scheme $scheme;
144− proxy_pass http://127.0.0.1:4004/;
171+ # https://example.org/searx
172+
173+ location /searx {
174+ proxy_pass http://127.0.0.1:4004/;
175+
176+ proxy_set_header Host $http_host;
177+ proxy_set_header Connection $http_connection;
178+ proxy_set_header X-Real-IP $remote_addr;
179+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
180+ proxy_set_header X-Scheme $scheme;
181+ proxy_set_header X-Script-Name /searx;
145182 }
146183
184+ location /searx/static {
185+ /usr/local/searx/searx-src/searx/static;
186+ }
187+
188+
147189Requests are coming from port 4004 going through filtron and then forwarded to
148−port 8888 where a searx is being run.
190+port 8888 where a searx is being run. For a complete setup see: :ref:`nginx
191+searx site`.
_sources/admin/index.rst.txt+8−1
@@ -3,9 +3,16 @@ Administrator documentation
33===========================
44
55.. toctree::
6− :maxdepth: 1
6+ :maxdepth: 2
7+ :caption: Contents
78
89 installation
10+ installation-searx
11+ installation-uwsgi
12+ installation-nginx
13+ installation-apache
14+ installation-docker
15+ update-searx
916 settings
1017 api
1118 architecture
_sources/admin/installation-apache.rst.txtnew file+514
@@ -0,0 +1,514 @@
1+.. _installation apache:
2+
3+===================
4+Install with apache
5+===================
6+
7+.. _Apache: https://httpd.apache.org/
8+.. _Apache Debian:
9+ https://cwiki.apache.org/confluence/display/HTTPD/DistrosDefaultLayout#DistrosDefaultLayout-Debian,Ubuntu(Apachehttpd2.x):
10+.. _README.Debian:
11+ https://salsa.debian.org/apache-team/apache2/raw/master/debian/apache2.README.Debian
12+.. _Apache Arch Linux:
13+ https://wiki.archlinux.org/index.php/Apache_HTTP_Server
14+.. _Apache Fedora:
15+ https://docs.fedoraproject.org/en-US/quick-docs/getting-started-with-apache-http-server/index.html
16+.. _Apache directives:
17+ https://httpd.apache.org/docs/trunk/mod/directives.html
18+.. _Getting Started:
19+ https://httpd.apache.org/docs/current/en/getting-started.html
20+.. _Terms Used to Describe Directives:
21+ https://httpd.apache.org/docs/current/en/mod/directive-dict.html
22+.. _Configuration Files:
23+ https://httpd.apache.org/docs/current/en/configuring.html
24+.. _ProxyPreserveHost: https://httpd.apache.org/docs/trunk/mod/mod_proxy.html#proxypreservehost
25+.. _LoadModule:
26+ https://httpd.apache.org/docs/2.4/mod/mod_so.html#loadmodule
27+.. _DocumentRoot:
28+ https://httpd.apache.org/docs/trunk/mod/core.html#documentroot
29+.. _Location:
30+ https://httpd.apache.org/docs/trunk/mod/core.html#location
31+.. _uWSGI Apache support:
32+ https://uwsgi-docs.readthedocs.io/en/latest/Apache.html
33+.. _mod_proxy_uwsgi:
34+ https://uwsgi-docs.readthedocs.io/en/latest/Apache.html#mod-proxy-uwsgi
35+
36+.. sidebar:: further read
37+
38+ - `Apache Arch Linux`_
39+ - `Apache Debian`_ and `README.Debian`_
40+ - `Apache Fedora`_
41+ - `Apache directives`_
42+
43+.. contents:: Contents
44+ :depth: 2
45+ :local:
46+ :backlinks: entry
47+
48+----
49+
50+**Install** :ref:`apache searx site` using :ref:`filtron.sh <filtron.sh overview>`
51+
52+.. code:: bash
53+
54+ $ sudo -H ./utils/filtron.sh apache install
55+
56+**Install** :ref:`apache searx site` using :ref:`morty.sh <morty.sh overview>`
57+
58+.. code:: bash
59+
60+ $ sudo -H ./utils/morty.sh apache install
61+
62+----
63+
64+The apache HTTP server
65+======================
66+
67+If Apache_ is not installed, install it now. If apache_ is new to you, the
68+`Getting Started`_, `Configuration Files`_ and `Terms Used to Describe
69+Directives`_ documentation gives first orientation. There is also a list of
70+`Apache directives`_ *to keep in the pocket*.
71+
72+.. tabs::
73+
74+ .. group-tab:: Ubuntu / debian
75+
76+ .. code:: sh
77+
78+ sudo -H apt-get install apache2
79+
80+ .. group-tab:: Arch Linux
81+
82+ .. code:: sh
83+
84+ sudo -H pacman -S apache
85+ sudo -H systemctl enable httpd
86+ sudo -H systemctl start http
87+
88+ .. group-tab:: Fedora / RHEL
89+
90+ .. code:: sh
91+
92+ sudo -H dnf install httpd
93+ sudo -H systemctl enable httpd
94+ sudo -H systemctl start httpd
95+
96+Now at http://localhost you should see any kind of *Welcome* or *Test* page.
97+How this default intro site is configured, depends on the linux distribution
98+(compare `Apache directives`_).
99+
100+.. tabs::
101+
102+ .. group-tab:: Ubuntu / debian
103+
104+ .. code:: sh
105+
106+ less /etc/apache2/sites-enabled/000-default.conf
107+
108+ In this file, there is a line setting the `DocumentRoot`_ directive:
109+
110+ .. code:: apache
111+
112+ DocumentRoot /var/www/html
113+
114+ And the *welcome* page is the HTML file at ``/var/www/html/index.html``.
115+
116+ .. group-tab:: Arch Linux
117+
118+ .. code:: sh
119+
120+ less /etc/httpd/conf/httpd.conf
121+
122+ In this file, there is a line setting the `DocumentRoot`_ directive:
123+
124+ .. code:: apache
125+
126+ DocumentRoot "/srv/http"
127+ <Directory "/srv/http">
128+ Options Indexes FollowSymLinks
129+ AllowOverride None
130+ Require all granted
131+ </Directory>
132+
133+ The *welcome* page of Arch Linux is a page showing directory located at
134+ ``DocumentRoot``. This is *directory* page is generated by the Module
135+ `mod_autoindex <https://httpd.apache.org/docs/2.4/mod/mod_autoindex.html>`_:
136+
137+ .. code:: apache
138+
139+ LoadModule autoindex_module modules/mod_autoindex.so
140+ ...
141+ Include conf/extra/httpd-autoindex.conf
142+
143+ .. group-tab:: Fedora / RHEL
144+
145+ .. code:: sh
146+
147+ less /etc/httpd/conf/httpd.conf
148+
149+ In this file, there is a line setting the ``DocumentRoot`` directive:
150+
151+ .. code:: apache
152+
153+ DocumentRoot "/var/www/html"
154+ ...
155+ <Directory "/var/www">
156+ AllowOverride None
157+ # Allow open access:
158+ Require all granted
159+ </Directory>
160+
161+ On fresh installations, the ``/var/www`` is empty and the *default
162+ welcome page* is shown, the configuration is located at::
163+
164+ less /etc/httpd/conf.d/welcome.conf
165+
166+.. _apache searx site:
167+
168+Apache Reverse Proxy
169+====================
170+
171+.. sidebar:: public to the internet?
172+
173+ If your searx instance is public, stop here and first install :ref:`filtron
174+ reverse proxy <filtron.sh>` and :ref:`result proxy morty <morty.sh>`, see
175+ :ref:`installation scripts`. If already done, follow setup: *searx via
176+ filtron plus morty*.
177+
178+To setup a Apache revers proxy you have to enable the *headers* and *proxy*
179+modules and create a `Location`_ configuration for the searx site. In most
180+distributions you have to un-comment the lines in the main configuration file,
181+except in :ref:`The Debian Layout`.
182+
183+To pass the HTTP HOST header
184+With ProxyPreserveHost_ the incoming Host HTTP request header is passed to the
185+proxied host.
186+
187+.. tabs::
188+
189+ .. group-tab:: Ubuntu / debian
190+
191+ In the Apache setup, enable headers and proxy modules:
192+
193+ .. code:: sh
194+
195+ sudo -H a2enmod headers
196+ sudo -H a2enmod proxy
197+ sudo -H a2enmod proxy_http
198+
199+ In :ref:`The Debian Layout` you create a ``searx.conf`` with the
200+ ``<Location /searx >`` directive and save this file in the *sites
201+ available* folder at ``/etc/apache2/sites-available``. To enable the
202+ ``searx.conf`` use :man:`a2ensite`:
203+
204+ .. code:: sh
205+
206+ sudo -H a2ensite searx.conf
207+
208+ .. group-tab:: Arch Linux
209+
210+ In the ``/etc/httpd/conf/httpd.conf`` file, activate headers and proxy
211+ modules (LoadModule_):
212+
213+ .. code:: apache
214+
215+ FIXME needs test
216+
217+ LoadModule headers_module modules/mod_headers.so
218+ LoadModule proxy_module modules/mod_proxy.so
219+ LoadModule proxy_http_module modules/mod_proxy_http.so
220+
221+ .. group-tab:: Fedora / RHEL
222+
223+ In the ``/etc/httpd/conf/httpd.conf`` file, activate headers and proxy
224+ modules (LoadModule_):
225+
226+ .. code:: apache
227+
228+ FIXME needs test
229+
230+ LoadModule headers_module modules/mod_headers.so
231+ LoadModule proxy_module modules/mod_proxy.so
232+ LoadModule proxy_http_module modules/mod_proxy_http.so
233+
234+.. tabs::
235+
236+ .. group-tab:: searx via filtron plus morty
237+
238+ Use this setup, if your instance is public to the internet, compare
239+ figure: :ref:`architecture <arch public>` and :ref:`installation scripts`.
240+
241+ 1. Configure a reverse proxy for :ref:`filtron <filtron.sh>`, listening on
242+ *localhost 4004* (:ref:`filtron route request`):
243+
244+ .. code:: apache
245+
246+ <Location /searx >
247+
248+ # SetEnvIf Request_URI "/searx" dontlog
249+ # CustomLog /dev/null combined env=dontlog
250+
251+ Require all granted
252+
253+ Order deny,allow
254+ Deny from all
255+ #Allow from fd00::/8 192.168.0.0/16 fe80::/10 127.0.0.0/8 ::1
256+ Allow from all
257+
258+ ProxyPreserveHost On
259+ ProxyPass http://127.0.0.1:4004
260+ RequestHeader set X-Script-Name /searx
261+
262+ </Location>
263+
264+ 2. Configure reverse proxy for :ref:`morty <searx morty>`, listening on
265+ *localhost 3000*
266+
267+ .. code:: apache
268+
269+ ProxyPreserveHost On
270+
271+ <Location /morty >
272+
273+ # SetEnvIf Request_URI "/morty" dontlog
274+ # CustomLog /dev/null combined env=dontlog
275+
276+ Require all granted
277+
278+ Order deny,allow
279+ Deny from all
280+ #Allow from fd00::/8 192.168.0.0/16 fe80::/10 127.0.0.0/8 ::1
281+ Allow from all
282+
283+ ProxyPass http://127.0.0.1:3000
284+ RequestHeader set X-Script-Name /morty
285+
286+ </Location>
287+
288+ Note that reverse proxy advised to be used in case of single-user or
289+ low-traffic instances. For a fully result proxification add :ref:`morty's
290+ <searx morty>` **public URL** to your :origin:`searx/settings.yml`:
291+
292+ .. code:: yaml
293+
294+ result_proxy:
295+ # replace example.org with your server's public name
296+ url : https://example.org/morty
297+
298+ server:
299+ image_proxy : True
300+
301+uWSGI support
302+=============
303+
304+Be warned, with this setup, your instance isn't :ref:`protected <searx
305+filtron>`, nevertheless it is good enough for intranet usage. In modern Linux
306+distributions, the `mod_proxy_uwsgi`_ is compiled into the *normal* apache
307+package and you need to install only the :ref:`uWSGI <searx uwsgi>` package:
308+
309+.. tabs::
310+
311+ .. group-tab:: Ubuntu / debian
312+
313+ .. code:: sh
314+
315+ sudo -H apt-get install uwsgi
316+
317+ # Ubuntu =< 18.04
318+ sudo -H apt-get install libapache2-mod-proxy-uwsgi
319+
320+ .. group-tab:: Arch Linux
321+
322+ .. code:: sh
323+
324+ sudo -H pacman -S uwsgi
325+
326+ .. group-tab:: Fedora / RHEL
327+
328+ .. code:: sh
329+
330+ sudo -H dnf install uwsgi
331+
332+The next example shows a configuration using the `uWSGI Apache support`_ via
333+unix sockets and `mod_proxy_uwsgi`_.
334+
335+For socket communication, you have to activate ``socket =
336+/run/uwsgi/app/searx/socket`` and comment out the ``http = 127.0.0.1:8888``
337+configuration in your :ref:`uwsgi ini file <uwsgi configuration>`. If not
338+already exists, create a folder for the unix sockets, which can be used by the
339+searx account (see :ref:`create searx user`):
340+
341+.. code:: bash
342+
343+ sudo -H mkdir -p /run/uwsgi/app/searx/
344+ sudo -H chown -R searx:searx /run/uwsgi/app/searx/
345+
346+If the server is public; to limit access to your intranet replace ``Allow from
347+all`` directive and replace ``192.168.0.0/16`` with your subnet IP/class.
348+
349+.. tabs::
350+
351+ .. group-tab:: Ubuntu / debian
352+
353+ .. code:: apache
354+
355+ LoadModule headers_module /usr/lib/apache2/mod_headers.so
356+ LoadModule proxy_module /usr/lib/apache2/modules/mod_proxy.so
357+ LoadModule proxy_uwsgi_module /usr/lib/apache2/modules/mod_proxy_uwsgi.so
358+
359+ # SetEnvIf Request_URI /searx dontlog
360+ # CustomLog /dev/null combined env=dontlog
361+
362+ <Location /searx>
363+
364+ Require all granted
365+ Order deny,allow
366+ Deny from all
367+ # Allow from fd00::/8 192.168.0.0/16 fe80::/10 127.0.0.0/8 ::1
368+ Allow from all
369+
370+ ProxyPreserveHost On
371+ ProxyPass unix:/run/uwsgi/app/searx/socket|uwsgi://uwsgi-uds-searx/
372+
373+ </Location>
374+
375+ .. group-tab:: Arch Linux
376+
377+ .. code:: apache
378+
379+ FIXME needs test
380+
381+ LoadModule proxy_module modules/mod_proxy.so
382+ LoadModule proxy_uwsgi_module modules/mod_proxy_uwsgi.so
383+
384+ # SetEnvIf Request_URI /searx dontlog
385+ # CustomLog /dev/null combined env=dontlog
386+
387+ <Location /searx>
388+
389+ Require all granted
390+ Order deny,allow
391+ Deny from all
392+ # Allow from fd00::/8 192.168.0.0/16 fe80::/10 127.0.0.0/8 ::1
393+ Allow from all
394+
395+ ProxyPreserveHost On
396+ ProxyPass unix:/run/uwsgi/app/searx/socket|uwsgi://uwsgi-uds-searx/
397+
398+ </Location>
399+
400+ .. group-tab:: Fedora / RHEL
401+
402+ .. code:: apache
403+
404+ FIXME needs test
405+
406+ LoadModule proxy_module modules/mod_proxy.so
407+ LoadModule proxy_uwsgi_module modules/mod_proxy_uwsgi.so
408+ <IfModule proxy_uwsgi_module>
409+
410+ # SetEnvIf Request_URI /searx dontlog
411+ # CustomLog /dev/null combined env=dontlog
412+
413+ <Location /searx>
414+
415+ Require all granted
416+ Order deny,allow
417+ Deny from all
418+ # Allow from fd00::/8 192.168.0.0/16 fe80::/10 127.0.0.0/8 ::1
419+ Allow from all
420+
421+ ProxyPreserveHost On
422+ ProxyPass unix:/run/uwsgi/app/searx/socket|uwsgi://uwsgi-uds-searx/
423+
424+ </Location>
425+
426+ </IfModule>
427+
428+ .. group-tab:: old mod_wsgi
429+
430+ We show this only for historical reasons, DON'T USE `mod_uwsgi
431+ <https://uwsgi-docs.readthedocs.io/en/latest/Apache.html#mod-uwsgi>`_.
432+ ANYMORE!
433+
434+ .. code:: apache
435+
436+ <IfModule mod_uwsgi.c>
437+
438+ # SetEnvIf Request_URI "/searx" dontlog
439+ # CustomLog /dev/null combined env=dontlog
440+
441+ <Location /searx >
442+
443+ Require all granted
444+
445+ Options FollowSymLinks Indexes
446+ SetHandler uwsgi-handler
447+ uWSGISocket /run/uwsgi/app/searx/socket
448+
449+ Order deny,allow
450+ Deny from all
451+ # Allow from fd00::/8 192.168.0.0/16 fe80::/10 127.0.0.0/8 ::1
452+ Allow from all
453+
454+ </Location>
455+
456+ </IfModule>
457+
458+.. _restart apache:
459+
460+Restart service
461+===============
462+
463+.. tabs::
464+
465+ .. group-tab:: Ubuntu / debian
466+
467+ .. code:: sh
468+
469+ sudo -H systemctl restart apache2
470+ sudo -H service uwsgi restart searx
471+
472+ .. group-tab:: Arch Linux
473+
474+ .. code:: sh
475+
476+ sudo -H systemctl restart httpd
477+ sudo -H systemctl restart uwsgi@searx
478+
479+ .. group-tab:: Fedora / RHEL
480+
481+ .. code:: sh
482+
483+ sudo -H systemctl restart httpd
484+ sudo -H touch /etc/uwsgi.d/searx.ini
485+
486+
487+disable logs
488+============
489+
490+For better privacy you can disable Apache logs. In the examples above activate
491+one of the lines and `restart apache`_::
492+
493+
494+ # SetEnvIf Request_URI "/searx" dontlog
495+ # CustomLog /dev/null combined env=dontlog
496+
497+The ``CustomLog`` directive disable logs for the whole (virtual) server, use it
498+when the URL of the service does not have a path component (``/searx``) / is
499+located at root (``/``).
500+
501+.. _The Debian Layout:
502+
503+The Debian Layout
504+=================
505+
506+Be aware that the Debian layout is quite different from the standard Apache
507+configuration. For details look at the README.Debian_
508+(``/usr/share/doc/apache2/README.Debian.gz``). Some commands you should know on
509+Debian:
510+
511+* :man:`apache2ctl`: Apache HTTP server control interface
512+* :man:`a2enmod`, :man:`a2dismod`: switch on/off modules
513+* :man:`a2enconf`, :man:`a2disconf`: switch on/off configurations
514+* :man:`a2ensite`, :man:`a2dissite`: switch on/off sites
_sources/admin/installation-docker.rst.txtnew file+28
@@ -0,0 +1,28 @@
1+.. _installation docker:
2+
3+===================
4+Docker installation
5+===================
6+
7+.. contents:: Contents
8+ :depth: 2
9+ :local:
10+ :backlinks: entry
11+
12+Make sure you have installed Docker. For instance, you can deploy searx like this:
13+
14+.. code:: sh
15+
16+ docker pull wonderfall/searx
17+ docker run -d --name searx -p $PORT:8888 wonderfall/searx
18+
19+Go to ``http://localhost:$PORT``.
20+
21+See https://hub.docker.com/r/wonderfall/searx/ for more informations. It's also
22+possible to build searx from the embedded Dockerfile.
23+
24+.. code:: sh
25+
26+ git clone https://github.com/asciimoo/searx.git
27+ cd searx
28+ docker build -t whatever/searx .
_sources/admin/installation-nginx.rst.txtnew file+381
@@ -0,0 +1,381 @@
1+.. _installation nginx:
2+
3+==================
4+Install with nginx
5+==================
6+
7+.. _nginx:
8+ https://docs.nginx.com/nginx/admin-guide/
9+.. _nginx server configuration:
10+ https://docs.nginx.com/nginx/admin-guide/web-server/web-server/#setting-up-virtual-servers
11+.. _nginx beginners guide:
12+ http://nginx.org/en/docs/beginners_guide.html
13+.. _Getting Started wiki:
14+ https://www.nginx.com/resources/wiki/start/
15+.. _uWSGI support from nginx:
16+ https://uwsgi-docs.readthedocs.io/en/latest/Nginx.html
17+.. _uwsgi_params:
18+ https://uwsgi-docs.readthedocs.io/en/latest/Nginx.html#configuring-nginx
19+.. _SCRIPT_NAME:
20+ https://werkzeug.palletsprojects.com/en/1.0.x/wsgi/#werkzeug.wsgi.get_script_name
21+
22+.. sidebar:: further reading
23+
24+ - nginx_
25+ - `nginx beginners guide`_
26+ - `nginx server configuration`_
27+ - `Getting Started wiki`_
28+ - `uWSGI support from nginx`_
29+
30+.. contents:: Contents
31+ :depth: 2
32+ :local:
33+ :backlinks: entry
34+
35+----
36+
37+**Install** :ref:`nginx searx site` using :ref:`filtron.sh <filtron.sh overview>`
38+
39+.. code:: bash
40+
41+ $ sudo -H ./utils/filtron.sh nginx install
42+
43+**Install** :ref:`nginx searx site` using :ref:`morty.sh <morty.sh overview>`
44+
45+.. code:: bash
46+
47+ $ sudo -H ./utils/morty.sh nginx install
48+
49+----
50+
51+
52+The nginx HTTP server
53+=====================
54+
55+If nginx_ is not installed (uwsgi will not work with the package nginx-light),
56+install it now.
57+
58+.. tabs::
59+
60+ .. group-tab:: Ubuntu / debian
61+
62+ .. code:: sh
63+
64+ sudo -H apt-get install nginx
65+
66+ .. group-tab:: Arch Linux
67+
68+ .. code-block:: sh
69+
70+ sudo -H pacman -S nginx-mainline
71+ sudo -H systemctl enable nginx
72+ sudo -H systemctl start nginx
73+
74+ .. group-tab:: Fedora / RHEL
75+
76+ .. code-block:: sh
77+
78+ sudo -H dnf install nginx
79+ sudo -H systemctl enable nginx
80+ sudo -H systemctl start nginx
81+
82+Now at http://localhost you should see a *Welcome to nginx!* page, on Fedora you
83+see a *Fedora Webserver - Test Page*. The test page comes from the default
84+`nginx server configuration`_. How this default intro site is configured,
85+depends on the linux distribution:
86+
87+.. tabs::
88+
89+ .. group-tab:: Ubuntu / debian
90+
91+ .. code:: sh
92+
93+ less /etc/nginx/nginx.conf
94+
95+ there is a line including site configurations from:
96+
97+ .. code:: nginx
98+
99+ include /etc/nginx/sites-enabled/*;
100+
101+ .. group-tab:: Arch Linux
102+
103+ .. code-block:: sh
104+
105+ less /etc/nginx/nginx.conf
106+
107+ in there is a configuration section named ``server``:
108+
109+ .. code-block:: nginx
110+
111+ server {
112+ listen 80;
113+ server_name localhost;
114+ # ...
115+ }
116+
117+ .. group-tab:: Fedora / RHEL
118+
119+ .. code-block:: sh
120+
121+ less /etc/nginx/nginx.conf
122+
123+ there is a line including site configurations from:
124+
125+ .. code:: nginx
126+
127+ include /etc/nginx/conf.d/*.conf;
128+
129+.. _nginx searx site:
130+
131+A nginx searx site
132+==================
133+
134+.. sidebar:: public to the internet?
135+
136+ If your searx instance is public, stop here and first install :ref:`filtron
137+ reverse proxy <filtron.sh>` and :ref:`result proxy morty <morty.sh>`, see
138+ :ref:`installation scripts`. If already done, follow setup: *searx via
139+ filtron plus morty*.
140+
141+Now you have to create a configuration for the searx site. If nginx_ is new to
142+you, the `nginx beginners guide`_ is a good starting point and the `Getting
143+Started wiki`_ is always a good resource *to keep in the pocket*.
144+
145+.. tabs::
146+
147+ .. group-tab:: Ubuntu / debian
148+
149+ Create configuration at ``/etc/nginx/sites-available/searx`` and place a
150+ symlink to sites-enabled:
151+
152+ .. code:: sh
153+
154+ sudo -H ln -s /etc/nginx/sites-available/searx /etc/nginx/sites-enabled/searx
155+
156+ .. group-tab:: Arch Linux
157+
158+ In the ``/etc/nginx/nginx.conf`` file, replace the configuration section
159+ named ``server``.
160+
161+ .. group-tab:: Fedora / RHEL
162+
163+ Create configuration at ``/etc/nginx/conf.d/searx`` and place a
164+ symlink to sites-enabled:
165+
166+.. tabs::
167+
168+ .. group-tab:: searx via filtron plus morty
169+
170+ Use this setup, if your instance is public to the internet, compare
171+ figure: :ref:`architecture <arch public>` and :ref:`installation scripts`.
172+
173+ 1. Configure a reverse proxy for :ref:`filtron <filtron.sh>`, listening on
174+ *localhost 4004* (:ref:`filtron route request`):
175+
176+ .. code:: nginx
177+
178+ # https://example.org/searx
179+
180+ location /searx {
181+ proxy_pass http://127.0.0.1:4004/;
182+
183+ proxy_set_header Host $http_host;
184+ proxy_set_header Connection $http_connection;
185+ proxy_set_header X-Real-IP $remote_addr;
186+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
187+ proxy_set_header X-Scheme $scheme;
188+ proxy_set_header X-Script-Name /searx;
189+ }
190+
191+ location /searx/static {
192+ /usr/local/searx/searx-src/searx/static;
193+ }
194+
195+
196+ 2. Configure reverse proxy for :ref:`morty <searx morty>`, listening on
197+ *localhost 3000*:
198+
199+ .. code:: nginx
200+
201+ # https://example.org/morty
202+
203+ location /morty {
204+ proxy_pass http://127.0.0.1:3000/;
205+
206+ proxy_set_header Host $http_host;
207+ proxy_set_header Connection $http_connection;
208+ proxy_set_header X-Real-IP $remote_addr;
209+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
210+ proxy_set_header X-Scheme $scheme;
211+ }
212+
213+ Note that reverse proxy advised to be used in case of single-user or
214+ low-traffic instances. For a fully result proxification add :ref:`morty's
215+ <searx morty>` **public URL** to your :origin:`searx/settings.yml`:
216+
217+ .. code:: yaml
218+
219+ result_proxy:
220+ # replace example.org with your server's public name
221+ url : https://example.org/morty
222+
223+ server:
224+ image_proxy : True
225+
226+
227+ .. group-tab:: proxy or uWSGI
228+
229+ Be warned, with this setup, your instance isn't :ref:`protected <searx
230+ filtron>`. Nevertheless it is good enough for intranet usage and it is a
231+ excellent example of; *how different services can be set up*. The next
232+ example shows a reverse proxy configuration wrapping the :ref:`searx-uWSGI
233+ application <uwsgi configuration>`, listening on ``http =
234+ 127.0.0.1:8888``.
235+
236+ .. code:: nginx
237+
238+ # https://hostname.local/
239+
240+ location / {
241+ proxy_pass http://127.0.0.1:8888;
242+
243+ proxy_set_header Host $host;
244+ proxy_set_header Connection $http_connection;
245+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
246+ proxy_set_header X-Scheme $scheme;
247+ proxy_buffering off;
248+ }
249+
250+ Alternatively you can use the `uWSGI support from nginx`_ via unix
251+ sockets. For socket communication, you have to activate ``socket =
252+ /run/uwsgi/app/searx/socket`` and comment out the ``http =
253+ 127.0.0.1:8888`` configuration in your :ref:`uwsgi ini file <uwsgi
254+ configuration>`.
255+
256+ The example shows a nginx virtual ``server`` configuration, listening on
257+ port 80 (IPv4 and IPv6 http://[::]:80). The uWSGI app is configured at
258+ location ``/`` by importing the `uwsgi_params`_ and passing requests to
259+ the uWSGI socket (``uwsgi_pass``). The ``server``\'s root points to the
260+ :ref:`searx-src clone <searx-src>` and wraps directly the
261+ :origin:`searx/static/` content at ``location /static``.
262+
263+ .. code:: nginx
264+
265+ server {
266+ # replace hostname.local with your server's name
267+ server_name hostname.local;
268+
269+ listen 80;
270+ listen [::]:80;
271+
272+ location / {
273+ include uwsgi_params;
274+ uwsgi_pass unix:/run/uwsgi/app/searx/socket;
275+ }
276+
277+ root /usr/local/searx/searx-src/searx;
278+ location /static { }
279+ }
280+
281+ If not already exists, create a folder for the unix sockets, which can be
282+ used by the searx account:
283+
284+ .. code:: bash
285+
286+ mkdir -p /run/uwsgi/app/searx/
287+ sudo -H chown -R searx:searx /run/uwsgi/app/searx/
288+
289+ .. group-tab:: \.\. at subdir URL
290+
291+ Be warned, with these setups, your instance isn't :ref:`protected <searx
292+ filtron>`. The examples are just here to demonstrate how to export the
293+ searx application from a subdirectory URL ``https://example.org/searx/``.
294+
295+ .. code:: nginx
296+
297+ # https://hostname.local/searx
298+
299+ location /searx {
300+ proxy_pass http://127.0.0.1:8888;
301+
302+ proxy_set_header Host $host;
303+ proxy_set_header Connection $http_connection;
304+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
305+ proxy_set_header X-Scheme $scheme;
306+ proxy_set_header X-Script-Name /searx;
307+ proxy_buffering off;
308+ }
309+
310+ location /searx/static {
311+ alias /usr/local/searx/searx-src/searx/static;
312+ }
313+
314+ The ``X-Script-Name /searx`` is needed by the searx implementation to
315+ calculate relative URLs correct. The next example shows a uWSGI
316+ configuration. Since there are no HTTP headers in a (u)WSGI protocol, the
317+ value is shipped via the SCRIPT_NAME_ in the WSGI environment.
318+
319+ .. code:: nginx
320+
321+ # https://hostname.local/searx
322+
323+ location /searx {
324+ uwsgi_param SCRIPT_NAME /searx;
325+ include uwsgi_params;
326+ uwsgi_pass unix:/run/uwsgi/app/searx/socket;
327+ }
328+
329+ location /searx/static {
330+ alias /usr/local/searx/searx-src/searx;
331+ }
332+
333+ For searx to work correctly the ``base_url`` must be set in the
334+ :origin:`searx/settings.yml`.
335+
336+ .. code:: yaml
337+
338+ server:
339+ # replace example.org with your server's public name
340+ base_url : https://example.org/searx/
341+
342+
343+Restart service:
344+
345+.. tabs::
346+
347+ .. group-tab:: Ubuntu / debian
348+
349+ .. code:: sh
350+
351+ sudo -H systemctl restart nginx
352+ sudo -H service uwsgi restart searx
353+
354+ .. group-tab:: Arch Linux
355+
356+ .. code:: sh
357+
358+ sudo -H systemctl restart nginx
359+ sudo -H systemctl restart uwsgi@searx
360+
361+ .. group-tab:: Fedora
362+
363+ .. code:: sh
364+
365+ sudo -H systemctl restart nginx
366+ sudo -H touch /etc/uwsgi.d/searx.ini
367+
368+
369+Disable logs
370+============
371+
372+For better privacy you can disable nginx logs in ``/etc/nginx/nginx.conf``.
373+
374+.. code:: nginx
375+
376+ http {
377+ # ...
378+ access_log /dev/null;
379+ error_log /dev/null;
380+ # ...
381+ }
_sources/admin/installation-searx.rst.txtnew file+92
@@ -0,0 +1,92 @@
1+.. _installation basic:
2+
3+=========================
4+Step by step installation
5+=========================
6+
7+.. contents:: Contents
8+ :depth: 2
9+ :local:
10+ :backlinks: entry
11+
12+Step by step installation with virtualenv. For Ubuntu, be sure to have enable
13+universe repository.
14+
15+.. _install packages:
16+
17+Install packages
18+================
19+
20+.. kernel-include:: $DOCS_BUILD/includes/searx.rst
21+ :start-after: START distro-packages
22+ :end-before: END distro-packages
23+
24+.. hint::
25+
26+ This installs also the packages needed by :ref:`searx uwsgi`
27+
28+.. _create searx user:
29+
30+Create user
31+===========
32+
33+.. kernel-include:: $DOCS_BUILD/includes/searx.rst
34+ :start-after: START create user
35+ :end-before: END create user
36+
37+.. _searx-src:
38+
39+install searx & dependencies
40+============================
41+
42+Start a interactive shell from new created user and clone searx:
43+
44+.. kernel-include:: $DOCS_BUILD/includes/searx.rst
45+ :start-after: START clone searx
46+ :end-before: END clone searx
47+
48+In the same shell create *virtualenv*:
49+
50+.. kernel-include:: $DOCS_BUILD/includes/searx.rst
51+ :start-after: START create virtualenv
52+ :end-before: END create virtualenv
53+
54+To install searx's dependencies, exit the searx *bash* session you opened above
55+and restart a new. Before install, first check if your *virualenv* was sourced
56+from the login (*~/.profile*):
57+
58+.. kernel-include:: $DOCS_BUILD/includes/searx.rst
59+ :start-after: START manage.sh update_packages
60+ :end-before: END manage.sh update_packages
61+
62+.. tip::
63+
64+ Open a second terminal for the configuration tasks and left the ``(searx)$``
65+ terminal open for the tasks below.
66+
67+Configuration
68+==============
69+
70+Create a copy of the :origin:`searx/settings.yml` configuration file in system's
71+*/etc* folder. Configure like shown below -- replace ``searx@\$(uname -n)`` with
72+a name of your choice -- *and/or* edit ``/etc/searx/settings.yml`` if necessary.
73+
74+.. kernel-include:: $DOCS_BUILD/includes/searx.rst
75+ :start-after: START searx config
76+ :end-before: END searx config
77+
78+Check
79+=====
80+
81+To check your searx setup, optional enable debugging and start the *webapp*.
82+Searx looks at the exported environment ``$SEARX_SETTINGS_PATH`` for a
83+configuration file.
84+
85+.. kernel-include:: $DOCS_BUILD/includes/searx.rst
86+ :start-after: START check searx installation
87+ :end-before: END check searx installation
88+
89+If everything works fine, hit ``[CTRL-C]`` to stop the *webapp* and disable the
90+debug option in ``settings.yml``. You can now exit searx user bash (enter exit
91+command twice). At this point searx is not demonized; uwsgi allows this.
92+
_sources/admin/installation-uwsgi.rst.txtnew file+149
@@ -0,0 +1,149 @@
1+.. _searx uwsgi:
2+
3+=====
4+uwsgi
5+=====
6+
7+.. sidebar:: further reading
8+
9+ - `systemd.unit`_
10+ - `uWSGI Emperor`_
11+
12+.. contents:: Contents
13+ :depth: 2
14+ :local:
15+ :backlinks: entry
16+
17+
18+.. _systemd.unit: https://www.freedesktop.org/software/systemd/man/systemd.unit.html
19+.. _One service per app in systemd:
20+ https://uwsgi-docs.readthedocs.io/en/latest/Systemd.html#one-service-per-app-in-systemd
21+.. _uWSGI Emperor:
22+ https://uwsgi-docs.readthedocs.io/en/latest/Emperor.html
23+.. _uwsgi ini file:
24+ https://uwsgi-docs.readthedocs.io/en/latest/Configuration.html#ini-files
25+.. _systemd unit template:
26+ http://0pointer.de/blog/projects/instances.html
27+
28+
29+Origin uWSGI
30+============
31+
32+How uWSGI is implemented by distributors is different. uWSGI itself
33+recommend two methods
34+
35+`systemd.unit`_ template files as described here `One service per app in systemd`_.
36+
37+ There is one `systemd unit template`_ and one `uwsgi ini file`_ per uWSGI-app
38+ placed at dedicated locations. Take archlinux and a searx.ini as example::
39+
40+ unit template --> /usr/lib/systemd/system/uwsgi@.service
41+ uwsgi ini files --> /etc/uwsgi/searx.ini
42+
43+ The searx app can be maintained as know from common systemd units::
44+
45+ systemctl enable uwsgi@searx
46+ systemctl start uwsgi@searx
47+ systemctl restart uwsgi@searx
48+ systemctl stop uwsgi@searx
49+
50+The `uWSGI Emperor`_ mode which fits for maintaining a large range of uwsgi apps.
51+
52+ The Emperor mode is a special uWSGI instance that will monitor specific
53+ events. The Emperor mode (service) is started by a (common, not template)
54+ systemd unit. The Emperor service will scan specific directories for `uwsgi
55+ ini file`_\s (also know as *vassals*). If a *vassal* is added, removed or the
56+ timestamp is modified, a corresponding action takes place: a new uWSGI
57+ instance is started, reload or stopped. Take Fedora and a searx.ini as
58+ example::
59+
60+ to start a new searx instance create --> /etc/uwsgi.d/searx.ini
61+ to reload the instance edit timestamp --> touch /etc/uwsgi.d/searx.ini
62+ to stop instance remove ini --> rm /etc/uwsgi.d/searx.ini
63+
64+Distributors
65+============
66+
67+The `uWSGI Emperor`_ mode and `systemd unit template`_ is what the distributors
68+mostly offer their users, even if they differ in the way they implement both
69+modes and their defaults. Another point they might differ is the packaging of
70+plugins (if so, compare :ref:`install packages`) and what the default python
71+interpreter is (python2 vs. python3).
72+
73+Fedora starts a Emperor by default, while archlinux does not start any uwsgi
74+service by default. Worth to know; debian (ubuntu) follow a complete different
75+approach. *debian*: your are familiar with the apache infrastructure? .. they
76+do similar for the uWSGI infrastructure (with less comfort), the folders are::
77+
78+ /etc/uwsgi/apps-available/
79+ /etc/uwsgi/apps-enabled/
80+
81+The `uwsgi ini file`_ is enabled by a symbolic link::
82+
83+ ln -s /etc/uwsgi/apps-available/searx.ini /etc/uwsgi/apps-enabled/
84+
85+From debian's documentation (``/usr/share/doc/uwsgi/README.Debian.gz``): You
86+could control specific instance(s) by issuing::
87+
88+ service uwsgi <command> <confname> <confname> ...
89+
90+ sudo -H service uwsgi start searx
91+ sudo -H service uwsgi stop searx
92+
93+My experience is, that this command is a bit buggy.
94+
95+.. _uwsgi configuration:
96+
97+Alltogether
98+===========
99+
100+Create the configuration ini-file according to your distribution (see below) and
101+restart the uwsgi application.
102+
103+.. tabs::
104+
105+ .. group-tab:: Ubuntu / debian
106+
107+ .. kernel-include:: $DOCS_BUILD/includes/searx.rst
108+ :start-after: START searx uwsgi-description ubuntu-20.04
109+ :end-before: END searx uwsgi-description ubuntu-20.04
110+
111+
112+ .. group-tab:: Arch Linux
113+
114+ .. kernel-include:: $DOCS_BUILD/includes/searx.rst
115+ :start-after: START searx uwsgi-description arch
116+ :end-before: END searx uwsgi-description arch
117+
118+
119+ .. group-tab:: Fedora / RHEL
120+
121+ .. kernel-include:: $DOCS_BUILD/includes/searx.rst
122+ :start-after: START searx uwsgi-description fedora
123+ :end-before: END searx uwsgi-description fedora
124+
125+
126+.. tabs::
127+
128+ .. group-tab:: Ubuntu / debian
129+
130+ .. kernel-include:: $DOCS_BUILD/includes/searx.rst
131+ :code: ini
132+ :start-after: START searx uwsgi-appini ubuntu-20.04
133+ :end-before: END searx uwsgi-appini ubuntu-20.04
134+
135+ .. group-tab:: Arch Linux
136+
137+ .. kernel-include:: $DOCS_BUILD/includes/searx.rst
138+ :code: ini
139+ :start-after: START searx uwsgi-appini arch
140+ :end-before: END searx uwsgi-appini arch
141+
142+ .. group-tab:: Fedora / RHEL
143+
144+ .. kernel-include:: $DOCS_BUILD/includes/searx.rst
145+ :code: ini
146+ :start-after: START searx uwsgi-appini fedora
147+ :end-before: END searx uwsgi-appini fedora
148+
149+
_sources/admin/installation.rst.txt+37−320
@@ -4,346 +4,63 @@
44Installation
55============
66
7−.. contents::
8− :depth: 3
7+*You're spoilt for choice*, choose your preferred method of installation.
98
10−Basic installation
11−==================
9+- :ref:`installation docker`
10+- :ref:`installation scripts`
11+- :ref:`installation basic`
1212
13−Step by step installation for Debian/Ubuntu with virtualenv. For Ubuntu, be sure
14−to have enable universe repository.
13+The :ref:`installation basic` is good enough for intranet usage and it is a
14+excellent illustration of *how a searx instance is build up*. If you place your
15+instance public to the internet you should really consider to install a
16+:ref:`filtron reverse proxy <filtron.sh>` and for privacy a :ref:`result proxy
17+<morty.sh>` is mandatory.
1518
16−Install packages:
19+Therefore, if you do not have any special preferences, its recommend to use the
20+:ref:`installation docker` or the `Installation scripts`_ from our :ref:`tooling
21+box <toolboxing>` as described below.
1722
18−.. code:: sh
23+.. _installation scripts:
1924
20− $ sudo -H apt-get install \
21− git build-essential libxslt-dev \
22− python-dev python-virtualenv python-babel \
23− zlib1g-dev libffi-dev libssl-dev
25+Installation scripts
26+====================
2427
25−Install searx:
28+.. sidebar:: Update OS first!
2629
27−.. code:: sh
30+ To avoid unwanted side effects, update your OS before installing searx.
2831
29− cd /usr/local
30− sudo -H git clone https://github.com/asciimoo/searx.git
31− sudo -H useradd searx -d /usr/local/searx
32− sudo -H chown searx:searx -R /usr/local/searx
32+The following will install a setup as shown in :ref:`architecture`. First you
33+need to get a clone. The clone is only needed for the installation procedure
34+and some maintenance tasks (alternatively you can create your own fork).
3335
34−Install dependencies in a virtualenv:
36+.. code:: bash
3537
36−.. code:: sh
38+ $ cd ~/Downloads
39+ $ git clone https://github.com/asciimoo/searx searx
40+ $ cd searx
3741
38− cd /usr/local/searx
39− sudo -H -u searx -i
42+**Install** :ref:`searx service <searx.sh>`
4043
41−.. code:: sh
44+This installs searx as described in :ref:`installation basic`.
4245
43− (searx)$ virtualenv searx-ve
44− (searx)$ . ./searx-ve/bin/activate
45− (searx)$ ./manage.sh update_packages
46+.. code:: bash
4647
47−Configuration
48−==============
48+ $ sudo -H ./utils/searx.sh install all
4949
50−.. code:: sh
50+**Install** :ref:`filtron reverse proxy <filtron.sh>`
5151
52− sed -i -e "s/ultrasecretkey/`openssl rand -hex 16`/g" searx/settings.yml
52+.. code:: bash
5353
54−Edit searx/settings.yml if necessary.
54+ $ sudo -H ./utils/filtron.sh install all
5555
56−Check
57−=====
56+**Install** :ref:`result proxy <morty.sh>`
5857
59−Start searx:
58+.. code:: bash
6059
61−.. code:: sh
60+ $ sudo -H ./utils/morty.sh install all
6261
63− python searx/webapp.py
62+If all services are running fine, you can add it to your HTTP server:
6463
65−Go to http://localhost:8888
64+- :ref:`installation apache`
65+- :ref:`installation nginx`
6666
67−If everything works fine, disable the debug option in settings.yml:
68−
69−.. code:: sh
70−
71− sed -i -e "s/debug : True/debug : False/g" searx/settings.yml
72−
73−At this point searx is not demonized ; uwsgi allows this.
74−
75−You can exit the virtualenv and the searx user bash (enter exit command
76−twice).
77−
78−uwsgi
79−=====
80−
81−Install packages:
82−
83−.. code:: sh
84−
85− sudo -H apt-get install \
86− uwsgi uwsgi-plugin-python
87−
88−Create the configuration file ``/etc/uwsgi/apps-available/searx.ini`` with this
89−content:
90−
91−.. code:: ini
92−
93− [uwsgi]
94− # Who will run the code
95− uid = searx
96− gid = searx
97−
98− # disable logging for privacy
99− disable-logging = true
100−
101− # Number of workers (usually CPU count)
102− workers = 4
103−
104− # The right granted on the created socket
105− chmod-socket = 666
106−
107− # Plugin to use and interpretor config
108− single-interpreter = true
109− master = true
110− plugin = python
111− lazy-apps = true
112− enable-threads = true
113−
114− # Module to import
115− module = searx.webapp
116−
117− # Support running the module from a webserver subdirectory.
118− route-run = fixpathinfo:
119−
120− # Virtualenv and python path
121− virtualenv = /usr/local/searx/searx-ve/
122− pythonpath = /usr/local/searx/
123− chdir = /usr/local/searx/searx/
124−
125−Activate the uwsgi application and restart:
126−
127−.. code:: sh
128−
129− cd /etc/uwsgi/apps-enabled
130− ln -s ../apps-available/searx.ini
131− /etc/init.d/uwsgi restart
132−
133−Web server
134−==========
135−
136−with nginx
137−----------
138−
139−If nginx is not installed (uwsgi will not work with the package
140−nginx-light):
141−
142−.. code:: sh
143−
144− sudo -H apt-get install nginx
145−
146−Hosted at /
147−~~~~~~~~~~~
148−
149−Create the configuration file ``/etc/nginx/sites-available/searx`` with this
150−content:
151−
152−.. code:: nginx
153−
154− server {
155− listen 80;
156− server_name searx.example.com;
157− root /usr/local/searx/searx;
158−
159− location /static {
160− }
161−
162− location / {
163− include uwsgi_params;
164− uwsgi_pass unix:/run/uwsgi/app/searx/socket;
165− }
166− }
167−
168−Create a symlink to sites-enabled:
169−
170−.. code:: sh
171−
172− sudo -H ln -s /etc/nginx/sites-available/searx /etc/nginx/sites-enabled/searx
173−
174−Restart service:
175−
176−.. code:: sh
177−
178− sudo -H service nginx restart
179− sudo -H service uwsgi restart
180−
181−from subdirectory URL (/searx)
182−~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
183−
184−Add this configuration in the server config file
185−``/etc/nginx/sites-enabled/default``:
186−
187−.. code:: nginx
188−
189− location /searx/static {
190− alias /usr/local/searx/searx/static;
191− }
192−
193− location /searx {
194− uwsgi_param SCRIPT_NAME /searx;
195− include uwsgi_params;
196− uwsgi_pass unix:/run/uwsgi/app/searx/socket;
197− }
198−
199−
200−**OR** using reverse proxy (Please, note that reverse proxy advised to be used
201−in case of single-user or low-traffic instances.)
202−
203−.. code:: nginx
204−
205− location /searx/static {
206− alias /usr/local/searx/searx/static;
207− }
208−
209− location /searx {
210− proxy_pass http://127.0.0.1:8888;
211− proxy_set_header Host $host;
212− proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
213− proxy_set_header X-Scheme $scheme;
214− proxy_set_header X-Script-Name /searx;
215− proxy_buffering off;
216− }
217−
218−
219−Enable ``base_url`` in ``searx/settings.yml``
220−
221−.. code:: yaml
222−
223− base_url : http://your.domain.tld/searx/
224−
225−Restart service:
226−
227−.. code:: sh
228−
229− sudo -H service nginx restart
230− sudo -H service uwsgi restart
231−
232−disable logs
233−^^^^^^^^^^^^
234−
235−for better privacy you can disable nginx logs about searx.
236−
237−how to proceed: below ``uwsgi_pass`` in ``/etc/nginx/sites-available/default``
238−add:
239−
240−.. code:: nginx
241−
242− access_log /dev/null;
243− error_log /dev/null;
244−
245−Restart service:
246−
247−.. code:: sh
248−
249− sudo -H service nginx restart
250−
251−with apache
252−-----------
253−
254−Add wsgi mod:
255−
256−.. code:: sh
257−
258− sudo -H apt-get install libapache2-mod-uwsgi
259− sudo -H a2enmod uwsgi
260−
261−Add this configuration in the file ``/etc/apache2/apache2.conf``:
262−
263−.. code:: apache
264−
265− <Location />
266− Options FollowSymLinks Indexes
267− SetHandler uwsgi-handler
268− uWSGISocket /run/uwsgi/app/searx/socket
269− </Location>
270−
271−Note that if your instance of searx is not at the root, you should change
272−``<Location />`` by the location of your instance, like ``<Location /searx>``.
273−
274−Restart Apache:
275−
276−.. code:: sh
277−
278− sudo -H /etc/init.d/apache2 restart
279−
280−disable logs
281−~~~~~~~~~~~~
282−
283−For better privacy you can disable Apache logs.
284−
285−.. warning::
286−
287− You can only disable logs for the whole (virtual) server not for a specific
288− path.
289−
290−Go back to ``/etc/apache2/apache2.conf`` and above ``<Location />`` add:
291−
292−.. code:: apache
293−
294− CustomLog /dev/null combined
295−
296−Restart Apache:
297−
298−.. code:: sh
299−
300− sudo -H /etc/init.d/apache2 restart
301−
302−How to update
303−=============
304−
305−.. code:: sh
306−
307− cd /usr/local/searx
308− sudo -H -u searx -i
309−
310−.. code:: sh
311−
312− (searx)$ . ./searx-ve/bin/activate
313− (searx)$ git stash
314− (searx)$ git pull origin master
315− (searx)$ git stash apply
316− (searx)$ ./manage.sh update_packages
317−
318−.. code:: sh
319−
320− sudo -H service uwsgi restart
321−
322−Docker
323−======
324−
325−Make sure you have installed Docker. For instance, you can deploy searx like this:
326−
327−.. code:: sh
328−
329− docker pull wonderfall/searx
330− docker run -d --name searx -p $PORT:8888 wonderfall/searx
331−
332−Go to ``http://localhost:$PORT``.
333−
334−See https://hub.docker.com/r/wonderfall/searx/ for more informations. It's also
335−possible to build searx from the embedded Dockerfile.
336−
337−.. code:: sh
338−
339− git clone https://github.com/asciimoo/searx.git
340− cd searx
341− docker build -t whatever/searx .
342−
343−References
344−==========
345−
346−* https://about.okhin.fr/posts/Searx/ with some additions
347−
348−* How to: `Setup searx in a couple of hours with a free SSL certificate
349− <https://www.reddit.com/r/privacytoolsIO/comments/366kvn/how_to_setup_your_own_privacy_respecting_search/>`__
_sources/admin/morty.rst.txt+7
@@ -1,7 +1,14 @@
1+
2+.. _searx morty:
3+
14=========================
25How to setup result proxy
36=========================
47
8+.. sidebar:: further reading
9+
10+ - :ref:`morty.sh`
11+
512.. _morty: https://github.com/asciimoo/morty
613.. _morty's README: https://github.com/asciimoo/morty
714
_sources/admin/settings.rst.txt+11−2
@@ -4,11 +4,17 @@
44``settings.yml``
55================
66
7+This page describe the options possibilities of the :origin:`searx/settings.yml`
8+file.
9+
710.. sidebar:: Further reading ..
811
912 - :ref:`search API`
1013
11−This page describe the options possibilities of the settings.yml file.
14+.. contents:: Contents
15+ :depth: 2
16+ :local:
17+ :backlinks: entry
1218
1319.. _settings global:
1420
@@ -98,7 +104,7 @@ Global Settings
98104 specific instance of searx, a locale can be defined using an ISO language
99105 code, like ``fr``, ``en``, ``de``.
100106
101−.. _requests proxies: http://docs.python-requests.org/en/latest/user/advanced/#proxies
107+.. _requests proxies: http://requests.readthedocs.io/en/latest/user/advanced/#proxies
102108.. _PR SOCKS support: https://github.com/kennethreitz/requests/pull/478
103109
104110``outgoing_proxies`` :
@@ -175,6 +181,9 @@ Engine settings
175181``weigth`` : default ``1``
176182 Weighting of the results of this engine.
177183
184+``display_error_messages`` : default ``True``
185+ When an engine returns an error, the message is displayed on the user interface.
186+
178187.. note::
179188
180189 A few more options are possible, but they are pretty specific to some
_sources/admin/update-searx.rst.txtnew file+23
@@ -0,0 +1,23 @@
1+.. _update searx:
2+
3+=============
4+How to update
5+=============
6+
7+.. code:: sh
8+
9+ sudo -H -u searx -i
10+ (searx)$ git stash
11+ (searx)$ git pull origin master
12+ (searx)$ git stash apply
13+ (searx)$ ./manage.sh update_packages
14+
15+Restart uwsgi:
16+
17+.. tabs::
18+
19+ .. group-tab:: Ubuntu / debian
20+
21+ .. code:: sh
22+
23+ sudo -H systemctl restart uwsgi
_sources/blog/index.rst.txt+2−1
@@ -3,7 +3,8 @@ Blog
33====
44
55.. toctree::
6− :maxdepth: 1
6+ :maxdepth: 2
7+ :caption: Contents
78
89 python3
910 admin
_sources/dev/contribution_guide.rst.txt+5
@@ -4,6 +4,11 @@
44How to contribute
55=================
66
7+.. contents:: Contents
8+ :depth: 2
9+ :local:
10+ :backlinks: entry
11+
712Prime directives: Privacy, Hackability
813======================================
914
_sources/dev/engine_overview.rst.txt+1
@@ -57,6 +57,7 @@ engine string name of searx-engine
5757 (filename without ``.py``)
5858shortcut string shortcut of search-engine
5959timeout string specific timeout for search-engine
60+display_error_messages boolean display error messages on the web UI
6061======================= =========== ===========================================
6162
6263
_sources/dev/index.rst.txt+2−1
@@ -3,7 +3,8 @@ Developer documentation
33=======================
44
55.. toctree::
6− :maxdepth: 1
6+ :maxdepth: 2
7+ :caption: Contents
78
89 quickstart
910 contribution_guide
_sources/dev/makefile.rst.txt+24−24
@@ -11,23 +11,17 @@ Makefile Targets
1111 Before looking deeper at the targets, first read about :ref:`makefile setup`
1212 and :ref:`make pyenv`.
1313
14+ To install system requirements follow :ref:`buildhosts`.
15+
1416With the aim to simplify development cycles, started with :pull:`1756` a
1517``Makefile`` based boilerplate was added. If you are not familiar with
1618Makefiles, we recommend to read gnu-make_ introduction.
1719
1820The usage is simple, just type ``make {target-name}`` to *build* a target.
19−Calling the ``help`` target gives a first overview::
20−
21− $ make help
22− test - run developer tests
23− docs - build documentation
24− docs-live - autobuild HTML documentation while editing
25− run - run developer instance
26− install - developer install (./local)
27− uninstall - uninstall (./local)
28− gh-pages - build docs & deploy on gh-pages branch
29− clean - drop builds and environments
30− ...
21+Calling the ``help`` target gives a first overview (``make help``):
22+
23+.. program-output:: bash -c "cd ..; make --no-print-directory help"
24+
3125
3226.. contents:: Contents
3327 :depth: 2
@@ -37,27 +31,33 @@ Calling the ``help`` target gives a first overview::
3731
3832.. _makefile setup:
3933
40−Setup
41−=====
34+Makefile setup
35+==============
4236
4337.. _git stash: https://git-scm.com/docs/git-stash
4438
45−The main setup is done in the :origin:`Makefile`::
46−
47− export GIT_URL=https://github.com/asciimoo/searx
48− export SEARX_URL=https://searx.me
49− export DOCS_URL=https://asciimoo.github.io/searx
50−
5139.. sidebar:: fork & upstream
5240
5341 Commit changes in your (local) branch, fork or whatever, but do not push them
5442 upstream / `git stash`_ is your friend.
5543
56−:GIT_URL: Changes this, to point to your searx fork.
44+The main setup is done in the :origin:`Makefile`.
45+
46+.. literalinclude:: ../../Makefile
47+ :start-after: START Makefile setup
48+ :end-before: END Makefile setup
49+
50+:GIT_URL: Changes this, to point to your searx fork.
51+:GIT_BRANCH: Changes this, to point to your searx branch.
52+:SEARX_URL: Changes this, to point to your searx instance.
53+:DOCS_URL: If you host your own (*brand*) documentation, change this URL.
5754
58−:SEARX_URL: Changes this, to point to your searx instance.
55+If you change any of this build environment variables, you have to run ``make
56+buildenv``::
5957
60−:DOCS_URL: If you host your own (branded) documentation, change this URL.
58+ $ make buildenv
59+ build searx/brand.py
60+ build utils/brand.env
6161
6262.. _make pyenv:
6363
@@ -170,7 +170,7 @@ e.g.:
170170
171171.. code:: sh
172172
173− $ make test.pep8 test.unit
173+ $ make test.pep8 test.unit test.sh
174174 . ./local/py3/bin/activate; ./manage.sh pep8_check
175175 [!] Running pep8 check
176176 . ./local/py3/bin/activate; ./manage.sh unit_tests
_sources/dev/quickstart.rst.txt+5−5
@@ -27,7 +27,7 @@ searx-ve virtualenv and install the required packages using ``manage.sh``.
2727 cd ~/myprojects
2828 git clone https://github.com/asciimoo/searx.git
2929 cd searx
30− virtualenv searx-ve
30+ python3 -m venv searx-ve
3131 . ./searx-ve/bin/activate
3232 ./manage.sh update_dev_packages
3333
@@ -87,8 +87,8 @@ After satisfying the requirements styles can be build using ``manage.sh``
8787 ./manage.sh styles
8888
8989
90−How to build the source of the oscar theme
91−==========================================
90+How to build the source of the themes
91+=====================================
9292
9393.. _grunt: https://gruntjs.com/
9494
@@ -98,13 +98,13 @@ NodeJS, so first Node has to be installed.
9898.. code:: sh
9999
100100 sudo -H apt-get install nodejs
101− sudo -H npm install -g grunt-cli
101+ make node.env
102102
103103After installing grunt, the files can be built using the following command:
104104
105105.. code:: sh
106106
107− ./manage.sh grunt_build
107+ make themes
108108
109109
110110Tips for debugging/development
_sources/dev/reST.rst.txt+5−5
@@ -325,8 +325,9 @@ Literal blocks
325325
326326The simplest form of :duref:`literal-blocks` is a indented block introduced by
327327two colons (``::``). For highlighting use :dudir:`highlight` or :ref:`reST
328−code` directive. To include literals from external files use directive
329−:dudir:`literalinclude`.
328+code` directive. To include literals from external files use
329+:rst:dir:`literalinclude` or :ref:`kernel-include <kernel-include-directive>`
330+directive (latter one expands environment variables in the path name).
330331
331332.. _reST literal:
332333
@@ -1312,9 +1313,8 @@ others are basic-tabs_ and code-tabs_. Below a *group-tab* example from
13121313
13131314.. literalinclude:: ../admin/buildhosts.rst
13141315 :language: reST
1315− :start-after: .. _system requirements:
1316− :end-before: .. _system requirements END:
1317−
1316+ :start-after: .. SNIP sh lint requirements
1317+ :end-before: .. SNAP sh lint requirements
13181318
13191319.. _math:
13201320
_sources/index.rst.txt+10−8
@@ -2,7 +2,14 @@
22Welcome to searx
33================
44
5−Search without being tracked.
5+ *Search without being tracked.*
6+
7+Searx is a free internet metasearch engine which aggregates results from more
8+than 70 search services. Users are neither tracked nor profiled. Additionally,
9+searx can be used over Tor for online anonymity.
10+
11+Get started with searx by using one of the Searx-instances_. If you don't trust
12+anyone, you can set up your own, see :ref:`installation`.
613
714.. sidebar:: Features
815
@@ -16,19 +23,14 @@ Search without being tracked.
1623 - Hosted by organizations, such as *La Quadrature du Net*, which promote
1724 digital rights
1825
19−Searx is a free internet metasearch engine which aggregates results from more
20−than 70 search services. Users are neither tracked nor profiled. Additionally,
21−searx can be used over Tor for online anonymity.
22−
23−Get started with searx by using one of the Searx-instances_. If you don't trust
24−anyone, you can set up your own, see :ref:`installation`.
25−
2626.. toctree::
2727 :maxdepth: 2
28+ :caption: Contents
2829
2930 user/index
3031 admin/index
3132 dev/index
33+ utils/index
3234 blog/index
3335
3436.. _Searx-instances: https://searx.space
_sources/user/index.rst.txt+2−1
@@ -3,7 +3,8 @@ User documentation
33==================
44
55.. toctree::
6− :maxdepth: 1
6+ :maxdepth: 2
7+ :caption: Contents
78
89 search_syntax
910 own-instance
_sources/user/own-instance.rst.txt+4−2
@@ -2,8 +2,10 @@
22Why use a private instance?
33===========================
44
5−"Is it worth to run my own instance?" is a common question among searx users.
6−Before answering this question, see what options a searx user has.
5+ *"Is it worth to run my own instance?"*
6+
7+\.\. is a common question among searx users. Before answering this question,
8+see what options a searx user has.
79
810Public instances are open to everyone who has access to its URL. Usually, these
911are operated by unknown parties (from the users' point of view). Private
_sources/user/public_instances.rst.txtdeleted−3
@@ -1,3 +0,0 @@
1−:orphan:
2−
3−This page page has been moved to `searx.space <https://searx.space/>`__
_sources/utils/filtron.sh.rst.txtnew file+80
@@ -0,0 +1,80 @@
1+
2+.. _filtron.sh:
3+
4+====================
5+``utils/filtron.sh``
6+====================
7+
8+.. sidebar:: further reading
9+
10+ - :ref:`searx filtron`
11+ - :ref:`architecture`
12+ - :ref:`installation` (:ref:`nginx <installation nginx>` & :ref:`apache
13+ <installation apache>`)
14+
15+.. _Go: https://golang.org/
16+.. _filtron: https://github.com/asciimoo/filtron
17+.. _filtron README: https://github.com/asciimoo/filtron/blob/master/README.md
18+
19+To simplify installation and maintenance of a filtron instance you can use the
20+script :origin:`utils/filtron.sh`. In most cases you will install filtron_
21+simply by running the command:
22+
23+.. code:: bash
24+
25+ sudo -H ./utils/filtron.sh install all
26+
27+The script adds a ``${SERVICE_USER}`` (default:``filtron``) and installs filtron_
28+into this user account:
29+
30+#. Create a separated user account (``filtron``).
31+#. Download and install Go_ binary in user's $HOME (``~filtron``).
32+#. Install filtron with the package management from Go_ (``go get -v -u
33+ github.com/asciimoo/filtron``)
34+#. Setup a proper rule configuration :origin:`[ref]
35+ <utils/templates/etc/filtron/rules.json>` (``/etc/filtron/rules.json``).
36+#. Setup a systemd service unit :origin:`[ref]
37+ <utils/templates/lib/systemd/system/filtron.service>`
38+ (``/lib/systemd/system/filtron.service``).
39+
40+
41+Create user
42+===========
43+
44+.. kernel-include:: $DOCS_BUILD/includes/filtron.rst
45+ :start-after: START create user
46+ :end-before: END create user
47+
48+
49+Install go
50+==========
51+
52+.. kernel-include:: $DOCS_BUILD/includes/filtron.rst
53+ :start-after: START install go
54+ :end-before: END install go
55+
56+
57+Install filtron
58+===============
59+
60+Install :origin:`rules.json <utils/templates/etc/filtron/rules.json>` at
61+``/etc/filtron/rules.json`` (see :ref:`Sample configuration of filtron`) and
62+install filtron software and systemd unit:
63+
64+.. kernel-include:: $DOCS_BUILD/includes/filtron.rst
65+ :start-after: START install filtron
66+ :end-before: END install filtron
67+
68+.. kernel-include:: $DOCS_BUILD/includes/filtron.rst
69+ :start-after: START install systemd unit
70+ :end-before: END install systemd unit
71+
72+.. _filtron.sh overview:
73+
74+Overview
75+========
76+
77+The ``--help`` output of the script is largely self-explanatory
78+(:ref:`toolboxing common`):
79+
80+.. program-output:: ../utils/filtron.sh --help
_sources/utils/index.rst.txtnew file+53
@@ -0,0 +1,53 @@
1+.. _searx_utils:
2+.. _toolboxing:
3+
4+=======================
5+Tooling box ``utils/*``
6+=======================
7+
8+In the folder :origin:`utils/` we maintain some tools useful for admins and
9+developers.
10+
11+.. toctree::
12+ :maxdepth: 2
13+ :caption: Contents
14+
15+ searx.sh
16+ filtron.sh
17+ morty.sh
18+ lxc.sh
19+
20+.. _toolboxing common:
21+
22+Common commands & environment
23+=============================
24+
25+Scripts to maintain services often dispose of common commands and environments.
26+
27+``shell`` : command
28+ Opens a shell from the service user ``${SERVICE_USSR}``, very helpful for
29+ troubleshooting.
30+
31+``inspect service`` : command
32+ Shows status and log of the service, most often you have a option to enable
33+ more verbose debug logs. Very helpful for debugging, but be careful not to
34+ enable debugging in a production environment!
35+
36+``FORCE_TIMEOUT`` : environment
37+ Sets timeout for interactive prompts. If you want to run a script in batch
38+ job, with defaults choices, set ``FORCE_TIMEOUT=0``. By example; to install a
39+ reverse proxy for filtron on all containers of the :ref:`searx suite
40+ <lxc-searx.env>` use ::
41+
42+ sudo -H ./utils/lxc.sh cmd -- FORCE_TIMEOUT=0 ./utils/filtron.sh apache install
43+
44+.. _toolboxing setup:
45+
46+Tooling box setup
47+=================
48+
49+The main setup is done in the :origin:`.config.sh` (read also :ref:`makefile
50+setup`).
51+
52+.. literalinclude:: ../../.config.sh
53+ :language: bash
_sources/utils/lxc.sh.rst.txtnew file+148
@@ -0,0 +1,148 @@
1+
2+.. _snap: https://snapcraft.io
3+.. _snapcraft LXD: https://snapcraft.io/lxd
4+.. _LXC/LXD Image Server: https://uk.images.linuxcontainers.org/
5+.. _LXC: https://linuxcontainers.org/lxc/introduction/
6+.. _LXD: https://linuxcontainers.org/lxd/introduction/
7+.. _`LXD@github`: https://github.com/lxc/lxd
8+
9+.. _archlinux: https://www.archlinux.org/
10+
11+.. _lxc.sh:
12+
13+================
14+``utils/lxc.sh``
15+================
16+
17+.. sidebar:: further reading
18+
19+ - snap_, `snapcraft LXD`_
20+ - LXC_, LXD_
21+ - `LXC/LXD Image Server`_
22+ - `LXD@github`_
23+
24+With the use of *Linux Containers* (LXC_) we can scale our tasks over a stack of
25+containers, what we call the: *lxc suite*. The *searx suite*
26+(:origin:`lxc-searx.env <utils/lxc-searx.env>`) is loaded by default, every time
27+you start the ``lxc.sh`` script (*you do not need to care about*).
28+
29+Before you can start with containers, you need to install and initiate LXD_
30+once::
31+
32+ $ snap install lxd
33+ $ lxd init --auto
34+
35+To make use of the containers from the *searx suite*, you have to build the
36+:ref:`LXC suite containers <lxc.sh help>` initial. But be warned, **this might
37+take some time**::
38+
39+ $ sudo -H ./utils/lxc.sh build
40+
41+A cup of coffee later, your LXC suite is build up and you can run whatever task
42+you want / in a selected or even in all :ref:`LXC suite containers <lxc.sh
43+help>`. If you do not want to build all containers, **you can build just
44+one**::
45+
46+ $ sudo -H ./utils/lxc.sh build searx-ubu1804
47+
48+*Good to know ...*
49+
50+Eeach container shares the root folder of the repository and the
51+command ``utils/lxc.sh cmd`` **handles relative path names transparent**,
52+compare output of::
53+
54+ $ sudo -H ./utils/lxc.sh cmd -- ls -la Makefile
55+ ...
56+
57+In the containers, you can run what ever you want, e.g. to start a bash use::
58+
59+ $ sudo -H ./utils/lxc.sh cmd searx-ubu1804 bash
60+ INFO: [searx-ubu1804] bash
61+ root@searx-ubu1804:/share/searx#
62+
63+If there comes the time you want to **get rid off all** the containers and
64+**clean up local images** just type::
65+
66+ $ sudo -H ./utils/lxc.sh remove
67+ $ sudo -H ./utils/lxc.sh remove images
68+
69+
70+Install suite
71+=============
72+
73+To install the complete :ref:`searx suite (includes searx, morty & filtron)
74+<lxc-searx.env>` into all LXC_ use::
75+
76+ $ sudo -H ./utils/lxc.sh install suite
77+
78+The command above installs a searx suite (see :ref:`installation scripts`). To
79+get the IP (URL) of the filtron service in the containers use ``show suite``
80+command. To test instances from containers just open the URLs in your
81+WEB-Browser::
82+
83+ $ sudo ./utils/lxc.sh show suite | grep filtron
84+ [searx-ubu1604] INFO: (eth0) filtron: http://n.n.n.246:4004/ http://n.n.n.246/searx
85+ [searx-ubu1804] INFO: (eth0) filtron: http://n.n.n.147:4004/ http://n.n.n.147/searx
86+ [searx-ubu1910] INFO: (eth0) filtron: http://n.n.n.140:4004/ http://n.n.n.140/searx
87+ [searx-ubu2004] INFO: (eth0) filtron: http://n.n.n.18:4004/ http://n.n.n.18/searx
88+ [searx-fedora31] INFO: (eth0) filtron: http://n.n.n.46:4004/ http://n.n.n.46/searx
89+ [searx-archlinux] INFO: (eth0) filtron: http://n.n.n.32:4004/ http://n.n.n.32/searx
90+
91+To :ref:`install a nginx <installation nginx>` reverse proxy for filtron and
92+morty use (or alternatively use :ref:`apache <installation apache>`)::
93+
94+ sudo -H ./utils/lxc.sh cmd -- FORCE_TIMEOUT=0 ./utils/filtron.sh nginx install
95+ sudo -H ./utils/lxc.sh cmd -- FORCE_TIMEOUT=0 ./utils/morty.sh nginx install
96+
97+
98+Running commands
99+================
100+
101+**Inside containers, you can use make or run scripts** from the
102+:ref:`toolboxing`. By example: to setup a :ref:`buildhosts` and run the
103+Makefile target ``test`` in the archlinux_ container::
104+
105+ sudo -H ./utils/lxc.sh cmd searx-archlinux ./utils/searx.sh install buildhost
106+ sudo -H ./utils/lxc.sh cmd searx-archlinux make test
107+
108+
109+Setup searx buildhost
110+=====================
111+
112+You can **install the searx buildhost environment** into one or all containers.
113+The installation procedure to set up a :ref:`build host<buildhosts>` takes its
114+time. Installation in all containers will take more time (time for another cup
115+of coffee).::
116+
117+ sudo -H ./utils/lxc.sh cmd -- ./utils/searx.sh install buildhost
118+
119+To build (live) documentation inside a archlinux_ container::
120+
121+ sudo -H ./utils/lxc.sh cmd searx-archlinux make docs-clean docs-live
122+ ...
123+ [I 200331 15:00:42 server:296] Serving on http://0.0.0.0:8080
124+
125+To get IP of the container and the port number *live docs* is listening::
126+
127+ $ sudo ./utils/lxc.sh show suite | grep docs-live
128+ ...
129+ [searx-archlinux] INFO: (eth0) docs-live: http://n.n.n.12:8080/
130+
131+
132+.. _lxc.sh help:
133+
134+Overview
135+========
136+
137+The ``--help`` output of the script is largely self-explanatory:
138+
139+.. program-output:: ../utils/lxc.sh --help
140+
141+
142+.. _lxc-searx.env:
143+
144+searx suite
145+===========
146+
147+.. literalinclude:: ../../utils/lxc-searx.env
148+ :language: bash
_sources/utils/morty.sh.rst.txtnew file+80
@@ -0,0 +1,80 @@
1+
2+.. _morty: https://github.com/asciimoo/morty
3+.. _morty's README: https://github.com/asciimoo/morty
4+.. _Go: https://golang.org/
5+
6+.. _morty.sh:
7+
8+==================
9+``utils/morty.sh``
10+==================
11+
12+.. sidebar:: further reading
13+
14+ - :ref:`architecture`
15+ - :ref:`installation` (:ref:`nginx <installation nginx>` & :ref:`apache
16+ <installation apache>`)
17+ - :ref:`searx morty`
18+
19+To simplify installation and maintenance of a morty_ instance you can use the
20+script :origin:`utils/morty.sh`. In most cases you will install morty_ simply by
21+running the command:
22+
23+.. code:: bash
24+
25+ sudo -H ./utils/morty.sh install all
26+
27+The script adds a ``${SERVICE_USER}`` (default:``morty``) and installs morty_
28+into this user account:
29+
30+#. Create a separated user account (``morty``).
31+#. Download and install Go_ binary in user's $HOME (``~morty``).
32+#. Install morty_ with the package management from Go_ (``go get -v -u
33+ github.com/asciimoo/morty``)
34+#. Setup a systemd service unit :origin:`[ref]
35+ <utils/templates/lib/systemd/system/morty.service>`
36+ (``/lib/systemd/system/morty.service``).
37+
38+.. hint::
39+
40+ To add morty to your searx instance read chapter :ref:`searx morty`.
41+
42+Create user
43+===========
44+
45+.. kernel-include:: $DOCS_BUILD/includes/morty.rst
46+ :start-after: START create user
47+ :end-before: END create user
48+
49+
50+Install go
51+==========
52+
53+.. kernel-include:: $DOCS_BUILD/includes/morty.rst
54+ :start-after: START install go
55+ :end-before: END install go
56+
57+
58+Install morty
59+=============
60+
61+Install morty software and systemd unit:
62+
63+.. kernel-include:: $DOCS_BUILD/includes/morty.rst
64+ :start-after: START install morty
65+ :end-before: END install morty
66+
67+.. kernel-include:: $DOCS_BUILD/includes/morty.rst
68+ :start-after: START install systemd unit
69+ :end-before: END install systemd unit
70+
71+.. _morty.sh overview:
72+
73+Overview
74+========
75+
76+The ``--help`` output of the script is largely self-explanatory
77+(:ref:`toolboxing common`):
78+
79+.. program-output:: ../utils/morty.sh --help
80+
_sources/utils/searx.sh.rst.txtnew file+39
@@ -0,0 +1,39 @@
1+
2+.. _searx.sh:
3+
4+==================
5+``utils/searx.sh``
6+==================
7+
8+.. sidebar:: further reading
9+
10+ - :ref:`architecture`
11+ - :ref:`installation`
12+ - :ref:`installation nginx`
13+ - :ref:`installation apache`
14+
15+To simplify installation and maintenance of a searx instance you can use the
16+script :origin:`utils/searx.sh`.
17+
18+Install
19+=======
20+
21+In most cases you will install searx simply by running the command:
22+
23+.. code:: bash
24+
25+ sudo -H ./utils/searx.sh install all
26+
27+The script adds a ``${SERVICE_USER}`` (default:``searx``) and installs searx
28+into this user account. The installation is described in chapter
29+:ref:`installation basic`.
30+
31+.. _intranet reverse proxy:
32+
33+Overview
34+========
35+
36+The ``--help`` output of the script is largely self-explanatory
37+(:ref:`toolboxing common`):
38+
39+.. program-output:: ../utils/searx.sh --help
_static/basic.css+94−27
@@ -316,22 +316,29 @@ img.align-default, .figure.align-default {
316316div.sidebar {
317317 margin: 0 0 0.5em 1em;
318318 border: 1px solid #ddb;
319− padding: 7px 7px 0 7px;
319+ padding: 7px;
320320 background-color: #ffe;
321321 width: 40%;
322322 float: right;
323+ clear: right;
324+ overflow-x: auto;
323325}
324326
325327p.sidebar-title {
326328 font-weight: bold;
327329}
328330
331+div.admonition, div.topic, pre, div[class|="highlight"] {
332+ clear: both;
333+}
334+
329335/* -- topics ---------------------------------------------------------------- */
330336
331337div.topic {
332338 border: 1px solid #ccc;
333− padding: 7px 7px 0 7px;
339+ padding: 7px;
334340 margin: 10px 0 10px 0;
341+ overflow-x: auto;
335342}
336343
337344p.topic-title {
@@ -346,16 +353,13 @@ div.admonition {
346353 margin-top: 10px;
347354 margin-bottom: 10px;
348355 padding: 7px;
356+ overflow-x: auto;
349357}
350358
351359div.admonition dt {
352360 font-weight: bold;
353361}
354362
355−div.admonition dl {
356− margin-bottom: 0;
357−}
358−
359363p.admonition-title {
360364 margin: 0px 10px 5px 0px;
361365 font-weight: bold;
@@ -366,9 +370,19 @@ div.body p.centered {
366370 margin-top: 25px;
367371}
368372
373+/* -- content of sidebars/topics/admonitions -------------------------------- */
374+
375+div.sidebar > :last-child,
376+div.topic > :last-child,
377+div.admonition > :last-child {
378+ margin-bottom: 0;
379+}
380+
369381/* -- tables ---------------------------------------------------------------- */
370382
371383table.docutils {
384+ margin-top: 10px;
385+ margin-bottom: 10px;
372386 border: 0;
373387 border-collapse: collapse;
374388}
@@ -416,13 +430,13 @@ table.citation td {
416430 border-bottom: none;
417431}
418432
419−th > p:first-child,
420−td > p:first-child {
433+th > :first-child,
434+td > :first-child {
421435 margin-top: 0px;
422436}
423437
424−th > p:last-child,
425−td > p:last-child {
438+th > :last-child,
439+td > :last-child {
426440 margin-bottom: 0px;
427441}
428442
@@ -468,6 +482,10 @@ table.field-list td, table.field-list th {
468482
469483/* -- hlist styles ---------------------------------------------------------- */
470484
485+table.hlist {
486+ margin: 1em 0;
487+}
488+
471489table.hlist td {
472490 vertical-align: top;
473491}
@@ -495,17 +513,34 @@ ol.upperroman {
495513 list-style: upper-roman;
496514}
497515
498−li > p:first-child {
516+ol > li:first-child > :first-child,
517+ul > li:first-child > :first-child {
499518 margin-top: 0px;
500519}
501520
502−li > p:last-child {
521+ol ol > li:first-child > :first-child,
522+ol ul > li:first-child > :first-child,
523+ul ol > li:first-child > :first-child,
524+ul ul > li:first-child > :first-child {
525+ margin-top: revert;
526+}
527+
528+ol > li:last-child > :last-child,
529+ul > li:last-child > :last-child {
503530 margin-bottom: 0px;
504531}
505532
533+ol ol > li:last-child > :last-child,
534+ol ul > li:last-child > :last-child,
535+ul ol > li:last-child > :last-child,
536+ul ul > li:last-child > :last-child {
537+ margin-bottom: revert;
538+}
539+
506540dl.footnote > dt,
507541dl.citation > dt {
508542 float: left;
543+ margin-right: 0.5em;
509544}
510545
511546dl.footnote > dd,
@@ -546,7 +581,7 @@ dl {
546581 margin-bottom: 15px;
547582}
548583
549−dd > p:first-child {
584+dd > :first-child {
550585 margin-top: 0px;
551586}
552587
@@ -560,6 +595,11 @@ dd {
560595 margin-left: 30px;
561596}
562597
598+dl > dd:last-child,
599+dl > dd:last-child > :last-child {
600+ margin-bottom: 0;
601+}
602+
563603dt:target, span.highlighted {
564604 background-color: #fbe54e;
565605}
@@ -644,22 +684,57 @@ span.pre {
644684 hyphens: none;
645685}
646686
687+div[class^="highlight-"] {
688+ margin: 1em 0;
689+}
690+
647691td.linenos pre {
648− padding: 5px 0px;
649692 border: 0;
650693 background-color: transparent;
651694 color: #aaa;
652695}
653696
654697table.highlighttable {
655− margin-left: 0.5em;
698+ display: block;
699+}
700+
701+table.highlighttable tbody {
702+ display: block;
703+}
704+
705+table.highlighttable tr {
706+ display: flex;
656707}
657708
658709table.highlighttable td {
659− padding: 0 0.5em 0 0.5em;
710+ margin: 0;
711+ padding: 0;
712+}
713+
714+table.highlighttable td.linenos {
715+ padding-right: 0.5em;
716+}
717+
718+table.highlighttable td.code {
719+ flex: 1;
720+ overflow: hidden;
721+}
722+
723+.highlight .hll {
724+ display: block;
725+}
726+
727+div.highlight pre,
728+table.highlighttable pre {
729+ margin: 0;
730+}
731+
732+div.code-block-caption + div {
733+ margin-top: 0;
660734}
661735
662736div.code-block-caption {
737+ margin-top: 1em;
663738 padding: 2px 5px;
664739 font-size: small;
665740}
@@ -668,10 +743,7 @@ div.code-block-caption code {
668743 background-color: transparent;
669744}
670745
671−div.code-block-caption + div > div.highlight > pre {
672− margin-top: 0;
673−}
674−
746+table.highlighttable td.linenos,
675747div.doctest > div.highlight span.gp { /* gp: Generic.Prompt */
676748 user-select: none;
677749}
@@ -685,11 +757,7 @@ div.code-block-caption span.caption-text {
685757}
686758
687759div.literal-block-wrapper {
688− padding: 1em 1em 0;
689−}
690−
691−div.literal-block-wrapper div.highlight {
692− margin: 0;
760+ margin: 1em 0;
693761}
694762
695763code.descname {
@@ -740,8 +808,7 @@ span.eqno {
740808}
741809
742810span.eqno a.headerlink {
743− position: relative;
744− left: 0px;
811+ position: absolute;
745812 z-index: 1;
746813}
747814
_static/documentation_options.js+1
@@ -5,6 +5,7 @@ var DOCUMENTATION_OPTIONS = {
55 COLLAPSE_INDEX: false,
66 BUILDER: 'html',
77 FILE_SUFFIX: '.html',
8+ LINK_SUFFIX: '.html',
89 HAS_SOURCE: true,
910 SOURCELINK_SUFFIX: '.txt',
1011 NAVIGATION_WITH_KEYS: false
_static/jquery-3.4.1.js → _static/jquery-3.5.1.jsrenamed+756−482
@@ -1,5 +1,5 @@
11/*!
2− * jQuery JavaScript Library v3.4.1
2+ * jQuery JavaScript Library v3.5.1
33 * https://jquery.com/
44 *
55 * Includes Sizzle.js
@@ -9,7 +9,7 @@
99 * Released under the MIT license
1010 * https://jquery.org/license
1111 *
12− * Date: 2019-05-01T21:04Z
12+ * Date: 2020-05-04T22:49Z
1313 */
1414( function( global, factory ) {
1515
@@ -47,13 +47,16 @@
4747
4848var arr = [];
4949
50−var document = window.document;
51−
5250var getProto = Object.getPrototypeOf;
5351
5452var slice = arr.slice;
5553
56−var concat = arr.concat;
54+var flat = arr.flat ? function( array ) {
55+ return arr.flat.call( array );
56+} : function( array ) {
57+ return arr.concat.apply( [], array );
58+};
59+
5760
5861var push = arr.push;
5962
@@ -86,6 +89,8 @@ var isWindow = function isWindow( obj ) {
8689 };
8790
8891
92+var document = window.document;
93+
8994
9095
9196 var preservedScriptAttributes = {
@@ -142,7 +147,7 @@ function toType( obj ) {
142147
143148
144149var
145− version = "3.4.1",
150+ version = "3.5.1",
146151
147152 // Define a local copy of jQuery
148153 jQuery = function( selector, context ) {
@@ -150,11 +155,7 @@ var
150155 // The jQuery object is actually just the init constructor 'enhanced'
151156 // Need init if jQuery is called (just allow error to be thrown if not included)
152157 return new jQuery.fn.init( selector, context );
153− },
154−
155− // Support: Android <=4.0 only
156− // Make sure we trim BOM and NBSP
157− rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;
158+ };
158159
159160jQuery.fn = jQuery.prototype = {
160161
@@ -220,6 +221,18 @@ jQuery.fn = jQuery.prototype = {
220221 return this.eq( -1 );
221222 },
222223
224+ even: function() {
225+ return this.pushStack( jQuery.grep( this, function( _elem, i ) {
226+ return ( i + 1 ) % 2;
227+ } ) );
228+ },
229+
230+ odd: function() {
231+ return this.pushStack( jQuery.grep( this, function( _elem, i ) {
232+ return i % 2;
233+ } ) );
234+ },
235+
223236 eq: function( i ) {
224237 var len = this.length,
225238 j = +i + ( i < 0 ? len : 0 );
@@ -353,9 +366,10 @@ jQuery.extend( {
353366 return true;
354367 },
355368
356− // Evaluates a script in a global context
357− globalEval: function( code, options ) {
358− DOMEval( code, { nonce: options && options.nonce } );
369+ // Evaluates a script in a provided context; falls back to the global one
370+ // if not specified.
371+ globalEval: function( code, options, doc ) {
372+ DOMEval( code, { nonce: options && options.nonce }, doc );
359373 },
360374
361375 each: function( obj, callback ) {
@@ -379,13 +393,6 @@ jQuery.extend( {
379393 return obj;
380394 },
381395
382− // Support: Android <=4.0 only
383− trim: function( text ) {
384− return text == null ?
385− "" :
386− ( text + "" ).replace( rtrim, "" );
387− },
388−
389396 // results is for internal usage only
390397 makeArray: function( arr, results ) {
391398 var ret = results || [];
@@ -472,7 +479,7 @@ jQuery.extend( {
472479 }
473480
474481 // Flatten any nested arrays
475− return concat.apply( [], ret );
482+ return flat( ret );
476483 },
477484
478485 // A global GUID counter for objects
@@ -489,7 +496,7 @@ if ( typeof Symbol === "function" ) {
489496
490497// Populate the class2type map
491498jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ),
492−function( i, name ) {
499+function( _i, name ) {
493500 class2type[ "[object " + name + "]" ] = name.toLowerCase();
494501} );
495502
@@ -511,17 +518,16 @@ function isArrayLike( obj ) {
511518}
512519var Sizzle =
513520/*!
514− * Sizzle CSS Selector Engine v2.3.4
521+ * Sizzle CSS Selector Engine v2.3.5
515522 * https://sizzlejs.com/
516523 *
517524 * Copyright JS Foundation and other contributors
518525 * Released under the MIT license
519526 * https://js.foundation/
520527 *
521− * Date: 2019-04-08
528+ * Date: 2020-03-14
522529 */
523−(function( window ) {
524−
530+( function( window ) {
525531var i,
526532 support,
527533 Expr,
@@ -561,59 +567,70 @@ var i,
561567 },
562568
563569 // Instance methods
564− hasOwn = ({}).hasOwnProperty,
570+ hasOwn = ( {} ).hasOwnProperty,
565571 arr = [],
566572 pop = arr.pop,
567− push_native = arr.push,
573+ pushNative = arr.push,
568574 push = arr.push,
569575 slice = arr.slice,
576+
570577 // Use a stripped-down indexOf as it's faster than native
571578 // https://jsperf.com/thor-indexof-vs-for/5
572579 indexOf = function( list, elem ) {
573580 var i = 0,
574581 len = list.length;
575582 for ( ; i < len; i++ ) {
576− if ( list[i] === elem ) {
583+ if ( list[ i ] === elem ) {
577584 return i;
578585 }
579586 }
580587 return -1;
581588 },
582589
583− booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",
590+ booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|" +
591+ "ismap|loop|multiple|open|readonly|required|scoped",
584592
585593 // Regular expressions
586594
587595 // http://www.w3.org/TR/css3-selectors/#whitespace
588596 whitespace = "[\\x20\\t\\r\\n\\f]",
589597
590− // http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier
591− identifier = "(?:\\\\.|[\\w-]|[^\0-\\xa0])+",
598+ // https://www.w3.org/TR/css-syntax-3/#ident-token-diagram
599+ identifier = "(?:\\\\[\\da-fA-F]{1,6}" + whitespace +
600+ "?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+",
592601
593602 // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors
594603 attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace +
604+
595605 // Operator (capture 2)
596606 "*([*^$|!~]?=)" + whitespace +
597− // "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]"
598− "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace +
599− "*\\]",
607+
608+ // "Attribute values must be CSS identifiers [capture 5]
609+ // or strings [capture 3 or capture 4]"
610+ "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" +
611+ whitespace + "*\\]",
600612
601613 pseudos = ":(" + identifier + ")(?:\\((" +
614+
602615 // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments:
603616 // 1. quoted (capture 3; capture 4 or capture 5)
604617 "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" +
618+
605619 // 2. simple (capture 6)
606620 "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" +
621+
607622 // 3. anything else (capture 2)
608623 ".*" +
609624 ")\\)|)",
610625
611626 // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter
612627 rwhitespace = new RegExp( whitespace + "+", "g" ),
613− rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ),
628+ rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" +
629+ whitespace + "+$", "g" ),
614630
615631 rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ),
616− rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ),
632+ rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace +
633+ "*" ),
617634 rdescend = new RegExp( whitespace + "|>" ),
618635
619636 rpseudo = new RegExp( pseudos ),
@@ -625,14 +642,16 @@ var i,
625642 "TAG": new RegExp( "^(" + identifier + "|[*])" ),
626643 "ATTR": new RegExp( "^" + attributes ),
627644 "PSEUDO": new RegExp( "^" + pseudos ),
628− "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace +
629− "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace +
630− "*(\\d+)|))" + whitespace + "*\\)|)", "i" ),
645+ "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" +
646+ whitespace + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" +
647+ whitespace + "*(\\d+)|))" + whitespace + "*\\)|)", "i" ),
631648 "bool": new RegExp( "^(?:" + booleans + ")$", "i" ),
649+
632650 // For use in libraries implementing .is()
633651 // We use this for POS matching in `select`
634− "needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" +
635− whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" )
652+ "needsContext": new RegExp( "^" + whitespace +
653+ "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + whitespace +
654+ "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" )
636655 },
637656
638657 rhtml = /HTML$/i,
@@ -648,18 +667,21 @@ var i,
648667
649668 // CSS escapes
650669 // http://www.w3.org/TR/CSS21/syndata.html#escaped-characters
651− runescape = new RegExp( "\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ),
652− funescape = function( _, escaped, escapedWhitespace ) {
653− var high = "0x" + escaped - 0x10000;
654− // NaN means non-codepoint
655− // Support: Firefox<24
656− // Workaround erroneous numeric interpretation of +"0x"
657− return high !== high || escapedWhitespace ?
658− escaped :
670+ runescape = new RegExp( "\\\\[\\da-fA-F]{1,6}" + whitespace + "?|\\\\([^\\r\\n\\f])", "g" ),
671+ funescape = function( escape, nonHex ) {
672+ var high = "0x" + escape.slice( 1 ) - 0x10000;
673+
674+ return nonHex ?
675+
676+ // Strip the backslash prefix from a non-hex escape sequence
677+ nonHex :
678+
679+ // Replace a hexadecimal escape sequence with the encoded Unicode code point
680+ // Support: IE <=11+
681+ // For values outside the Basic Multilingual Plane (BMP), manually construct a
682+ // surrogate pair
659683 high < 0 ?
660− // BMP codepoint
661684 String.fromCharCode( high + 0x10000 ) :
662− // Supplemental Plane codepoint (surrogate pair)
663685 String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );
664686 },
665687
@@ -675,7 +697,8 @@ var i,
675697 }
676698
677699 // Control characters and (dependent upon position) numbers get escaped as code points
678− return ch.slice( 0, -1 ) + "\\" + ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " ";
700+ return ch.slice( 0, -1 ) + "\\" +
701+ ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " ";
679702 }
680703
681704 // Other potentially-special ASCII characters get backslash-escaped
@@ -700,18 +723,20 @@ var i,
700723// Optimize for push.apply( _, NodeList )
701724try {
702725 push.apply(
703− (arr = slice.call( preferredDoc.childNodes )),
726+ ( arr = slice.call( preferredDoc.childNodes ) ),
704727 preferredDoc.childNodes
705728 );
729+
706730 // Support: Android<4.0
707731 // Detect silently failing push.apply
732+ // eslint-disable-next-line no-unused-expressions
708733 arr[ preferredDoc.childNodes.length ].nodeType;
709734} catch ( e ) {
710735 push = { apply: arr.length ?
711736
712737 // Leverage slice if possible
713738 function( target, els ) {
714− push_native.apply( target, slice.call(els) );
739+ pushNative.apply( target, slice.call( els ) );
715740 } :
716741
717742 // Support: IE<9
@@ -719,8 +744,9 @@ try {
719744 function( target, els ) {
720745 var j = target.length,
721746 i = 0;
747+
722748 // Can't trust NodeList.length
723− while ( (target[j++] = els[i++]) ) {}
749+ while ( ( target[ j++ ] = els[ i++ ] ) ) {}
724750 target.length = j - 1;
725751 }
726752 };
@@ -744,24 +770,21 @@ function Sizzle( selector, context, results, seed ) {
744770
745771 // Try to shortcut find operations (as opposed to filters) in HTML documents
746772 if ( !seed ) {
747−
748− if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) {
749− setDocument( context );
750− }
773+ setDocument( context );
751774 context = context || document;
752775
753776 if ( documentIsHTML ) {
754777
755778 // If the selector is sufficiently simple, try using a "get*By*" DOM method
756779 // (excepting DocumentFragment context, where the methods don't exist)
757− if ( nodeType !== 11 && (match = rquickExpr.exec( selector )) ) {
780+ if ( nodeType !== 11 && ( match = rquickExpr.exec( selector ) ) ) {
758781
759782 // ID selector
760− if ( (m = match[1]) ) {
783+ if ( ( m = match[ 1 ] ) ) {
761784
762785 // Document context
763786 if ( nodeType === 9 ) {
764− if ( (elem = context.getElementById( m )) ) {
787+ if ( ( elem = context.getElementById( m ) ) ) {
765788
766789 // Support: IE, Opera, Webkit
767790 // TODO: identify versions
@@ -780,7 +803,7 @@ function Sizzle( selector, context, results, seed ) {
780803 // Support: IE, Opera, Webkit
781804 // TODO: identify versions
782805 // getElementById can match elements by name instead of ID
783− if ( newContext && (elem = newContext.getElementById( m )) &&
806+ if ( newContext && ( elem = newContext.getElementById( m ) ) &&
784807 contains( context, elem ) &&
785808 elem.id === m ) {
786809
@@ -790,12 +813,12 @@ function Sizzle( selector, context, results, seed ) {
790813 }
791814
792815 // Type selector
793− } else if ( match[2] ) {
816+ } else if ( match[ 2 ] ) {
794817 push.apply( results, context.getElementsByTagName( selector ) );
795818 return results;
796819
797820 // Class selector
798− } else if ( (m = match[3]) && support.getElementsByClassName &&
821+ } else if ( ( m = match[ 3 ] ) && support.getElementsByClassName &&
799822 context.getElementsByClassName ) {
800823
801824 push.apply( results, context.getElementsByClassName( m ) );
@@ -806,11 +829,11 @@ function Sizzle( selector, context, results, seed ) {
806829 // Take advantage of querySelectorAll
807830 if ( support.qsa &&
808831 !nonnativeSelectorCache[ selector + " " ] &&
809− (!rbuggyQSA || !rbuggyQSA.test( selector )) &&
832+ ( !rbuggyQSA || !rbuggyQSA.test( selector ) ) &&
810833
811834 // Support: IE 8 only
812835 // Exclude object elements
813− (nodeType !== 1 || context.nodeName.toLowerCase() !== "object") ) {
836+ ( nodeType !== 1 || context.nodeName.toLowerCase() !== "object" ) ) {
814837
815838 newSelector = selector;
816839 newContext = context;
@@ -819,27 +842,36 @@ function Sizzle( selector, context, results, seed ) {
819842 // descendant combinators, which is not what we want.
820843 // In such cases, we work around the behavior by prefixing every selector in the
821844 // list with an ID selector referencing the scope context.
845+ // The technique has to be used as well when a leading combinator is used
846+ // as such selectors are not recognized by querySelectorAll.
822847 // Thanks to Andrew Dupont for this technique.
823− if ( nodeType === 1 && rdescend.test( selector ) ) {
848+ if ( nodeType === 1 &&
849+ ( rdescend.test( selector ) || rcombinators.test( selector ) ) ) {
824850
825− // Capture the context ID, setting it first if necessary
826− if ( (nid = context.getAttribute( "id" )) ) {
827− nid = nid.replace( rcssescape, fcssescape );
828− } else {
829− context.setAttribute( "id", (nid = expando) );
851+ // Expand context for sibling selectors
852+ newContext = rsibling.test( selector ) && testContext( context.parentNode ) ||
853+ context;
854+
855+ // We can use :scope instead of the ID hack if the browser
856+ // supports it & if we're not changing the context.
857+ if ( newContext !== context || !support.scope ) {
858+
859+ // Capture the context ID, setting it first if necessary
860+ if ( ( nid = context.getAttribute( "id" ) ) ) {
861+ nid = nid.replace( rcssescape, fcssescape );
862+ } else {
863+ context.setAttribute( "id", ( nid = expando ) );
864+ }
830865 }
831866
832867 // Prefix every selector in the list
833868 groups = tokenize( selector );
834869 i = groups.length;
835870 while ( i-- ) {
836− groups[i] = "#" + nid + " " + toSelector( groups[i] );
871+ groups[ i ] = ( nid ? "#" + nid : ":scope" ) + " " +
872+ toSelector( groups[ i ] );
837873 }
838874 newSelector = groups.join( "," );
839−
840− // Expand context for sibling selectors
841− newContext = rsibling.test( selector ) && testContext( context.parentNode ) ||
842− context;
843875 }
844876
845877 try {
@@ -872,12 +904,14 @@ function createCache() {
872904 var keys = [];
873905
874906 function cache( key, value ) {
907+
875908 // Use (key + " ") to avoid collision with native prototype properties (see Issue #157)
876909 if ( keys.push( key + " " ) > Expr.cacheLength ) {
910+
877911 // Only keep the most recent entries
878912 delete cache[ keys.shift() ];
879913 }
880− return (cache[ key + " " ] = value);
914+ return ( cache[ key + " " ] = value );
881915 }
882916 return cache;
883917}
@@ -896,17 +930,19 @@ function markFunction( fn ) {
896930 * @param {Function} fn Passed the created element and returns a boolean result
897931 */
898932function assert( fn ) {
899− var el = document.createElement("fieldset");
933+ var el = document.createElement( "fieldset" );
900934
901935 try {
902936 return !!fn( el );
903− } catch (e) {
937+ } catch ( e ) {
904938 return false;
905939 } finally {
940+
906941 // Remove from its parent by default
907942 if ( el.parentNode ) {
908943 el.parentNode.removeChild( el );
909944 }
945+
910946 // release memory in IE
911947 el = null;
912948 }
@@ -918,11 +954,11 @@ function assert( fn ) {
918954 * @param {Function} handler The method that will be applied
919955 */
920956function addHandle( attrs, handler ) {
921− var arr = attrs.split("|"),
957+ var arr = attrs.split( "|" ),
922958 i = arr.length;
923959
924960 while ( i-- ) {
925− Expr.attrHandle[ arr[i] ] = handler;
961+ Expr.attrHandle[ arr[ i ] ] = handler;
926962 }
927963}
928964
@@ -944,7 +980,7 @@ function siblingCheck( a, b ) {
944980
945981 // Check if b follows a
946982 if ( cur ) {
947− while ( (cur = cur.nextSibling) ) {
983+ while ( ( cur = cur.nextSibling ) ) {
948984 if ( cur === b ) {
949985 return -1;
950986 }
@@ -972,7 +1008,7 @@ function createInputPseudo( type ) {
9721008function createButtonPseudo( type ) {
9731009 return function( elem ) {
9741010 var name = elem.nodeName.toLowerCase();
975− return (name === "input" || name === "button") && elem.type === type;
1011+ return ( name === "input" || name === "button" ) && elem.type === type;
9761012 };
9771013}
9781014
@@ -1015,7 +1051,7 @@ function createDisabledPseudo( disabled ) {
10151051 // Where there is no isDisabled, check manually
10161052 /* jshint -W018 */
10171053 elem.isDisabled !== !disabled &&
1018− inDisabledFieldset( elem ) === disabled;
1054+ inDisabledFieldset( elem ) === disabled;
10191055 }
10201056
10211057 return elem.disabled === disabled;
@@ -1037,21 +1073,21 @@ function createDisabledPseudo( disabled ) {
10371073 * @param {Function} fn
10381074 */
10391075function createPositionalPseudo( fn ) {
1040− return markFunction(function( argument ) {
1076+ return markFunction( function( argument ) {
10411077 argument = +argument;
1042− return markFunction(function( seed, matches ) {
1078+ return markFunction( function( seed, matches ) {
10431079 var j,
10441080 matchIndexes = fn( [], seed.length, argument ),
10451081 i = matchIndexes.length;
10461082
10471083 // Match elements found at the specified indexes
10481084 while ( i-- ) {
1049− if ( seed[ (j = matchIndexes[i]) ] ) {
1050− seed[j] = !(matches[j] = seed[j]);
1085+ if ( seed[ ( j = matchIndexes[ i ] ) ] ) {
1086+ seed[ j ] = !( matches[ j ] = seed[ j ] );
10511087 }
10521088 }
1053− });
1054− });
1089+ } );
1090+ } );
10551091}
10561092
10571093/**
@@ -1073,7 +1109,7 @@ support = Sizzle.support = {};
10731109 */
10741110isXML = Sizzle.isXML = function( elem ) {
10751111 var namespace = elem.namespaceURI,
1076− docElem = (elem.ownerDocument || elem).documentElement;
1112+ docElem = ( elem.ownerDocument || elem ).documentElement;
10771113
10781114 // Support: IE <=8
10791115 // Assume HTML when documentElement doesn't yet exist, such as inside loading iframes
@@ -1091,7 +1127,11 @@ setDocument = Sizzle.setDocument = function( node ) {
10911127 doc = node ? node.ownerDocument || node : preferredDoc;
10921128
10931129 // Return early if doc is invalid or already selected
1094− if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) {
1130+ // Support: IE 11+, Edge 17 - 18+
1131+ // IE/Edge sometimes throw a "Permission denied" error when strict-comparing
1132+ // two documents; shallow comparisons work.
1133+ // eslint-disable-next-line eqeqeq
1134+ if ( doc == document || doc.nodeType !== 9 || !doc.documentElement ) {
10951135 return document;
10961136 }
10971137
@@ -1100,10 +1140,14 @@ setDocument = Sizzle.setDocument = function( node ) {
11001140 docElem = document.documentElement;
11011141 documentIsHTML = !isXML( document );
11021142
1103− // Support: IE 9-11, Edge
1143+ // Support: IE 9 - 11+, Edge 12 - 18+
11041144 // Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936)
1105− if ( preferredDoc !== document &&
1106− (subWindow = document.defaultView) && subWindow.top !== subWindow ) {
1145+ // Support: IE 11+, Edge 17 - 18+
1146+ // IE/Edge sometimes throw a "Permission denied" error when strict-comparing
1147+ // two documents; shallow comparisons work.
1148+ // eslint-disable-next-line eqeqeq
1149+ if ( preferredDoc != document &&
1150+ ( subWindow = document.defaultView ) && subWindow.top !== subWindow ) {
11071151
11081152 // Support: IE 11, Edge
11091153 if ( subWindow.addEventListener ) {
@@ -1115,25 +1159,36 @@ setDocument = Sizzle.setDocument = function( node ) {
11151159 }
11161160 }
11171161
1162+ // Support: IE 8 - 11+, Edge 12 - 18+, Chrome <=16 - 25 only, Firefox <=3.6 - 31 only,
1163+ // Safari 4 - 5 only, Opera <=11.6 - 12.x only
1164+ // IE/Edge & older browsers don't support the :scope pseudo-class.
1165+ // Support: Safari 6.0 only
1166+ // Safari 6.0 supports :scope but it's an alias of :root there.
1167+ support.scope = assert( function( el ) {
1168+ docElem.appendChild( el ).appendChild( document.createElement( "div" ) );
1169+ return typeof el.querySelectorAll !== "undefined" &&
1170+ !el.querySelectorAll( ":scope fieldset div" ).length;
1171+ } );
1172+
11181173 /* Attributes
11191174 ---------------------------------------------------------------------- */
11201175
11211176 // Support: IE<8
11221177 // Verify that getAttribute really returns attributes and not properties
11231178 // (excepting IE8 booleans)
1124− support.attributes = assert(function( el ) {
1179+ support.attributes = assert( function( el ) {
11251180 el.className = "i";
1126− return !el.getAttribute("className");
1127− });
1181+ return !el.getAttribute( "className" );
1182+ } );
11281183
11291184 /* getElement(s)By*
11301185 ---------------------------------------------------------------------- */
11311186
11321187 // Check if getElementsByTagName("*") returns only elements
1133− support.getElementsByTagName = assert(function( el ) {
1134− el.appendChild( document.createComment("") );
1135− return !el.getElementsByTagName("*").length;
1136− });
1188+ support.getElementsByTagName = assert( function( el ) {
1189+ el.appendChild( document.createComment( "" ) );
1190+ return !el.getElementsByTagName( "*" ).length;
1191+ } );
11371192
11381193 // Support: IE<9
11391194 support.getElementsByClassName = rnative.test( document.getElementsByClassName );
@@ -1142,38 +1197,38 @@ setDocument = Sizzle.setDocument = function( node ) {
11421197 // Check if getElementById returns elements by name
11431198 // The broken getElementById methods don't pick up programmatically-set names,
11441199 // so use a roundabout getElementsByName test
1145− support.getById = assert(function( el ) {
1200+ support.getById = assert( function( el ) {
11461201 docElem.appendChild( el ).id = expando;
11471202 return !document.getElementsByName || !document.getElementsByName( expando ).length;
1148− });
1203+ } );
11491204
11501205 // ID filter and find
11511206 if ( support.getById ) {
1152− Expr.filter["ID"] = function( id ) {
1207+ Expr.filter[ "ID" ] = function( id ) {
11531208 var attrId = id.replace( runescape, funescape );
11541209 return function( elem ) {
1155− return elem.getAttribute("id") === attrId;
1210+ return elem.getAttribute( "id" ) === attrId;
11561211 };
11571212 };
1158− Expr.find["ID"] = function( id, context ) {
1213+ Expr.find[ "ID" ] = function( id, context ) {
11591214 if ( typeof context.getElementById !== "undefined" && documentIsHTML ) {
11601215 var elem = context.getElementById( id );
11611216 return elem ? [ elem ] : [];
11621217 }
11631218 };
11641219 } else {
1165− Expr.filter["ID"] = function( id ) {
1220+ Expr.filter[ "ID" ] = function( id ) {
11661221 var attrId = id.replace( runescape, funescape );
11671222 return function( elem ) {
11681223 var node = typeof elem.getAttributeNode !== "undefined" &&
1169− elem.getAttributeNode("id");
1224+ elem.getAttributeNode( "id" );
11701225 return node && node.value === attrId;
11711226 };
11721227 };
11731228
11741229 // Support: IE 6 - 7 only
11751230 // getElementById is not reliable as a find shortcut
1176− Expr.find["ID"] = function( id, context ) {
1231+ Expr.find[ "ID" ] = function( id, context ) {
11771232 if ( typeof context.getElementById !== "undefined" && documentIsHTML ) {
11781233 var node, i, elems,
11791234 elem = context.getElementById( id );
@@ -1181,7 +1236,7 @@ setDocument = Sizzle.setDocument = function( node ) {
11811236 if ( elem ) {
11821237
11831238 // Verify the id attribute
1184− node = elem.getAttributeNode("id");
1239+ node = elem.getAttributeNode( "id" );
11851240 if ( node && node.value === id ) {
11861241 return [ elem ];
11871242 }
@@ -1189,8 +1244,8 @@ setDocument = Sizzle.setDocument = function( node ) {
11891244 // Fall back on getElementsByName
11901245 elems = context.getElementsByName( id );
11911246 i = 0;
1192− while ( (elem = elems[i++]) ) {
1193− node = elem.getAttributeNode("id");
1247+ while ( ( elem = elems[ i++ ] ) ) {
1248+ node = elem.getAttributeNode( "id" );
11941249 if ( node && node.value === id ) {
11951250 return [ elem ];
11961251 }
@@ -1203,7 +1258,7 @@ setDocument = Sizzle.setDocument = function( node ) {
12031258 }
12041259
12051260 // Tag
1206− Expr.find["TAG"] = support.getElementsByTagName ?
1261+ Expr.find[ "TAG" ] = support.getElementsByTagName ?
12071262 function( tag, context ) {
12081263 if ( typeof context.getElementsByTagName !== "undefined" ) {
12091264 return context.getElementsByTagName( tag );
@@ -1218,12 +1273,13 @@ setDocument = Sizzle.setDocument = function( node ) {
12181273 var elem,
12191274 tmp = [],
12201275 i = 0,
1276+
12211277 // By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too
12221278 results = context.getElementsByTagName( tag );
12231279
12241280 // Filter out possible comments
12251281 if ( tag === "*" ) {
1226− while ( (elem = results[i++]) ) {
1282+ while ( ( elem = results[ i++ ] ) ) {
12271283 if ( elem.nodeType === 1 ) {
12281284 tmp.push( elem );
12291285 }
@@ -1235,7 +1291,7 @@ setDocument = Sizzle.setDocument = function( node ) {
12351291 };
12361292
12371293 // Class
1238− Expr.find["CLASS"] = support.getElementsByClassName && function( className, context ) {
1294+ Expr.find[ "CLASS" ] = support.getElementsByClassName && function( className, context ) {
12391295 if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) {
12401296 return context.getElementsByClassName( className );
12411297 }
@@ -1256,10 +1312,14 @@ setDocument = Sizzle.setDocument = function( node ) {
12561312 // See https://bugs.jquery.com/ticket/13378
12571313 rbuggyQSA = [];
12581314
1259− if ( (support.qsa = rnative.test( document.querySelectorAll )) ) {
1315+ if ( ( support.qsa = rnative.test( document.querySelectorAll ) ) ) {
1316+
12601317 // Build QSA regex
12611318 // Regex strategy adopted from Diego Perini
1262− assert(function( el ) {
1319+ assert( function( el ) {
1320+
1321+ var input;
1322+
12631323 // Select is set to empty string on purpose
12641324 // This is to test IE's treatment of not explicitly
12651325 // setting a boolean content attribute,
@@ -1273,78 +1333,98 @@ setDocument = Sizzle.setDocument = function( node ) {
12731333 // Nothing should be selected when empty strings follow ^= or $= or *=
12741334 // The test attribute must be unknown in Opera but "safe" for WinRT
12751335 // https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section
1276− if ( el.querySelectorAll("[msallowcapture^='']").length ) {
1336+ if ( el.querySelectorAll( "[msallowcapture^='']" ).length ) {
12771337 rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" );
12781338 }
12791339
12801340 // Support: IE8
12811341 // Boolean attributes and "value" are not treated correctly
1282− if ( !el.querySelectorAll("[selected]").length ) {
1342+ if ( !el.querySelectorAll( "[selected]" ).length ) {
12831343 rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" );
12841344 }
12851345
12861346 // Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+
12871347 if ( !el.querySelectorAll( "[id~=" + expando + "-]" ).length ) {
1288− rbuggyQSA.push("~=");
1348+ rbuggyQSA.push( "~=" );
1349+ }
1350+
1351+ // Support: IE 11+, Edge 15 - 18+
1352+ // IE 11/Edge don't find elements on a `[name='']` query in some cases.
1353+ // Adding a temporary attribute to the document before the selection works
1354+ // around the issue.
1355+ // Interestingly, IE 10 & older don't seem to have the issue.
1356+ input = document.createElement( "input" );
1357+ input.setAttribute( "name", "" );
1358+ el.appendChild( input );
1359+ if ( !el.querySelectorAll( "[name='']" ).length ) {
1360+ rbuggyQSA.push( "\\[" + whitespace + "*name" + whitespace + "*=" +
1361+ whitespace + "*(?:''|\"\")" );
12891362 }
12901363
12911364 // Webkit/Opera - :checked should return selected option elements
12921365 // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
12931366 // IE8 throws error here and will not see later tests
1294− if ( !el.querySelectorAll(":checked").length ) {
1295− rbuggyQSA.push(":checked");
1367+ if ( !el.querySelectorAll( ":checked" ).length ) {
1368+ rbuggyQSA.push( ":checked" );
12961369 }
12971370
12981371 // Support: Safari 8+, iOS 8+
12991372 // https://bugs.webkit.org/show_bug.cgi?id=136851
13001373 // In-page `selector#id sibling-combinator selector` fails
13011374 if ( !el.querySelectorAll( "a#" + expando + "+*" ).length ) {
1302− rbuggyQSA.push(".#.+[+~]");
1375+ rbuggyQSA.push( ".#.+[+~]" );
13031376 }
1304− });
13051377
1306− assert(function( el ) {
1378+ // Support: Firefox <=3.6 - 5 only
1379+ // Old Firefox doesn't throw on a badly-escaped identifier.
1380+ el.querySelectorAll( "\\\f" );
1381+ rbuggyQSA.push( "[\\r\\n\\f]" );
1382+ } );
1383+
1384+ assert( function( el ) {
13071385 el.innerHTML = "<a href='' disabled='disabled'></a>" +
13081386 "<select disabled='disabled'><option/></select>";
13091387
13101388 // Support: Windows 8 Native Apps
13111389 // The type and name attributes are restricted during .innerHTML assignment
1312− var input = document.createElement("input");
1390+ var input = document.createElement( "input" );
13131391 input.setAttribute( "type", "hidden" );
13141392 el.appendChild( input ).setAttribute( "name", "D" );
13151393
13161394 // Support: IE8
13171395 // Enforce case-sensitivity of name attribute
1318− if ( el.querySelectorAll("[name=d]").length ) {
1396+ if ( el.querySelectorAll( "[name=d]" ).length ) {
13191397 rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" );
13201398 }
13211399
13221400 // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)
13231401 // IE8 throws error here and will not see later tests
1324− if ( el.querySelectorAll(":enabled").length !== 2 ) {
1402+ if ( el.querySelectorAll( ":enabled" ).length !== 2 ) {
13251403 rbuggyQSA.push( ":enabled", ":disabled" );
13261404 }
13271405
13281406 // Support: IE9-11+
13291407 // IE's :disabled selector does not pick up the children of disabled fieldsets
13301408 docElem.appendChild( el ).disabled = true;
1331− if ( el.querySelectorAll(":disabled").length !== 2 ) {
1409+ if ( el.querySelectorAll( ":disabled" ).length !== 2 ) {
13321410 rbuggyQSA.push( ":enabled", ":disabled" );
13331411 }
13341412
1413+ // Support: Opera 10 - 11 only
13351414 // Opera 10-11 does not throw on post-comma invalid pseudos
1336− el.querySelectorAll("*,:x");
1337− rbuggyQSA.push(",.*:");
1338− });
1415+ el.querySelectorAll( "*,:x" );
1416+ rbuggyQSA.push( ",.*:" );
1417+ } );
13391418 }
13401419
1341− if ( (support.matchesSelector = rnative.test( (matches = docElem.matches ||
1420+ if ( ( support.matchesSelector = rnative.test( ( matches = docElem.matches ||
13421421 docElem.webkitMatchesSelector ||
13431422 docElem.mozMatchesSelector ||
13441423 docElem.oMatchesSelector ||
1345− docElem.msMatchesSelector) )) ) {
1424+ docElem.msMatchesSelector ) ) ) ) {
1425+
1426+ assert( function( el ) {
13461427
1347− assert(function( el ) {
13481428 // Check to see if it's possible to do matchesSelector
13491429 // on a disconnected node (IE 9)
13501430 support.disconnectedMatch = matches.call( el, "*" );
@@ -1353,11 +1433,11 @@ setDocument = Sizzle.setDocument = function( node ) {
13531433 // Gecko does not error, returns false instead
13541434 matches.call( el, "[s!='']:x" );
13551435 rbuggyMatches.push( "!=", pseudos );
1356− });
1436+ } );
13571437 }
13581438
1359− rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") );
1360− rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join("|") );
1439+ rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join( "|" ) );
1440+ rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join( "|" ) );
13611441
13621442 /* Contains
13631443 ---------------------------------------------------------------------- */
@@ -1374,11 +1454,11 @@ setDocument = Sizzle.setDocument = function( node ) {
13741454 adown.contains ?
13751455 adown.contains( bup ) :
13761456 a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16
1377− ));
1457+ ) );
13781458 } :
13791459 function( a, b ) {
13801460 if ( b ) {
1381− while ( (b = b.parentNode) ) {
1461+ while ( ( b = b.parentNode ) ) {
13821462 if ( b === a ) {
13831463 return true;
13841464 }
@@ -1407,7 +1487,11 @@ setDocument = Sizzle.setDocument = function( node ) {
14071487 }
14081488
14091489 // Calculate position if both inputs belong to the same document
1410− compare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ?
1490+ // Support: IE 11+, Edge 17 - 18+
1491+ // IE/Edge sometimes throw a "Permission denied" error when strict-comparing
1492+ // two documents; shallow comparisons work.
1493+ // eslint-disable-next-line eqeqeq
1494+ compare = ( a.ownerDocument || a ) == ( b.ownerDocument || b ) ?
14111495 a.compareDocumentPosition( b ) :
14121496
14131497 // Otherwise we know they are disconnected
@@ -1415,13 +1499,24 @@ setDocument = Sizzle.setDocument = function( node ) {
14151499
14161500 // Disconnected nodes
14171501 if ( compare & 1 ||
1418− (!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) {
1502+ ( !support.sortDetached && b.compareDocumentPosition( a ) === compare ) ) {
14191503
14201504 // Choose the first element that is related to our preferred document
1421− if ( a === document || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) {
1505+ // Support: IE 11+, Edge 17 - 18+
1506+ // IE/Edge sometimes throw a "Permission denied" error when strict-comparing
1507+ // two documents; shallow comparisons work.
1508+ // eslint-disable-next-line eqeqeq
1509+ if ( a == document || a.ownerDocument == preferredDoc &&
1510+ contains( preferredDoc, a ) ) {
14221511 return -1;
14231512 }
1424− if ( b === document || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) {
1513+
1514+ // Support: IE 11+, Edge 17 - 18+
1515+ // IE/Edge sometimes throw a "Permission denied" error when strict-comparing
1516+ // two documents; shallow comparisons work.
1517+ // eslint-disable-next-line eqeqeq
1518+ if ( b == document || b.ownerDocument == preferredDoc &&
1519+ contains( preferredDoc, b ) ) {
14251520 return 1;
14261521 }
14271522
@@ -1434,6 +1529,7 @@ setDocument = Sizzle.setDocument = function( node ) {
14341529 return compare & 4 ? -1 : 1;
14351530 } :
14361531 function( a, b ) {
1532+
14371533 // Exit early if the nodes are identical
14381534 if ( a === b ) {
14391535 hasDuplicate = true;
@@ -1449,8 +1545,14 @@ setDocument = Sizzle.setDocument = function( node ) {
14491545
14501546 // Parentless nodes are either documents or disconnected
14511547 if ( !aup || !bup ) {
1452− return a === document ? -1 :
1453− b === document ? 1 :
1548+
1549+ // Support: IE 11+, Edge 17 - 18+
1550+ // IE/Edge sometimes throw a "Permission denied" error when strict-comparing
1551+ // two documents; shallow comparisons work.
1552+ /* eslint-disable eqeqeq */
1553+ return a == document ? -1 :
1554+ b == document ? 1 :
1555+ /* eslint-enable eqeqeq */
14541556 aup ? -1 :
14551557 bup ? 1 :
14561558 sortInput ?
@@ -1464,26 +1566,32 @@ setDocument = Sizzle.setDocument = function( node ) {
14641566
14651567 // Otherwise we need full lists of their ancestors for comparison
14661568 cur = a;
1467− while ( (cur = cur.parentNode) ) {
1569+ while ( ( cur = cur.parentNode ) ) {
14681570 ap.unshift( cur );
14691571 }
14701572 cur = b;
1471− while ( (cur = cur.parentNode) ) {
1573+ while ( ( cur = cur.parentNode ) ) {
14721574 bp.unshift( cur );
14731575 }
14741576
14751577 // Walk down the tree looking for a discrepancy
1476− while ( ap[i] === bp[i] ) {
1578+ while ( ap[ i ] === bp[ i ] ) {
14771579 i++;
14781580 }
14791581
14801582 return i ?
1583+
14811584 // Do a sibling check if the nodes have a common ancestor
1482− siblingCheck( ap[i], bp[i] ) :
1585+ siblingCheck( ap[ i ], bp[ i ] ) :
14831586
14841587 // Otherwise nodes in our document sort first
1485− ap[i] === preferredDoc ? -1 :
1486− bp[i] === preferredDoc ? 1 :
1588+ // Support: IE 11+, Edge 17 - 18+
1589+ // IE/Edge sometimes throw a "Permission denied" error when strict-comparing
1590+ // two documents; shallow comparisons work.
1591+ /* eslint-disable eqeqeq */
1592+ ap[ i ] == preferredDoc ? -1 :
1593+ bp[ i ] == preferredDoc ? 1 :
1594+ /* eslint-enable eqeqeq */
14871595 0;
14881596 };
14891597
@@ -1495,10 +1603,7 @@ Sizzle.matches = function( expr, elements ) {
14951603};
14961604
14971605Sizzle.matchesSelector = function( elem, expr ) {
1498− // Set document vars if needed
1499− if ( ( elem.ownerDocument || elem ) !== document ) {
1500− setDocument( elem );
1501− }
1606+ setDocument( elem );
15021607
15031608 if ( support.matchesSelector && documentIsHTML &&
15041609 !nonnativeSelectorCache[ expr + " " ] &&
@@ -1510,12 +1615,13 @@ Sizzle.matchesSelector = function( elem, expr ) {
15101615
15111616 // IE 9's matchesSelector returns false on disconnected nodes
15121617 if ( ret || support.disconnectedMatch ||
1513− // As well, disconnected nodes are said to be in a document
1514− // fragment in IE 9
1515− elem.document && elem.document.nodeType !== 11 ) {
1618+
1619+ // As well, disconnected nodes are said to be in a document
1620+ // fragment in IE 9
1621+ elem.document && elem.document.nodeType !== 11 ) {
15161622 return ret;
15171623 }
1518− } catch (e) {
1624+ } catch ( e ) {
15191625 nonnativeSelectorCache( expr, true );
15201626 }
15211627 }
@@ -1524,20 +1630,31 @@ Sizzle.matchesSelector = function( elem, expr ) {
15241630};
15251631
15261632Sizzle.contains = function( context, elem ) {
1633+
15271634 // Set document vars if needed
1528− if ( ( context.ownerDocument || context ) !== document ) {
1635+ // Support: IE 11+, Edge 17 - 18+
1636+ // IE/Edge sometimes throw a "Permission denied" error when strict-comparing
1637+ // two documents; shallow comparisons work.
1638+ // eslint-disable-next-line eqeqeq
1639+ if ( ( context.ownerDocument || context ) != document ) {
15291640 setDocument( context );
15301641 }
15311642 return contains( context, elem );
15321643};
15331644
15341645Sizzle.attr = function( elem, name ) {
1646+
15351647 // Set document vars if needed
1536− if ( ( elem.ownerDocument || elem ) !== document ) {
1648+ // Support: IE 11+, Edge 17 - 18+
1649+ // IE/Edge sometimes throw a "Permission denied" error when strict-comparing
1650+ // two documents; shallow comparisons work.
1651+ // eslint-disable-next-line eqeqeq
1652+ if ( ( elem.ownerDocument || elem ) != document ) {
15371653 setDocument( elem );
15381654 }
15391655
15401656 var fn = Expr.attrHandle[ name.toLowerCase() ],
1657+
15411658 // Don't get fooled by Object.prototype properties (jQuery #13807)
15421659 val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ?
15431660 fn( elem, name, !documentIsHTML ) :
@@ -1547,13 +1664,13 @@ Sizzle.attr = function( elem, name ) {
15471664 val :
15481665 support.attributes || !documentIsHTML ?
15491666 elem.getAttribute( name ) :
1550− (val = elem.getAttributeNode(name)) && val.specified ?
1667+ ( val = elem.getAttributeNode( name ) ) && val.specified ?
15511668 val.value :
15521669 null;
15531670};
15541671
15551672Sizzle.escape = function( sel ) {
1556− return (sel + "").replace( rcssescape, fcssescape );
1673+ return ( sel + "" ).replace( rcssescape, fcssescape );
15571674};
15581675
15591676Sizzle.error = function( msg ) {
@@ -1576,7 +1693,7 @@ Sizzle.uniqueSort = function( results ) {
15761693 results.sort( sortOrder );
15771694
15781695 if ( hasDuplicate ) {
1579− while ( (elem = results[i++]) ) {
1696+ while ( ( elem = results[ i++ ] ) ) {
15801697 if ( elem === results[ i ] ) {
15811698 j = duplicates.push( i );
15821699 }
@@ -1604,17 +1721,21 @@ getText = Sizzle.getText = function( elem ) {
16041721 nodeType = elem.nodeType;
16051722
16061723 if ( !nodeType ) {
1724+
16071725 // If no nodeType, this is expected to be an array
1608− while ( (node = elem[i++]) ) {
1726+ while ( ( node = elem[ i++ ] ) ) {
1727+
16091728 // Do not traverse comment nodes
16101729 ret += getText( node );
16111730 }
16121731 } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {
1732+
16131733 // Use textContent for elements
16141734 // innerText usage removed for consistency of new lines (jQuery #11153)
16151735 if ( typeof elem.textContent === "string" ) {
16161736 return elem.textContent;
16171737 } else {
1738+
16181739 // Traverse its children
16191740 for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
16201741 ret += getText( elem );
@@ -1623,6 +1744,7 @@ getText = Sizzle.getText = function( elem ) {
16231744 } else if ( nodeType === 3 || nodeType === 4 ) {
16241745 return elem.nodeValue;
16251746 }
1747+
16261748 // Do not include comment or processing instruction nodes
16271749
16281750 return ret;
@@ -1650,19 +1772,21 @@ Expr = Sizzle.selectors = {
16501772
16511773 preFilter: {
16521774 "ATTR": function( match ) {
1653− match[1] = match[1].replace( runescape, funescape );
1775+ match[ 1 ] = match[ 1 ].replace( runescape, funescape );
16541776
16551777 // Move the given value to match[3] whether quoted or unquoted
1656− match[3] = ( match[3] || match[4] || match[5] || "" ).replace( runescape, funescape );
1778+ match[ 3 ] = ( match[ 3 ] || match[ 4 ] ||
1779+ match[ 5 ] || "" ).replace( runescape, funescape );
16571780
1658− if ( match[2] === "~=" ) {
1659− match[3] = " " + match[3] + " ";
1781+ if ( match[ 2 ] === "~=" ) {
1782+ match[ 3 ] = " " + match[ 3 ] + " ";
16601783 }
16611784
16621785 return match.slice( 0, 4 );
16631786 },
16641787
16651788 "CHILD": function( match ) {
1789+
16661790 /* matches from matchExpr["CHILD"]
16671791 1 type (only|nth|...)
16681792 2 what (child|of-type)
@@ -1673,22 +1797,25 @@ Expr = Sizzle.selectors = {
16731797 7 sign of y-component
16741798 8 y of y-component
16751799 */
1676− match[1] = match[1].toLowerCase();
1800+ match[ 1 ] = match[ 1 ].toLowerCase();
1801+
1802+ if ( match[ 1 ].slice( 0, 3 ) === "nth" ) {
16771803
1678− if ( match[1].slice( 0, 3 ) === "nth" ) {
16791804 // nth-* requires argument
1680− if ( !match[3] ) {
1681− Sizzle.error( match[0] );
1805+ if ( !match[ 3 ] ) {
1806+ Sizzle.error( match[ 0 ] );
16821807 }
16831808
16841809 // numeric x and y parameters for Expr.filter.CHILD
16851810 // remember that false/true cast respectively to 0/1
1686− match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) );
1687− match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" );
1811+ match[ 4 ] = +( match[ 4 ] ?
1812+ match[ 5 ] + ( match[ 6 ] || 1 ) :
1813+ 2 * ( match[ 3 ] === "even" || match[ 3 ] === "odd" ) );
1814+ match[ 5 ] = +( ( match[ 7 ] + match[ 8 ] ) || match[ 3 ] === "odd" );
16881815
1689− // other types prohibit arguments
1690− } else if ( match[3] ) {
1691− Sizzle.error( match[0] );
1816+ // other types prohibit arguments
1817+ } else if ( match[ 3 ] ) {
1818+ Sizzle.error( match[ 0 ] );
16921819 }
16931820
16941821 return match;
@@ -1696,26 +1823,28 @@ Expr = Sizzle.selectors = {
16961823
16971824 "PSEUDO": function( match ) {
16981825 var excess,
1699− unquoted = !match[6] && match[2];
1826+ unquoted = !match[ 6 ] && match[ 2 ];
17001827
1701− if ( matchExpr["CHILD"].test( match[0] ) ) {
1828+ if ( matchExpr[ "CHILD" ].test( match[ 0 ] ) ) {
17021829 return null;
17031830 }
17041831
17051832 // Accept quoted arguments as-is
1706− if ( match[3] ) {
1707− match[2] = match[4] || match[5] || "";
1833+ if ( match[ 3 ] ) {
1834+ match[ 2 ] = match[ 4 ] || match[ 5 ] || "";
17081835
17091836 // Strip excess characters from unquoted arguments
17101837 } else if ( unquoted && rpseudo.test( unquoted ) &&
1838+
17111839 // Get excess from tokenize (recursively)
1712− (excess = tokenize( unquoted, true )) &&
1840+ ( excess = tokenize( unquoted, true ) ) &&
1841+
17131842 // advance to the next closing parenthesis
1714− (excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) {
1843+ ( excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length ) ) {
17151844
17161845 // excess is a negative index
1717− match[0] = match[0].slice( 0, excess );
1718− match[2] = unquoted.slice( 0, excess );
1846+ match[ 0 ] = match[ 0 ].slice( 0, excess );
1847+ match[ 2 ] = unquoted.slice( 0, excess );
17191848 }
17201849
17211850 // Return only captures needed by the pseudo filter method (type and argument)
@@ -1728,7 +1857,9 @@ Expr = Sizzle.selectors = {
17281857 "TAG": function( nodeNameSelector ) {
17291858 var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase();
17301859 return nodeNameSelector === "*" ?
1731− function() { return true; } :
1860+ function() {
1861+ return true;
1862+ } :
17321863 function( elem ) {
17331864 return elem.nodeName && elem.nodeName.toLowerCase() === nodeName;
17341865 };
@@ -1738,10 +1869,16 @@ Expr = Sizzle.selectors = {
17381869 var pattern = classCache[ className + " " ];
17391870
17401871 return pattern ||
1741− (pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) &&
1742− classCache( className, function( elem ) {
1743− return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== "undefined" && elem.getAttribute("class") || "" );
1744− });
1872+ ( pattern = new RegExp( "(^|" + whitespace +
1873+ ")" + className + "(" + whitespace + "|$)" ) ) && classCache(
1874+ className, function( elem ) {
1875+ return pattern.test(
1876+ typeof elem.className === "string" && elem.className ||
1877+ typeof elem.getAttribute !== "undefined" &&
1878+ elem.getAttribute( "class" ) ||
1879+ ""
1880+ );
1881+ } );
17451882 },
17461883
17471884 "ATTR": function( name, operator, check ) {
@@ -1757,6 +1894,8 @@ Expr = Sizzle.selectors = {
17571894
17581895 result += "";
17591896
1897+ /* eslint-disable max-len */
1898+
17601899 return operator === "=" ? result === check :
17611900 operator === "!=" ? result !== check :
17621901 operator === "^=" ? check && result.indexOf( check ) === 0 :
@@ -1765,10 +1904,12 @@ Expr = Sizzle.selectors = {
17651904 operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 :
17661905 operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" :
17671906 false;
1907+ /* eslint-enable max-len */
1908+
17681909 };
17691910 },
17701911
1771− "CHILD": function( type, what, argument, first, last ) {
1912+ "CHILD": function( type, what, _argument, first, last ) {
17721913 var simple = type.slice( 0, 3 ) !== "nth",
17731914 forward = type.slice( -4 ) !== "last",
17741915 ofType = what === "of-type";
@@ -1780,7 +1921,7 @@ Expr = Sizzle.selectors = {
17801921 return !!elem.parentNode;
17811922 } :
17821923
1783− function( elem, context, xml ) {
1924+ function( elem, _context, xml ) {
17841925 var cache, uniqueCache, outerCache, node, nodeIndex, start,
17851926 dir = simple !== forward ? "nextSibling" : "previousSibling",
17861927 parent = elem.parentNode,
@@ -1794,7 +1935,7 @@ Expr = Sizzle.selectors = {
17941935 if ( simple ) {
17951936 while ( dir ) {
17961937 node = elem;
1797− while ( (node = node[ dir ]) ) {
1938+ while ( ( node = node[ dir ] ) ) {
17981939 if ( ofType ?
17991940 node.nodeName.toLowerCase() === name :
18001941 node.nodeType === 1 ) {
@@ -1802,6 +1943,7 @@ Expr = Sizzle.selectors = {
18021943 return false;
18031944 }
18041945 }
1946+
18051947 // Reverse direction for :only-* (if we haven't yet done so)
18061948 start = dir = type === "only" && !start && "nextSibling";
18071949 }
@@ -1817,22 +1959,22 @@ Expr = Sizzle.selectors = {
18171959
18181960 // ...in a gzip-friendly way
18191961 node = parent;
1820− outerCache = node[ expando ] || (node[ expando ] = {});
1962+ outerCache = node[ expando ] || ( node[ expando ] = {} );
18211963
18221964 // Support: IE <9 only
18231965 // Defend against cloned attroperties (jQuery gh-1709)
18241966 uniqueCache = outerCache[ node.uniqueID ] ||
1825− (outerCache[ node.uniqueID ] = {});
1967+ ( outerCache[ node.uniqueID ] = {} );
18261968
18271969 cache = uniqueCache[ type ] || [];
18281970 nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];
18291971 diff = nodeIndex && cache[ 2 ];
18301972 node = nodeIndex && parent.childNodes[ nodeIndex ];
18311973
1832− while ( (node = ++nodeIndex && node && node[ dir ] ||
1974+ while ( ( node = ++nodeIndex && node && node[ dir ] ||
18331975
18341976 // Fallback to seeking `elem` from the start
1835− (diff = nodeIndex = 0) || start.pop()) ) {
1977+ ( diff = nodeIndex = 0 ) || start.pop() ) ) {
18361978
18371979 // When found, cache indexes on `parent` and break
18381980 if ( node.nodeType === 1 && ++diff && node === elem ) {
@@ -1842,16 +1984,18 @@ Expr = Sizzle.selectors = {
18421984 }
18431985
18441986 } else {
1987+
18451988 // Use previously-cached element index if available
18461989 if ( useCache ) {
1990+
18471991 // ...in a gzip-friendly way
18481992 node = elem;
1849− outerCache = node[ expando ] || (node[ expando ] = {});
1993+ outerCache = node[ expando ] || ( node[ expando ] = {} );
18501994
18511995 // Support: IE <9 only
18521996 // Defend against cloned attroperties (jQuery gh-1709)
18531997 uniqueCache = outerCache[ node.uniqueID ] ||
1854− (outerCache[ node.uniqueID ] = {});
1998+ ( outerCache[ node.uniqueID ] = {} );
18551999
18562000 cache = uniqueCache[ type ] || [];
18572001 nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];
@@ -1861,9 +2005,10 @@ Expr = Sizzle.selectors = {
18612005 // xml :nth-child(...)
18622006 // or :nth-last-child(...) or :nth(-last)?-of-type(...)
18632007 if ( diff === false ) {
2008+
18642009 // Use the same loop as above to seek `elem` from the start
1865− while ( (node = ++nodeIndex && node && node[ dir ] ||
1866− (diff = nodeIndex = 0) || start.pop()) ) {
2010+ while ( ( node = ++nodeIndex && node && node[ dir ] ||
2011+ ( diff = nodeIndex = 0 ) || start.pop() ) ) {
18672012
18682013 if ( ( ofType ?
18692014 node.nodeName.toLowerCase() === name :
@@ -1872,12 +2017,13 @@ Expr = Sizzle.selectors = {
18722017
18732018 // Cache the index of each encountered element
18742019 if ( useCache ) {
1875− outerCache = node[ expando ] || (node[ expando ] = {});
2020+ outerCache = node[ expando ] ||
2021+ ( node[ expando ] = {} );
18762022
18772023 // Support: IE <9 only
18782024 // Defend against cloned attroperties (jQuery gh-1709)
18792025 uniqueCache = outerCache[ node.uniqueID ] ||
1880− (outerCache[ node.uniqueID ] = {});
2026+ ( outerCache[ node.uniqueID ] = {} );
18812027
18822028 uniqueCache[ type ] = [ dirruns, diff ];
18832029 }
@@ -1898,6 +2044,7 @@ Expr = Sizzle.selectors = {
18982044 },
18992045
19002046 "PSEUDO": function( pseudo, argument ) {
2047+
19012048 // pseudo-class names are case-insensitive
19022049 // http://www.w3.org/TR/selectors/#pseudo-classes
19032050 // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters
@@ -1917,15 +2064,15 @@ Expr = Sizzle.selectors = {
19172064 if ( fn.length > 1 ) {
19182065 args = [ pseudo, pseudo, "", argument ];
19192066 return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?
1920− markFunction(function( seed, matches ) {
2067+ markFunction( function( seed, matches ) {
19212068 var idx,
19222069 matched = fn( seed, argument ),
19232070 i = matched.length;
19242071 while ( i-- ) {
1925− idx = indexOf( seed, matched[i] );
1926− seed[ idx ] = !( matches[ idx ] = matched[i] );
2072+ idx = indexOf( seed, matched[ i ] );
2073+ seed[ idx ] = !( matches[ idx ] = matched[ i ] );
19272074 }
1928− }) :
2075+ } ) :
19292076 function( elem ) {
19302077 return fn( elem, 0, args );
19312078 };
@@ -1936,8 +2083,10 @@ Expr = Sizzle.selectors = {
19362083 },
19372084
19382085 pseudos: {
2086+
19392087 // Potentially complex pseudos
1940− "not": markFunction(function( selector ) {
2088+ "not": markFunction( function( selector ) {
2089+
19412090 // Trim the selector passed to compile
19422091 // to avoid treating leading and trailing
19432092 // spaces as combinators
@@ -1946,39 +2095,40 @@ Expr = Sizzle.selectors = {
19462095 matcher = compile( selector.replace( rtrim, "$1" ) );
19472096
19482097 return matcher[ expando ] ?
1949− markFunction(function( seed, matches, context, xml ) {
2098+ markFunction( function( seed, matches, _context, xml ) {
19502099 var elem,
19512100 unmatched = matcher( seed, null, xml, [] ),
19522101 i = seed.length;
19532102
19542103 // Match elements unmatched by `matcher`
19552104 while ( i-- ) {
1956− if ( (elem = unmatched[i]) ) {
1957− seed[i] = !(matches[i] = elem);
2105+ if ( ( elem = unmatched[ i ] ) ) {
2106+ seed[ i ] = !( matches[ i ] = elem );
19582107 }
19592108 }
1960− }) :
1961− function( elem, context, xml ) {
1962− input[0] = elem;
2109+ } ) :
2110+ function( elem, _context, xml ) {
2111+ input[ 0 ] = elem;
19632112 matcher( input, null, xml, results );
2113+
19642114 // Don't keep the element (issue #299)
1965− input[0] = null;
2115+ input[ 0 ] = null;
19662116 return !results.pop();
19672117 };
1968− }),
2118+ } ),
19692119
1970− "has": markFunction(function( selector ) {
2120+ "has": markFunction( function( selector ) {
19712121 return function( elem ) {
19722122 return Sizzle( selector, elem ).length > 0;
19732123 };
1974− }),
2124+ } ),
19752125
1976− "contains": markFunction(function( text ) {
2126+ "contains": markFunction( function( text ) {
19772127 text = text.replace( runescape, funescape );
19782128 return function( elem ) {
19792129 return ( elem.textContent || getText( elem ) ).indexOf( text ) > -1;
19802130 };
1981− }),
2131+ } ),
19822132
19832133 // "Whether an element is represented by a :lang() selector
19842134 // is based solely on the element's language value
@@ -1988,25 +2138,26 @@ Expr = Sizzle.selectors = {
19882138 // The identifier C does not have to be a valid language name."
19892139 // http://www.w3.org/TR/selectors/#lang-pseudo
19902140 "lang": markFunction( function( lang ) {
2141+
19912142 // lang value must be a valid identifier
1992− if ( !ridentifier.test(lang || "") ) {
2143+ if ( !ridentifier.test( lang || "" ) ) {
19932144 Sizzle.error( "unsupported lang: " + lang );
19942145 }
19952146 lang = lang.replace( runescape, funescape ).toLowerCase();
19962147 return function( elem ) {
19972148 var elemLang;
19982149 do {
1999− if ( (elemLang = documentIsHTML ?
2150+ if ( ( elemLang = documentIsHTML ?
20002151 elem.lang :
2001− elem.getAttribute("xml:lang") || elem.getAttribute("lang")) ) {
2152+ elem.getAttribute( "xml:lang" ) || elem.getAttribute( "lang" ) ) ) {
20022153
20032154 elemLang = elemLang.toLowerCase();
20042155 return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0;
20052156 }
2006− } while ( (elem = elem.parentNode) && elem.nodeType === 1 );
2157+ } while ( ( elem = elem.parentNode ) && elem.nodeType === 1 );
20072158 return false;
20082159 };
2009− }),
2160+ } ),
20102161
20112162 // Miscellaneous
20122163 "target": function( elem ) {
@@ -2019,7 +2170,9 @@ Expr = Sizzle.selectors = {
20192170 },
20202171
20212172 "focus": function( elem ) {
2022− return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex);
2173+ return elem === document.activeElement &&
2174+ ( !document.hasFocus || document.hasFocus() ) &&
2175+ !!( elem.type || elem.href || ~elem.tabIndex );
20232176 },
20242177
20252178 // Boolean properties
@@ -2027,16 +2180,20 @@ Expr = Sizzle.selectors = {
20272180 "disabled": createDisabledPseudo( true ),
20282181
20292182 "checked": function( elem ) {
2183+
20302184 // In CSS3, :checked should return both checked and selected elements
20312185 // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
20322186 var nodeName = elem.nodeName.toLowerCase();
2033− return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected);
2187+ return ( nodeName === "input" && !!elem.checked ) ||
2188+ ( nodeName === "option" && !!elem.selected );
20342189 },
20352190
20362191 "selected": function( elem ) {
2192+
20372193 // Accessing this property makes selected-by-default
20382194 // options in Safari work properly
20392195 if ( elem.parentNode ) {
2196+ // eslint-disable-next-line no-unused-expressions
20402197 elem.parentNode.selectedIndex;
20412198 }
20422199
@@ -2045,6 +2202,7 @@ Expr = Sizzle.selectors = {
20452202
20462203 // Contents
20472204 "empty": function( elem ) {
2205+
20482206 // http://www.w3.org/TR/selectors/#empty-pseudo
20492207 // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5),
20502208 // but not by others (comment: 8; processing instruction: 7; etc.)
@@ -2058,7 +2216,7 @@ Expr = Sizzle.selectors = {
20582216 },
20592217
20602218 "parent": function( elem ) {
2061− return !Expr.pseudos["empty"]( elem );
2219+ return !Expr.pseudos[ "empty" ]( elem );
20622220 },
20632221
20642222 // Element/input types
@@ -2082,39 +2240,40 @@ Expr = Sizzle.selectors = {
20822240
20832241 // Support: IE<8
20842242 // New HTML5 attribute values (e.g., "search") appear with elem.type === "text"
2085− ( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === "text" );
2243+ ( ( attr = elem.getAttribute( "type" ) ) == null ||
2244+ attr.toLowerCase() === "text" );
20862245 },
20872246
20882247 // Position-in-collection
2089− "first": createPositionalPseudo(function() {
2248+ "first": createPositionalPseudo( function() {
20902249 return [ 0 ];
2091− }),
2250+ } ),
20922251
2093− "last": createPositionalPseudo(function( matchIndexes, length ) {
2252+ "last": createPositionalPseudo( function( _matchIndexes, length ) {
20942253 return [ length - 1 ];
2095− }),
2254+ } ),
20962255
2097− "eq": createPositionalPseudo(function( matchIndexes, length, argument ) {
2256+ "eq": createPositionalPseudo( function( _matchIndexes, length, argument ) {
20982257 return [ argument < 0 ? argument + length : argument ];
2099− }),
2258+ } ),
21002259
2101− "even": createPositionalPseudo(function( matchIndexes, length ) {
2260+ "even": createPositionalPseudo( function( matchIndexes, length ) {
21022261 var i = 0;
21032262 for ( ; i < length; i += 2 ) {
21042263 matchIndexes.push( i );
21052264 }
21062265 return matchIndexes;
2107− }),
2266+ } ),
21082267
2109− "odd": createPositionalPseudo(function( matchIndexes, length ) {
2268+ "odd": createPositionalPseudo( function( matchIndexes, length ) {
21102269 var i = 1;
21112270 for ( ; i < length; i += 2 ) {
21122271 matchIndexes.push( i );
21132272 }
21142273 return matchIndexes;
2115− }),
2274+ } ),
21162275
2117− "lt": createPositionalPseudo(function( matchIndexes, length, argument ) {
2276+ "lt": createPositionalPseudo( function( matchIndexes, length, argument ) {
21182277 var i = argument < 0 ?
21192278 argument + length :
21202279 argument > length ?
@@ -2124,19 +2283,19 @@ Expr = Sizzle.selectors = {
21242283 matchIndexes.push( i );
21252284 }
21262285 return matchIndexes;
2127− }),
2286+ } ),
21282287
2129− "gt": createPositionalPseudo(function( matchIndexes, length, argument ) {
2288+ "gt": createPositionalPseudo( function( matchIndexes, length, argument ) {
21302289 var i = argument < 0 ? argument + length : argument;
21312290 for ( ; ++i < length; ) {
21322291 matchIndexes.push( i );
21332292 }
21342293 return matchIndexes;
2135− })
2294+ } )
21362295 }
21372296};
21382297
2139−Expr.pseudos["nth"] = Expr.pseudos["eq"];
2298+Expr.pseudos[ "nth" ] = Expr.pseudos[ "eq" ];
21402299
21412300// Add button/input type pseudos
21422301for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {
@@ -2167,37 +2326,39 @@ tokenize = Sizzle.tokenize = function( selector, parseOnly ) {
21672326 while ( soFar ) {
21682327
21692328 // Comma and first run
2170− if ( !matched || (match = rcomma.exec( soFar )) ) {
2329+ if ( !matched || ( match = rcomma.exec( soFar ) ) ) {
21712330 if ( match ) {
2331+
21722332 // Don't consume trailing commas as valid
2173− soFar = soFar.slice( match[0].length ) || soFar;
2333+ soFar = soFar.slice( match[ 0 ].length ) || soFar;
21742334 }
2175− groups.push( (tokens = []) );
2335+ groups.push( ( tokens = [] ) );
21762336 }
21772337
21782338 matched = false;
21792339
21802340 // Combinators
2181− if ( (match = rcombinators.exec( soFar )) ) {
2341+ if ( ( match = rcombinators.exec( soFar ) ) ) {
21822342 matched = match.shift();
2183− tokens.push({
2343+ tokens.push( {
21842344 value: matched,
2345+
21852346 // Cast descendant combinators to space
2186− type: match[0].replace( rtrim, " " )
2187− });
2347+ type: match[ 0 ].replace( rtrim, " " )
2348+ } );
21882349 soFar = soFar.slice( matched.length );
21892350 }
21902351
21912352 // Filters
21922353 for ( type in Expr.filter ) {
2193− if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] ||
2194− (match = preFilters[ type ]( match ))) ) {
2354+ if ( ( match = matchExpr[ type ].exec( soFar ) ) && ( !preFilters[ type ] ||
2355+ ( match = preFilters[ type ]( match ) ) ) ) {
21952356 matched = match.shift();
2196− tokens.push({
2357+ tokens.push( {
21972358 value: matched,
21982359 type: type,
21992360 matches: match
2200− });
2361+ } );
22012362 soFar = soFar.slice( matched.length );
22022363 }
22032364 }
@@ -2214,6 +2375,7 @@ tokenize = Sizzle.tokenize = function( selector, parseOnly ) {
22142375 soFar.length :
22152376 soFar ?
22162377 Sizzle.error( selector ) :
2378+
22172379 // Cache the tokens
22182380 tokenCache( selector, groups ).slice( 0 );
22192381};
@@ -2223,7 +2385,7 @@ function toSelector( tokens ) {
22232385 len = tokens.length,
22242386 selector = "";
22252387 for ( ; i < len; i++ ) {
2226− selector += tokens[i].value;
2388+ selector += tokens[ i ].value;
22272389 }
22282390 return selector;
22292391}
@@ -2236,9 +2398,10 @@ function addCombinator( matcher, combinator, base ) {
22362398 doneName = done++;
22372399
22382400 return combinator.first ?
2401+
22392402 // Check against closest ancestor/preceding element
22402403 function( elem, context, xml ) {
2241− while ( (elem = elem[ dir ]) ) {
2404+ while ( ( elem = elem[ dir ] ) ) {
22422405 if ( elem.nodeType === 1 || checkNonElements ) {
22432406 return matcher( elem, context, xml );
22442407 }
@@ -2253,7 +2416,7 @@ function addCombinator( matcher, combinator, base ) {
22532416
22542417 // We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching
22552418 if ( xml ) {
2256− while ( (elem = elem[ dir ]) ) {
2419+ while ( ( elem = elem[ dir ] ) ) {
22572420 if ( elem.nodeType === 1 || checkNonElements ) {
22582421 if ( matcher( elem, context, xml ) ) {
22592422 return true;
@@ -2261,27 +2424,29 @@ function addCombinator( matcher, combinator, base ) {
22612424 }
22622425 }
22632426 } else {
2264− while ( (elem = elem[ dir ]) ) {
2427+ while ( ( elem = elem[ dir ] ) ) {
22652428 if ( elem.nodeType === 1 || checkNonElements ) {
2266− outerCache = elem[ expando ] || (elem[ expando ] = {});
2429+ outerCache = elem[ expando ] || ( elem[ expando ] = {} );
22672430
22682431 // Support: IE <9 only
22692432 // Defend against cloned attroperties (jQuery gh-1709)
2270− uniqueCache = outerCache[ elem.uniqueID ] || (outerCache[ elem.uniqueID ] = {});
2433+ uniqueCache = outerCache[ elem.uniqueID ] ||
2434+ ( outerCache[ elem.uniqueID ] = {} );
22712435
22722436 if ( skip && skip === elem.nodeName.toLowerCase() ) {
22732437 elem = elem[ dir ] || elem;
2274− } else if ( (oldCache = uniqueCache[ key ]) &&
2438+ } else if ( ( oldCache = uniqueCache[ key ] ) &&
22752439 oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) {
22762440
22772441 // Assign to newCache so results back-propagate to previous elements
2278− return (newCache[ 2 ] = oldCache[ 2 ]);
2442+ return ( newCache[ 2 ] = oldCache[ 2 ] );
22792443 } else {
2444+
22802445 // Reuse newcache so results back-propagate to previous elements
22812446 uniqueCache[ key ] = newCache;
22822447
22832448 // A match means we're done; a fail means we have to keep checking
2284− if ( (newCache[ 2 ] = matcher( elem, context, xml )) ) {
2449+ if ( ( newCache[ 2 ] = matcher( elem, context, xml ) ) ) {
22852450 return true;
22862451 }
22872452 }
@@ -2297,20 +2462,20 @@ function elementMatcher( matchers ) {
22972462 function( elem, context, xml ) {
22982463 var i = matchers.length;
22992464 while ( i-- ) {
2300− if ( !matchers[i]( elem, context, xml ) ) {
2465+ if ( !matchers[ i ]( elem, context, xml ) ) {
23012466 return false;
23022467 }
23032468 }
23042469 return true;
23052470 } :
2306− matchers[0];
2471+ matchers[ 0 ];
23072472}
23082473
23092474function multipleContexts( selector, contexts, results ) {
23102475 var i = 0,
23112476 len = contexts.length;
23122477 for ( ; i < len; i++ ) {
2313− Sizzle( selector, contexts[i], results );
2478+ Sizzle( selector, contexts[ i ], results );
23142479 }
23152480 return results;
23162481}
@@ -2323,7 +2488,7 @@ function condense( unmatched, map, filter, context, xml ) {
23232488 mapped = map != null;
23242489
23252490 for ( ; i < len; i++ ) {
2326− if ( (elem = unmatched[i]) ) {
2491+ if ( ( elem = unmatched[ i ] ) ) {
23272492 if ( !filter || filter( elem, context, xml ) ) {
23282493 newUnmatched.push( elem );
23292494 if ( mapped ) {
@@ -2343,14 +2508,18 @@ function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postS
23432508 if ( postFinder && !postFinder[ expando ] ) {
23442509 postFinder = setMatcher( postFinder, postSelector );
23452510 }
2346− return markFunction(function( seed, results, context, xml ) {
2511+ return markFunction( function( seed, results, context, xml ) {
23472512 var temp, i, elem,
23482513 preMap = [],
23492514 postMap = [],
23502515 preexisting = results.length,
23512516
23522517 // Get initial elements from seed or context
2353− elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ),
2518+ elems = seed || multipleContexts(
2519+ selector || "*",
2520+ context.nodeType ? [ context ] : context,
2521+ []
2522+ ),
23542523
23552524 // Prefilter to get matcher input, preserving a map for seed-results synchronization
23562525 matcherIn = preFilter && ( seed || !selector ) ?
@@ -2358,6 +2527,7 @@ function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postS
23582527 elems,
23592528
23602529 matcherOut = matcher ?
2530+
23612531 // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,
23622532 postFinder || ( seed ? preFilter : preexisting || postFilter ) ?
23632533
@@ -2381,8 +2551,8 @@ function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postS
23812551 // Un-match failing elements by moving them back to matcherIn
23822552 i = temp.length;
23832553 while ( i-- ) {
2384− if ( (elem = temp[i]) ) {
2385− matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem);
2554+ if ( ( elem = temp[ i ] ) ) {
2555+ matcherOut[ postMap[ i ] ] = !( matcherIn[ postMap[ i ] ] = elem );
23862556 }
23872557 }
23882558 }
@@ -2390,25 +2560,27 @@ function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postS
23902560 if ( seed ) {
23912561 if ( postFinder || preFilter ) {
23922562 if ( postFinder ) {
2563+
23932564 // Get the final matcherOut by condensing this intermediate into postFinder contexts
23942565 temp = [];
23952566 i = matcherOut.length;
23962567 while ( i-- ) {
2397− if ( (elem = matcherOut[i]) ) {
2568+ if ( ( elem = matcherOut[ i ] ) ) {
2569+
23982570 // Restore matcherIn since elem is not yet a final match
2399− temp.push( (matcherIn[i] = elem) );
2571+ temp.push( ( matcherIn[ i ] = elem ) );
24002572 }
24012573 }
2402− postFinder( null, (matcherOut = []), temp, xml );
2574+ postFinder( null, ( matcherOut = [] ), temp, xml );
24032575 }
24042576
24052577 // Move matched elements from seed to results to keep them synchronized
24062578 i = matcherOut.length;
24072579 while ( i-- ) {
2408− if ( (elem = matcherOut[i]) &&
2409− (temp = postFinder ? indexOf( seed, elem ) : preMap[i]) > -1 ) {
2580+ if ( ( elem = matcherOut[ i ] ) &&
2581+ ( temp = postFinder ? indexOf( seed, elem ) : preMap[ i ] ) > -1 ) {
24102582
2411− seed[temp] = !(results[temp] = elem);
2583+ seed[ temp ] = !( results[ temp ] = elem );
24122584 }
24132585 }
24142586 }
@@ -2426,14 +2598,14 @@ function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postS
24262598 push.apply( results, matcherOut );
24272599 }
24282600 }
2429− });
2601+ } );
24302602}
24312603
24322604function matcherFromTokens( tokens ) {
24332605 var checkContext, matcher, j,
24342606 len = tokens.length,
2435− leadingRelative = Expr.relative[ tokens[0].type ],
2436− implicitRelative = leadingRelative || Expr.relative[" "],
2607+ leadingRelative = Expr.relative[ tokens[ 0 ].type ],
2608+ implicitRelative = leadingRelative || Expr.relative[ " " ],
24372609 i = leadingRelative ? 1 : 0,
24382610
24392611 // The foundational matcher ensures that elements are reachable from top-level context(s)
@@ -2445,38 +2617,43 @@ function matcherFromTokens( tokens ) {
24452617 }, implicitRelative, true ),
24462618 matchers = [ function( elem, context, xml ) {
24472619 var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || (
2448− (checkContext = context).nodeType ?
2620+ ( checkContext = context ).nodeType ?
24492621 matchContext( elem, context, xml ) :
24502622 matchAnyContext( elem, context, xml ) );
2623+
24512624 // Avoid hanging onto element (issue #299)
24522625 checkContext = null;
24532626 return ret;
24542627 } ];
24552628
24562629 for ( ; i < len; i++ ) {
2457− if ( (matcher = Expr.relative[ tokens[i].type ]) ) {
2458− matchers = [ addCombinator(elementMatcher( matchers ), matcher) ];
2630+ if ( ( matcher = Expr.relative[ tokens[ i ].type ] ) ) {
2631+ matchers = [ addCombinator( elementMatcher( matchers ), matcher ) ];
24592632 } else {
2460− matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches );
2633+ matcher = Expr.filter[ tokens[ i ].type ].apply( null, tokens[ i ].matches );
24612634
24622635 // Return special upon seeing a positional matcher
24632636 if ( matcher[ expando ] ) {
2637+
24642638 // Find the next relative operator (if any) for proper handling
24652639 j = ++i;
24662640 for ( ; j < len; j++ ) {
2467− if ( Expr.relative[ tokens[j].type ] ) {
2641+ if ( Expr.relative[ tokens[ j ].type ] ) {
24682642 break;
24692643 }
24702644 }
24712645 return setMatcher(
24722646 i > 1 && elementMatcher( matchers ),
24732647 i > 1 && toSelector(
2474− // If the preceding token was a descendant combinator, insert an implicit any-element `*`
2475− tokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === " " ? "*" : "" })
2648+
2649+ // If the preceding token was a descendant combinator, insert an implicit any-element `*`
2650+ tokens
2651+ .slice( 0, i - 1 )
2652+ .concat( { value: tokens[ i - 2 ].type === " " ? "*" : "" } )
24762653 ).replace( rtrim, "$1" ),
24772654 matcher,
24782655 i < j && matcherFromTokens( tokens.slice( i, j ) ),
2479− j < len && matcherFromTokens( (tokens = tokens.slice( j )) ),
2656+ j < len && matcherFromTokens( ( tokens = tokens.slice( j ) ) ),
24802657 j < len && toSelector( tokens )
24812658 );
24822659 }
@@ -2497,28 +2674,40 @@ function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
24972674 unmatched = seed && [],
24982675 setMatched = [],
24992676 contextBackup = outermostContext,
2677+
25002678 // We must always have either seed elements or outermost context
2501− elems = seed || byElement && Expr.find["TAG"]( "*", outermost ),
2679+ elems = seed || byElement && Expr.find[ "TAG" ]( "*", outermost ),
2680+
25022681 // Use integer dirruns iff this is the outermost matcher
2503− dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1),
2682+ dirrunsUnique = ( dirruns += contextBackup == null ? 1 : Math.random() || 0.1 ),
25042683 len = elems.length;
25052684
25062685 if ( outermost ) {
2507− outermostContext = context === document || context || outermost;
2686+
2687+ // Support: IE 11+, Edge 17 - 18+
2688+ // IE/Edge sometimes throw a "Permission denied" error when strict-comparing
2689+ // two documents; shallow comparisons work.
2690+ // eslint-disable-next-line eqeqeq
2691+ outermostContext = context == document || context || outermost;
25082692 }
25092693
25102694 // Add elements passing elementMatchers directly to results
25112695 // Support: IE<9, Safari
25122696 // Tolerate NodeList properties (IE: "length"; Safari: <number>) matching elements by id
2513− for ( ; i !== len && (elem = elems[i]) != null; i++ ) {
2697+ for ( ; i !== len && ( elem = elems[ i ] ) != null; i++ ) {
25142698 if ( byElement && elem ) {
25152699 j = 0;
2516− if ( !context && elem.ownerDocument !== document ) {
2700+
2701+ // Support: IE 11+, Edge 17 - 18+
2702+ // IE/Edge sometimes throw a "Permission denied" error when strict-comparing
2703+ // two documents; shallow comparisons work.
2704+ // eslint-disable-next-line eqeqeq
2705+ if ( !context && elem.ownerDocument != document ) {
25172706 setDocument( elem );
25182707 xml = !documentIsHTML;
25192708 }
2520− while ( (matcher = elementMatchers[j++]) ) {
2521− if ( matcher( elem, context || document, xml) ) {
2709+ while ( ( matcher = elementMatchers[ j++ ] ) ) {
2710+ if ( matcher( elem, context || document, xml ) ) {
25222711 results.push( elem );
25232712 break;
25242713 }
@@ -2530,8 +2719,9 @@ function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
25302719
25312720 // Track unmatched elements for set filters
25322721 if ( bySet ) {
2722+
25332723 // They will have gone through all possible matchers
2534− if ( (elem = !matcher && elem) ) {
2724+ if ( ( elem = !matcher && elem ) ) {
25352725 matchedCount--;
25362726 }
25372727
@@ -2555,16 +2745,17 @@ function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
25552745 // numerically zero.
25562746 if ( bySet && i !== matchedCount ) {
25572747 j = 0;
2558− while ( (matcher = setMatchers[j++]) ) {
2748+ while ( ( matcher = setMatchers[ j++ ] ) ) {
25592749 matcher( unmatched, setMatched, context, xml );
25602750 }
25612751
25622752 if ( seed ) {
2753+
25632754 // Reintegrate element matches to eliminate the need for sorting
25642755 if ( matchedCount > 0 ) {
25652756 while ( i-- ) {
2566− if ( !(unmatched[i] || setMatched[i]) ) {
2567− setMatched[i] = pop.call( results );
2757+ if ( !( unmatched[ i ] || setMatched[ i ] ) ) {
2758+ setMatched[ i ] = pop.call( results );
25682759 }
25692760 }
25702761 }
@@ -2605,13 +2796,14 @@ compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) {
26052796 cached = compilerCache[ selector + " " ];
26062797
26072798 if ( !cached ) {
2799+
26082800 // Generate a function of recursive functions that can be used to check each element
26092801 if ( !match ) {
26102802 match = tokenize( selector );
26112803 }
26122804 i = match.length;
26132805 while ( i-- ) {
2614− cached = matcherFromTokens( match[i] );
2806+ cached = matcherFromTokens( match[ i ] );
26152807 if ( cached[ expando ] ) {
26162808 setMatchers.push( cached );
26172809 } else {
@@ -2620,7 +2812,10 @@ compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) {
26202812 }
26212813
26222814 // Cache the compiled function
2623− cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) );
2815+ cached = compilerCache(
2816+ selector,
2817+ matcherFromGroupMatchers( elementMatchers, setMatchers )
2818+ );
26242819
26252820 // Save selector and tokenization
26262821 cached.selector = selector;
@@ -2640,7 +2835,7 @@ compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) {
26402835select = Sizzle.select = function( selector, context, results, seed ) {
26412836 var i, tokens, token, type, find,
26422837 compiled = typeof selector === "function" && selector,
2643− match = !seed && tokenize( (selector = compiled.selector || selector) );
2838+ match = !seed && tokenize( ( selector = compiled.selector || selector ) );
26442839
26452840 results = results || [];
26462841
@@ -2649,11 +2844,12 @@ select = Sizzle.select = function( selector, context, results, seed ) {
26492844 if ( match.length === 1 ) {
26502845
26512846 // Reduce context if the leading compound selector is an ID
2652− tokens = match[0] = match[0].slice( 0 );
2653− if ( tokens.length > 2 && (token = tokens[0]).type === "ID" &&
2654− context.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[1].type ] ) {
2847+ tokens = match[ 0 ] = match[ 0 ].slice( 0 );
2848+ if ( tokens.length > 2 && ( token = tokens[ 0 ] ).type === "ID" &&
2849+ context.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[ 1 ].type ] ) {
26552850
2656− context = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0];
2851+ context = ( Expr.find[ "ID" ]( token.matches[ 0 ]
2852+ .replace( runescape, funescape ), context ) || [] )[ 0 ];
26572853 if ( !context ) {
26582854 return results;
26592855
@@ -2666,20 +2862,22 @@ select = Sizzle.select = function( selector, context, results, seed ) {
26662862 }
26672863
26682864 // Fetch a seed set for right-to-left matching
2669− i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length;
2865+ i = matchExpr[ "needsContext" ].test( selector ) ? 0 : tokens.length;
26702866 while ( i-- ) {
2671− token = tokens[i];
2867+ token = tokens[ i ];
26722868
26732869 // Abort if we hit a combinator
2674− if ( Expr.relative[ (type = token.type) ] ) {
2870+ if ( Expr.relative[ ( type = token.type ) ] ) {
26752871 break;
26762872 }
2677− if ( (find = Expr.find[ type ]) ) {
2873+ if ( ( find = Expr.find[ type ] ) ) {
2874+
26782875 // Search, expanding context for leading sibling combinators
2679− if ( (seed = find(
2680− token.matches[0].replace( runescape, funescape ),
2681− rsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context
2682− )) ) {
2876+ if ( ( seed = find(
2877+ token.matches[ 0 ].replace( runescape, funescape ),
2878+ rsibling.test( tokens[ 0 ].type ) && testContext( context.parentNode ) ||
2879+ context
2880+ ) ) ) {
26832881
26842882 // If seed is empty or no tokens remain, we can return early
26852883 tokens.splice( i, 1 );
@@ -2710,7 +2908,7 @@ select = Sizzle.select = function( selector, context, results, seed ) {
27102908// One-time assignments
27112909
27122910// Sort stability
2713−support.sortStable = expando.split("").sort( sortOrder ).join("") === expando;
2911+support.sortStable = expando.split( "" ).sort( sortOrder ).join( "" ) === expando;
27142912
27152913// Support: Chrome 14-35+
27162914// Always assume duplicates if they aren't passed to the comparison function
@@ -2721,58 +2919,59 @@ setDocument();
27212919
27222920// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27)
27232921// Detached nodes confoundingly follow *each other*
2724−support.sortDetached = assert(function( el ) {
2922+support.sortDetached = assert( function( el ) {
2923+
27252924 // Should return 1, but returns 4 (following)
2726− return el.compareDocumentPosition( document.createElement("fieldset") ) & 1;
2727−});
2925+ return el.compareDocumentPosition( document.createElement( "fieldset" ) ) & 1;
2926+} );
27282927
27292928// Support: IE<8
27302929// Prevent attribute/property "interpolation"
27312930// https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx
2732−if ( !assert(function( el ) {
2931+if ( !assert( function( el ) {
27332932 el.innerHTML = "<a href='#'></a>";
2734− return el.firstChild.getAttribute("href") === "#" ;
2735−}) ) {
2933+ return el.firstChild.getAttribute( "href" ) === "#";
2934+} ) ) {
27362935 addHandle( "type|href|height|width", function( elem, name, isXML ) {
27372936 if ( !isXML ) {
27382937 return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 );
27392938 }
2740− });
2939+ } );
27412940}
27422941
27432942// Support: IE<9
27442943// Use defaultValue in place of getAttribute("value")
2745−if ( !support.attributes || !assert(function( el ) {
2944+if ( !support.attributes || !assert( function( el ) {
27462945 el.innerHTML = "<input/>";
27472946 el.firstChild.setAttribute( "value", "" );
27482947 return el.firstChild.getAttribute( "value" ) === "";
2749−}) ) {
2750− addHandle( "value", function( elem, name, isXML ) {
2948+} ) ) {
2949+ addHandle( "value", function( elem, _name, isXML ) {
27512950 if ( !isXML && elem.nodeName.toLowerCase() === "input" ) {
27522951 return elem.defaultValue;
27532952 }
2754− });
2953+ } );
27552954}
27562955
27572956// Support: IE<9
27582957// Use getAttributeNode to fetch booleans when getAttribute lies
2759−if ( !assert(function( el ) {
2760− return el.getAttribute("disabled") == null;
2761−}) ) {
2958+if ( !assert( function( el ) {
2959+ return el.getAttribute( "disabled" ) == null;
2960+} ) ) {
27622961 addHandle( booleans, function( elem, name, isXML ) {
27632962 var val;
27642963 if ( !isXML ) {
27652964 return elem[ name ] === true ? name.toLowerCase() :
2766− (val = elem.getAttributeNode( name )) && val.specified ?
2965+ ( val = elem.getAttributeNode( name ) ) && val.specified ?
27672966 val.value :
2768− null;
2967+ null;
27692968 }
2770− });
2969+ } );
27712970}
27722971
27732972return Sizzle;
27742973
2775−})( window );
2974+} )( window );
27762975
27772976
27782977
@@ -3141,7 +3340,7 @@ jQuery.each( {
31413340 parents: function( elem ) {
31423341 return dir( elem, "parentNode" );
31433342 },
3144− parentsUntil: function( elem, i, until ) {
3343+ parentsUntil: function( elem, _i, until ) {
31453344 return dir( elem, "parentNode", until );
31463345 },
31473346 next: function( elem ) {
@@ -3156,10 +3355,10 @@ jQuery.each( {
31563355 prevAll: function( elem ) {
31573356 return dir( elem, "previousSibling" );
31583357 },
3159− nextUntil: function( elem, i, until ) {
3358+ nextUntil: function( elem, _i, until ) {
31603359 return dir( elem, "nextSibling", until );
31613360 },
3162− prevUntil: function( elem, i, until ) {
3361+ prevUntil: function( elem, _i, until ) {
31633362 return dir( elem, "previousSibling", until );
31643363 },
31653364 siblings: function( elem ) {
@@ -3169,7 +3368,13 @@ jQuery.each( {
31693368 return siblings( elem.firstChild );
31703369 },
31713370 contents: function( elem ) {
3172− if ( typeof elem.contentDocument !== "undefined" ) {
3371+ if ( elem.contentDocument != null &&
3372+
3373+ // Support: IE 11+
3374+ // <object> elements with no `data` attribute has an object
3375+ // `contentDocument` with a `null` prototype.
3376+ getProto( elem.contentDocument ) ) {
3377+
31733378 return elem.contentDocument;
31743379 }
31753380
@@ -3512,7 +3717,7 @@ jQuery.extend( {
35123717 var fns = arguments;
35133718
35143719 return jQuery.Deferred( function( newDefer ) {
3515− jQuery.each( tuples, function( i, tuple ) {
3720+ jQuery.each( tuples, function( _i, tuple ) {
35163721
35173722 // Map tuples (progress, done, fail) to arguments (done, fail, progress)
35183723 var fn = isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ];
@@ -3965,7 +4170,7 @@ var access = function( elems, fn, key, value, chainable, emptyGet, raw ) {
39654170 // ...except when executing function values
39664171 } else {
39674172 bulk = fn;
3968− fn = function( elem, key, value ) {
4173+ fn = function( elem, _key, value ) {
39694174 return bulk.call( jQuery( elem ), value );
39704175 };
39714176 }
@@ -4000,7 +4205,7 @@ var rmsPrefix = /^-ms-/,
40004205 rdashAlpha = /-([a-z])/g;
40014206
40024207// Used by camelCase as callback to replace()
4003−function fcamelCase( all, letter ) {
4208+function fcamelCase( _all, letter ) {
40044209 return letter.toUpperCase();
40054210}
40064211
@@ -4528,27 +4733,6 @@ var isHiddenWithinTree = function( elem, el ) {
45284733 jQuery.css( elem, "display" ) === "none";
45294734 };
45304735
4531−var swap = function( elem, options, callback, args ) {
4532− var ret, name,
4533− old = {};
4534−
4535− // Remember the old values, and insert the new ones
4536− for ( name in options ) {
4537− old[ name ] = elem.style[ name ];
4538− elem.style[ name ] = options[ name ];
4539− }
4540−
4541− ret = callback.apply( elem, args || [] );
4542−
4543− // Revert the old values
4544− for ( name in options ) {
4545− elem.style[ name ] = old[ name ];
4546− }
4547−
4548− return ret;
4549−};
4550−
4551−
45524736
45534737
45544738function adjustCSS( elem, prop, valueParts, tween ) {
@@ -4719,11 +4903,40 @@ var rscriptType = ( /^$|^module$|\/(?:java|ecma)script/i );
47194903
47204904
47214905
4722−// We have to close these tags to support XHTML (#13200)
4723−var wrapMap = {
4906+( function() {
4907+ var fragment = document.createDocumentFragment(),
4908+ div = fragment.appendChild( document.createElement( "div" ) ),
4909+ input = document.createElement( "input" );
4910+
4911+ // Support: Android 4.0 - 4.3 only
4912+ // Check state lost if the name is set (#11217)
4913+ // Support: Windows Web Apps (WWA)
4914+ // `name` and `type` must use .setAttribute for WWA (#14901)
4915+ input.setAttribute( "type", "radio" );
4916+ input.setAttribute( "checked", "checked" );
4917+ input.setAttribute( "name", "t" );
4918+
4919+ div.appendChild( input );
4920+
4921+ // Support: Android <=4.1 only
4922+ // Older WebKit doesn't clone checked state correctly in fragments
4923+ support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked;
4924+
4925+ // Support: IE <=11 only
4926+ // Make sure textarea (and checkbox) defaultValue is properly cloned
4927+ div.innerHTML = "<textarea>x</textarea>";
4928+ support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;
47244929
47254930 // Support: IE <=9 only
4726− option: [ 1, "<select multiple='multiple'>", "</select>" ],
4931+ // IE <=9 replaces <option> tags with their contents when inserted outside of
4932+ // the select element.
4933+ div.innerHTML = "<option></option>";
4934+ support.option = !!div.lastChild;
4935+} )();
4936+
4937+
4938+// We have to close these tags to support XHTML (#13200)
4939+var wrapMap = {
47274940
47284941 // XHTML parsers do not magically insert elements in the
47294942 // same way that tag soup parsers do. So we cannot shorten
@@ -4736,12 +4949,14 @@ var wrapMap = {
47364949 _default: [ 0, "", "" ]
47374950};
47384951
4739−// Support: IE <=9 only
4740−wrapMap.optgroup = wrapMap.option;
4741−
47424952wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
47434953wrapMap.th = wrapMap.td;
47444954
4955+// Support: IE <=9 only
4956+if ( !support.option ) {
4957+ wrapMap.optgroup = wrapMap.option = [ 1, "<select multiple='multiple'>", "</select>" ];
4958+}
4959+
47454960
47464961function getAll( context, tag ) {
47474962
@@ -4874,32 +5089,6 @@ function buildFragment( elems, context, scripts, selection, ignored ) {
48745089}
48755090
48765091
4877−( function() {
4878− var fragment = document.createDocumentFragment(),
4879− div = fragment.appendChild( document.createElement( "div" ) ),
4880− input = document.createElement( "input" );
4881−
4882− // Support: Android 4.0 - 4.3 only
4883− // Check state lost if the name is set (#11217)
4884− // Support: Windows Web Apps (WWA)
4885− // `name` and `type` must use .setAttribute for WWA (#14901)
4886− input.setAttribute( "type", "radio" );
4887− input.setAttribute( "checked", "checked" );
4888− input.setAttribute( "name", "t" );
4889−
4890− div.appendChild( input );
4891−
4892− // Support: Android <=4.1 only
4893− // Older WebKit doesn't clone checked state correctly in fragments
4894− support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked;
4895−
4896− // Support: IE <=11 only
4897− // Make sure textarea (and checkbox) defaultValue is properly cloned
4898− div.innerHTML = "<textarea>x</textarea>";
4899− support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;
4900−} )();
4901−
4902−
49035092var
49045093 rkeyEvent = /^key/,
49055094 rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/,
@@ -5008,8 +5197,8 @@ jQuery.event = {
50085197 special, handlers, type, namespaces, origType,
50095198 elemData = dataPriv.get( elem );
50105199
5011− // Don't attach events to noData or text/comment nodes (but allow plain objects)
5012− if ( !elemData ) {
5200+ // Only attach events to objects that accept data
5201+ if ( !acceptData( elem ) ) {
50135202 return;
50145203 }
50155204
@@ -5033,7 +5222,7 @@ jQuery.event = {
50335222
50345223 // Init the element's event structure and main handler, if this is the first
50355224 if ( !( events = elemData.events ) ) {
5036− events = elemData.events = {};
5225+ events = elemData.events = Object.create( null );
50375226 }
50385227 if ( !( eventHandle = elemData.handle ) ) {
50395228 eventHandle = elemData.handle = function( e ) {
@@ -5191,12 +5380,15 @@ jQuery.event = {
51915380
51925381 dispatch: function( nativeEvent ) {
51935382
5194− // Make a writable jQuery.Event from the native event object
5195− var event = jQuery.event.fix( nativeEvent );
5196−
51975383 var i, j, ret, matched, handleObj, handlerQueue,
51985384 args = new Array( arguments.length ),
5199− handlers = ( dataPriv.get( this, "events" ) || {} )[ event.type ] || [],
5385+
5386+ // Make a writable jQuery.Event from the native event object
5387+ event = jQuery.event.fix( nativeEvent ),
5388+
5389+ handlers = (
5390+ dataPriv.get( this, "events" ) || Object.create( null )
5391+ )[ event.type ] || [],
52005392 special = jQuery.event.special[ event.type ] || {};
52015393
52025394 // Use the fix-ed jQuery.Event rather than the (read-only) native event
@@ -5771,13 +5963,6 @@ jQuery.fn.extend( {
57715963
57725964var
57735965
5774− /* eslint-disable max-len */
5775−
5776− // See https://github.com/eslint/eslint/issues/3229
5777− rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\/\0>\x20\t\r\n\f]*)[^>]*)\/>/gi,
5778−
5779− /* eslint-enable */
5780−
57815966 // Support: IE <=10 - 11, Edge 12 - 13 only
57825967 // In IE/Edge using regex groups here causes severe slowdowns.
57835968 // See https://connect.microsoft.com/IE/feedback/details/1736512/
@@ -5814,7 +5999,7 @@ function restoreScript( elem ) {
58145999}
58156000
58166001function cloneCopyEvent( src, dest ) {
5817− var i, l, type, pdataOld, pdataCur, udataOld, udataCur, events;
6002+ var i, l, type, pdataOld, udataOld, udataCur, events;
58186003
58196004 if ( dest.nodeType !== 1 ) {
58206005 return;
@@ -5822,13 +6007,11 @@ function cloneCopyEvent( src, dest ) {
58226007
58236008 // 1. Copy private data: events, handlers, etc.
58246009 if ( dataPriv.hasData( src ) ) {
5825− pdataOld = dataPriv.access( src );
5826− pdataCur = dataPriv.set( dest, pdataOld );
6010+ pdataOld = dataPriv.get( src );
58276011 events = pdataOld.events;
58286012
58296013 if ( events ) {
5830− delete pdataCur.handle;
5831− pdataCur.events = {};
6014+ dataPriv.remove( dest, "handle events" );
58326015
58336016 for ( type in events ) {
58346017 for ( i = 0, l = events[ type ].length; i < l; i++ ) {
@@ -5864,7 +6047,7 @@ function fixInput( src, dest ) {
58646047function domManip( collection, args, callback, ignored ) {
58656048
58666049 // Flatten any nested arrays
5867− args = concat.apply( [], args );
6050+ args = flat( args );
58686051
58696052 var fragment, first, scripts, hasScripts, node, doc,
58706053 i = 0,
@@ -5939,7 +6122,7 @@ function domManip( collection, args, callback, ignored ) {
59396122 if ( jQuery._evalUrl && !node.noModule ) {
59406123 jQuery._evalUrl( node.src, {
59416124 nonce: node.nonce || node.getAttribute( "nonce" )
5942− } );
6125+ }, doc );
59436126 }
59446127 } else {
59456128 DOMEval( node.textContent.replace( rcleanScript, "" ), node, doc );
@@ -5976,7 +6159,7 @@ function remove( elem, selector, keepData ) {
59766159
59776160jQuery.extend( {
59786161 htmlPrefilter: function( html ) {
5979− return html.replace( rxhtmlTag, "<$1></$2>" );
6162+ return html;
59806163 },
59816164
59826165 clone: function( elem, dataAndEvents, deepDataAndEvents ) {
@@ -6238,6 +6421,27 @@ var getStyles = function( elem ) {
62386421 return view.getComputedStyle( elem );
62396422 };
62406423
6424+var swap = function( elem, options, callback ) {
6425+ var ret, name,
6426+ old = {};
6427+
6428+ // Remember the old values, and insert the new ones
6429+ for ( name in options ) {
6430+ old[ name ] = elem.style[ name ];
6431+ elem.style[ name ] = options[ name ];
6432+ }
6433+
6434+ ret = callback.call( elem );
6435+
6436+ // Revert the old values
6437+ for ( name in options ) {
6438+ elem.style[ name ] = old[ name ];
6439+ }
6440+
6441+ return ret;
6442+};
6443+
6444+
62416445var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" );
62426446
62436447
@@ -6295,7 +6499,7 @@ var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" );
62956499 }
62966500
62976501 var pixelPositionVal, boxSizingReliableVal, scrollboxSizeVal, pixelBoxStylesVal,
6298− reliableMarginLeftVal,
6502+ reliableTrDimensionsVal, reliableMarginLeftVal,
62996503 container = document.createElement( "div" ),
63006504 div = document.createElement( "div" );
63016505
@@ -6330,6 +6534,35 @@ var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" );
63306534 scrollboxSize: function() {
63316535 computeStyleTests();
63326536 return scrollboxSizeVal;
6537+ },
6538+
6539+ // Support: IE 9 - 11+, Edge 15 - 18+
6540+ // IE/Edge misreport `getComputedStyle` of table rows with width/height
6541+ // set in CSS while `offset*` properties report correct values.
6542+ // Behavior in IE 9 is more subtle than in newer versions & it passes
6543+ // some versions of this test; make sure not to make it pass there!
6544+ reliableTrDimensions: function() {
6545+ var table, tr, trChild, trStyle;
6546+ if ( reliableTrDimensionsVal == null ) {
6547+ table = document.createElement( "table" );
6548+ tr = document.createElement( "tr" );
6549+ trChild = document.createElement( "div" );
6550+
6551+ table.style.cssText = "position:absolute;left:-11111px";
6552+ tr.style.height = "1px";
6553+ trChild.style.height = "9px";
6554+
6555+ documentElement
6556+ .appendChild( table )
6557+ .appendChild( tr )
6558+ .appendChild( trChild );
6559+
6560+ trStyle = window.getComputedStyle( tr );
6561+ reliableTrDimensionsVal = parseInt( trStyle.height ) > 3;
6562+
6563+ documentElement.removeChild( table );
6564+ }
6565+ return reliableTrDimensionsVal;
63336566 }
63346567 } );
63356568} )();
@@ -6454,7 +6687,7 @@ var
64546687 fontWeight: "400"
64556688 };
64566689
6457−function setPositiveNumber( elem, value, subtract ) {
6690+function setPositiveNumber( _elem, value, subtract ) {
64586691
64596692 // Any relative (+/-) values have already been
64606693 // normalized at this point
@@ -6559,17 +6792,26 @@ function getWidthOrHeight( elem, dimension, extra ) {
65596792 }
65606793
65616794
6562− // Fall back to offsetWidth/offsetHeight when value is "auto"
6563− // This happens for inline elements with no explicit setting (gh-3571)
6564− // Support: Android <=4.1 - 4.3 only
6565− // Also use offsetWidth/offsetHeight for misreported inline dimensions (gh-3602)
6566− // Support: IE 9-11 only
6567− // Also use offsetWidth/offsetHeight for when box sizing is unreliable
6568− // We use getClientRects() to check for hidden/disconnected.
6569− // In those cases, the computed value can be trusted to be border-box
6795+ // Support: IE 9 - 11 only
6796+ // Use offsetWidth/offsetHeight for when box sizing is unreliable.
6797+ // In those cases, the computed value can be trusted to be border-box.
65706798 if ( ( !support.boxSizingReliable() && isBorderBox ||
6799+
6800+ // Support: IE 10 - 11+, Edge 15 - 18+
6801+ // IE/Edge misreport `getComputedStyle` of table rows with width/height
6802+ // set in CSS while `offset*` properties report correct values.
6803+ // Interestingly, in some cases IE 9 doesn't suffer from this issue.
6804+ !support.reliableTrDimensions() && nodeName( elem, "tr" ) ||
6805+
6806+ // Fall back to offsetWidth/offsetHeight when value is "auto"
6807+ // This happens for inline elements with no explicit setting (gh-3571)
65716808 val === "auto" ||
6809+
6810+ // Support: Android <=4.1 - 4.3 only
6811+ // Also use offsetWidth/offsetHeight for misreported inline dimensions (gh-3602)
65726812 !parseFloat( val ) && jQuery.css( elem, "display", false, styles ) === "inline" ) &&
6813+
6814+ // Make sure the element is visible & connected
65736815 elem.getClientRects().length ) {
65746816
65756817 isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box";
@@ -6764,7 +7006,7 @@ jQuery.extend( {
67647006 }
67657007} );
67667008
6767−jQuery.each( [ "height", "width" ], function( i, dimension ) {
7009+jQuery.each( [ "height", "width" ], function( _i, dimension ) {
67687010 jQuery.cssHooks[ dimension ] = {
67697011 get: function( elem, computed, extra ) {
67707012 if ( computed ) {
@@ -7537,7 +7779,7 @@ jQuery.fn.extend( {
75377779 clearQueue = type;
75387780 type = undefined;
75397781 }
7540− if ( clearQueue && type !== false ) {
7782+ if ( clearQueue ) {
75417783 this.queue( type || "fx", [] );
75427784 }
75437785
@@ -7620,7 +7862,7 @@ jQuery.fn.extend( {
76207862 }
76217863} );
76227864
7623−jQuery.each( [ "toggle", "show", "hide" ], function( i, name ) {
7865+jQuery.each( [ "toggle", "show", "hide" ], function( _i, name ) {
76247866 var cssFn = jQuery.fn[ name ];
76257867 jQuery.fn[ name ] = function( speed, easing, callback ) {
76267868 return speed == null || typeof speed === "boolean" ?
@@ -7841,7 +8083,7 @@ boolHook = {
78418083 }
78428084};
78438085
7844−jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( i, name ) {
8086+jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( _i, name ) {
78458087 var getter = attrHandle[ name ] || jQuery.find.attr;
78468088
78478089 attrHandle[ name ] = function( elem, name, isXML ) {
@@ -8465,7 +8707,9 @@ jQuery.extend( jQuery.event, {
84658707 special.bindType || type;
84668708
84678709 // jQuery handler
8468− handle = ( dataPriv.get( cur, "events" ) || {} )[ event.type ] &&
8710+ handle = (
8711+ dataPriv.get( cur, "events" ) || Object.create( null )
8712+ )[ event.type ] &&
84698713 dataPriv.get( cur, "handle" );
84708714 if ( handle ) {
84718715 handle.apply( cur, data );
@@ -8576,7 +8820,10 @@ if ( !support.focusin ) {
85768820
85778821 jQuery.event.special[ fix ] = {
85788822 setup: function() {
8579− var doc = this.ownerDocument || this,
8823+
8824+ // Handle: regular nodes (via `this.ownerDocument`), window
8825+ // (via `this.document`) & document (via `this`).
8826+ var doc = this.ownerDocument || this.document || this,
85808827 attaches = dataPriv.access( doc, fix );
85818828
85828829 if ( !attaches ) {
@@ -8585,7 +8832,7 @@ if ( !support.focusin ) {
85858832 dataPriv.access( doc, fix, ( attaches || 0 ) + 1 );
85868833 },
85878834 teardown: function() {
8588− var doc = this.ownerDocument || this,
8835+ var doc = this.ownerDocument || this.document || this,
85898836 attaches = dataPriv.access( doc, fix ) - 1;
85908837
85918838 if ( !attaches ) {
@@ -8601,7 +8848,7 @@ if ( !support.focusin ) {
86018848}
86028849var location = window.location;
86038850
8604−var nonce = Date.now();
8851+var nonce = { guid: Date.now() };
86058852
86068853var rquery = ( /\?/ );
86078854
@@ -8733,7 +8980,7 @@ jQuery.fn.extend( {
87338980 rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&
87348981 ( this.checked || !rcheckableType.test( type ) );
87358982 } )
8736− .map( function( i, elem ) {
8983+ .map( function( _i, elem ) {
87378984 var val = jQuery( this ).val();
87388985
87398986 if ( val == null ) {
@@ -9346,7 +9593,8 @@ jQuery.extend( {
93469593 // Add or update anti-cache param if needed
93479594 if ( s.cache === false ) {
93489595 cacheURL = cacheURL.replace( rantiCache, "$1" );
9349− uncached = ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + ( nonce++ ) + uncached;
9596+ uncached = ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + ( nonce.guid++ ) +
9597+ uncached;
93509598 }
93519599
93529600 // Put hash and anti-cache on the URL that will be requested (gh-1732)
@@ -9479,6 +9727,11 @@ jQuery.extend( {
94799727 response = ajaxHandleResponses( s, jqXHR, responses );
94809728 }
94819729
9730+ // Use a noop converter for missing script
9731+ if ( !isSuccess && jQuery.inArray( "script", s.dataTypes ) > -1 ) {
9732+ s.converters[ "text script" ] = function() {};
9733+ }
9734+
94829735 // Convert no matter what (that way responseXXX fields are always set)
94839736 response = ajaxConvert( s, response, jqXHR, isSuccess );
94849737
@@ -9569,7 +9822,7 @@ jQuery.extend( {
95699822 }
95709823} );
95719824
9572−jQuery.each( [ "get", "post" ], function( i, method ) {
9825+jQuery.each( [ "get", "post" ], function( _i, method ) {
95739826 jQuery[ method ] = function( url, data, callback, type ) {
95749827
95759828 // Shift arguments if data argument was omitted
@@ -9590,8 +9843,17 @@ jQuery.each( [ "get", "post" ], function( i, method ) {
95909843 };
95919844} );
95929845
9846+jQuery.ajaxPrefilter( function( s ) {
9847+ var i;
9848+ for ( i in s.headers ) {
9849+ if ( i.toLowerCase() === "content-type" ) {
9850+ s.contentType = s.headers[ i ] || "";
9851+ }
9852+ }
9853+} );
9854+
95939855
9594−jQuery._evalUrl = function( url, options ) {
9856+jQuery._evalUrl = function( url, options, doc ) {
95959857 return jQuery.ajax( {
95969858 url: url,
95979859
@@ -9609,7 +9871,7 @@ jQuery._evalUrl = function( url, options ) {
96099871 "text script": function() {}
96109872 },
96119873 dataFilter: function( response ) {
9612− jQuery.globalEval( response, options );
9874+ jQuery.globalEval( response, options, doc );
96139875 }
96149876 } );
96159877};
@@ -9931,7 +10193,7 @@ var oldCallbacks = [],
993110193jQuery.ajaxSetup( {
993210194 jsonp: "callback",
993310195 jsonpCallback: function() {
9934− var callback = oldCallbacks.pop() || ( jQuery.expando + "_" + ( nonce++ ) );
10196+ var callback = oldCallbacks.pop() || ( jQuery.expando + "_" + ( nonce.guid++ ) );
993510197 this[ callback ] = true;
993610198 return callback;
993710199 }
@@ -10148,23 +10410,6 @@ jQuery.fn.load = function( url, params, callback ) {
1014810410
1014910411
1015010412
10151−// Attach a bunch of functions for handling common AJAX events
10152−jQuery.each( [
10153− "ajaxStart",
10154− "ajaxStop",
10155− "ajaxComplete",
10156− "ajaxError",
10157− "ajaxSuccess",
10158− "ajaxSend"
10159−], function( i, type ) {
10160− jQuery.fn[ type ] = function( fn ) {
10161− return this.on( type, fn );
10162− };
10163−} );
10164−
10165−
10166−
10167−
1016810413jQuery.expr.pseudos.animated = function( elem ) {
1016910414 return jQuery.grep( jQuery.timers, function( fn ) {
1017010415 return elem === fn.elem;
@@ -10221,6 +10466,12 @@ jQuery.offset = {
1022110466 options.using.call( elem, props );
1022210467
1022310468 } else {
10469+ if ( typeof props.top === "number" ) {
10470+ props.top += "px";
10471+ }
10472+ if ( typeof props.left === "number" ) {
10473+ props.left += "px";
10474+ }
1022410475 curElem.css( props );
1022510476 }
1022610477 }
@@ -10371,7 +10622,7 @@ jQuery.each( { scrollLeft: "pageXOffset", scrollTop: "pageYOffset" }, function(
1037110622// Blink bug: https://bugs.chromium.org/p/chromium/issues/detail?id=589347
1037210623// getComputedStyle returns percent when specified for top/left/bottom/right;
1037310624// rather than make the css module depend on the offset module, just check for it here
10374−jQuery.each( [ "top", "left" ], function( i, prop ) {
10625+jQuery.each( [ "top", "left" ], function( _i, prop ) {
1037510626 jQuery.cssHooks[ prop ] = addGetHookIf( support.pixelPosition,
1037610627 function( elem, computed ) {
1037710628 if ( computed ) {
@@ -10434,25 +10685,19 @@ jQuery.each( { Height: "height", Width: "width" }, function( name, type ) {
1043410685} );
1043510686
1043610687
10437−jQuery.each( ( "blur focus focusin focusout resize scroll click dblclick " +
10438− "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
10439− "change select submit keydown keypress keyup contextmenu" ).split( " " ),
10440− function( i, name ) {
10441−
10442− // Handle event binding
10443− jQuery.fn[ name ] = function( data, fn ) {
10444− return arguments.length > 0 ?
10445− this.on( name, null, data, fn ) :
10446− this.trigger( name );
10688+jQuery.each( [
10689+ "ajaxStart",
10690+ "ajaxStop",
10691+ "ajaxComplete",
10692+ "ajaxError",
10693+ "ajaxSuccess",
10694+ "ajaxSend"
10695+], function( _i, type ) {
10696+ jQuery.fn[ type ] = function( fn ) {
10697+ return this.on( type, fn );
1044710698 };
1044810699} );
1044910700
10450−jQuery.fn.extend( {
10451− hover: function( fnOver, fnOut ) {
10452− return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
10453− }
10454−} );
10455−
1045610701
1045710702
1045810703
@@ -10474,9 +10719,33 @@ jQuery.fn.extend( {
1047410719 return arguments.length === 1 ?
1047510720 this.off( selector, "**" ) :
1047610721 this.off( types, selector || "**", fn );
10722+ },
10723+
10724+ hover: function( fnOver, fnOut ) {
10725+ return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
1047710726 }
1047810727} );
1047910728
10729+jQuery.each( ( "blur focus focusin focusout resize scroll click dblclick " +
10730+ "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
10731+ "change select submit keydown keypress keyup contextmenu" ).split( " " ),
10732+ function( _i, name ) {
10733+
10734+ // Handle event binding
10735+ jQuery.fn[ name ] = function( data, fn ) {
10736+ return arguments.length > 0 ?
10737+ this.on( name, null, data, fn ) :
10738+ this.trigger( name );
10739+ };
10740+ } );
10741+
10742+
10743+
10744+
10745+// Support: Android <=4.0 only
10746+// Make sure we trim BOM and NBSP
10747+var rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;
10748+
1048010749// Bind a function to a context, optionally partially applying any
1048110750// arguments.
1048210751// jQuery.proxy is deprecated to promote standards (specifically Function#bind)
@@ -10539,6 +10808,11 @@ jQuery.isNumeric = function( obj ) {
1053910808 !isNaN( obj - parseFloat( obj ) );
1054010809};
1054110810
10811+jQuery.trim = function( text ) {
10812+ return text == null ?
10813+ "" :
10814+ ( text + "" ).replace( rtrim, "" );
10815+};
1054210816
1054310817
1054410818
@@ -10587,7 +10861,7 @@ jQuery.noConflict = function( deep ) {
1058710861// Expose jQuery and $ identifiers, even in AMD
1058810862// (#7102#comment:10, https://github.com/jquery/jquery/pull/557)
1058910863// and CommonJS for browser emulators (#13566)
10590−if ( !noGlobal ) {
10864+if ( typeof noGlobal === "undefined" ) {
1059110865 window.jQuery = window.$ = jQuery;
1059210866}
1059310867
_static/jquery.js+2−2
@@ -1,2 +1,2 @@
1−/*! jQuery v3.4.1 | (c) JS Foundation and other contributors | jquery.org/license */
2−!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],E=C.document,r=Object.getPrototypeOf,s=t.slice,g=t.concat,u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType},x=function(e){return null!=e&&e===e.window},c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.4.1",k=function(e,t){return new k.fn.init(e,t)},p=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;function d(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0<t&&t-1 in e)}k.fn=k.prototype={jquery:f,constructor:k,length:0,toArray:function(){return s.call(this)},get:function(e){return null==e?s.call(this):e<0?this[e+this.length]:this[e]},pushStack:function(e){var t=k.merge(this.constructor(),e);return t.prevObject=this,t},each:function(e){return k.each(this,e)},map:function(n){return this.pushStack(k.map(this,function(e,t){return n.call(e,t,e)}))},slice:function(){return this.pushStack(s.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(e){var t=this.length,n=+e+(e<0?t:0);return this.pushStack(0<=n&&n<t?[this[n]]:[])},end:function(){return this.prevObject||this.constructor()},push:u,sort:t.sort,splice:t.splice},k.extend=k.fn.extend=function(){var e,t,n,r,i,o,a=arguments[0]||{},s=1,u=arguments.length,l=!1;for("boolean"==typeof a&&(l=a,a=arguments[s]||{},s++),"object"==typeof a||m(a)||(a={}),s===u&&(a=this,s--);s<u;s++)if(null!=(e=arguments[s]))for(t in e)r=e[t],"__proto__"!==t&&a!==r&&(l&&r&&(k.isPlainObject(r)||(i=Array.isArray(r)))?(n=a[t],o=i&&!Array.isArray(n)?[]:i||k.isPlainObject(n)?n:{},i=!1,a[t]=k.extend(l,o,r)):void 0!==r&&(a[t]=r));return a},k.extend({expando:"jQuery"+(f+Math.random()).replace(/\D/g,""),isReady:!0,error:function(e){throw new Error(e)},noop:function(){},isPlainObject:function(e){var t,n;return!(!e||"[object Object]"!==o.call(e))&&(!(t=r(e))||"function"==typeof(n=v.call(t,"constructor")&&t.constructor)&&a.call(n)===l)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},globalEval:function(e,t){b(e,{nonce:t&&t.nonce})},each:function(e,t){var n,r=0;if(d(e)){for(n=e.length;r<n;r++)if(!1===t.call(e[r],r,e[r]))break}else for(r in e)if(!1===t.call(e[r],r,e[r]))break;return e},trim:function(e){return null==e?"":(e+"").replace(p,"")},makeArray:function(e,t){var n=t||[];return null!=e&&(d(Object(e))?k.merge(n,"string"==typeof e?[e]:e):u.call(n,e)),n},inArray:function(e,t,n){return null==t?-1:i.call(t,e,n)},merge:function(e,t){for(var n=+t.length,r=0,i=e.length;r<n;r++)e[i++]=t[r];return e.length=i,e},grep:function(e,t,n){for(var r=[],i=0,o=e.length,a=!n;i<o;i++)!t(e[i],i)!==a&&r.push(e[i]);return r},map:function(e,t,n){var r,i,o=0,a=[];if(d(e))for(r=e.length;o<r;o++)null!=(i=t(e[o],o,n))&&a.push(i);else for(o in e)null!=(i=t(e[o],o,n))&&a.push(i);return g.apply([],a)},guid:1,support:y}),"function"==typeof Symbol&&(k.fn[Symbol.iterator]=t[Symbol.iterator]),k.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(e,t){n["[object "+t+"]"]=t.toLowerCase()});var h=function(n){var e,d,b,o,i,h,f,g,w,u,l,T,C,a,E,v,s,c,y,k="sizzle"+1*new Date,m=n.document,S=0,r=0,p=ue(),x=ue(),N=ue(),A=ue(),D=function(e,t){return e===t&&(l=!0),0},j={}.hasOwnProperty,t=[],q=t.pop,L=t.push,H=t.push,O=t.slice,P=function(e,t){for(var n=0,r=e.length;n<r;n++)if(e[n]===t)return n;return-1},R="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",M="[\\x20\\t\\r\\n\\f]",I="(?:\\\\.|[\\w-]|[^\0-\\xa0])+",W="\\["+M+"*("+I+")(?:"+M+"*([*^$|!~]?=)"+M+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+I+"))|)"+M+"*\\]",$=":("+I+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+W+")*)|.*)\\)|)",F=new RegExp(M+"+","g"),B=new RegExp("^"+M+"+|((?:^|[^\\\\])(?:\\\\.)*)"+M+"+$","g"),_=new RegExp("^"+M+"*,"+M+"*"),z=new RegExp("^"+M+"*([>+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp($),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+$),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\([\\da-f]{1,6}"+M+"?|("+M+")|.)","ig"),ne=function(e,t,n){var r="0x"+t-65536;return r!=r||n?t:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|56320)},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(m.childNodes),m.childNodes),t[m.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&((e?e.ownerDocument||e:m)!==C&&T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!A[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&U.test(t)){(s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=k),o=(l=h(t)).length;while(o--)l[o]="#"+s+" "+xe(l[o]);c=l.join(","),f=ee.test(t)&&ye(e.parentNode)||e}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){A(t,!0)}finally{s===k&&e.removeAttribute("id")}}}return g(t.replace(B,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[k]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e.namespaceURI,n=(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:m;return r!==C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),m!==C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=k,!C.getElementsByName||!C.getElementsByName(k).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){a.appendChild(e).innerHTML="<a id='"+k+"'></a><select id='"+k+"-\r\\' msallowcapture=''><option selected=''></option></select>",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+k+"-]").length||v.push("~="),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+k+"+*").length||v.push(".#.+[+~]")}),ce(function(e){e.innerHTML="<a href='' disabled='disabled'></a><select disabled='disabled'><option/></select>";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",$)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},D=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)===(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e===C||e.ownerDocument===m&&y(m,e)?-1:t===C||t.ownerDocument===m&&y(m,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e===C?-1:t===C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]===m?-1:s[r]===m?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if((e.ownerDocument||e)!==C&&T(e),d.matchesSelector&&E&&!A[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){A(t,!0)}return 0<se(t,C,null,[e]).length},se.contains=function(e,t){return(e.ownerDocument||e)!==C&&T(e),y(e,t)},se.attr=function(e,t){(e.ownerDocument||e)!==C&&T(e);var n=b.attrHandle[t.toLowerCase()],r=n&&j.call(b.attrHandle,t.toLowerCase())?n(e,t,!E):void 0;return void 0!==r?r:d.attributes||!E?e.getAttribute(t):(r=e.getAttributeNode(t))&&r.specified?r.value:null},se.escape=function(e){return(e+"").replace(re,ie)},se.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},se.uniqueSort=function(e){var t,n=[],r=0,i=0;if(l=!d.detectDuplicates,u=!d.sortStable&&e.slice(0),e.sort(D),l){while(t=e[i++])t===e[i]&&(r=n.push(i));while(r--)e.splice(n[r],1)}return u=null,e},o=se.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=o(e)}else if(3===i||4===i)return e.nodeValue}else while(t=e[r++])n+=o(t);return n},(b=se.selectors={cacheLength:50,createPseudo:le,match:G,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=p[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&p(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1<t.indexOf(i):"$="===r?i&&t.slice(-i.length)===i:"~="===r?-1<(" "+t.replace(F," ")+" ").indexOf(i):"|="===r&&(t===i||t.slice(0,i.length+1)===i+"-"))}},CHILD:function(h,e,t,g,v){var y="nth"!==h.slice(0,3),m="last"!==h.slice(-4),x="of-type"===e;return 1===g&&0===v?function(e){return!!e.parentNode}:function(e,t,n){var r,i,o,a,s,u,l=y!==m?"nextSibling":"previousSibling",c=e.parentNode,f=x&&e.nodeName.toLowerCase(),p=!n&&!x,d=!1;if(c){if(y){while(l){a=e;while(a=a[l])if(x?a.nodeName.toLowerCase()===f:1===a.nodeType)return!1;u=l="only"===h&&!u&&"nextSibling"}return!0}if(u=[m?c.firstChild:c.lastChild],m&&p){d=(s=(r=(i=(o=(a=c)[k]||(a[k]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]||[])[0]===S&&r[1])&&r[2],a=s&&c.childNodes[s];while(a=++s&&a&&a[l]||(d=s=0)||u.pop())if(1===a.nodeType&&++d&&a===e){i[h]=[S,s,d];break}}else if(p&&(d=s=(r=(i=(o=(a=e)[k]||(a[k]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]||[])[0]===S&&r[1]),!1===d)while(a=++s&&a&&a[l]||(d=s=0)||u.pop())if((x?a.nodeName.toLowerCase()===f:1===a.nodeType)&&++d&&(p&&((i=(o=a[k]||(a[k]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]=[S,d]),a===e))break;return(d-=v)===g||d%g==0&&0<=d/g}}},PSEUDO:function(e,o){var t,a=b.pseudos[e]||b.setFilters[e.toLowerCase()]||se.error("unsupported pseudo: "+e);return a[k]?a(o):1<a.length?(t=[e,e,"",o],b.setFilters.hasOwnProperty(e.toLowerCase())?le(function(e,t){var n,r=a(e,o),i=r.length;while(i--)e[n=P(e,r[i])]=!(t[n]=r[i])}):function(e){return a(e,0,t)}):a}},pseudos:{not:le(function(e){var r=[],i=[],s=f(e.replace(B,"$1"));return s[k]?le(function(e,t,n,r){var i,o=s(e,null,r,[]),a=e.length;while(a--)(i=o[a])&&(e[a]=!(t[a]=i))}):function(e,t,n){return r[0]=e,s(r,null,n,i),r[0]=null,!i.pop()}}),has:le(function(t){return function(e){return 0<se(t,e).length}}),contains:le(function(t){return t=t.replace(te,ne),function(e){return-1<(e.textContent||o(e)).indexOf(t)}}),lang:le(function(n){return V.test(n||"")||se.error("unsupported lang: "+n),n=n.replace(te,ne).toLowerCase(),function(e){var t;do{if(t=E?e.lang:e.getAttribute("xml:lang")||e.getAttribute("lang"))return(t=t.toLowerCase())===n||0===t.indexOf(n+"-")}while((e=e.parentNode)&&1===e.nodeType);return!1}}),target:function(e){var t=n.location&&n.location.hash;return t&&t.slice(1)===e.id},root:function(e){return e===a},focus:function(e){return e===C.activeElement&&(!C.hasFocus||C.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:ge(!1),disabled:ge(!0),checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,!0===e.selected},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!b.pseudos.empty(e)},header:function(e){return J.test(e.nodeName)},input:function(e){return Q.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||"text"===t.toLowerCase())},first:ve(function(){return[0]}),last:ve(function(e,t){return[t-1]}),eq:ve(function(e,t,n){return[n<0?n+t:n]}),even:ve(function(e,t){for(var n=0;n<t;n+=2)e.push(n);return e}),odd:ve(function(e,t){for(var n=1;n<t;n+=2)e.push(n);return e}),lt:ve(function(e,t,n){for(var r=n<0?n+t:t<n?t:n;0<=--r;)e.push(r);return e}),gt:ve(function(e,t,n){for(var r=n<0?n+t:n;++r<t;)e.push(r);return e})}}).pseudos.nth=b.pseudos.eq,{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})b.pseudos[e]=de(e);for(e in{submit:!0,reset:!0})b.pseudos[e]=he(e);function me(){}function xe(e){for(var t=0,n=e.length,r="";t<n;t++)r+=e[t].value;return r}function be(s,e,t){var u=e.dir,l=e.next,c=l||u,f=t&&"parentNode"===c,p=r++;return e.first?function(e,t,n){while(e=e[u])if(1===e.nodeType||f)return s(e,t,n);return!1}:function(e,t,n){var r,i,o,a=[S,p];if(n){while(e=e[u])if((1===e.nodeType||f)&&s(e,t,n))return!0}else while(e=e[u])if(1===e.nodeType||f)if(i=(o=e[k]||(e[k]={}))[e.uniqueID]||(o[e.uniqueID]={}),l&&l===e.nodeName.toLowerCase())e=e[u]||e;else{if((r=i[c])&&r[0]===S&&r[1]===p)return a[2]=r[2];if((i[c]=a)[2]=s(e,t,n))return!0}return!1}}function we(i){return 1<i.length?function(e,t,n){var r=i.length;while(r--)if(!i[r](e,t,n))return!1;return!0}:i[0]}function Te(e,t,n,r,i){for(var o,a=[],s=0,u=e.length,l=null!=t;s<u;s++)(o=e[s])&&(n&&!n(o,r,i)||(a.push(o),l&&t.push(s)));return a}function Ce(d,h,g,v,y,e){return v&&!v[k]&&(v=Ce(v)),y&&!y[k]&&(y=Ce(y,e)),le(function(e,t,n,r){var i,o,a,s=[],u=[],l=t.length,c=e||function(e,t,n){for(var r=0,i=t.length;r<i;r++)se(e,t[r],n);return n}(h||"*",n.nodeType?[n]:n,[]),f=!d||!e&&h?c:Te(c,s,d,n,r),p=g?y||(e?d:l||v)?[]:t:f;if(g&&g(f,p,n,r),v){i=Te(p,u),v(i,[],n,r),o=i.length;while(o--)(a=i[o])&&(p[u[o]]=!(f[u[o]]=a))}if(e){if(y||d){if(y){i=[],o=p.length;while(o--)(a=p[o])&&i.push(f[o]=a);y(null,p=[],i,r)}o=p.length;while(o--)(a=p[o])&&-1<(i=y?P(e,a):s[o])&&(e[i]=!(t[i]=a))}}else p=Te(p===t?p.splice(l,p.length):p),y?y(null,t,p,r):H.apply(t,p)})}function Ee(e){for(var i,t,n,r=e.length,o=b.relative[e[0].type],a=o||b.relative[" "],s=o?1:0,u=be(function(e){return e===i},a,!0),l=be(function(e){return-1<P(i,e)},a,!0),c=[function(e,t,n){var r=!o&&(n||t!==w)||((i=t).nodeType?u(e,t,n):l(e,t,n));return i=null,r}];s<r;s++)if(t=b.relative[e[s].type])c=[be(we(c),t)];else{if((t=b.filter[e[s].type].apply(null,e[s].matches))[k]){for(n=++s;n<r;n++)if(b.relative[e[n].type])break;return Ce(1<s&&we(c),1<s&&xe(e.slice(0,s-1).concat({value:" "===e[s-2].type?"*":""})).replace(B,"$1"),t,s<n&&Ee(e.slice(s,n)),n<r&&Ee(e=e.slice(n)),n<r&&xe(e))}c.push(t)}return we(c)}return me.prototype=b.filters=b.pseudos,b.setFilters=new me,h=se.tokenize=function(e,t){var n,r,i,o,a,s,u,l=x[e+" "];if(l)return t?0:l.slice(0);a=e,s=[],u=b.preFilter;while(a){for(o in n&&!(r=_.exec(a))||(r&&(a=a.slice(r[0].length)||a),s.push(i=[])),n=!1,(r=z.exec(a))&&(n=r.shift(),i.push({value:n,type:r[0].replace(B," ")}),a=a.slice(n.length)),b.filter)!(r=G[o].exec(a))||u[o]&&!(r=u[o](r))||(n=r.shift(),i.push({value:n,type:o,matches:r}),a=a.slice(n.length));if(!n)break}return t?a.length:a?se.error(e):x(e,s).slice(0)},f=se.compile=function(e,t){var n,v,y,m,x,r,i=[],o=[],a=N[e+" "];if(!a){t||(t=h(e)),n=t.length;while(n--)(a=Ee(t[n]))[k]?i.push(a):o.push(a);(a=N(e,(v=o,m=0<(y=i).length,x=0<v.length,r=function(e,t,n,r,i){var o,a,s,u=0,l="0",c=e&&[],f=[],p=w,d=e||x&&b.find.TAG("*",i),h=S+=null==p?1:Math.random()||.1,g=d.length;for(i&&(w=t===C||t||i);l!==g&&null!=(o=d[l]);l++){if(x&&o){a=0,t||o.ownerDocument===C||(T(o),n=!E);while(s=v[a++])if(s(o,t||C,n)){r.push(o);break}i&&(S=h)}m&&((o=!s&&o)&&u--,e&&c.push(o))}if(u+=l,m&&l!==u){a=0;while(s=y[a++])s(c,f,t,n);if(e){if(0<u)while(l--)c[l]||f[l]||(f[l]=q.call(r));f=Te(f)}H.apply(r,f),i&&!e&&0<f.length&&1<u+y.length&&se.uniqueSort(r)}return i&&(S=h,w=p),c},m?le(r):r))).selector=e}return a},g=se.select=function(e,t,n,r){var i,o,a,s,u,l="function"==typeof e&&e,c=!r&&h(e=l.selector||e);if(n=n||[],1===c.length){if(2<(o=c[0]=c[0].slice(0)).length&&"ID"===(a=o[0]).type&&9===t.nodeType&&E&&b.relative[o[1].type]){if(!(t=(b.find.ID(a.matches[0].replace(te,ne),t)||[])[0]))return n;l&&(t=t.parentNode),e=e.slice(o.shift().value.length)}i=G.needsContext.test(e)?0:o.length;while(i--){if(a=o[i],b.relative[s=a.type])break;if((u=b.find[s])&&(r=u(a.matches[0].replace(te,ne),ee.test(o[0].type)&&ye(t.parentNode)||t))){if(o.splice(i,1),!(e=r.length&&xe(o)))return H.apply(n,r),n;break}}}return(l||f(e,c))(r,t,!E,n,!t||ee.test(e)&&ye(t.parentNode)||t),n},d.sortStable=k.split("").sort(D).join("")===k,d.detectDuplicates=!!l,T(),d.sortDetached=ce(function(e){return 1&e.compareDocumentPosition(C.createElement("fieldset"))}),ce(function(e){return e.innerHTML="<a href='#'></a>","#"===e.firstChild.getAttribute("href")})||fe("type|href|height|width",function(e,t,n){if(!n)return e.getAttribute(t,"type"===t.toLowerCase()?1:2)}),d.attributes&&ce(function(e){return e.innerHTML="<input/>",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||fe("value",function(e,t,n){if(!n&&"input"===e.nodeName.toLowerCase())return e.defaultValue}),ce(function(e){return null==e.getAttribute("disabled")})||fe(R,function(e,t,n){var r;if(!n)return!0===e[t]?t.toLowerCase():(r=e.getAttributeNode(t))&&r.specified?r.value:null}),se}(C);k.find=h,k.expr=h.selectors,k.expr[":"]=k.expr.pseudos,k.uniqueSort=k.unique=h.uniqueSort,k.text=h.getText,k.isXMLDoc=h.isXML,k.contains=h.contains,k.escapeSelector=h.escape;var T=function(e,t,n){var r=[],i=void 0!==n;while((e=e[t])&&9!==e.nodeType)if(1===e.nodeType){if(i&&k(e).is(n))break;r.push(e)}return r},S=function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n},N=k.expr.match.needsContext;function A(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()}var D=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?k.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?k.grep(e,function(e){return e===n!==r}):"string"!=typeof n?k.grep(e,function(e){return-1<i.call(n,e)!==r}):k.filter(n,e,r)}k.filter=function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?k.find.matchesSelector(r,e)?[r]:[]:k.find.matches(e,k.grep(t,function(e){return 1===e.nodeType}))},k.fn.extend({find:function(e){var t,n,r=this.length,i=this;if("string"!=typeof e)return this.pushStack(k(e).filter(function(){for(t=0;t<r;t++)if(k.contains(i[t],this))return!0}));for(n=this.pushStack([]),t=0;t<r;t++)k.find(e,i[t],n);return 1<r?k.uniqueSort(n):n},filter:function(e){return this.pushStack(j(this,e||[],!1))},not:function(e){return this.pushStack(j(this,e||[],!0))},is:function(e){return!!j(this,"string"==typeof e&&N.test(e)?k(e):e||[],!1).length}});var q,L=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;(k.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||q,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:L.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof k?t[0]:t,k.merge(this,k.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),D.test(r[1])&&k.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(k):k.makeArray(e,this)}).prototype=k.fn,q=k(E);var H=/^(?:parents|prev(?:Until|All))/,O={children:!0,contents:!0,next:!0,prev:!0};function P(e,t){while((e=e[t])&&1!==e.nodeType);return e}k.fn.extend({has:function(e){var t=k(e,this),n=t.length;return this.filter(function(){for(var e=0;e<n;e++)if(k.contains(this,t[e]))return!0})},closest:function(e,t){var n,r=0,i=this.length,o=[],a="string"!=typeof e&&k(e);if(!N.test(e))for(;r<i;r++)for(n=this[r];n&&n!==t;n=n.parentNode)if(n.nodeType<11&&(a?-1<a.index(n):1===n.nodeType&&k.find.matchesSelector(n,e))){o.push(n);break}return this.pushStack(1<o.length?k.uniqueSort(o):o)},index:function(e){return e?"string"==typeof e?i.call(k(e),this[0]):i.call(this,e.jquery?e[0]:e):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(k.uniqueSort(k.merge(this.get(),k(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),k.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return T(e,"parentNode")},parentsUntil:function(e,t,n){return T(e,"parentNode",n)},next:function(e){return P(e,"nextSibling")},prev:function(e){return P(e,"previousSibling")},nextAll:function(e){return T(e,"nextSibling")},prevAll:function(e){return T(e,"previousSibling")},nextUntil:function(e,t,n){return T(e,"nextSibling",n)},prevUntil:function(e,t,n){return T(e,"previousSibling",n)},siblings:function(e){return S((e.parentNode||{}).firstChild,e)},children:function(e){return S(e.firstChild)},contents:function(e){return"undefined"!=typeof e.contentDocument?e.contentDocument:(A(e,"template")&&(e=e.content||e),k.merge([],e.childNodes))}},function(r,i){k.fn[r]=function(e,t){var n=k.map(this,i,e);return"Until"!==r.slice(-5)&&(t=e),t&&"string"==typeof t&&(n=k.filter(t,n)),1<this.length&&(O[r]||k.uniqueSort(n),H.test(r)&&n.reverse()),this.pushStack(n)}});var R=/[^\x20\t\r\n\f]+/g;function M(e){return e}function I(e){throw e}function W(e,t,n,r){var i;try{e&&m(i=e.promise)?i.call(e).done(t).fail(n):e&&m(i=e.then)?i.call(e,t,n):t.apply(void 0,[e].slice(r))}catch(e){n.apply(void 0,[e])}}k.Callbacks=function(r){var e,n;r="string"==typeof r?(e=r,n={},k.each(e.match(R)||[],function(e,t){n[t]=!0}),n):k.extend({},r);var i,t,o,a,s=[],u=[],l=-1,c=function(){for(a=a||r.once,o=i=!0;u.length;l=-1){t=u.shift();while(++l<s.length)!1===s[l].apply(t[0],t[1])&&r.stopOnFalse&&(l=s.length,t=!1)}r.memory||(t=!1),i=!1,a&&(s=t?[]:"")},f={add:function(){return s&&(t&&!i&&(l=s.length-1,u.push(t)),function n(e){k.each(e,function(e,t){m(t)?r.unique&&f.has(t)||s.push(t):t&&t.length&&"string"!==w(t)&&n(t)})}(arguments),t&&!i&&c()),this},remove:function(){return k.each(arguments,function(e,t){var n;while(-1<(n=k.inArray(t,s,n)))s.splice(n,1),n<=l&&l--}),this},has:function(e){return e?-1<k.inArray(e,s):0<s.length},empty:function(){return s&&(s=[]),this},disable:function(){return a=u=[],s=t="",this},disabled:function(){return!s},lock:function(){return a=u=[],t||i||(s=t=""),this},locked:function(){return!!a},fireWith:function(e,t){return a||(t=[e,(t=t||[]).slice?t.slice():t],u.push(t),i||c()),this},fire:function(){return f.fireWith(this,arguments),this},fired:function(){return!!o}};return f},k.extend({Deferred:function(e){var o=[["notify","progress",k.Callbacks("memory"),k.Callbacks("memory"),2],["resolve","done",k.Callbacks("once memory"),k.Callbacks("once memory"),0,"resolved"],["reject","fail",k.Callbacks("once memory"),k.Callbacks("once memory"),1,"rejected"]],i="pending",a={state:function(){return i},always:function(){return s.done(arguments).fail(arguments),this},"catch":function(e){return a.then(null,e)},pipe:function(){var i=arguments;return k.Deferred(function(r){k.each(o,function(e,t){var n=m(i[t[4]])&&i[t[4]];s[t[1]](function(){var e=n&&n.apply(this,arguments);e&&m(e.promise)?e.promise().progress(r.notify).done(r.resolve).fail(r.reject):r[t[0]+"With"](this,n?[e]:arguments)})}),i=null}).promise()},then:function(t,n,r){var u=0;function l(i,o,a,s){return function(){var n=this,r=arguments,e=function(){var e,t;if(!(i<u)){if((e=a.apply(n,r))===o.promise())throw new TypeError("Thenable self-resolution");t=e&&("object"==typeof e||"function"==typeof e)&&e.then,m(t)?s?t.call(e,l(u,o,M,s),l(u,o,I,s)):(u++,t.call(e,l(u,o,M,s),l(u,o,I,s),l(u,o,M,o.notifyWith))):(a!==M&&(n=void 0,r=[e]),(s||o.resolveWith)(n,r))}},t=s?e:function(){try{e()}catch(e){k.Deferred.exceptionHook&&k.Deferred.exceptionHook(e,t.stackTrace),u<=i+1&&(a!==I&&(n=void 0,r=[e]),o.rejectWith(n,r))}};i?t():(k.Deferred.getStackHook&&(t.stackTrace=k.Deferred.getStackHook()),C.setTimeout(t))}}return k.Deferred(function(e){o[0][3].add(l(0,e,m(r)?r:M,e.notifyWith)),o[1][3].add(l(0,e,m(t)?t:M)),o[2][3].add(l(0,e,m(n)?n:I))}).promise()},promise:function(e){return null!=e?k.extend(e,a):a}},s={};return k.each(o,function(e,t){var n=t[2],r=t[5];a[t[1]]=n.add,r&&n.add(function(){i=r},o[3-e][2].disable,o[3-e][3].disable,o[0][2].lock,o[0][3].lock),n.add(t[3].fire),s[t[0]]=function(){return s[t[0]+"With"](this===s?void 0:this,arguments),this},s[t[0]+"With"]=n.fireWith}),a.promise(s),e&&e.call(s,s),s},when:function(e){var n=arguments.length,t=n,r=Array(t),i=s.call(arguments),o=k.Deferred(),a=function(t){return function(e){r[t]=this,i[t]=1<arguments.length?s.call(arguments):e,--n||o.resolveWith(r,i)}};if(n<=1&&(W(e,o.done(a(t)).resolve,o.reject,!n),"pending"===o.state()||m(i[t]&&i[t].then)))return o.then();while(t--)W(i[t],a(t),o.reject);return o.promise()}});var $=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;k.Deferred.exceptionHook=function(e,t){C.console&&C.console.warn&&e&&$.test(e.name)&&C.console.warn("jQuery.Deferred exception: "+e.message,e.stack,t)},k.readyException=function(e){C.setTimeout(function(){throw e})};var F=k.Deferred();function B(){E.removeEventListener("DOMContentLoaded",B),C.removeEventListener("load",B),k.ready()}k.fn.ready=function(e){return F.then(e)["catch"](function(e){k.readyException(e)}),this},k.extend({isReady:!1,readyWait:1,ready:function(e){(!0===e?--k.readyWait:k.isReady)||(k.isReady=!0)!==e&&0<--k.readyWait||F.resolveWith(E,[k])}}),k.ready.then=F.then,"complete"===E.readyState||"loading"!==E.readyState&&!E.documentElement.doScroll?C.setTimeout(k.ready):(E.addEventListener("DOMContentLoaded",B),C.addEventListener("load",B));var _=function(e,t,n,r,i,o,a){var s=0,u=e.length,l=null==n;if("object"===w(n))for(s in i=!0,n)_(e,t,s,n[s],!0,o,a);else if(void 0!==r&&(i=!0,m(r)||(a=!0),l&&(a?(t.call(e,r),t=null):(l=t,t=function(e,t,n){return l.call(k(e),n)})),t))for(;s<u;s++)t(e[s],n,a?r:r.call(e[s],s,t(e[s],n)));return i?e:l?t.call(e):u?t(e[0],n):o},z=/^-ms-/,U=/-([a-z])/g;function X(e,t){return t.toUpperCase()}function V(e){return e.replace(z,"ms-").replace(U,X)}var G=function(e){return 1===e.nodeType||9===e.nodeType||!+e.nodeType};function Y(){this.expando=k.expando+Y.uid++}Y.uid=1,Y.prototype={cache:function(e){var t=e[this.expando];return t||(t={},G(e)&&(e.nodeType?e[this.expando]=t:Object.defineProperty(e,this.expando,{value:t,configurable:!0}))),t},set:function(e,t,n){var r,i=this.cache(e);if("string"==typeof t)i[V(t)]=n;else for(r in t)i[V(r)]=t[r];return i},get:function(e,t){return void 0===t?this.cache(e):e[this.expando]&&e[this.expando][V(t)]},access:function(e,t,n){return void 0===t||t&&"string"==typeof t&&void 0===n?this.get(e,t):(this.set(e,t,n),void 0!==n?n:t)},remove:function(e,t){var n,r=e[this.expando];if(void 0!==r){if(void 0!==t){n=(t=Array.isArray(t)?t.map(V):(t=V(t))in r?[t]:t.match(R)||[]).length;while(n--)delete r[t[n]]}(void 0===t||k.isEmptyObject(r))&&(e.nodeType?e[this.expando]=void 0:delete e[this.expando])}},hasData:function(e){var t=e[this.expando];return void 0!==t&&!k.isEmptyObject(t)}};var Q=new Y,J=new Y,K=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,Z=/[A-Z]/g;function ee(e,t,n){var r,i;if(void 0===n&&1===e.nodeType)if(r="data-"+t.replace(Z,"-$&").toLowerCase(),"string"==typeof(n=e.getAttribute(r))){try{n="true"===(i=n)||"false"!==i&&("null"===i?null:i===+i+""?+i:K.test(i)?JSON.parse(i):i)}catch(e){}J.set(e,t,n)}else n=void 0;return n}k.extend({hasData:function(e){return J.hasData(e)||Q.hasData(e)},data:function(e,t,n){return J.access(e,t,n)},removeData:function(e,t){J.remove(e,t)},_data:function(e,t,n){return Q.access(e,t,n)},_removeData:function(e,t){Q.remove(e,t)}}),k.fn.extend({data:function(n,e){var t,r,i,o=this[0],a=o&&o.attributes;if(void 0===n){if(this.length&&(i=J.get(o),1===o.nodeType&&!Q.get(o,"hasDataAttrs"))){t=a.length;while(t--)a[t]&&0===(r=a[t].name).indexOf("data-")&&(r=V(r.slice(5)),ee(o,r,i[r]));Q.set(o,"hasDataAttrs",!0)}return i}return"object"==typeof n?this.each(function(){J.set(this,n)}):_(this,function(e){var t;if(o&&void 0===e)return void 0!==(t=J.get(o,n))?t:void 0!==(t=ee(o,n))?t:void 0;this.each(function(){J.set(this,n,e)})},null,e,1<arguments.length,null,!0)},removeData:function(e){return this.each(function(){J.remove(this,e)})}}),k.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=Q.get(e,t),n&&(!r||Array.isArray(n)?r=Q.access(e,t,k.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=k.queue(e,t),r=n.length,i=n.shift(),o=k._queueHooks(e,t);"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,function(){k.dequeue(e,t)},o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return Q.get(e,n)||Q.access(e,n,{empty:k.Callbacks("once memory").add(function(){Q.remove(e,[t+"queue",n])})})}}),k.fn.extend({queue:function(t,n){var e=2;return"string"!=typeof t&&(n=t,t="fx",e--),arguments.length<e?k.queue(this[0],t):void 0===n?this:this.each(function(){var e=k.queue(this,t,n);k._queueHooks(this,t),"fx"===t&&"inprogress"!==e[0]&&k.dequeue(this,t)})},dequeue:function(e){return this.each(function(){k.dequeue(this,e)})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,t){var n,r=1,i=k.Deferred(),o=this,a=this.length,s=function(){--r||i.resolveWith(o,[o])};"string"!=typeof e&&(t=e,e=void 0),e=e||"fx";while(a--)(n=Q.get(o[a],e+"queueHooks"))&&n.empty&&(r++,n.empty.add(s));return s(),i.promise(t)}});var te=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,ne=new RegExp("^(?:([+-])=|)("+te+")([a-z%]*)$","i"),re=["Top","Right","Bottom","Left"],ie=E.documentElement,oe=function(e){return k.contains(e.ownerDocument,e)},ae={composed:!0};ie.getRootNode&&(oe=function(e){return k.contains(e.ownerDocument,e)||e.getRootNode(ae)===e.ownerDocument});var se=function(e,t){return"none"===(e=t||e).style.display||""===e.style.display&&oe(e)&&"none"===k.css(e,"display")},ue=function(e,t,n,r){var i,o,a={};for(o in t)a[o]=e.style[o],e.style[o]=t[o];for(o in i=n.apply(e,r||[]),t)e.style[o]=a[o];return i};function le(e,t,n,r){var i,o,a=20,s=r?function(){return r.cur()}:function(){return k.css(e,t,"")},u=s(),l=n&&n[3]||(k.cssNumber[t]?"":"px"),c=e.nodeType&&(k.cssNumber[t]||"px"!==l&&+u)&&ne.exec(k.css(e,t));if(c&&c[3]!==l){u/=2,l=l||c[3],c=+u||1;while(a--)k.style(e,t,c+l),(1-o)*(1-(o=s()/u||.5))<=0&&(a=0),c/=o;c*=2,k.style(e,t,c+l),n=n||[]}return n&&(c=+c||+u||0,i=n[1]?c+(n[1]+1)*n[2]:+n[2],r&&(r.unit=l,r.start=c,r.end=i)),i}var ce={};function fe(e,t){for(var n,r,i,o,a,s,u,l=[],c=0,f=e.length;c<f;c++)(r=e[c]).style&&(n=r.style.display,t?("none"===n&&(l[c]=Q.get(r,"display")||null,l[c]||(r.style.display="")),""===r.style.display&&se(r)&&(l[c]=(u=a=o=void 0,a=(i=r).ownerDocument,s=i.nodeName,(u=ce[s])||(o=a.body.appendChild(a.createElement(s)),u=k.css(o,"display"),o.parentNode.removeChild(o),"none"===u&&(u="block"),ce[s]=u)))):"none"!==n&&(l[c]="none",Q.set(r,"display",n)));for(c=0;c<f;c++)null!=l[c]&&(e[c].style.display=l[c]);return e}k.fn.extend({show:function(){return fe(this,!0)},hide:function(){return fe(this)},toggle:function(e){return"boolean"==typeof e?e?this.show():this.hide():this.each(function(){se(this)?k(this).show():k(this).hide()})}});var pe=/^(?:checkbox|radio)$/i,de=/<([a-z][^\/\0>\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i,ge={option:[1,"<select multiple='multiple'>","</select>"],thead:[1,"<table>","</table>"],col:[2,"<table><colgroup>","</colgroup></table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?k.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n<r;n++)Q.set(e[n],"globalEval",!t||Q.get(t[n],"globalEval"))}ge.optgroup=ge.option,ge.tbody=ge.tfoot=ge.colgroup=ge.caption=ge.thead,ge.th=ge.td;var me,xe,be=/<|&#?\w+;/;function we(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d<h;d++)if((o=e[d])||0===o)if("object"===w(o))k.merge(p,o.nodeType?[o]:o);else if(be.test(o)){a=a||f.appendChild(t.createElement("div")),s=(de.exec(o)||["",""])[1].toLowerCase(),u=ge[s]||ge._default,a.innerHTML=u[1]+k.htmlPrefilter(o)+u[2],c=u[0];while(c--)a=a.lastChild;k.merge(p,a.childNodes),(a=f.firstChild).textContent=""}else p.push(t.createTextNode(o));f.textContent="",d=0;while(o=p[d++])if(r&&-1<k.inArray(o,r))i&&i.push(o);else if(l=oe(o),a=ve(f.appendChild(o),"script"),l&&ye(a),n){c=0;while(o=a[c++])he.test(o.type||"")&&n.push(o)}return f}me=E.createDocumentFragment().appendChild(E.createElement("div")),(xe=E.createElement("input")).setAttribute("type","radio"),xe.setAttribute("checked","checked"),xe.setAttribute("name","t"),me.appendChild(xe),y.checkClone=me.cloneNode(!0).cloneNode(!0).lastChild.checked,me.innerHTML="<textarea>x</textarea>",y.noCloneChecked=!!me.cloneNode(!0).lastChild.defaultValue;var Te=/^key/,Ce=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Ee=/^([^.]*)(?:\.(.+)|)/;function ke(){return!0}function Se(){return!1}function Ne(e,t){return e===function(){try{return E.activeElement}catch(e){}}()==("focus"===t)}function Ae(e,t,n,r,i,o){var a,s;if("object"==typeof t){for(s in"string"!=typeof n&&(r=r||n,n=void 0),t)Ae(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=Se;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return k().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=k.guid++)),e.each(function(){k.event.add(this,t,i,r,n)})}function De(e,i,o){o?(Q.set(e,i,!1),k.event.add(e,i,{namespace:!1,handler:function(e){var t,n,r=Q.get(this,i);if(1&e.isTrigger&&this[i]){if(r.length)(k.event.special[i]||{}).delegateType&&e.stopPropagation();else if(r=s.call(arguments),Q.set(this,i,r),t=o(this,i),this[i](),r!==(n=Q.get(this,i))||t?Q.set(this,i,!1):n={},r!==n)return e.stopImmediatePropagation(),e.preventDefault(),n.value}else r.length&&(Q.set(this,i,{value:k.event.trigger(k.extend(r[0],k.Event.prototype),r.slice(1),this)}),e.stopImmediatePropagation())}})):void 0===Q.get(e,i)&&k.event.add(e,i,ke)}k.event={global:{},add:function(t,e,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.get(t);if(v){n.handler&&(n=(o=n).handler,i=o.selector),i&&k.find.matchesSelector(ie,i),n.guid||(n.guid=k.guid++),(u=v.events)||(u=v.events={}),(a=v.handle)||(a=v.handle=function(e){return"undefined"!=typeof k&&k.event.triggered!==e.type?k.event.dispatch.apply(t,arguments):void 0}),l=(e=(e||"").match(R)||[""]).length;while(l--)d=g=(s=Ee.exec(e[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=k.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=k.event.special[d]||{},c=k.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&k.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,r,h,a)||t.addEventListener&&t.addEventListener(d,a)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),k.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.hasData(e)&&Q.get(e);if(v&&(u=v.events)){l=(t=(t||"").match(R)||[""]).length;while(l--)if(d=g=(s=Ee.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d){f=k.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,v.handle)||k.removeEvent(e,d,v.handle),delete u[d])}else for(d in u)k.event.remove(e,d+t[l],n,r,!0);k.isEmptyObject(u)&&Q.remove(e,"handle events")}},dispatch:function(e){var t,n,r,i,o,a,s=k.event.fix(e),u=new Array(arguments.length),l=(Q.get(this,"events")||{})[s.type]||[],c=k.event.special[s.type]||{};for(u[0]=s,t=1;t<arguments.length;t++)u[t]=arguments[t];if(s.delegateTarget=this,!c.preDispatch||!1!==c.preDispatch.call(this,s)){a=k.event.handlers.call(this,s,l),t=0;while((i=a[t++])&&!s.isPropagationStopped()){s.currentTarget=i.elem,n=0;while((o=i.handlers[n++])&&!s.isImmediatePropagationStopped())s.rnamespace&&!1!==o.namespace&&!s.rnamespace.test(o.namespace)||(s.handleObj=o,s.data=o.data,void 0!==(r=((k.event.special[o.origType]||{}).handle||o.handler).apply(i.elem,u))&&!1===(s.result=r)&&(s.preventDefault(),s.stopPropagation()))}return c.postDispatch&&c.postDispatch.call(this,s),s.result}},handlers:function(e,t){var n,r,i,o,a,s=[],u=t.delegateCount,l=e.target;if(u&&l.nodeType&&!("click"===e.type&&1<=e.button))for(;l!==this;l=l.parentNode||this)if(1===l.nodeType&&("click"!==e.type||!0!==l.disabled)){for(o=[],a={},n=0;n<u;n++)void 0===a[i=(r=t[n]).selector+" "]&&(a[i]=r.needsContext?-1<k(i,this).index(l):k.find(i,this,null,[l]).length),a[i]&&o.push(r);o.length&&s.push({elem:l,handlers:o})}return l=this,u<t.length&&s.push({elem:l,handlers:t.slice(u)}),s},addProp:function(t,e){Object.defineProperty(k.Event.prototype,t,{enumerable:!0,configurable:!0,get:m(e)?function(){if(this.originalEvent)return e(this.originalEvent)}:function(){if(this.originalEvent)return this.originalEvent[t]},set:function(e){Object.defineProperty(this,t,{enumerable:!0,configurable:!0,writable:!0,value:e})}})},fix:function(e){return e[k.expando]?e:new k.Event(e)},special:{load:{noBubble:!0},click:{setup:function(e){var t=this||e;return pe.test(t.type)&&t.click&&A(t,"input")&&De(t,"click",ke),!1},trigger:function(e){var t=this||e;return pe.test(t.type)&&t.click&&A(t,"input")&&De(t,"click"),!0},_default:function(e){var t=e.target;return pe.test(t.type)&&t.click&&A(t,"input")&&Q.get(t,"click")||A(t,"a")}},beforeunload:{postDispatch:function(e){void 0!==e.result&&e.originalEvent&&(e.originalEvent.returnValue=e.result)}}}},k.removeEvent=function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n)},k.Event=function(e,t){if(!(this instanceof k.Event))return new k.Event(e,t);e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||void 0===e.defaultPrevented&&!1===e.returnValue?ke:Se,this.target=e.target&&3===e.target.nodeType?e.target.parentNode:e.target,this.currentTarget=e.currentTarget,this.relatedTarget=e.relatedTarget):this.type=e,t&&k.extend(this,t),this.timeStamp=e&&e.timeStamp||Date.now(),this[k.expando]=!0},k.Event.prototype={constructor:k.Event,isDefaultPrevented:Se,isPropagationStopped:Se,isImmediatePropagationStopped:Se,isSimulated:!1,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=ke,e&&!this.isSimulated&&e.preventDefault()},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=ke,e&&!this.isSimulated&&e.stopPropagation()},stopImmediatePropagation:function(){var e=this.originalEvent;this.isImmediatePropagationStopped=ke,e&&!this.isSimulated&&e.stopImmediatePropagation(),this.stopPropagation()}},k.each({altKey:!0,bubbles:!0,cancelable:!0,changedTouches:!0,ctrlKey:!0,detail:!0,eventPhase:!0,metaKey:!0,pageX:!0,pageY:!0,shiftKey:!0,view:!0,"char":!0,code:!0,charCode:!0,key:!0,keyCode:!0,button:!0,buttons:!0,clientX:!0,clientY:!0,offsetX:!0,offsetY:!0,pointerId:!0,pointerType:!0,screenX:!0,screenY:!0,targetTouches:!0,toElement:!0,touches:!0,which:function(e){var t=e.button;return null==e.which&&Te.test(e.type)?null!=e.charCode?e.charCode:e.keyCode:!e.which&&void 0!==t&&Ce.test(e.type)?1&t?1:2&t?3:4&t?2:0:e.which}},k.event.addProp),k.each({focus:"focusin",blur:"focusout"},function(e,t){k.event.special[e]={setup:function(){return De(this,e,Ne),!1},trigger:function(){return De(this,e),!0},delegateType:t}}),k.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(e,i){k.event.special[e]={delegateType:i,bindType:i,handle:function(e){var t,n=e.relatedTarget,r=e.handleObj;return n&&(n===this||k.contains(this,n))||(e.type=r.origType,t=r.handler.apply(this,arguments),e.type=i),t}}}),k.fn.extend({on:function(e,t,n,r){return Ae(this,e,t,n,r)},one:function(e,t,n,r){return Ae(this,e,t,n,r,1)},off:function(e,t,n){var r,i;if(e&&e.preventDefault&&e.handleObj)return r=e.handleObj,k(e.delegateTarget).off(r.namespace?r.origType+"."+r.namespace:r.origType,r.selector,r.handler),this;if("object"==typeof e){for(i in e)this.off(i,t,e[i]);return this}return!1!==t&&"function"!=typeof t||(n=t,t=void 0),!1===n&&(n=Se),this.each(function(){k.event.remove(this,e,n,t)})}});var je=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\/\0>\x20\t\r\n\f]*)[^>]*)\/>/gi,qe=/<script|<style|<link/i,Le=/checked\s*(?:[^=]|=\s*.checked.)/i,He=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;function Oe(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&k(e).children("tbody")[0]||e}function Pe(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function Re(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Me(e,t){var n,r,i,o,a,s,u,l;if(1===t.nodeType){if(Q.hasData(e)&&(o=Q.access(e),a=Q.set(t,o),l=o.events))for(i in delete a.handle,a.events={},l)for(n=0,r=l[i].length;n<r;n++)k.event.add(t,i,l[i][n]);J.hasData(e)&&(s=J.access(e),u=k.extend({},s),J.set(t,u))}}function Ie(n,r,i,o){r=g.apply([],r);var e,t,a,s,u,l,c=0,f=n.length,p=f-1,d=r[0],h=m(d);if(h||1<f&&"string"==typeof d&&!y.checkClone&&Le.test(d))return n.each(function(e){var t=n.eq(e);h&&(r[0]=d.call(this,e,t.html())),Ie(t,r,i,o)});if(f&&(t=(e=we(r,n[0].ownerDocument,!1,n,o)).firstChild,1===e.childNodes.length&&(e=t),t||o)){for(s=(a=k.map(ve(e,"script"),Pe)).length;c<f;c++)u=e,c!==p&&(u=k.clone(u,!0,!0),s&&k.merge(a,ve(u,"script"))),i.call(n[c],u,c);if(s)for(l=a[a.length-1].ownerDocument,k.map(a,Re),c=0;c<s;c++)u=a[c],he.test(u.type||"")&&!Q.access(u,"globalEval")&&k.contains(l,u)&&(u.src&&"module"!==(u.type||"").toLowerCase()?k._evalUrl&&!u.noModule&&k._evalUrl(u.src,{nonce:u.nonce||u.getAttribute("nonce")}):b(u.textContent.replace(He,""),u,l))}return n}function We(e,t,n){for(var r,i=t?k.filter(t,e):e,o=0;null!=(r=i[o]);o++)n||1!==r.nodeType||k.cleanData(ve(r)),r.parentNode&&(n&&oe(r)&&ye(ve(r,"script")),r.parentNode.removeChild(r));return e}k.extend({htmlPrefilter:function(e){return e.replace(je,"<$1></$2>")},clone:function(e,t,n){var r,i,o,a,s,u,l,c=e.cloneNode(!0),f=oe(e);if(!(y.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||k.isXMLDoc(e)))for(a=ve(c),r=0,i=(o=ve(e)).length;r<i;r++)s=o[r],u=a[r],void 0,"input"===(l=u.nodeName.toLowerCase())&&pe.test(s.type)?u.checked=s.checked:"input"!==l&&"textarea"!==l||(u.defaultValue=s.defaultValue);if(t)if(n)for(o=o||ve(e),a=a||ve(c),r=0,i=o.length;r<i;r++)Me(o[r],a[r]);else Me(e,c);return 0<(a=ve(c,"script")).length&&ye(a,!f&&ve(e,"script")),c},cleanData:function(e){for(var t,n,r,i=k.event.special,o=0;void 0!==(n=e[o]);o++)if(G(n)){if(t=n[Q.expando]){if(t.events)for(r in t.events)i[r]?k.event.remove(n,r):k.removeEvent(n,r,t.handle);n[Q.expando]=void 0}n[J.expando]&&(n[J.expando]=void 0)}}}),k.fn.extend({detach:function(e){return We(this,e,!0)},remove:function(e){return We(this,e)},text:function(e){return _(this,function(e){return void 0===e?k.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=e)})},null,e,arguments.length)},append:function(){return Ie(this,arguments,function(e){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||Oe(this,e).appendChild(e)})},prepend:function(){return Ie(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=Oe(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return Ie(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return Ie(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},empty:function(){for(var e,t=0;null!=(e=this[t]);t++)1===e.nodeType&&(k.cleanData(ve(e,!1)),e.textContent="");return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map(function(){return k.clone(this,e,t)})},html:function(e){return _(this,function(e){var t=this[0]||{},n=0,r=this.length;if(void 0===e&&1===t.nodeType)return t.innerHTML;if("string"==typeof e&&!qe.test(e)&&!ge[(de.exec(e)||["",""])[1].toLowerCase()]){e=k.htmlPrefilter(e);try{for(;n<r;n++)1===(t=this[n]||{}).nodeType&&(k.cleanData(ve(t,!1)),t.innerHTML=e);t=0}catch(e){}}t&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(){var n=[];return Ie(this,arguments,function(e){var t=this.parentNode;k.inArray(this,n)<0&&(k.cleanData(ve(this)),t&&t.replaceChild(e,this))},n)}}),k.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,a){k.fn[e]=function(e){for(var t,n=[],r=k(e),i=r.length-1,o=0;o<=i;o++)t=o===i?this:this.clone(!0),k(r[o])[a](t),u.apply(n,t.get());return this.pushStack(n)}});var $e=new RegExp("^("+te+")(?!px)[a-z%]+$","i"),Fe=function(e){var t=e.ownerDocument.defaultView;return t&&t.opener||(t=C),t.getComputedStyle(e)},Be=new RegExp(re.join("|"),"i");function _e(e,t,n){var r,i,o,a,s=e.style;return(n=n||Fe(e))&&(""!==(a=n.getPropertyValue(t)||n[t])||oe(e)||(a=k.style(e,t)),!y.pixelBoxStyles()&&$e.test(a)&&Be.test(t)&&(r=s.width,i=s.minWidth,o=s.maxWidth,s.minWidth=s.maxWidth=s.width=a,a=n.width,s.width=r,s.minWidth=i,s.maxWidth=o)),void 0!==a?a+"":a}function ze(e,t){return{get:function(){if(!e())return(this.get=t).apply(this,arguments);delete this.get}}}!function(){function e(){if(u){s.style.cssText="position:absolute;left:-11111px;width:60px;margin-top:1px;padding:0;border:0",u.style.cssText="position:relative;display:block;box-sizing:border-box;overflow:scroll;margin:auto;border:1px;padding:1px;width:60%;top:1%",ie.appendChild(s).appendChild(u);var e=C.getComputedStyle(u);n="1%"!==e.top,a=12===t(e.marginLeft),u.style.right="60%",o=36===t(e.right),r=36===t(e.width),u.style.position="absolute",i=12===t(u.offsetWidth/3),ie.removeChild(s),u=null}}function t(e){return Math.round(parseFloat(e))}var n,r,i,o,a,s=E.createElement("div"),u=E.createElement("div");u.style&&(u.style.backgroundClip="content-box",u.cloneNode(!0).style.backgroundClip="",y.clearCloneStyle="content-box"===u.style.backgroundClip,k.extend(y,{boxSizingReliable:function(){return e(),r},pixelBoxStyles:function(){return e(),o},pixelPosition:function(){return e(),n},reliableMarginLeft:function(){return e(),a},scrollboxSize:function(){return e(),i}}))}();var Ue=["Webkit","Moz","ms"],Xe=E.createElement("div").style,Ve={};function Ge(e){var t=k.cssProps[e]||Ve[e];return t||(e in Xe?e:Ve[e]=function(e){var t=e[0].toUpperCase()+e.slice(1),n=Ue.length;while(n--)if((e=Ue[n]+t)in Xe)return e}(e)||e)}var Ye=/^(none|table(?!-c[ea]).+)/,Qe=/^--/,Je={position:"absolute",visibility:"hidden",display:"block"},Ke={letterSpacing:"0",fontWeight:"400"};function Ze(e,t,n){var r=ne.exec(t);return r?Math.max(0,r[2]-(n||0))+(r[3]||"px"):t}function et(e,t,n,r,i,o){var a="width"===t?1:0,s=0,u=0;if(n===(r?"border":"content"))return 0;for(;a<4;a+=2)"margin"===n&&(u+=k.css(e,n+re[a],!0,i)),r?("content"===n&&(u-=k.css(e,"padding"+re[a],!0,i)),"margin"!==n&&(u-=k.css(e,"border"+re[a]+"Width",!0,i))):(u+=k.css(e,"padding"+re[a],!0,i),"padding"!==n?u+=k.css(e,"border"+re[a]+"Width",!0,i):s+=k.css(e,"border"+re[a]+"Width",!0,i));return!r&&0<=o&&(u+=Math.max(0,Math.ceil(e["offset"+t[0].toUpperCase()+t.slice(1)]-o-u-s-.5))||0),u}function tt(e,t,n){var r=Fe(e),i=(!y.boxSizingReliable()||n)&&"border-box"===k.css(e,"boxSizing",!1,r),o=i,a=_e(e,t,r),s="offset"+t[0].toUpperCase()+t.slice(1);if($e.test(a)){if(!n)return a;a="auto"}return(!y.boxSizingReliable()&&i||"auto"===a||!parseFloat(a)&&"inline"===k.css(e,"display",!1,r))&&e.getClientRects().length&&(i="border-box"===k.css(e,"boxSizing",!1,r),(o=s in e)&&(a=e[s])),(a=parseFloat(a)||0)+et(e,t,n||(i?"border":"content"),o,r,a)+"px"}function nt(e,t,n,r,i){return new nt.prototype.init(e,t,n,r,i)}k.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=_e(e,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,gridArea:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnStart:!0,gridRow:!0,gridRowEnd:!0,gridRowStart:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{},style:function(e,t,n,r){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var i,o,a,s=V(t),u=Qe.test(t),l=e.style;if(u||(t=Ge(s)),a=k.cssHooks[t]||k.cssHooks[s],void 0===n)return a&&"get"in a&&void 0!==(i=a.get(e,!1,r))?i:l[t];"string"===(o=typeof n)&&(i=ne.exec(n))&&i[1]&&(n=le(e,t,i),o="number"),null!=n&&n==n&&("number"!==o||u||(n+=i&&i[3]||(k.cssNumber[s]?"":"px")),y.clearCloneStyle||""!==n||0!==t.indexOf("background")||(l[t]="inherit"),a&&"set"in a&&void 0===(n=a.set(e,n,r))||(u?l.setProperty(t,n):l[t]=n))}},css:function(e,t,n,r){var i,o,a,s=V(t);return Qe.test(t)||(t=Ge(s)),(a=k.cssHooks[t]||k.cssHooks[s])&&"get"in a&&(i=a.get(e,!0,n)),void 0===i&&(i=_e(e,t,r)),"normal"===i&&t in Ke&&(i=Ke[t]),""===n||n?(o=parseFloat(i),!0===n||isFinite(o)?o||0:i):i}}),k.each(["height","width"],function(e,u){k.cssHooks[u]={get:function(e,t,n){if(t)return!Ye.test(k.css(e,"display"))||e.getClientRects().length&&e.getBoundingClientRect().width?tt(e,u,n):ue(e,Je,function(){return tt(e,u,n)})},set:function(e,t,n){var r,i=Fe(e),o=!y.scrollboxSize()&&"absolute"===i.position,a=(o||n)&&"border-box"===k.css(e,"boxSizing",!1,i),s=n?et(e,u,n,a,i):0;return a&&o&&(s-=Math.ceil(e["offset"+u[0].toUpperCase()+u.slice(1)]-parseFloat(i[u])-et(e,u,"border",!1,i)-.5)),s&&(r=ne.exec(t))&&"px"!==(r[3]||"px")&&(e.style[u]=t,t=k.css(e,u)),Ze(0,t,s)}}}),k.cssHooks.marginLeft=ze(y.reliableMarginLeft,function(e,t){if(t)return(parseFloat(_e(e,"marginLeft"))||e.getBoundingClientRect().left-ue(e,{marginLeft:0},function(){return e.getBoundingClientRect().left}))+"px"}),k.each({margin:"",padding:"",border:"Width"},function(i,o){k.cssHooks[i+o]={expand:function(e){for(var t=0,n={},r="string"==typeof e?e.split(" "):[e];t<4;t++)n[i+re[t]+o]=r[t]||r[t-2]||r[0];return n}},"margin"!==i&&(k.cssHooks[i+o].set=Ze)}),k.fn.extend({css:function(e,t){return _(this,function(e,t,n){var r,i,o={},a=0;if(Array.isArray(t)){for(r=Fe(e),i=t.length;a<i;a++)o[t[a]]=k.css(e,t[a],!1,r);return o}return void 0!==n?k.style(e,t,n):k.css(e,t)},e,t,1<arguments.length)}}),((k.Tween=nt).prototype={constructor:nt,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||k.easing._default,this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(k.cssNumber[n]?"":"px")},cur:function(){var e=nt.propHooks[this.prop];return e&&e.get?e.get(this):nt.propHooks._default.get(this)},run:function(e){var t,n=nt.propHooks[this.prop];return this.options.duration?this.pos=t=k.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=t=e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):nt.propHooks._default.set(this),this}}).init.prototype=nt.prototype,(nt.propHooks={_default:{get:function(e){var t;return 1!==e.elem.nodeType||null!=e.elem[e.prop]&&null==e.elem.style[e.prop]?e.elem[e.prop]:(t=k.css(e.elem,e.prop,""))&&"auto"!==t?t:0},set:function(e){k.fx.step[e.prop]?k.fx.step[e.prop](e):1!==e.elem.nodeType||!k.cssHooks[e.prop]&&null==e.elem.style[Ge(e.prop)]?e.elem[e.prop]=e.now:k.style(e.elem,e.prop,e.now+e.unit)}}}).scrollTop=nt.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},k.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2},_default:"swing"},k.fx=nt.prototype.init,k.fx.step={};var rt,it,ot,at,st=/^(?:toggle|show|hide)$/,ut=/queueHooks$/;function lt(){it&&(!1===E.hidden&&C.requestAnimationFrame?C.requestAnimationFrame(lt):C.setTimeout(lt,k.fx.interval),k.fx.tick())}function ct(){return C.setTimeout(function(){rt=void 0}),rt=Date.now()}function ft(e,t){var n,r=0,i={height:e};for(t=t?1:0;r<4;r+=2-t)i["margin"+(n=re[r])]=i["padding"+n]=e;return t&&(i.opacity=i.width=e),i}function pt(e,t,n){for(var r,i=(dt.tweeners[t]||[]).concat(dt.tweeners["*"]),o=0,a=i.length;o<a;o++)if(r=i[o].call(n,t,e))return r}function dt(o,e,t){var n,a,r=0,i=dt.prefilters.length,s=k.Deferred().always(function(){delete u.elem}),u=function(){if(a)return!1;for(var e=rt||ct(),t=Math.max(0,l.startTime+l.duration-e),n=1-(t/l.duration||0),r=0,i=l.tweens.length;r<i;r++)l.tweens[r].run(n);return s.notifyWith(o,[l,n,t]),n<1&&i?t:(i||s.notifyWith(o,[l,1,0]),s.resolveWith(o,[l]),!1)},l=s.promise({elem:o,props:k.extend({},e),opts:k.extend(!0,{specialEasing:{},easing:k.easing._default},t),originalProperties:e,originalOptions:t,startTime:rt||ct(),duration:t.duration,tweens:[],createTween:function(e,t){var n=k.Tween(o,l.opts,e,t,l.opts.specialEasing[e]||l.opts.easing);return l.tweens.push(n),n},stop:function(e){var t=0,n=e?l.tweens.length:0;if(a)return this;for(a=!0;t<n;t++)l.tweens[t].run(1);return e?(s.notifyWith(o,[l,1,0]),s.resolveWith(o,[l,e])):s.rejectWith(o,[l,e]),this}}),c=l.props;for(!function(e,t){var n,r,i,o,a;for(n in e)if(i=t[r=V(n)],o=e[n],Array.isArray(o)&&(i=o[1],o=e[n]=o[0]),n!==r&&(e[r]=o,delete e[n]),(a=k.cssHooks[r])&&"expand"in a)for(n in o=a.expand(o),delete e[r],o)n in e||(e[n]=o[n],t[n]=i);else t[r]=i}(c,l.opts.specialEasing);r<i;r++)if(n=dt.prefilters[r].call(l,o,c,l.opts))return m(n.stop)&&(k._queueHooks(l.elem,l.opts.queue).stop=n.stop.bind(n)),n;return k.map(c,pt,l),m(l.opts.start)&&l.opts.start.call(o,l),l.progress(l.opts.progress).done(l.opts.done,l.opts.complete).fail(l.opts.fail).always(l.opts.always),k.fx.timer(k.extend(u,{elem:o,anim:l,queue:l.opts.queue})),l}k.Animation=k.extend(dt,{tweeners:{"*":[function(e,t){var n=this.createTween(e,t);return le(n.elem,e,ne.exec(t),n),n}]},tweener:function(e,t){m(e)?(t=e,e=["*"]):e=e.match(R);for(var n,r=0,i=e.length;r<i;r++)n=e[r],dt.tweeners[n]=dt.tweeners[n]||[],dt.tweeners[n].unshift(t)},prefilters:[function(e,t,n){var r,i,o,a,s,u,l,c,f="width"in t||"height"in t,p=this,d={},h=e.style,g=e.nodeType&&se(e),v=Q.get(e,"fxshow");for(r in n.queue||(null==(a=k._queueHooks(e,"fx")).unqueued&&(a.unqueued=0,s=a.empty.fire,a.empty.fire=function(){a.unqueued||s()}),a.unqueued++,p.always(function(){p.always(function(){a.unqueued--,k.queue(e,"fx").length||a.empty.fire()})})),t)if(i=t[r],st.test(i)){if(delete t[r],o=o||"toggle"===i,i===(g?"hide":"show")){if("show"!==i||!v||void 0===v[r])continue;g=!0}d[r]=v&&v[r]||k.style(e,r)}if((u=!k.isEmptyObject(t))||!k.isEmptyObject(d))for(r in f&&1===e.nodeType&&(n.overflow=[h.overflow,h.overflowX,h.overflowY],null==(l=v&&v.display)&&(l=Q.get(e,"display")),"none"===(c=k.css(e,"display"))&&(l?c=l:(fe([e],!0),l=e.style.display||l,c=k.css(e,"display"),fe([e]))),("inline"===c||"inline-block"===c&&null!=l)&&"none"===k.css(e,"float")&&(u||(p.done(function(){h.display=l}),null==l&&(c=h.display,l="none"===c?"":c)),h.display="inline-block")),n.overflow&&(h.overflow="hidden",p.always(function(){h.overflow=n.overflow[0],h.overflowX=n.overflow[1],h.overflowY=n.overflow[2]})),u=!1,d)u||(v?"hidden"in v&&(g=v.hidden):v=Q.access(e,"fxshow",{display:l}),o&&(v.hidden=!g),g&&fe([e],!0),p.done(function(){for(r in g||fe([e]),Q.remove(e,"fxshow"),d)k.style(e,r,d[r])})),u=pt(g?v[r]:0,r,p),r in v||(v[r]=u.start,g&&(u.end=u.start,u.start=0))}],prefilter:function(e,t){t?dt.prefilters.unshift(e):dt.prefilters.push(e)}}),k.speed=function(e,t,n){var r=e&&"object"==typeof e?k.extend({},e):{complete:n||!n&&t||m(e)&&e,duration:e,easing:n&&t||t&&!m(t)&&t};return k.fx.off?r.duration=0:"number"!=typeof r.duration&&(r.duration in k.fx.speeds?r.duration=k.fx.speeds[r.duration]:r.duration=k.fx.speeds._default),null!=r.queue&&!0!==r.queue||(r.queue="fx"),r.old=r.complete,r.complete=function(){m(r.old)&&r.old.call(this),r.queue&&k.dequeue(this,r.queue)},r},k.fn.extend({fadeTo:function(e,t,n,r){return this.filter(se).css("opacity",0).show().end().animate({opacity:t},e,n,r)},animate:function(t,e,n,r){var i=k.isEmptyObject(t),o=k.speed(e,n,r),a=function(){var e=dt(this,k.extend({},t),o);(i||Q.get(this,"finish"))&&e.stop(!0)};return a.finish=a,i||!1===o.queue?this.each(a):this.queue(o.queue,a)},stop:function(i,e,o){var a=function(e){var t=e.stop;delete e.stop,t(o)};return"string"!=typeof i&&(o=e,e=i,i=void 0),e&&!1!==i&&this.queue(i||"fx",[]),this.each(function(){var e=!0,t=null!=i&&i+"queueHooks",n=k.timers,r=Q.get(this);if(t)r[t]&&r[t].stop&&a(r[t]);else for(t in r)r[t]&&r[t].stop&&ut.test(t)&&a(r[t]);for(t=n.length;t--;)n[t].elem!==this||null!=i&&n[t].queue!==i||(n[t].anim.stop(o),e=!1,n.splice(t,1));!e&&o||k.dequeue(this,i)})},finish:function(a){return!1!==a&&(a=a||"fx"),this.each(function(){var e,t=Q.get(this),n=t[a+"queue"],r=t[a+"queueHooks"],i=k.timers,o=n?n.length:0;for(t.finish=!0,k.queue(this,a,[]),r&&r.stop&&r.stop.call(this,!0),e=i.length;e--;)i[e].elem===this&&i[e].queue===a&&(i[e].anim.stop(!0),i.splice(e,1));for(e=0;e<o;e++)n[e]&&n[e].finish&&n[e].finish.call(this);delete t.finish})}}),k.each(["toggle","show","hide"],function(e,r){var i=k.fn[r];k.fn[r]=function(e,t,n){return null==e||"boolean"==typeof e?i.apply(this,arguments):this.animate(ft(r,!0),e,t,n)}}),k.each({slideDown:ft("show"),slideUp:ft("hide"),slideToggle:ft("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,r){k.fn[e]=function(e,t,n){return this.animate(r,e,t,n)}}),k.timers=[],k.fx.tick=function(){var e,t=0,n=k.timers;for(rt=Date.now();t<n.length;t++)(e=n[t])()||n[t]!==e||n.splice(t--,1);n.length||k.fx.stop(),rt=void 0},k.fx.timer=function(e){k.timers.push(e),k.fx.start()},k.fx.interval=13,k.fx.start=function(){it||(it=!0,lt())},k.fx.stop=function(){it=null},k.fx.speeds={slow:600,fast:200,_default:400},k.fn.delay=function(r,e){return r=k.fx&&k.fx.speeds[r]||r,e=e||"fx",this.queue(e,function(e,t){var n=C.setTimeout(e,r);t.stop=function(){C.clearTimeout(n)}})},ot=E.createElement("input"),at=E.createElement("select").appendChild(E.createElement("option")),ot.type="checkbox",y.checkOn=""!==ot.value,y.optSelected=at.selected,(ot=E.createElement("input")).value="t",ot.type="radio",y.radioValue="t"===ot.value;var ht,gt=k.expr.attrHandle;k.fn.extend({attr:function(e,t){return _(this,k.attr,e,t,1<arguments.length)},removeAttr:function(e){return this.each(function(){k.removeAttr(this,e)})}}),k.extend({attr:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return"undefined"==typeof e.getAttribute?k.prop(e,t,n):(1===o&&k.isXMLDoc(e)||(i=k.attrHooks[t.toLowerCase()]||(k.expr.match.bool.test(t)?ht:void 0)),void 0!==n?null===n?void k.removeAttr(e,t):i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:(e.setAttribute(t,n+""),n):i&&"get"in i&&null!==(r=i.get(e,t))?r:null==(r=k.find.attr(e,t))?void 0:r)},attrHooks:{type:{set:function(e,t){if(!y.radioValue&&"radio"===t&&A(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},removeAttr:function(e,t){var n,r=0,i=t&&t.match(R);if(i&&1===e.nodeType)while(n=i[r++])e.removeAttribute(n)}}),ht={set:function(e,t,n){return!1===t?k.removeAttr(e,n):e.setAttribute(n,n),n}},k.each(k.expr.match.bool.source.match(/\w+/g),function(e,t){var a=gt[t]||k.find.attr;gt[t]=function(e,t,n){var r,i,o=t.toLowerCase();return n||(i=gt[o],gt[o]=r,r=null!=a(e,t,n)?o:null,gt[o]=i),r}});var vt=/^(?:input|select|textarea|button)$/i,yt=/^(?:a|area)$/i;function mt(e){return(e.match(R)||[]).join(" ")}function xt(e){return e.getAttribute&&e.getAttribute("class")||""}function bt(e){return Array.isArray(e)?e:"string"==typeof e&&e.match(R)||[]}k.fn.extend({prop:function(e,t){return _(this,k.prop,e,t,1<arguments.length)},removeProp:function(e){return this.each(function(){delete this[k.propFix[e]||e]})}}),k.extend({prop:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return 1===o&&k.isXMLDoc(e)||(t=k.propFix[t]||t,i=k.propHooks[t]),void 0!==n?i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:e[t]=n:i&&"get"in i&&null!==(r=i.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){var t=k.find.attr(e,"tabindex");return t?parseInt(t,10):vt.test(e.nodeName)||yt.test(e.nodeName)&&e.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),y.optSelected||(k.propHooks.selected={get:function(e){var t=e.parentNode;return t&&t.parentNode&&t.parentNode.selectedIndex,null},set:function(e){var t=e.parentNode;t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex)}}),k.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){k.propFix[this.toLowerCase()]=this}),k.fn.extend({addClass:function(t){var e,n,r,i,o,a,s,u=0;if(m(t))return this.each(function(e){k(this).addClass(t.call(this,e,xt(this)))});if((e=bt(t)).length)while(n=this[u++])if(i=xt(n),r=1===n.nodeType&&" "+mt(i)+" "){a=0;while(o=e[a++])r.indexOf(" "+o+" ")<0&&(r+=o+" ");i!==(s=mt(r))&&n.setAttribute("class",s)}return this},removeClass:function(t){var e,n,r,i,o,a,s,u=0;if(m(t))return this.each(function(e){k(this).removeClass(t.call(this,e,xt(this)))});if(!arguments.length)return this.attr("class","");if((e=bt(t)).length)while(n=this[u++])if(i=xt(n),r=1===n.nodeType&&" "+mt(i)+" "){a=0;while(o=e[a++])while(-1<r.indexOf(" "+o+" "))r=r.replace(" "+o+" "," ");i!==(s=mt(r))&&n.setAttribute("class",s)}return this},toggleClass:function(i,t){var o=typeof i,a="string"===o||Array.isArray(i);return"boolean"==typeof t&&a?t?this.addClass(i):this.removeClass(i):m(i)?this.each(function(e){k(this).toggleClass(i.call(this,e,xt(this),t),t)}):this.each(function(){var e,t,n,r;if(a){t=0,n=k(this),r=bt(i);while(e=r[t++])n.hasClass(e)?n.removeClass(e):n.addClass(e)}else void 0!==i&&"boolean"!==o||((e=xt(this))&&Q.set(this,"__className__",e),this.setAttribute&&this.setAttribute("class",e||!1===i?"":Q.get(this,"__className__")||""))})},hasClass:function(e){var t,n,r=0;t=" "+e+" ";while(n=this[r++])if(1===n.nodeType&&-1<(" "+mt(xt(n))+" ").indexOf(t))return!0;return!1}});var wt=/\r/g;k.fn.extend({val:function(n){var r,e,i,t=this[0];return arguments.length?(i=m(n),this.each(function(e){var t;1===this.nodeType&&(null==(t=i?n.call(this,e,k(this).val()):n)?t="":"number"==typeof t?t+="":Array.isArray(t)&&(t=k.map(t,function(e){return null==e?"":e+""})),(r=k.valHooks[this.type]||k.valHooks[this.nodeName.toLowerCase()])&&"set"in r&&void 0!==r.set(this,t,"value")||(this.value=t))})):t?(r=k.valHooks[t.type]||k.valHooks[t.nodeName.toLowerCase()])&&"get"in r&&void 0!==(e=r.get(t,"value"))?e:"string"==typeof(e=t.value)?e.replace(wt,""):null==e?"":e:void 0}}),k.extend({valHooks:{option:{get:function(e){var t=k.find.attr(e,"value");return null!=t?t:mt(k.text(e))}},select:{get:function(e){var t,n,r,i=e.options,o=e.selectedIndex,a="select-one"===e.type,s=a?null:[],u=a?o+1:i.length;for(r=o<0?u:a?o:0;r<u;r++)if(((n=i[r]).selected||r===o)&&!n.disabled&&(!n.parentNode.disabled||!A(n.parentNode,"optgroup"))){if(t=k(n).val(),a)return t;s.push(t)}return s},set:function(e,t){var n,r,i=e.options,o=k.makeArray(t),a=i.length;while(a--)((r=i[a]).selected=-1<k.inArray(k.valHooks.option.get(r),o))&&(n=!0);return n||(e.selectedIndex=-1),o}}}}),k.each(["radio","checkbox"],function(){k.valHooks[this]={set:function(e,t){if(Array.isArray(t))return e.checked=-1<k.inArray(k(e).val(),t)}},y.checkOn||(k.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})}),y.focusin="onfocusin"in C;var Tt=/^(?:focusinfocus|focusoutblur)$/,Ct=function(e){e.stopPropagation()};k.extend(k.event,{trigger:function(e,t,n,r){var i,o,a,s,u,l,c,f,p=[n||E],d=v.call(e,"type")?e.type:e,h=v.call(e,"namespace")?e.namespace.split("."):[];if(o=f=a=n=n||E,3!==n.nodeType&&8!==n.nodeType&&!Tt.test(d+k.event.triggered)&&(-1<d.indexOf(".")&&(d=(h=d.split(".")).shift(),h.sort()),u=d.indexOf(":")<0&&"on"+d,(e=e[k.expando]?e:new k.Event(d,"object"==typeof e&&e)).isTrigger=r?2:3,e.namespace=h.join("."),e.rnamespace=e.namespace?new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,e.result=void 0,e.target||(e.target=n),t=null==t?[e]:k.makeArray(t,[e]),c=k.event.special[d]||{},r||!c.trigger||!1!==c.trigger.apply(n,t))){if(!r&&!c.noBubble&&!x(n)){for(s=c.delegateType||d,Tt.test(s+d)||(o=o.parentNode);o;o=o.parentNode)p.push(o),a=o;a===(n.ownerDocument||E)&&p.push(a.defaultView||a.parentWindow||C)}i=0;while((o=p[i++])&&!e.isPropagationStopped())f=o,e.type=1<i?s:c.bindType||d,(l=(Q.get(o,"events")||{})[e.type]&&Q.get(o,"handle"))&&l.apply(o,t),(l=u&&o[u])&&l.apply&&G(o)&&(e.result=l.apply(o,t),!1===e.result&&e.preventDefault());return e.type=d,r||e.isDefaultPrevented()||c._default&&!1!==c._default.apply(p.pop(),t)||!G(n)||u&&m(n[d])&&!x(n)&&((a=n[u])&&(n[u]=null),k.event.triggered=d,e.isPropagationStopped()&&f.addEventListener(d,Ct),n[d](),e.isPropagationStopped()&&f.removeEventListener(d,Ct),k.event.triggered=void 0,a&&(n[u]=a)),e.result}},simulate:function(e,t,n){var r=k.extend(new k.Event,n,{type:e,isSimulated:!0});k.event.trigger(r,null,t)}}),k.fn.extend({trigger:function(e,t){return this.each(function(){k.event.trigger(e,t,this)})},triggerHandler:function(e,t){var n=this[0];if(n)return k.event.trigger(e,t,n,!0)}}),y.focusin||k.each({focus:"focusin",blur:"focusout"},function(n,r){var i=function(e){k.event.simulate(r,e.target,k.event.fix(e))};k.event.special[r]={setup:function(){var e=this.ownerDocument||this,t=Q.access(e,r);t||e.addEventListener(n,i,!0),Q.access(e,r,(t||0)+1)},teardown:function(){var e=this.ownerDocument||this,t=Q.access(e,r)-1;t?Q.access(e,r,t):(e.removeEventListener(n,i,!0),Q.remove(e,r))}}});var Et=C.location,kt=Date.now(),St=/\?/;k.parseXML=function(e){var t;if(!e||"string"!=typeof e)return null;try{t=(new C.DOMParser).parseFromString(e,"text/xml")}catch(e){t=void 0}return t&&!t.getElementsByTagName("parsererror").length||k.error("Invalid XML: "+e),t};var Nt=/\[\]$/,At=/\r?\n/g,Dt=/^(?:submit|button|image|reset|file)$/i,jt=/^(?:input|select|textarea|keygen)/i;function qt(n,e,r,i){var t;if(Array.isArray(e))k.each(e,function(e,t){r||Nt.test(n)?i(n,t):qt(n+"["+("object"==typeof t&&null!=t?e:"")+"]",t,r,i)});else if(r||"object"!==w(e))i(n,e);else for(t in e)qt(n+"["+t+"]",e[t],r,i)}k.param=function(e,t){var n,r=[],i=function(e,t){var n=m(t)?t():t;r[r.length]=encodeURIComponent(e)+"="+encodeURIComponent(null==n?"":n)};if(null==e)return"";if(Array.isArray(e)||e.jquery&&!k.isPlainObject(e))k.each(e,function(){i(this.name,this.value)});else for(n in e)qt(n,e[n],t,i);return r.join("&")},k.fn.extend({serialize:function(){return k.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=k.prop(this,"elements");return e?k.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!k(this).is(":disabled")&&jt.test(this.nodeName)&&!Dt.test(e)&&(this.checked||!pe.test(e))}).map(function(e,t){var n=k(this).val();return null==n?null:Array.isArray(n)?k.map(n,function(e){return{name:t.name,value:e.replace(At,"\r\n")}}):{name:t.name,value:n.replace(At,"\r\n")}}).get()}});var Lt=/%20/g,Ht=/#.*$/,Ot=/([?&])_=[^&]*/,Pt=/^(.*?):[ \t]*([^\r\n]*)$/gm,Rt=/^(?:GET|HEAD)$/,Mt=/^\/\//,It={},Wt={},$t="*/".concat("*"),Ft=E.createElement("a");function Bt(o){return function(e,t){"string"!=typeof e&&(t=e,e="*");var n,r=0,i=e.toLowerCase().match(R)||[];if(m(t))while(n=i[r++])"+"===n[0]?(n=n.slice(1)||"*",(o[n]=o[n]||[]).unshift(t)):(o[n]=o[n]||[]).push(t)}}function _t(t,i,o,a){var s={},u=t===Wt;function l(e){var r;return s[e]=!0,k.each(t[e]||[],function(e,t){var n=t(i,o,a);return"string"!=typeof n||u||s[n]?u?!(r=n):void 0:(i.dataTypes.unshift(n),l(n),!1)}),r}return l(i.dataTypes[0])||!s["*"]&&l("*")}function zt(e,t){var n,r,i=k.ajaxSettings.flatOptions||{};for(n in t)void 0!==t[n]&&((i[n]?e:r||(r={}))[n]=t[n]);return r&&k.extend(!0,e,r),e}Ft.href=Et.href,k.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:Et.href,type:"GET",isLocal:/^(?:about|app|app-storage|.+-extension|file|res|widget):$/.test(Et.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":$t,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":k.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?zt(zt(e,k.ajaxSettings),t):zt(k.ajaxSettings,e)},ajaxPrefilter:Bt(It),ajaxTransport:Bt(Wt),ajax:function(e,t){"object"==typeof e&&(t=e,e=void 0),t=t||{};var c,f,p,n,d,r,h,g,i,o,v=k.ajaxSetup({},t),y=v.context||v,m=v.context&&(y.nodeType||y.jquery)?k(y):k.event,x=k.Deferred(),b=k.Callbacks("once memory"),w=v.statusCode||{},a={},s={},u="canceled",T={readyState:0,getResponseHeader:function(e){var t;if(h){if(!n){n={};while(t=Pt.exec(p))n[t[1].toLowerCase()+" "]=(n[t[1].toLowerCase()+" "]||[]).concat(t[2])}t=n[e.toLowerCase()+" "]}return null==t?null:t.join(", ")},getAllResponseHeaders:function(){return h?p:null},setRequestHeader:function(e,t){return null==h&&(e=s[e.toLowerCase()]=s[e.toLowerCase()]||e,a[e]=t),this},overrideMimeType:function(e){return null==h&&(v.mimeType=e),this},statusCode:function(e){var t;if(e)if(h)T.always(e[T.status]);else for(t in e)w[t]=[w[t],e[t]];return this},abort:function(e){var t=e||u;return c&&c.abort(t),l(0,t),this}};if(x.promise(T),v.url=((e||v.url||Et.href)+"").replace(Mt,Et.protocol+"//"),v.type=t.method||t.type||v.method||v.type,v.dataTypes=(v.dataType||"*").toLowerCase().match(R)||[""],null==v.crossDomain){r=E.createElement("a");try{r.href=v.url,r.href=r.href,v.crossDomain=Ft.protocol+"//"+Ft.host!=r.protocol+"//"+r.host}catch(e){v.crossDomain=!0}}if(v.data&&v.processData&&"string"!=typeof v.data&&(v.data=k.param(v.data,v.traditional)),_t(It,v,t,T),h)return T;for(i in(g=k.event&&v.global)&&0==k.active++&&k.event.trigger("ajaxStart"),v.type=v.type.toUpperCase(),v.hasContent=!Rt.test(v.type),f=v.url.replace(Ht,""),v.hasContent?v.data&&v.processData&&0===(v.contentType||"").indexOf("application/x-www-form-urlencoded")&&(v.data=v.data.replace(Lt,"+")):(o=v.url.slice(f.length),v.data&&(v.processData||"string"==typeof v.data)&&(f+=(St.test(f)?"&":"?")+v.data,delete v.data),!1===v.cache&&(f=f.replace(Ot,"$1"),o=(St.test(f)?"&":"?")+"_="+kt+++o),v.url=f+o),v.ifModified&&(k.lastModified[f]&&T.setRequestHeader("If-Modified-Since",k.lastModified[f]),k.etag[f]&&T.setRequestHeader("If-None-Match",k.etag[f])),(v.data&&v.hasContent&&!1!==v.contentType||t.contentType)&&T.setRequestHeader("Content-Type",v.contentType),T.setRequestHeader("Accept",v.dataTypes[0]&&v.accepts[v.dataTypes[0]]?v.accepts[v.dataTypes[0]]+("*"!==v.dataTypes[0]?", "+$t+"; q=0.01":""):v.accepts["*"]),v.headers)T.setRequestHeader(i,v.headers[i]);if(v.beforeSend&&(!1===v.beforeSend.call(y,T,v)||h))return T.abort();if(u="abort",b.add(v.complete),T.done(v.success),T.fail(v.error),c=_t(Wt,v,t,T)){if(T.readyState=1,g&&m.trigger("ajaxSend",[T,v]),h)return T;v.async&&0<v.timeout&&(d=C.setTimeout(function(){T.abort("timeout")},v.timeout));try{h=!1,c.send(a,l)}catch(e){if(h)throw e;l(-1,e)}}else l(-1,"No Transport");function l(e,t,n,r){var i,o,a,s,u,l=t;h||(h=!0,d&&C.clearTimeout(d),c=void 0,p=r||"",T.readyState=0<e?4:0,i=200<=e&&e<300||304===e,n&&(s=function(e,t,n){var r,i,o,a,s=e.contents,u=e.dataTypes;while("*"===u[0])u.shift(),void 0===r&&(r=e.mimeType||t.getResponseHeader("Content-Type"));if(r)for(i in s)if(s[i]&&s[i].test(r)){u.unshift(i);break}if(u[0]in n)o=u[0];else{for(i in n){if(!u[0]||e.converters[i+" "+u[0]]){o=i;break}a||(a=i)}o=o||a}if(o)return o!==u[0]&&u.unshift(o),n[o]}(v,T,n)),s=function(e,t,n,r){var i,o,a,s,u,l={},c=e.dataTypes.slice();if(c[1])for(a in e.converters)l[a.toLowerCase()]=e.converters[a];o=c.shift();while(o)if(e.responseFields[o]&&(n[e.responseFields[o]]=t),!u&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),u=o,o=c.shift())if("*"===o)o=u;else if("*"!==u&&u!==o){if(!(a=l[u+" "+o]||l["* "+o]))for(i in l)if((s=i.split(" "))[1]===o&&(a=l[u+" "+s[0]]||l["* "+s[0]])){!0===a?a=l[i]:!0!==l[i]&&(o=s[0],c.unshift(s[1]));break}if(!0!==a)if(a&&e["throws"])t=a(t);else try{t=a(t)}catch(e){return{state:"parsererror",error:a?e:"No conversion from "+u+" to "+o}}}return{state:"success",data:t}}(v,s,T,i),i?(v.ifModified&&((u=T.getResponseHeader("Last-Modified"))&&(k.lastModified[f]=u),(u=T.getResponseHeader("etag"))&&(k.etag[f]=u)),204===e||"HEAD"===v.type?l="nocontent":304===e?l="notmodified":(l=s.state,o=s.data,i=!(a=s.error))):(a=l,!e&&l||(l="error",e<0&&(e=0))),T.status=e,T.statusText=(t||l)+"",i?x.resolveWith(y,[o,l,T]):x.rejectWith(y,[T,l,a]),T.statusCode(w),w=void 0,g&&m.trigger(i?"ajaxSuccess":"ajaxError",[T,v,i?o:a]),b.fireWith(y,[T,l]),g&&(m.trigger("ajaxComplete",[T,v]),--k.active||k.event.trigger("ajaxStop")))}return T},getJSON:function(e,t,n){return k.get(e,t,n,"json")},getScript:function(e,t){return k.get(e,void 0,t,"script")}}),k.each(["get","post"],function(e,i){k[i]=function(e,t,n,r){return m(t)&&(r=r||n,n=t,t=void 0),k.ajax(k.extend({url:e,type:i,dataType:r,data:t,success:n},k.isPlainObject(e)&&e))}}),k._evalUrl=function(e,t){return k.ajax({url:e,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,converters:{"text script":function(){}},dataFilter:function(e){k.globalEval(e,t)}})},k.fn.extend({wrapAll:function(e){var t;return this[0]&&(m(e)&&(e=e.call(this[0])),t=k(e,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstElementChild)e=e.firstElementChild;return e}).append(this)),this},wrapInner:function(n){return m(n)?this.each(function(e){k(this).wrapInner(n.call(this,e))}):this.each(function(){var e=k(this),t=e.contents();t.length?t.wrapAll(n):e.append(n)})},wrap:function(t){var n=m(t);return this.each(function(e){k(this).wrapAll(n?t.call(this,e):t)})},unwrap:function(e){return this.parent(e).not("body").each(function(){k(this).replaceWith(this.childNodes)}),this}}),k.expr.pseudos.hidden=function(e){return!k.expr.pseudos.visible(e)},k.expr.pseudos.visible=function(e){return!!(e.offsetWidth||e.offsetHeight||e.getClientRects().length)},k.ajaxSettings.xhr=function(){try{return new C.XMLHttpRequest}catch(e){}};var Ut={0:200,1223:204},Xt=k.ajaxSettings.xhr();y.cors=!!Xt&&"withCredentials"in Xt,y.ajax=Xt=!!Xt,k.ajaxTransport(function(i){var o,a;if(y.cors||Xt&&!i.crossDomain)return{send:function(e,t){var n,r=i.xhr();if(r.open(i.type,i.url,i.async,i.username,i.password),i.xhrFields)for(n in i.xhrFields)r[n]=i.xhrFields[n];for(n in i.mimeType&&r.overrideMimeType&&r.overrideMimeType(i.mimeType),i.crossDomain||e["X-Requested-With"]||(e["X-Requested-With"]="XMLHttpRequest"),e)r.setRequestHeader(n,e[n]);o=function(e){return function(){o&&(o=a=r.onload=r.onerror=r.onabort=r.ontimeout=r.onreadystatechange=null,"abort"===e?r.abort():"error"===e?"number"!=typeof r.status?t(0,"error"):t(r.status,r.statusText):t(Ut[r.status]||r.status,r.statusText,"text"!==(r.responseType||"text")||"string"!=typeof r.responseText?{binary:r.response}:{text:r.responseText},r.getAllResponseHeaders()))}},r.onload=o(),a=r.onerror=r.ontimeout=o("error"),void 0!==r.onabort?r.onabort=a:r.onreadystatechange=function(){4===r.readyState&&C.setTimeout(function(){o&&a()})},o=o("abort");try{r.send(i.hasContent&&i.data||null)}catch(e){if(o)throw e}},abort:function(){o&&o()}}}),k.ajaxPrefilter(function(e){e.crossDomain&&(e.contents.script=!1)}),k.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(e){return k.globalEval(e),e}}}),k.ajaxPrefilter("script",function(e){void 0===e.cache&&(e.cache=!1),e.crossDomain&&(e.type="GET")}),k.ajaxTransport("script",function(n){var r,i;if(n.crossDomain||n.scriptAttrs)return{send:function(e,t){r=k("<script>").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var Vt,Gt=[],Yt=/(=)\?(?=&|$)|\?\?/;k.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Gt.pop()||k.expando+"_"+kt++;return this[e]=!0,e}}),k.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Yt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Yt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Yt,"$1"+r):!1!==e.jsonp&&(e.url+=(St.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||k.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?k(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Gt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((Vt=E.implementation.createHTMLDocument("").body).innerHTML="<form></form><form></form>",2===Vt.childNodes.length),k.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=D.exec(e))?[t.createElement(i[1])]:(i=we([e],t,o),o&&o.length&&k(o).remove(),k.merge([],i.childNodes)));var r,i,o},k.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1<s&&(r=mt(e.slice(s)),e=e.slice(0,s)),m(t)?(n=t,t=void 0):t&&"object"==typeof t&&(i="POST"),0<a.length&&k.ajax({url:e,type:i||"GET",dataType:"html",data:t}).done(function(e){o=arguments,a.html(r?k("<div>").append(k.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},k.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){k.fn[t]=function(e){return this.on(t,e)}}),k.expr.pseudos.animated=function(t){return k.grep(k.timers,function(e){return t===e.elem}).length},k.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=k.css(e,"position"),c=k(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=k.css(e,"top"),u=k.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,k.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},k.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){k.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===k.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===k.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=k(e).offset()).top+=k.css(e,"borderTopWidth",!0),i.left+=k.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-k.css(r,"marginTop",!0),left:t.left-i.left-k.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===k.css(e,"position"))e=e.offsetParent;return e||ie})}}),k.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;k.fn[t]=function(e){return _(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),k.each(["top","left"],function(e,n){k.cssHooks[n]=ze(y.pixelPosition,function(e,t){if(t)return t=_e(e,n),$e.test(t)?k(e).position()[n]+"px":t})}),k.each({Height:"height",Width:"width"},function(a,s){k.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){k.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return _(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?k.css(e,t,i):k.style(e,t,n,i)},s,n?e:void 0,n)}})}),k.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){k.fn[n]=function(e,t){return 0<arguments.length?this.on(n,null,e,t):this.trigger(n)}}),k.fn.extend({hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),k.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)}}),k.proxy=function(e,t){var n,r,i;if("string"==typeof t&&(n=e[t],t=e,e=n),m(e))return r=s.call(arguments,2),(i=function(){return e.apply(t||this,r.concat(s.call(arguments)))}).guid=e.guid=e.guid||k.guid++,i},k.holdReady=function(e){e?k.readyWait++:k.ready(!0)},k.isArray=Array.isArray,k.parseJSON=JSON.parse,k.nodeName=A,k.isFunction=m,k.isWindow=x,k.camelCase=V,k.type=w,k.now=Date.now,k.isNumeric=function(e){var t=k.type(e);return("number"===t||"string"===t)&&!isNaN(e-parseFloat(e))},"function"==typeof define&&define.amd&&define("jquery",[],function(){return k});var Qt=C.jQuery,Jt=C.$;return k.noConflict=function(e){return C.$===k&&(C.$=Jt),e&&C.jQuery===k&&(C.jQuery=Qt),k},e||(C.jQuery=C.$=k),k});
1+/*! jQuery v3.5.1 | (c) JS Foundation and other contributors | jquery.org/license */
2+!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.5.1",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0<t&&t-1 in e)}S.fn=S.prototype={jquery:f,constructor:S,length:0,toArray:function(){return s.call(this)},get:function(e){return null==e?s.call(this):e<0?this[e+this.length]:this[e]},pushStack:function(e){var t=S.merge(this.constructor(),e);return t.prevObject=this,t},each:function(e){return S.each(this,e)},map:function(n){return this.pushStack(S.map(this,function(e,t){return n.call(e,t,e)}))},slice:function(){return this.pushStack(s.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},even:function(){return this.pushStack(S.grep(this,function(e,t){return(t+1)%2}))},odd:function(){return this.pushStack(S.grep(this,function(e,t){return t%2}))},eq:function(e){var t=this.length,n=+e+(e<0?t:0);return this.pushStack(0<=n&&n<t?[this[n]]:[])},end:function(){return this.prevObject||this.constructor()},push:u,sort:t.sort,splice:t.splice},S.extend=S.fn.extend=function(){var e,t,n,r,i,o,a=arguments[0]||{},s=1,u=arguments.length,l=!1;for("boolean"==typeof a&&(l=a,a=arguments[s]||{},s++),"object"==typeof a||m(a)||(a={}),s===u&&(a=this,s--);s<u;s++)if(null!=(e=arguments[s]))for(t in e)r=e[t],"__proto__"!==t&&a!==r&&(l&&r&&(S.isPlainObject(r)||(i=Array.isArray(r)))?(n=a[t],o=i&&!Array.isArray(n)?[]:i||S.isPlainObject(n)?n:{},i=!1,a[t]=S.extend(l,o,r)):void 0!==r&&(a[t]=r));return a},S.extend({expando:"jQuery"+(f+Math.random()).replace(/\D/g,""),isReady:!0,error:function(e){throw new Error(e)},noop:function(){},isPlainObject:function(e){var t,n;return!(!e||"[object Object]"!==o.call(e))&&(!(t=r(e))||"function"==typeof(n=v.call(t,"constructor")&&t.constructor)&&a.call(n)===l)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},globalEval:function(e,t,n){b(e,{nonce:t&&t.nonce},n)},each:function(e,t){var n,r=0;if(p(e)){for(n=e.length;r<n;r++)if(!1===t.call(e[r],r,e[r]))break}else for(r in e)if(!1===t.call(e[r],r,e[r]))break;return e},makeArray:function(e,t){var n=t||[];return null!=e&&(p(Object(e))?S.merge(n,"string"==typeof e?[e]:e):u.call(n,e)),n},inArray:function(e,t,n){return null==t?-1:i.call(t,e,n)},merge:function(e,t){for(var n=+t.length,r=0,i=e.length;r<n;r++)e[i++]=t[r];return e.length=i,e},grep:function(e,t,n){for(var r=[],i=0,o=e.length,a=!n;i<o;i++)!t(e[i],i)!==a&&r.push(e[i]);return r},map:function(e,t,n){var r,i,o=0,a=[];if(p(e))for(r=e.length;o<r;o++)null!=(i=t(e[o],o,n))&&a.push(i);else for(o in e)null!=(i=t(e[o],o,n))&&a.push(i);return g(a)},guid:1,support:y}),"function"==typeof Symbol&&(S.fn[Symbol.iterator]=t[Symbol.iterator]),S.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(e,t){n["[object "+t+"]"]=t.toLowerCase()});var d=function(n){var e,d,b,o,i,h,f,g,w,u,l,T,C,a,E,v,s,c,y,S="sizzle"+1*new Date,p=n.document,k=0,r=0,m=ue(),x=ue(),A=ue(),N=ue(),D=function(e,t){return e===t&&(l=!0),0},j={}.hasOwnProperty,t=[],q=t.pop,L=t.push,H=t.push,O=t.slice,P=function(e,t){for(var n=0,r=e.length;n<r;n++)if(e[n]===t)return n;return-1},R="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",M="[\\x20\\t\\r\\n\\f]",I="(?:\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+",W="\\["+M+"*("+I+")(?:"+M+"*([*^$|!~]?=)"+M+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+I+"))|)"+M+"*\\]",F=":("+I+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+W+")*)|.*)\\)|)",B=new RegExp(M+"+","g"),$=new RegExp("^"+M+"+|((?:^|[^\\\\])(?:\\\\.)*)"+M+"+$","g"),_=new RegExp("^"+M+"*,"+M+"*"),z=new RegExp("^"+M+"*([>+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e.namespaceURI,n=(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="<a id='"+S+"'></a><select id='"+S+"-\r\\' msallowcapture=''><option selected=''></option></select>",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="<a href='' disabled='disabled'></a><select disabled='disabled'><option/></select>";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},D=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0<se(t,C,null,[e]).length},se.contains=function(e,t){return(e.ownerDocument||e)!=C&&T(e),y(e,t)},se.attr=function(e,t){(e.ownerDocument||e)!=C&&T(e);var n=b.attrHandle[t.toLowerCase()],r=n&&j.call(b.attrHandle,t.toLowerCase())?n(e,t,!E):void 0;return void 0!==r?r:d.attributes||!E?e.getAttribute(t):(r=e.getAttributeNode(t))&&r.specified?r.value:null},se.escape=function(e){return(e+"").replace(re,ie)},se.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},se.uniqueSort=function(e){var t,n=[],r=0,i=0;if(l=!d.detectDuplicates,u=!d.sortStable&&e.slice(0),e.sort(D),l){while(t=e[i++])t===e[i]&&(r=n.push(i));while(r--)e.splice(n[r],1)}return u=null,e},o=se.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=o(e)}else if(3===i||4===i)return e.nodeValue}else while(t=e[r++])n+=o(t);return n},(b=se.selectors={cacheLength:50,createPseudo:le,match:G,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1<t.indexOf(i):"$="===r?i&&t.slice(-i.length)===i:"~="===r?-1<(" "+t.replace(B," ")+" ").indexOf(i):"|="===r&&(t===i||t.slice(0,i.length+1)===i+"-"))}},CHILD:function(h,e,t,g,v){var y="nth"!==h.slice(0,3),m="last"!==h.slice(-4),x="of-type"===e;return 1===g&&0===v?function(e){return!!e.parentNode}:function(e,t,n){var r,i,o,a,s,u,l=y!==m?"nextSibling":"previousSibling",c=e.parentNode,f=x&&e.nodeName.toLowerCase(),p=!n&&!x,d=!1;if(c){if(y){while(l){a=e;while(a=a[l])if(x?a.nodeName.toLowerCase()===f:1===a.nodeType)return!1;u=l="only"===h&&!u&&"nextSibling"}return!0}if(u=[m?c.firstChild:c.lastChild],m&&p){d=(s=(r=(i=(o=(a=c)[S]||(a[S]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]||[])[0]===k&&r[1])&&r[2],a=s&&c.childNodes[s];while(a=++s&&a&&a[l]||(d=s=0)||u.pop())if(1===a.nodeType&&++d&&a===e){i[h]=[k,s,d];break}}else if(p&&(d=s=(r=(i=(o=(a=e)[S]||(a[S]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]||[])[0]===k&&r[1]),!1===d)while(a=++s&&a&&a[l]||(d=s=0)||u.pop())if((x?a.nodeName.toLowerCase()===f:1===a.nodeType)&&++d&&(p&&((i=(o=a[S]||(a[S]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]=[k,d]),a===e))break;return(d-=v)===g||d%g==0&&0<=d/g}}},PSEUDO:function(e,o){var t,a=b.pseudos[e]||b.setFilters[e.toLowerCase()]||se.error("unsupported pseudo: "+e);return a[S]?a(o):1<a.length?(t=[e,e,"",o],b.setFilters.hasOwnProperty(e.toLowerCase())?le(function(e,t){var n,r=a(e,o),i=r.length;while(i--)e[n=P(e,r[i])]=!(t[n]=r[i])}):function(e){return a(e,0,t)}):a}},pseudos:{not:le(function(e){var r=[],i=[],s=f(e.replace($,"$1"));return s[S]?le(function(e,t,n,r){var i,o=s(e,null,r,[]),a=e.length;while(a--)(i=o[a])&&(e[a]=!(t[a]=i))}):function(e,t,n){return r[0]=e,s(r,null,n,i),r[0]=null,!i.pop()}}),has:le(function(t){return function(e){return 0<se(t,e).length}}),contains:le(function(t){return t=t.replace(te,ne),function(e){return-1<(e.textContent||o(e)).indexOf(t)}}),lang:le(function(n){return V.test(n||"")||se.error("unsupported lang: "+n),n=n.replace(te,ne).toLowerCase(),function(e){var t;do{if(t=E?e.lang:e.getAttribute("xml:lang")||e.getAttribute("lang"))return(t=t.toLowerCase())===n||0===t.indexOf(n+"-")}while((e=e.parentNode)&&1===e.nodeType);return!1}}),target:function(e){var t=n.location&&n.location.hash;return t&&t.slice(1)===e.id},root:function(e){return e===a},focus:function(e){return e===C.activeElement&&(!C.hasFocus||C.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:ge(!1),disabled:ge(!0),checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,!0===e.selected},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!b.pseudos.empty(e)},header:function(e){return J.test(e.nodeName)},input:function(e){return Q.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||"text"===t.toLowerCase())},first:ve(function(){return[0]}),last:ve(function(e,t){return[t-1]}),eq:ve(function(e,t,n){return[n<0?n+t:n]}),even:ve(function(e,t){for(var n=0;n<t;n+=2)e.push(n);return e}),odd:ve(function(e,t){for(var n=1;n<t;n+=2)e.push(n);return e}),lt:ve(function(e,t,n){for(var r=n<0?n+t:t<n?t:n;0<=--r;)e.push(r);return e}),gt:ve(function(e,t,n){for(var r=n<0?n+t:n;++r<t;)e.push(r);return e})}}).pseudos.nth=b.pseudos.eq,{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})b.pseudos[e]=de(e);for(e in{submit:!0,reset:!0})b.pseudos[e]=he(e);function me(){}function xe(e){for(var t=0,n=e.length,r="";t<n;t++)r+=e[t].value;return r}function be(s,e,t){var u=e.dir,l=e.next,c=l||u,f=t&&"parentNode"===c,p=r++;return e.first?function(e,t,n){while(e=e[u])if(1===e.nodeType||f)return s(e,t,n);return!1}:function(e,t,n){var r,i,o,a=[k,p];if(n){while(e=e[u])if((1===e.nodeType||f)&&s(e,t,n))return!0}else while(e=e[u])if(1===e.nodeType||f)if(i=(o=e[S]||(e[S]={}))[e.uniqueID]||(o[e.uniqueID]={}),l&&l===e.nodeName.toLowerCase())e=e[u]||e;else{if((r=i[c])&&r[0]===k&&r[1]===p)return a[2]=r[2];if((i[c]=a)[2]=s(e,t,n))return!0}return!1}}function we(i){return 1<i.length?function(e,t,n){var r=i.length;while(r--)if(!i[r](e,t,n))return!1;return!0}:i[0]}function Te(e,t,n,r,i){for(var o,a=[],s=0,u=e.length,l=null!=t;s<u;s++)(o=e[s])&&(n&&!n(o,r,i)||(a.push(o),l&&t.push(s)));return a}function Ce(d,h,g,v,y,e){return v&&!v[S]&&(v=Ce(v)),y&&!y[S]&&(y=Ce(y,e)),le(function(e,t,n,r){var i,o,a,s=[],u=[],l=t.length,c=e||function(e,t,n){for(var r=0,i=t.length;r<i;r++)se(e,t[r],n);return n}(h||"*",n.nodeType?[n]:n,[]),f=!d||!e&&h?c:Te(c,s,d,n,r),p=g?y||(e?d:l||v)?[]:t:f;if(g&&g(f,p,n,r),v){i=Te(p,u),v(i,[],n,r),o=i.length;while(o--)(a=i[o])&&(p[u[o]]=!(f[u[o]]=a))}if(e){if(y||d){if(y){i=[],o=p.length;while(o--)(a=p[o])&&i.push(f[o]=a);y(null,p=[],i,r)}o=p.length;while(o--)(a=p[o])&&-1<(i=y?P(e,a):s[o])&&(e[i]=!(t[i]=a))}}else p=Te(p===t?p.splice(l,p.length):p),y?y(null,t,p,r):H.apply(t,p)})}function Ee(e){for(var i,t,n,r=e.length,o=b.relative[e[0].type],a=o||b.relative[" "],s=o?1:0,u=be(function(e){return e===i},a,!0),l=be(function(e){return-1<P(i,e)},a,!0),c=[function(e,t,n){var r=!o&&(n||t!==w)||((i=t).nodeType?u(e,t,n):l(e,t,n));return i=null,r}];s<r;s++)if(t=b.relative[e[s].type])c=[be(we(c),t)];else{if((t=b.filter[e[s].type].apply(null,e[s].matches))[S]){for(n=++s;n<r;n++)if(b.relative[e[n].type])break;return Ce(1<s&&we(c),1<s&&xe(e.slice(0,s-1).concat({value:" "===e[s-2].type?"*":""})).replace($,"$1"),t,s<n&&Ee(e.slice(s,n)),n<r&&Ee(e=e.slice(n)),n<r&&xe(e))}c.push(t)}return we(c)}return me.prototype=b.filters=b.pseudos,b.setFilters=new me,h=se.tokenize=function(e,t){var n,r,i,o,a,s,u,l=x[e+" "];if(l)return t?0:l.slice(0);a=e,s=[],u=b.preFilter;while(a){for(o in n&&!(r=_.exec(a))||(r&&(a=a.slice(r[0].length)||a),s.push(i=[])),n=!1,(r=z.exec(a))&&(n=r.shift(),i.push({value:n,type:r[0].replace($," ")}),a=a.slice(n.length)),b.filter)!(r=G[o].exec(a))||u[o]&&!(r=u[o](r))||(n=r.shift(),i.push({value:n,type:o,matches:r}),a=a.slice(n.length));if(!n)break}return t?a.length:a?se.error(e):x(e,s).slice(0)},f=se.compile=function(e,t){var n,v,y,m,x,r,i=[],o=[],a=A[e+" "];if(!a){t||(t=h(e)),n=t.length;while(n--)(a=Ee(t[n]))[S]?i.push(a):o.push(a);(a=A(e,(v=o,m=0<(y=i).length,x=0<v.length,r=function(e,t,n,r,i){var o,a,s,u=0,l="0",c=e&&[],f=[],p=w,d=e||x&&b.find.TAG("*",i),h=k+=null==p?1:Math.random()||.1,g=d.length;for(i&&(w=t==C||t||i);l!==g&&null!=(o=d[l]);l++){if(x&&o){a=0,t||o.ownerDocument==C||(T(o),n=!E);while(s=v[a++])if(s(o,t||C,n)){r.push(o);break}i&&(k=h)}m&&((o=!s&&o)&&u--,e&&c.push(o))}if(u+=l,m&&l!==u){a=0;while(s=y[a++])s(c,f,t,n);if(e){if(0<u)while(l--)c[l]||f[l]||(f[l]=q.call(r));f=Te(f)}H.apply(r,f),i&&!e&&0<f.length&&1<u+y.length&&se.uniqueSort(r)}return i&&(k=h,w=p),c},m?le(r):r))).selector=e}return a},g=se.select=function(e,t,n,r){var i,o,a,s,u,l="function"==typeof e&&e,c=!r&&h(e=l.selector||e);if(n=n||[],1===c.length){if(2<(o=c[0]=c[0].slice(0)).length&&"ID"===(a=o[0]).type&&9===t.nodeType&&E&&b.relative[o[1].type]){if(!(t=(b.find.ID(a.matches[0].replace(te,ne),t)||[])[0]))return n;l&&(t=t.parentNode),e=e.slice(o.shift().value.length)}i=G.needsContext.test(e)?0:o.length;while(i--){if(a=o[i],b.relative[s=a.type])break;if((u=b.find[s])&&(r=u(a.matches[0].replace(te,ne),ee.test(o[0].type)&&ye(t.parentNode)||t))){if(o.splice(i,1),!(e=r.length&&xe(o)))return H.apply(n,r),n;break}}}return(l||f(e,c))(r,t,!E,n,!t||ee.test(e)&&ye(t.parentNode)||t),n},d.sortStable=S.split("").sort(D).join("")===S,d.detectDuplicates=!!l,T(),d.sortDetached=ce(function(e){return 1&e.compareDocumentPosition(C.createElement("fieldset"))}),ce(function(e){return e.innerHTML="<a href='#'></a>","#"===e.firstChild.getAttribute("href")})||fe("type|href|height|width",function(e,t,n){if(!n)return e.getAttribute(t,"type"===t.toLowerCase()?1:2)}),d.attributes&&ce(function(e){return e.innerHTML="<input/>",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||fe("value",function(e,t,n){if(!n&&"input"===e.nodeName.toLowerCase())return e.defaultValue}),ce(function(e){return null==e.getAttribute("disabled")})||fe(R,function(e,t,n){var r;if(!n)return!0===e[t]?t.toLowerCase():(r=e.getAttributeNode(t))&&r.specified?r.value:null}),se}(C);S.find=d,S.expr=d.selectors,S.expr[":"]=S.expr.pseudos,S.uniqueSort=S.unique=d.uniqueSort,S.text=d.getText,S.isXMLDoc=d.isXML,S.contains=d.contains,S.escapeSelector=d.escape;var h=function(e,t,n){var r=[],i=void 0!==n;while((e=e[t])&&9!==e.nodeType)if(1===e.nodeType){if(i&&S(e).is(n))break;r.push(e)}return r},T=function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n},k=S.expr.match.needsContext;function A(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()}var N=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function D(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1<i.call(n,e)!==r}):S.filter(n,e,r)}S.filter=function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?S.find.matchesSelector(r,e)?[r]:[]:S.find.matches(e,S.grep(t,function(e){return 1===e.nodeType}))},S.fn.extend({find:function(e){var t,n,r=this.length,i=this;if("string"!=typeof e)return this.pushStack(S(e).filter(function(){for(t=0;t<r;t++)if(S.contains(i[t],this))return!0}));for(n=this.pushStack([]),t=0;t<r;t++)S.find(e,i[t],n);return 1<r?S.uniqueSort(n):n},filter:function(e){return this.pushStack(D(this,e||[],!1))},not:function(e){return this.pushStack(D(this,e||[],!0))},is:function(e){return!!D(this,"string"==typeof e&&k.test(e)?S(e):e||[],!1).length}});var j,q=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||j,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,j=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e<n;e++)if(S.contains(this,t[e]))return!0})},closest:function(e,t){var n,r=0,i=this.length,o=[],a="string"!=typeof e&&S(e);if(!k.test(e))for(;r<i;r++)for(n=this[r];n&&n!==t;n=n.parentNode)if(n.nodeType<11&&(a?-1<a.index(n):1===n.nodeType&&S.find.matchesSelector(n,e))){o.push(n);break}return this.pushStack(1<o.length?S.uniqueSort(o):o)},index:function(e){return e?"string"==typeof e?i.call(S(e),this[0]):i.call(this,e.jquery?e[0]:e):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(S.uniqueSort(S.merge(this.get(),S(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),S.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return h(e,"parentNode")},parentsUntil:function(e,t,n){return h(e,"parentNode",n)},next:function(e){return O(e,"nextSibling")},prev:function(e){return O(e,"previousSibling")},nextAll:function(e){return h(e,"nextSibling")},prevAll:function(e){return h(e,"previousSibling")},nextUntil:function(e,t,n){return h(e,"nextSibling",n)},prevUntil:function(e,t,n){return h(e,"previousSibling",n)},siblings:function(e){return T((e.parentNode||{}).firstChild,e)},children:function(e){return T(e.firstChild)},contents:function(e){return null!=e.contentDocument&&r(e.contentDocument)?e.contentDocument:(A(e,"template")&&(e=e.content||e),S.merge([],e.childNodes))}},function(r,i){S.fn[r]=function(e,t){var n=S.map(this,i,e);return"Until"!==r.slice(-5)&&(t=e),t&&"string"==typeof t&&(n=S.filter(t,n)),1<this.length&&(H[r]||S.uniqueSort(n),L.test(r)&&n.reverse()),this.pushStack(n)}});var P=/[^\x20\t\r\n\f]+/g;function R(e){return e}function M(e){throw e}function I(e,t,n,r){var i;try{e&&m(i=e.promise)?i.call(e).done(t).fail(n):e&&m(i=e.then)?i.call(e,t,n):t.apply(void 0,[e].slice(r))}catch(e){n.apply(void 0,[e])}}S.Callbacks=function(r){var e,n;r="string"==typeof r?(e=r,n={},S.each(e.match(P)||[],function(e,t){n[t]=!0}),n):S.extend({},r);var i,t,o,a,s=[],u=[],l=-1,c=function(){for(a=a||r.once,o=i=!0;u.length;l=-1){t=u.shift();while(++l<s.length)!1===s[l].apply(t[0],t[1])&&r.stopOnFalse&&(l=s.length,t=!1)}r.memory||(t=!1),i=!1,a&&(s=t?[]:"")},f={add:function(){return s&&(t&&!i&&(l=s.length-1,u.push(t)),function n(e){S.each(e,function(e,t){m(t)?r.unique&&f.has(t)||s.push(t):t&&t.length&&"string"!==w(t)&&n(t)})}(arguments),t&&!i&&c()),this},remove:function(){return S.each(arguments,function(e,t){var n;while(-1<(n=S.inArray(t,s,n)))s.splice(n,1),n<=l&&l--}),this},has:function(e){return e?-1<S.inArray(e,s):0<s.length},empty:function(){return s&&(s=[]),this},disable:function(){return a=u=[],s=t="",this},disabled:function(){return!s},lock:function(){return a=u=[],t||i||(s=t=""),this},locked:function(){return!!a},fireWith:function(e,t){return a||(t=[e,(t=t||[]).slice?t.slice():t],u.push(t),i||c()),this},fire:function(){return f.fireWith(this,arguments),this},fired:function(){return!!o}};return f},S.extend({Deferred:function(e){var o=[["notify","progress",S.Callbacks("memory"),S.Callbacks("memory"),2],["resolve","done",S.Callbacks("once memory"),S.Callbacks("once memory"),0,"resolved"],["reject","fail",S.Callbacks("once memory"),S.Callbacks("once memory"),1,"rejected"]],i="pending",a={state:function(){return i},always:function(){return s.done(arguments).fail(arguments),this},"catch":function(e){return a.then(null,e)},pipe:function(){var i=arguments;return S.Deferred(function(r){S.each(o,function(e,t){var n=m(i[t[4]])&&i[t[4]];s[t[1]](function(){var e=n&&n.apply(this,arguments);e&&m(e.promise)?e.promise().progress(r.notify).done(r.resolve).fail(r.reject):r[t[0]+"With"](this,n?[e]:arguments)})}),i=null}).promise()},then:function(t,n,r){var u=0;function l(i,o,a,s){return function(){var n=this,r=arguments,e=function(){var e,t;if(!(i<u)){if((e=a.apply(n,r))===o.promise())throw new TypeError("Thenable self-resolution");t=e&&("object"==typeof e||"function"==typeof e)&&e.then,m(t)?s?t.call(e,l(u,o,R,s),l(u,o,M,s)):(u++,t.call(e,l(u,o,R,s),l(u,o,M,s),l(u,o,R,o.notifyWith))):(a!==R&&(n=void 0,r=[e]),(s||o.resolveWith)(n,r))}},t=s?e:function(){try{e()}catch(e){S.Deferred.exceptionHook&&S.Deferred.exceptionHook(e,t.stackTrace),u<=i+1&&(a!==M&&(n=void 0,r=[e]),o.rejectWith(n,r))}};i?t():(S.Deferred.getStackHook&&(t.stackTrace=S.Deferred.getStackHook()),C.setTimeout(t))}}return S.Deferred(function(e){o[0][3].add(l(0,e,m(r)?r:R,e.notifyWith)),o[1][3].add(l(0,e,m(t)?t:R)),o[2][3].add(l(0,e,m(n)?n:M))}).promise()},promise:function(e){return null!=e?S.extend(e,a):a}},s={};return S.each(o,function(e,t){var n=t[2],r=t[5];a[t[1]]=n.add,r&&n.add(function(){i=r},o[3-e][2].disable,o[3-e][3].disable,o[0][2].lock,o[0][3].lock),n.add(t[3].fire),s[t[0]]=function(){return s[t[0]+"With"](this===s?void 0:this,arguments),this},s[t[0]+"With"]=n.fireWith}),a.promise(s),e&&e.call(s,s),s},when:function(e){var n=arguments.length,t=n,r=Array(t),i=s.call(arguments),o=S.Deferred(),a=function(t){return function(e){r[t]=this,i[t]=1<arguments.length?s.call(arguments):e,--n||o.resolveWith(r,i)}};if(n<=1&&(I(e,o.done(a(t)).resolve,o.reject,!n),"pending"===o.state()||m(i[t]&&i[t].then)))return o.then();while(t--)I(i[t],a(t),o.reject);return o.promise()}});var W=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;S.Deferred.exceptionHook=function(e,t){C.console&&C.console.warn&&e&&W.test(e.name)&&C.console.warn("jQuery.Deferred exception: "+e.message,e.stack,t)},S.readyException=function(e){C.setTimeout(function(){throw e})};var F=S.Deferred();function B(){E.removeEventListener("DOMContentLoaded",B),C.removeEventListener("load",B),S.ready()}S.fn.ready=function(e){return F.then(e)["catch"](function(e){S.readyException(e)}),this},S.extend({isReady:!1,readyWait:1,ready:function(e){(!0===e?--S.readyWait:S.isReady)||(S.isReady=!0)!==e&&0<--S.readyWait||F.resolveWith(E,[S])}}),S.ready.then=F.then,"complete"===E.readyState||"loading"!==E.readyState&&!E.documentElement.doScroll?C.setTimeout(S.ready):(E.addEventListener("DOMContentLoaded",B),C.addEventListener("load",B));var $=function(e,t,n,r,i,o,a){var s=0,u=e.length,l=null==n;if("object"===w(n))for(s in i=!0,n)$(e,t,s,n[s],!0,o,a);else if(void 0!==r&&(i=!0,m(r)||(a=!0),l&&(a?(t.call(e,r),t=null):(l=t,t=function(e,t,n){return l.call(S(e),n)})),t))for(;s<u;s++)t(e[s],n,a?r:r.call(e[s],s,t(e[s],n)));return i?e:l?t.call(e):u?t(e[0],n):o},_=/^-ms-/,z=/-([a-z])/g;function U(e,t){return t.toUpperCase()}function X(e){return e.replace(_,"ms-").replace(z,U)}var V=function(e){return 1===e.nodeType||9===e.nodeType||!+e.nodeType};function G(){this.expando=S.expando+G.uid++}G.uid=1,G.prototype={cache:function(e){var t=e[this.expando];return t||(t={},V(e)&&(e.nodeType?e[this.expando]=t:Object.defineProperty(e,this.expando,{value:t,configurable:!0}))),t},set:function(e,t,n){var r,i=this.cache(e);if("string"==typeof t)i[X(t)]=n;else for(r in t)i[X(r)]=t[r];return i},get:function(e,t){return void 0===t?this.cache(e):e[this.expando]&&e[this.expando][X(t)]},access:function(e,t,n){return void 0===t||t&&"string"==typeof t&&void 0===n?this.get(e,t):(this.set(e,t,n),void 0!==n?n:t)},remove:function(e,t){var n,r=e[this.expando];if(void 0!==r){if(void 0!==t){n=(t=Array.isArray(t)?t.map(X):(t=X(t))in r?[t]:t.match(P)||[]).length;while(n--)delete r[t[n]]}(void 0===t||S.isEmptyObject(r))&&(e.nodeType?e[this.expando]=void 0:delete e[this.expando])}},hasData:function(e){var t=e[this.expando];return void 0!==t&&!S.isEmptyObject(t)}};var Y=new G,Q=new G,J=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,K=/[A-Z]/g;function Z(e,t,n){var r,i;if(void 0===n&&1===e.nodeType)if(r="data-"+t.replace(K,"-$&").toLowerCase(),"string"==typeof(n=e.getAttribute(r))){try{n="true"===(i=n)||"false"!==i&&("null"===i?null:i===+i+""?+i:J.test(i)?JSON.parse(i):i)}catch(e){}Q.set(e,t,n)}else n=void 0;return n}S.extend({hasData:function(e){return Q.hasData(e)||Y.hasData(e)},data:function(e,t,n){return Q.access(e,t,n)},removeData:function(e,t){Q.remove(e,t)},_data:function(e,t,n){return Y.access(e,t,n)},_removeData:function(e,t){Y.remove(e,t)}}),S.fn.extend({data:function(n,e){var t,r,i,o=this[0],a=o&&o.attributes;if(void 0===n){if(this.length&&(i=Q.get(o),1===o.nodeType&&!Y.get(o,"hasDataAttrs"))){t=a.length;while(t--)a[t]&&0===(r=a[t].name).indexOf("data-")&&(r=X(r.slice(5)),Z(o,r,i[r]));Y.set(o,"hasDataAttrs",!0)}return i}return"object"==typeof n?this.each(function(){Q.set(this,n)}):$(this,function(e){var t;if(o&&void 0===e)return void 0!==(t=Q.get(o,n))?t:void 0!==(t=Z(o,n))?t:void 0;this.each(function(){Q.set(this,n,e)})},null,e,1<arguments.length,null,!0)},removeData:function(e){return this.each(function(){Q.remove(this,e)})}}),S.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=Y.get(e,t),n&&(!r||Array.isArray(n)?r=Y.access(e,t,S.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=S.queue(e,t),r=n.length,i=n.shift(),o=S._queueHooks(e,t);"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,function(){S.dequeue(e,t)},o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return Y.get(e,n)||Y.access(e,n,{empty:S.Callbacks("once memory").add(function(){Y.remove(e,[t+"queue",n])})})}}),S.fn.extend({queue:function(t,n){var e=2;return"string"!=typeof t&&(n=t,t="fx",e--),arguments.length<e?S.queue(this[0],t):void 0===n?this:this.each(function(){var e=S.queue(this,t,n);S._queueHooks(this,t),"fx"===t&&"inprogress"!==e[0]&&S.dequeue(this,t)})},dequeue:function(e){return this.each(function(){S.dequeue(this,e)})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,t){var n,r=1,i=S.Deferred(),o=this,a=this.length,s=function(){--r||i.resolveWith(o,[o])};"string"!=typeof e&&(t=e,e=void 0),e=e||"fx";while(a--)(n=Y.get(o[a],e+"queueHooks"))&&n.empty&&(r++,n.empty.add(s));return s(),i.promise(t)}});var ee=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,te=new RegExp("^(?:([+-])=|)("+ee+")([a-z%]*)$","i"),ne=["Top","Right","Bottom","Left"],re=E.documentElement,ie=function(e){return S.contains(e.ownerDocument,e)},oe={composed:!0};re.getRootNode&&(ie=function(e){return S.contains(e.ownerDocument,e)||e.getRootNode(oe)===e.ownerDocument});var ae=function(e,t){return"none"===(e=t||e).style.display||""===e.style.display&&ie(e)&&"none"===S.css(e,"display")};function se(e,t,n,r){var i,o,a=20,s=r?function(){return r.cur()}:function(){return S.css(e,t,"")},u=s(),l=n&&n[3]||(S.cssNumber[t]?"":"px"),c=e.nodeType&&(S.cssNumber[t]||"px"!==l&&+u)&&te.exec(S.css(e,t));if(c&&c[3]!==l){u/=2,l=l||c[3],c=+u||1;while(a--)S.style(e,t,c+l),(1-o)*(1-(o=s()/u||.5))<=0&&(a=0),c/=o;c*=2,S.style(e,t,c+l),n=n||[]}return n&&(c=+c||+u||0,i=n[1]?c+(n[1]+1)*n[2]:+n[2],r&&(r.unit=l,r.start=c,r.end=i)),i}var ue={};function le(e,t){for(var n,r,i,o,a,s,u,l=[],c=0,f=e.length;c<f;c++)(r=e[c]).style&&(n=r.style.display,t?("none"===n&&(l[c]=Y.get(r,"display")||null,l[c]||(r.style.display="")),""===r.style.display&&ae(r)&&(l[c]=(u=a=o=void 0,a=(i=r).ownerDocument,s=i.nodeName,(u=ue[s])||(o=a.body.appendChild(a.createElement(s)),u=S.css(o,"display"),o.parentNode.removeChild(o),"none"===u&&(u="block"),ue[s]=u)))):"none"!==n&&(l[c]="none",Y.set(r,"display",n)));for(c=0;c<f;c++)null!=l[c]&&(e[c].style.display=l[c]);return e}S.fn.extend({show:function(){return le(this,!0)},hide:function(){return le(this)},toggle:function(e){return"boolean"==typeof e?e?this.show():this.hide():this.each(function(){ae(this)?S(this).show():S(this).hide()})}});var ce,fe,pe=/^(?:checkbox|radio)$/i,de=/<([a-z][^\/\0>\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="<textarea>x</textarea>",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="<option></option>",y.option=!!ce.lastChild;var ge={thead:[1,"<table>","</table>"],col:[2,"<table><colgroup>","</colgroup></table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n<r;n++)Y.set(e[n],"globalEval",!t||Y.get(t[n],"globalEval"))}ge.tbody=ge.tfoot=ge.colgroup=ge.caption=ge.thead,ge.th=ge.td,y.option||(ge.optgroup=ge.option=[1,"<select multiple='multiple'>","</select>"]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d<h;d++)if((o=e[d])||0===o)if("object"===w(o))S.merge(p,o.nodeType?[o]:o);else if(me.test(o)){a=a||f.appendChild(t.createElement("div")),s=(de.exec(o)||["",""])[1].toLowerCase(),u=ge[s]||ge._default,a.innerHTML=u[1]+S.htmlPrefilter(o)+u[2],c=u[0];while(c--)a=a.lastChild;S.merge(p,a.childNodes),(a=f.firstChild).textContent=""}else p.push(t.createTextNode(o));f.textContent="",d=0;while(o=p[d++])if(r&&-1<S.inArray(o,r))i&&i.push(o);else if(l=ie(o),a=ve(f.appendChild(o),"script"),l&&ye(a),n){c=0;while(o=a[c++])he.test(o.type||"")&&n.push(o)}return f}var be=/^key/,we=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Te=/^([^.]*)(?:\.(.+)|)/;function Ce(){return!0}function Ee(){return!1}function Se(e,t){return e===function(){try{return E.activeElement}catch(e){}}()==("focus"===t)}function ke(e,t,n,r,i,o){var a,s;if("object"==typeof t){for(s in"string"!=typeof n&&(r=r||n,n=void 0),t)ke(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=Ee;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return S().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=S.guid++)),e.each(function(){S.event.add(this,t,i,r,n)})}function Ae(e,i,o){o?(Y.set(e,i,!1),S.event.add(e,i,{namespace:!1,handler:function(e){var t,n,r=Y.get(this,i);if(1&e.isTrigger&&this[i]){if(r.length)(S.event.special[i]||{}).delegateType&&e.stopPropagation();else if(r=s.call(arguments),Y.set(this,i,r),t=o(this,i),this[i](),r!==(n=Y.get(this,i))||t?Y.set(this,i,!1):n={},r!==n)return e.stopImmediatePropagation(),e.preventDefault(),n.value}else r.length&&(Y.set(this,i,{value:S.event.trigger(S.extend(r[0],S.Event.prototype),r.slice(1),this)}),e.stopImmediatePropagation())}})):void 0===Y.get(e,i)&&S.event.add(e,i,Ce)}S.event={global:{},add:function(t,e,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Y.get(t);if(V(t)){n.handler&&(n=(o=n).handler,i=o.selector),i&&S.find.matchesSelector(re,i),n.guid||(n.guid=S.guid++),(u=v.events)||(u=v.events=Object.create(null)),(a=v.handle)||(a=v.handle=function(e){return"undefined"!=typeof S&&S.event.triggered!==e.type?S.event.dispatch.apply(t,arguments):void 0}),l=(e=(e||"").match(P)||[""]).length;while(l--)d=g=(s=Te.exec(e[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=S.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=S.event.special[d]||{},c=S.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&S.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,r,h,a)||t.addEventListener&&t.addEventListener(d,a)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),S.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Y.hasData(e)&&Y.get(e);if(v&&(u=v.events)){l=(t=(t||"").match(P)||[""]).length;while(l--)if(d=g=(s=Te.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d){f=S.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,v.handle)||S.removeEvent(e,d,v.handle),delete u[d])}else for(d in u)S.event.remove(e,d+t[l],n,r,!0);S.isEmptyObject(u)&&Y.remove(e,"handle events")}},dispatch:function(e){var t,n,r,i,o,a,s=new Array(arguments.length),u=S.event.fix(e),l=(Y.get(this,"events")||Object.create(null))[u.type]||[],c=S.event.special[u.type]||{};for(s[0]=u,t=1;t<arguments.length;t++)s[t]=arguments[t];if(u.delegateTarget=this,!c.preDispatch||!1!==c.preDispatch.call(this,u)){a=S.event.handlers.call(this,u,l),t=0;while((i=a[t++])&&!u.isPropagationStopped()){u.currentTarget=i.elem,n=0;while((o=i.handlers[n++])&&!u.isImmediatePropagationStopped())u.rnamespace&&!1!==o.namespace&&!u.rnamespace.test(o.namespace)||(u.handleObj=o,u.data=o.data,void 0!==(r=((S.event.special[o.origType]||{}).handle||o.handler).apply(i.elem,s))&&!1===(u.result=r)&&(u.preventDefault(),u.stopPropagation()))}return c.postDispatch&&c.postDispatch.call(this,u),u.result}},handlers:function(e,t){var n,r,i,o,a,s=[],u=t.delegateCount,l=e.target;if(u&&l.nodeType&&!("click"===e.type&&1<=e.button))for(;l!==this;l=l.parentNode||this)if(1===l.nodeType&&("click"!==e.type||!0!==l.disabled)){for(o=[],a={},n=0;n<u;n++)void 0===a[i=(r=t[n]).selector+" "]&&(a[i]=r.needsContext?-1<S(i,this).index(l):S.find(i,this,null,[l]).length),a[i]&&o.push(r);o.length&&s.push({elem:l,handlers:o})}return l=this,u<t.length&&s.push({elem:l,handlers:t.slice(u)}),s},addProp:function(t,e){Object.defineProperty(S.Event.prototype,t,{enumerable:!0,configurable:!0,get:m(e)?function(){if(this.originalEvent)return e(this.originalEvent)}:function(){if(this.originalEvent)return this.originalEvent[t]},set:function(e){Object.defineProperty(this,t,{enumerable:!0,configurable:!0,writable:!0,value:e})}})},fix:function(e){return e[S.expando]?e:new S.Event(e)},special:{load:{noBubble:!0},click:{setup:function(e){var t=this||e;return pe.test(t.type)&&t.click&&A(t,"input")&&Ae(t,"click",Ce),!1},trigger:function(e){var t=this||e;return pe.test(t.type)&&t.click&&A(t,"input")&&Ae(t,"click"),!0},_default:function(e){var t=e.target;return pe.test(t.type)&&t.click&&A(t,"input")&&Y.get(t,"click")||A(t,"a")}},beforeunload:{postDispatch:function(e){void 0!==e.result&&e.originalEvent&&(e.originalEvent.returnValue=e.result)}}}},S.removeEvent=function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n)},S.Event=function(e,t){if(!(this instanceof S.Event))return new S.Event(e,t);e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||void 0===e.defaultPrevented&&!1===e.returnValue?Ce:Ee,this.target=e.target&&3===e.target.nodeType?e.target.parentNode:e.target,this.currentTarget=e.currentTarget,this.relatedTarget=e.relatedTarget):this.type=e,t&&S.extend(this,t),this.timeStamp=e&&e.timeStamp||Date.now(),this[S.expando]=!0},S.Event.prototype={constructor:S.Event,isDefaultPrevented:Ee,isPropagationStopped:Ee,isImmediatePropagationStopped:Ee,isSimulated:!1,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=Ce,e&&!this.isSimulated&&e.preventDefault()},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=Ce,e&&!this.isSimulated&&e.stopPropagation()},stopImmediatePropagation:function(){var e=this.originalEvent;this.isImmediatePropagationStopped=Ce,e&&!this.isSimulated&&e.stopImmediatePropagation(),this.stopPropagation()}},S.each({altKey:!0,bubbles:!0,cancelable:!0,changedTouches:!0,ctrlKey:!0,detail:!0,eventPhase:!0,metaKey:!0,pageX:!0,pageY:!0,shiftKey:!0,view:!0,"char":!0,code:!0,charCode:!0,key:!0,keyCode:!0,button:!0,buttons:!0,clientX:!0,clientY:!0,offsetX:!0,offsetY:!0,pointerId:!0,pointerType:!0,screenX:!0,screenY:!0,targetTouches:!0,toElement:!0,touches:!0,which:function(e){var t=e.button;return null==e.which&&be.test(e.type)?null!=e.charCode?e.charCode:e.keyCode:!e.which&&void 0!==t&&we.test(e.type)?1&t?1:2&t?3:4&t?2:0:e.which}},S.event.addProp),S.each({focus:"focusin",blur:"focusout"},function(e,t){S.event.special[e]={setup:function(){return Ae(this,e,Se),!1},trigger:function(){return Ae(this,e),!0},delegateType:t}}),S.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(e,i){S.event.special[e]={delegateType:i,bindType:i,handle:function(e){var t,n=e.relatedTarget,r=e.handleObj;return n&&(n===this||S.contains(this,n))||(e.type=r.origType,t=r.handler.apply(this,arguments),e.type=i),t}}}),S.fn.extend({on:function(e,t,n,r){return ke(this,e,t,n,r)},one:function(e,t,n,r){return ke(this,e,t,n,r,1)},off:function(e,t,n){var r,i;if(e&&e.preventDefault&&e.handleObj)return r=e.handleObj,S(e.delegateTarget).off(r.namespace?r.origType+"."+r.namespace:r.origType,r.selector,r.handler),this;if("object"==typeof e){for(i in e)this.off(i,t,e[i]);return this}return!1!==t&&"function"!=typeof t||(n=t,t=void 0),!1===n&&(n=Ee),this.each(function(){S.event.remove(this,e,n,t)})}});var Ne=/<script|<style|<link/i,De=/checked\s*(?:[^=]|=\s*.checked.)/i,je=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;function qe(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function Le(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function He(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Oe(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n<r;n++)S.event.add(t,i,s[i][n]);Q.hasData(e)&&(o=Q.access(e),a=S.extend({},o),Q.set(t,a))}}function Pe(n,r,i,o){r=g(r);var e,t,a,s,u,l,c=0,f=n.length,p=f-1,d=r[0],h=m(d);if(h||1<f&&"string"==typeof d&&!y.checkClone&&De.test(d))return n.each(function(e){var t=n.eq(e);h&&(r[0]=d.call(this,e,t.html())),Pe(t,r,i,o)});if(f&&(t=(e=xe(r,n[0].ownerDocument,!1,n,o)).firstChild,1===e.childNodes.length&&(e=t),t||o)){for(s=(a=S.map(ve(e,"script"),Le)).length;c<f;c++)u=e,c!==p&&(u=S.clone(u,!0,!0),s&&S.merge(a,ve(u,"script"))),i.call(n[c],u,c);if(s)for(l=a[a.length-1].ownerDocument,S.map(a,He),c=0;c<s;c++)u=a[c],he.test(u.type||"")&&!Y.access(u,"globalEval")&&S.contains(l,u)&&(u.src&&"module"!==(u.type||"").toLowerCase()?S._evalUrl&&!u.noModule&&S._evalUrl(u.src,{nonce:u.nonce||u.getAttribute("nonce")},l):b(u.textContent.replace(je,""),u,l))}return n}function Re(e,t,n){for(var r,i=t?S.filter(t,e):e,o=0;null!=(r=i[o]);o++)n||1!==r.nodeType||S.cleanData(ve(r)),r.parentNode&&(n&&ie(r)&&ye(ve(r,"script")),r.parentNode.removeChild(r));return e}S.extend({htmlPrefilter:function(e){return e},clone:function(e,t,n){var r,i,o,a,s,u,l,c=e.cloneNode(!0),f=ie(e);if(!(y.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||S.isXMLDoc(e)))for(a=ve(c),r=0,i=(o=ve(e)).length;r<i;r++)s=o[r],u=a[r],void 0,"input"===(l=u.nodeName.toLowerCase())&&pe.test(s.type)?u.checked=s.checked:"input"!==l&&"textarea"!==l||(u.defaultValue=s.defaultValue);if(t)if(n)for(o=o||ve(e),a=a||ve(c),r=0,i=o.length;r<i;r++)Oe(o[r],a[r]);else Oe(e,c);return 0<(a=ve(c,"script")).length&&ye(a,!f&&ve(e,"script")),c},cleanData:function(e){for(var t,n,r,i=S.event.special,o=0;void 0!==(n=e[o]);o++)if(V(n)){if(t=n[Y.expando]){if(t.events)for(r in t.events)i[r]?S.event.remove(n,r):S.removeEvent(n,r,t.handle);n[Y.expando]=void 0}n[Q.expando]&&(n[Q.expando]=void 0)}}}),S.fn.extend({detach:function(e){return Re(this,e,!0)},remove:function(e){return Re(this,e)},text:function(e){return $(this,function(e){return void 0===e?S.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=e)})},null,e,arguments.length)},append:function(){return Pe(this,arguments,function(e){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||qe(this,e).appendChild(e)})},prepend:function(){return Pe(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=qe(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return Pe(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return Pe(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},empty:function(){for(var e,t=0;null!=(e=this[t]);t++)1===e.nodeType&&(S.cleanData(ve(e,!1)),e.textContent="");return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map(function(){return S.clone(this,e,t)})},html:function(e){return $(this,function(e){var t=this[0]||{},n=0,r=this.length;if(void 0===e&&1===t.nodeType)return t.innerHTML;if("string"==typeof e&&!Ne.test(e)&&!ge[(de.exec(e)||["",""])[1].toLowerCase()]){e=S.htmlPrefilter(e);try{for(;n<r;n++)1===(t=this[n]||{}).nodeType&&(S.cleanData(ve(t,!1)),t.innerHTML=e);t=0}catch(e){}}t&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(){var n=[];return Pe(this,arguments,function(e){var t=this.parentNode;S.inArray(this,n)<0&&(S.cleanData(ve(this)),t&&t.replaceChild(e,this))},n)}}),S.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,a){S.fn[e]=function(e){for(var t,n=[],r=S(e),i=r.length-1,o=0;o<=i;o++)t=o===i?this:this.clone(!0),S(r[o])[a](t),u.apply(n,t.get());return this.pushStack(n)}});var Me=new RegExp("^("+ee+")(?!px)[a-z%]+$","i"),Ie=function(e){var t=e.ownerDocument.defaultView;return t&&t.opener||(t=C),t.getComputedStyle(e)},We=function(e,t,n){var r,i,o={};for(i in t)o[i]=e.style[i],e.style[i]=t[i];for(i in r=n.call(e),t)e.style[i]=o[i];return r},Fe=new RegExp(ne.join("|"),"i");function Be(e,t,n){var r,i,o,a,s=e.style;return(n=n||Ie(e))&&(""!==(a=n.getPropertyValue(t)||n[t])||ie(e)||(a=S.style(e,t)),!y.pixelBoxStyles()&&Me.test(a)&&Fe.test(t)&&(r=s.width,i=s.minWidth,o=s.maxWidth,s.minWidth=s.maxWidth=s.width=a,a=n.width,s.width=r,s.minWidth=i,s.maxWidth=o)),void 0!==a?a+"":a}function $e(e,t){return{get:function(){if(!e())return(this.get=t).apply(this,arguments);delete this.get}}}!function(){function e(){if(l){u.style.cssText="position:absolute;left:-11111px;width:60px;margin-top:1px;padding:0;border:0",l.style.cssText="position:relative;display:block;box-sizing:border-box;overflow:scroll;margin:auto;border:1px;padding:1px;width:60%;top:1%",re.appendChild(u).appendChild(l);var e=C.getComputedStyle(l);n="1%"!==e.top,s=12===t(e.marginLeft),l.style.right="60%",o=36===t(e.right),r=36===t(e.width),l.style.position="absolute",i=12===t(l.offsetWidth/3),re.removeChild(u),l=null}}function t(e){return Math.round(parseFloat(e))}var n,r,i,o,a,s,u=E.createElement("div"),l=E.createElement("div");l.style&&(l.style.backgroundClip="content-box",l.cloneNode(!0).style.backgroundClip="",y.clearCloneStyle="content-box"===l.style.backgroundClip,S.extend(y,{boxSizingReliable:function(){return e(),r},pixelBoxStyles:function(){return e(),o},pixelPosition:function(){return e(),n},reliableMarginLeft:function(){return e(),s},scrollboxSize:function(){return e(),i},reliableTrDimensions:function(){var e,t,n,r;return null==a&&(e=E.createElement("table"),t=E.createElement("tr"),n=E.createElement("div"),e.style.cssText="position:absolute;left:-11111px",t.style.height="1px",n.style.height="9px",re.appendChild(e).appendChild(t).appendChild(n),r=C.getComputedStyle(t),a=3<parseInt(r.height),re.removeChild(e)),a}}))}();var _e=["Webkit","Moz","ms"],ze=E.createElement("div").style,Ue={};function Xe(e){var t=S.cssProps[e]||Ue[e];return t||(e in ze?e:Ue[e]=function(e){var t=e[0].toUpperCase()+e.slice(1),n=_e.length;while(n--)if((e=_e[n]+t)in ze)return e}(e)||e)}var Ve=/^(none|table(?!-c[ea]).+)/,Ge=/^--/,Ye={position:"absolute",visibility:"hidden",display:"block"},Qe={letterSpacing:"0",fontWeight:"400"};function Je(e,t,n){var r=te.exec(t);return r?Math.max(0,r[2]-(n||0))+(r[3]||"px"):t}function Ke(e,t,n,r,i,o){var a="width"===t?1:0,s=0,u=0;if(n===(r?"border":"content"))return 0;for(;a<4;a+=2)"margin"===n&&(u+=S.css(e,n+ne[a],!0,i)),r?("content"===n&&(u-=S.css(e,"padding"+ne[a],!0,i)),"margin"!==n&&(u-=S.css(e,"border"+ne[a]+"Width",!0,i))):(u+=S.css(e,"padding"+ne[a],!0,i),"padding"!==n?u+=S.css(e,"border"+ne[a]+"Width",!0,i):s+=S.css(e,"border"+ne[a]+"Width",!0,i));return!r&&0<=o&&(u+=Math.max(0,Math.ceil(e["offset"+t[0].toUpperCase()+t.slice(1)]-o-u-s-.5))||0),u}function Ze(e,t,n){var r=Ie(e),i=(!y.boxSizingReliable()||n)&&"border-box"===S.css(e,"boxSizing",!1,r),o=i,a=Be(e,t,r),s="offset"+t[0].toUpperCase()+t.slice(1);if(Me.test(a)){if(!n)return a;a="auto"}return(!y.boxSizingReliable()&&i||!y.reliableTrDimensions()&&A(e,"tr")||"auto"===a||!parseFloat(a)&&"inline"===S.css(e,"display",!1,r))&&e.getClientRects().length&&(i="border-box"===S.css(e,"boxSizing",!1,r),(o=s in e)&&(a=e[s])),(a=parseFloat(a)||0)+Ke(e,t,n||(i?"border":"content"),o,r,a)+"px"}function et(e,t,n,r,i){return new et.prototype.init(e,t,n,r,i)}S.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=Be(e,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,gridArea:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnStart:!0,gridRow:!0,gridRowEnd:!0,gridRowStart:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{},style:function(e,t,n,r){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var i,o,a,s=X(t),u=Ge.test(t),l=e.style;if(u||(t=Xe(s)),a=S.cssHooks[t]||S.cssHooks[s],void 0===n)return a&&"get"in a&&void 0!==(i=a.get(e,!1,r))?i:l[t];"string"===(o=typeof n)&&(i=te.exec(n))&&i[1]&&(n=se(e,t,i),o="number"),null!=n&&n==n&&("number"!==o||u||(n+=i&&i[3]||(S.cssNumber[s]?"":"px")),y.clearCloneStyle||""!==n||0!==t.indexOf("background")||(l[t]="inherit"),a&&"set"in a&&void 0===(n=a.set(e,n,r))||(u?l.setProperty(t,n):l[t]=n))}},css:function(e,t,n,r){var i,o,a,s=X(t);return Ge.test(t)||(t=Xe(s)),(a=S.cssHooks[t]||S.cssHooks[s])&&"get"in a&&(i=a.get(e,!0,n)),void 0===i&&(i=Be(e,t,r)),"normal"===i&&t in Qe&&(i=Qe[t]),""===n||n?(o=parseFloat(i),!0===n||isFinite(o)?o||0:i):i}}),S.each(["height","width"],function(e,u){S.cssHooks[u]={get:function(e,t,n){if(t)return!Ve.test(S.css(e,"display"))||e.getClientRects().length&&e.getBoundingClientRect().width?Ze(e,u,n):We(e,Ye,function(){return Ze(e,u,n)})},set:function(e,t,n){var r,i=Ie(e),o=!y.scrollboxSize()&&"absolute"===i.position,a=(o||n)&&"border-box"===S.css(e,"boxSizing",!1,i),s=n?Ke(e,u,n,a,i):0;return a&&o&&(s-=Math.ceil(e["offset"+u[0].toUpperCase()+u.slice(1)]-parseFloat(i[u])-Ke(e,u,"border",!1,i)-.5)),s&&(r=te.exec(t))&&"px"!==(r[3]||"px")&&(e.style[u]=t,t=S.css(e,u)),Je(0,t,s)}}}),S.cssHooks.marginLeft=$e(y.reliableMarginLeft,function(e,t){if(t)return(parseFloat(Be(e,"marginLeft"))||e.getBoundingClientRect().left-We(e,{marginLeft:0},function(){return e.getBoundingClientRect().left}))+"px"}),S.each({margin:"",padding:"",border:"Width"},function(i,o){S.cssHooks[i+o]={expand:function(e){for(var t=0,n={},r="string"==typeof e?e.split(" "):[e];t<4;t++)n[i+ne[t]+o]=r[t]||r[t-2]||r[0];return n}},"margin"!==i&&(S.cssHooks[i+o].set=Je)}),S.fn.extend({css:function(e,t){return $(this,function(e,t,n){var r,i,o={},a=0;if(Array.isArray(t)){for(r=Ie(e),i=t.length;a<i;a++)o[t[a]]=S.css(e,t[a],!1,r);return o}return void 0!==n?S.style(e,t,n):S.css(e,t)},e,t,1<arguments.length)}}),((S.Tween=et).prototype={constructor:et,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||S.easing._default,this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(S.cssNumber[n]?"":"px")},cur:function(){var e=et.propHooks[this.prop];return e&&e.get?e.get(this):et.propHooks._default.get(this)},run:function(e){var t,n=et.propHooks[this.prop];return this.options.duration?this.pos=t=S.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=t=e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):et.propHooks._default.set(this),this}}).init.prototype=et.prototype,(et.propHooks={_default:{get:function(e){var t;return 1!==e.elem.nodeType||null!=e.elem[e.prop]&&null==e.elem.style[e.prop]?e.elem[e.prop]:(t=S.css(e.elem,e.prop,""))&&"auto"!==t?t:0},set:function(e){S.fx.step[e.prop]?S.fx.step[e.prop](e):1!==e.elem.nodeType||!S.cssHooks[e.prop]&&null==e.elem.style[Xe(e.prop)]?e.elem[e.prop]=e.now:S.style(e.elem,e.prop,e.now+e.unit)}}}).scrollTop=et.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},S.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2},_default:"swing"},S.fx=et.prototype.init,S.fx.step={};var tt,nt,rt,it,ot=/^(?:toggle|show|hide)$/,at=/queueHooks$/;function st(){nt&&(!1===E.hidden&&C.requestAnimationFrame?C.requestAnimationFrame(st):C.setTimeout(st,S.fx.interval),S.fx.tick())}function ut(){return C.setTimeout(function(){tt=void 0}),tt=Date.now()}function lt(e,t){var n,r=0,i={height:e};for(t=t?1:0;r<4;r+=2-t)i["margin"+(n=ne[r])]=i["padding"+n]=e;return t&&(i.opacity=i.width=e),i}function ct(e,t,n){for(var r,i=(ft.tweeners[t]||[]).concat(ft.tweeners["*"]),o=0,a=i.length;o<a;o++)if(r=i[o].call(n,t,e))return r}function ft(o,e,t){var n,a,r=0,i=ft.prefilters.length,s=S.Deferred().always(function(){delete u.elem}),u=function(){if(a)return!1;for(var e=tt||ut(),t=Math.max(0,l.startTime+l.duration-e),n=1-(t/l.duration||0),r=0,i=l.tweens.length;r<i;r++)l.tweens[r].run(n);return s.notifyWith(o,[l,n,t]),n<1&&i?t:(i||s.notifyWith(o,[l,1,0]),s.resolveWith(o,[l]),!1)},l=s.promise({elem:o,props:S.extend({},e),opts:S.extend(!0,{specialEasing:{},easing:S.easing._default},t),originalProperties:e,originalOptions:t,startTime:tt||ut(),duration:t.duration,tweens:[],createTween:function(e,t){var n=S.Tween(o,l.opts,e,t,l.opts.specialEasing[e]||l.opts.easing);return l.tweens.push(n),n},stop:function(e){var t=0,n=e?l.tweens.length:0;if(a)return this;for(a=!0;t<n;t++)l.tweens[t].run(1);return e?(s.notifyWith(o,[l,1,0]),s.resolveWith(o,[l,e])):s.rejectWith(o,[l,e]),this}}),c=l.props;for(!function(e,t){var n,r,i,o,a;for(n in e)if(i=t[r=X(n)],o=e[n],Array.isArray(o)&&(i=o[1],o=e[n]=o[0]),n!==r&&(e[r]=o,delete e[n]),(a=S.cssHooks[r])&&"expand"in a)for(n in o=a.expand(o),delete e[r],o)n in e||(e[n]=o[n],t[n]=i);else t[r]=i}(c,l.opts.specialEasing);r<i;r++)if(n=ft.prefilters[r].call(l,o,c,l.opts))return m(n.stop)&&(S._queueHooks(l.elem,l.opts.queue).stop=n.stop.bind(n)),n;return S.map(c,ct,l),m(l.opts.start)&&l.opts.start.call(o,l),l.progress(l.opts.progress).done(l.opts.done,l.opts.complete).fail(l.opts.fail).always(l.opts.always),S.fx.timer(S.extend(u,{elem:o,anim:l,queue:l.opts.queue})),l}S.Animation=S.extend(ft,{tweeners:{"*":[function(e,t){var n=this.createTween(e,t);return se(n.elem,e,te.exec(t),n),n}]},tweener:function(e,t){m(e)?(t=e,e=["*"]):e=e.match(P);for(var n,r=0,i=e.length;r<i;r++)n=e[r],ft.tweeners[n]=ft.tweeners[n]||[],ft.tweeners[n].unshift(t)},prefilters:[function(e,t,n){var r,i,o,a,s,u,l,c,f="width"in t||"height"in t,p=this,d={},h=e.style,g=e.nodeType&&ae(e),v=Y.get(e,"fxshow");for(r in n.queue||(null==(a=S._queueHooks(e,"fx")).unqueued&&(a.unqueued=0,s=a.empty.fire,a.empty.fire=function(){a.unqueued||s()}),a.unqueued++,p.always(function(){p.always(function(){a.unqueued--,S.queue(e,"fx").length||a.empty.fire()})})),t)if(i=t[r],ot.test(i)){if(delete t[r],o=o||"toggle"===i,i===(g?"hide":"show")){if("show"!==i||!v||void 0===v[r])continue;g=!0}d[r]=v&&v[r]||S.style(e,r)}if((u=!S.isEmptyObject(t))||!S.isEmptyObject(d))for(r in f&&1===e.nodeType&&(n.overflow=[h.overflow,h.overflowX,h.overflowY],null==(l=v&&v.display)&&(l=Y.get(e,"display")),"none"===(c=S.css(e,"display"))&&(l?c=l:(le([e],!0),l=e.style.display||l,c=S.css(e,"display"),le([e]))),("inline"===c||"inline-block"===c&&null!=l)&&"none"===S.css(e,"float")&&(u||(p.done(function(){h.display=l}),null==l&&(c=h.display,l="none"===c?"":c)),h.display="inline-block")),n.overflow&&(h.overflow="hidden",p.always(function(){h.overflow=n.overflow[0],h.overflowX=n.overflow[1],h.overflowY=n.overflow[2]})),u=!1,d)u||(v?"hidden"in v&&(g=v.hidden):v=Y.access(e,"fxshow",{display:l}),o&&(v.hidden=!g),g&&le([e],!0),p.done(function(){for(r in g||le([e]),Y.remove(e,"fxshow"),d)S.style(e,r,d[r])})),u=ct(g?v[r]:0,r,p),r in v||(v[r]=u.start,g&&(u.end=u.start,u.start=0))}],prefilter:function(e,t){t?ft.prefilters.unshift(e):ft.prefilters.push(e)}}),S.speed=function(e,t,n){var r=e&&"object"==typeof e?S.extend({},e):{complete:n||!n&&t||m(e)&&e,duration:e,easing:n&&t||t&&!m(t)&&t};return S.fx.off?r.duration=0:"number"!=typeof r.duration&&(r.duration in S.fx.speeds?r.duration=S.fx.speeds[r.duration]:r.duration=S.fx.speeds._default),null!=r.queue&&!0!==r.queue||(r.queue="fx"),r.old=r.complete,r.complete=function(){m(r.old)&&r.old.call(this),r.queue&&S.dequeue(this,r.queue)},r},S.fn.extend({fadeTo:function(e,t,n,r){return this.filter(ae).css("opacity",0).show().end().animate({opacity:t},e,n,r)},animate:function(t,e,n,r){var i=S.isEmptyObject(t),o=S.speed(e,n,r),a=function(){var e=ft(this,S.extend({},t),o);(i||Y.get(this,"finish"))&&e.stop(!0)};return a.finish=a,i||!1===o.queue?this.each(a):this.queue(o.queue,a)},stop:function(i,e,o){var a=function(e){var t=e.stop;delete e.stop,t(o)};return"string"!=typeof i&&(o=e,e=i,i=void 0),e&&this.queue(i||"fx",[]),this.each(function(){var e=!0,t=null!=i&&i+"queueHooks",n=S.timers,r=Y.get(this);if(t)r[t]&&r[t].stop&&a(r[t]);else for(t in r)r[t]&&r[t].stop&&at.test(t)&&a(r[t]);for(t=n.length;t--;)n[t].elem!==this||null!=i&&n[t].queue!==i||(n[t].anim.stop(o),e=!1,n.splice(t,1));!e&&o||S.dequeue(this,i)})},finish:function(a){return!1!==a&&(a=a||"fx"),this.each(function(){var e,t=Y.get(this),n=t[a+"queue"],r=t[a+"queueHooks"],i=S.timers,o=n?n.length:0;for(t.finish=!0,S.queue(this,a,[]),r&&r.stop&&r.stop.call(this,!0),e=i.length;e--;)i[e].elem===this&&i[e].queue===a&&(i[e].anim.stop(!0),i.splice(e,1));for(e=0;e<o;e++)n[e]&&n[e].finish&&n[e].finish.call(this);delete t.finish})}}),S.each(["toggle","show","hide"],function(e,r){var i=S.fn[r];S.fn[r]=function(e,t,n){return null==e||"boolean"==typeof e?i.apply(this,arguments):this.animate(lt(r,!0),e,t,n)}}),S.each({slideDown:lt("show"),slideUp:lt("hide"),slideToggle:lt("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,r){S.fn[e]=function(e,t,n){return this.animate(r,e,t,n)}}),S.timers=[],S.fx.tick=function(){var e,t=0,n=S.timers;for(tt=Date.now();t<n.length;t++)(e=n[t])()||n[t]!==e||n.splice(t--,1);n.length||S.fx.stop(),tt=void 0},S.fx.timer=function(e){S.timers.push(e),S.fx.start()},S.fx.interval=13,S.fx.start=function(){nt||(nt=!0,st())},S.fx.stop=function(){nt=null},S.fx.speeds={slow:600,fast:200,_default:400},S.fn.delay=function(r,e){return r=S.fx&&S.fx.speeds[r]||r,e=e||"fx",this.queue(e,function(e,t){var n=C.setTimeout(e,r);t.stop=function(){C.clearTimeout(n)}})},rt=E.createElement("input"),it=E.createElement("select").appendChild(E.createElement("option")),rt.type="checkbox",y.checkOn=""!==rt.value,y.optSelected=it.selected,(rt=E.createElement("input")).value="t",rt.type="radio",y.radioValue="t"===rt.value;var pt,dt=S.expr.attrHandle;S.fn.extend({attr:function(e,t){return $(this,S.attr,e,t,1<arguments.length)},removeAttr:function(e){return this.each(function(){S.removeAttr(this,e)})}}),S.extend({attr:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return"undefined"==typeof e.getAttribute?S.prop(e,t,n):(1===o&&S.isXMLDoc(e)||(i=S.attrHooks[t.toLowerCase()]||(S.expr.match.bool.test(t)?pt:void 0)),void 0!==n?null===n?void S.removeAttr(e,t):i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:(e.setAttribute(t,n+""),n):i&&"get"in i&&null!==(r=i.get(e,t))?r:null==(r=S.find.attr(e,t))?void 0:r)},attrHooks:{type:{set:function(e,t){if(!y.radioValue&&"radio"===t&&A(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},removeAttr:function(e,t){var n,r=0,i=t&&t.match(P);if(i&&1===e.nodeType)while(n=i[r++])e.removeAttribute(n)}}),pt={set:function(e,t,n){return!1===t?S.removeAttr(e,n):e.setAttribute(n,n),n}},S.each(S.expr.match.bool.source.match(/\w+/g),function(e,t){var a=dt[t]||S.find.attr;dt[t]=function(e,t,n){var r,i,o=t.toLowerCase();return n||(i=dt[o],dt[o]=r,r=null!=a(e,t,n)?o:null,dt[o]=i),r}});var ht=/^(?:input|select|textarea|button)$/i,gt=/^(?:a|area)$/i;function vt(e){return(e.match(P)||[]).join(" ")}function yt(e){return e.getAttribute&&e.getAttribute("class")||""}function mt(e){return Array.isArray(e)?e:"string"==typeof e&&e.match(P)||[]}S.fn.extend({prop:function(e,t){return $(this,S.prop,e,t,1<arguments.length)},removeProp:function(e){return this.each(function(){delete this[S.propFix[e]||e]})}}),S.extend({prop:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return 1===o&&S.isXMLDoc(e)||(t=S.propFix[t]||t,i=S.propHooks[t]),void 0!==n?i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:e[t]=n:i&&"get"in i&&null!==(r=i.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){var t=S.find.attr(e,"tabindex");return t?parseInt(t,10):ht.test(e.nodeName)||gt.test(e.nodeName)&&e.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),y.optSelected||(S.propHooks.selected={get:function(e){var t=e.parentNode;return t&&t.parentNode&&t.parentNode.selectedIndex,null},set:function(e){var t=e.parentNode;t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex)}}),S.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){S.propFix[this.toLowerCase()]=this}),S.fn.extend({addClass:function(t){var e,n,r,i,o,a,s,u=0;if(m(t))return this.each(function(e){S(this).addClass(t.call(this,e,yt(this)))});if((e=mt(t)).length)while(n=this[u++])if(i=yt(n),r=1===n.nodeType&&" "+vt(i)+" "){a=0;while(o=e[a++])r.indexOf(" "+o+" ")<0&&(r+=o+" ");i!==(s=vt(r))&&n.setAttribute("class",s)}return this},removeClass:function(t){var e,n,r,i,o,a,s,u=0;if(m(t))return this.each(function(e){S(this).removeClass(t.call(this,e,yt(this)))});if(!arguments.length)return this.attr("class","");if((e=mt(t)).length)while(n=this[u++])if(i=yt(n),r=1===n.nodeType&&" "+vt(i)+" "){a=0;while(o=e[a++])while(-1<r.indexOf(" "+o+" "))r=r.replace(" "+o+" "," ");i!==(s=vt(r))&&n.setAttribute("class",s)}return this},toggleClass:function(i,t){var o=typeof i,a="string"===o||Array.isArray(i);return"boolean"==typeof t&&a?t?this.addClass(i):this.removeClass(i):m(i)?this.each(function(e){S(this).toggleClass(i.call(this,e,yt(this),t),t)}):this.each(function(){var e,t,n,r;if(a){t=0,n=S(this),r=mt(i);while(e=r[t++])n.hasClass(e)?n.removeClass(e):n.addClass(e)}else void 0!==i&&"boolean"!==o||((e=yt(this))&&Y.set(this,"__className__",e),this.setAttribute&&this.setAttribute("class",e||!1===i?"":Y.get(this,"__className__")||""))})},hasClass:function(e){var t,n,r=0;t=" "+e+" ";while(n=this[r++])if(1===n.nodeType&&-1<(" "+vt(yt(n))+" ").indexOf(t))return!0;return!1}});var xt=/\r/g;S.fn.extend({val:function(n){var r,e,i,t=this[0];return arguments.length?(i=m(n),this.each(function(e){var t;1===this.nodeType&&(null==(t=i?n.call(this,e,S(this).val()):n)?t="":"number"==typeof t?t+="":Array.isArray(t)&&(t=S.map(t,function(e){return null==e?"":e+""})),(r=S.valHooks[this.type]||S.valHooks[this.nodeName.toLowerCase()])&&"set"in r&&void 0!==r.set(this,t,"value")||(this.value=t))})):t?(r=S.valHooks[t.type]||S.valHooks[t.nodeName.toLowerCase()])&&"get"in r&&void 0!==(e=r.get(t,"value"))?e:"string"==typeof(e=t.value)?e.replace(xt,""):null==e?"":e:void 0}}),S.extend({valHooks:{option:{get:function(e){var t=S.find.attr(e,"value");return null!=t?t:vt(S.text(e))}},select:{get:function(e){var t,n,r,i=e.options,o=e.selectedIndex,a="select-one"===e.type,s=a?null:[],u=a?o+1:i.length;for(r=o<0?u:a?o:0;r<u;r++)if(((n=i[r]).selected||r===o)&&!n.disabled&&(!n.parentNode.disabled||!A(n.parentNode,"optgroup"))){if(t=S(n).val(),a)return t;s.push(t)}return s},set:function(e,t){var n,r,i=e.options,o=S.makeArray(t),a=i.length;while(a--)((r=i[a]).selected=-1<S.inArray(S.valHooks.option.get(r),o))&&(n=!0);return n||(e.selectedIndex=-1),o}}}}),S.each(["radio","checkbox"],function(){S.valHooks[this]={set:function(e,t){if(Array.isArray(t))return e.checked=-1<S.inArray(S(e).val(),t)}},y.checkOn||(S.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})}),y.focusin="onfocusin"in C;var bt=/^(?:focusinfocus|focusoutblur)$/,wt=function(e){e.stopPropagation()};S.extend(S.event,{trigger:function(e,t,n,r){var i,o,a,s,u,l,c,f,p=[n||E],d=v.call(e,"type")?e.type:e,h=v.call(e,"namespace")?e.namespace.split("."):[];if(o=f=a=n=n||E,3!==n.nodeType&&8!==n.nodeType&&!bt.test(d+S.event.triggered)&&(-1<d.indexOf(".")&&(d=(h=d.split(".")).shift(),h.sort()),u=d.indexOf(":")<0&&"on"+d,(e=e[S.expando]?e:new S.Event(d,"object"==typeof e&&e)).isTrigger=r?2:3,e.namespace=h.join("."),e.rnamespace=e.namespace?new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,e.result=void 0,e.target||(e.target=n),t=null==t?[e]:S.makeArray(t,[e]),c=S.event.special[d]||{},r||!c.trigger||!1!==c.trigger.apply(n,t))){if(!r&&!c.noBubble&&!x(n)){for(s=c.delegateType||d,bt.test(s+d)||(o=o.parentNode);o;o=o.parentNode)p.push(o),a=o;a===(n.ownerDocument||E)&&p.push(a.defaultView||a.parentWindow||C)}i=0;while((o=p[i++])&&!e.isPropagationStopped())f=o,e.type=1<i?s:c.bindType||d,(l=(Y.get(o,"events")||Object.create(null))[e.type]&&Y.get(o,"handle"))&&l.apply(o,t),(l=u&&o[u])&&l.apply&&V(o)&&(e.result=l.apply(o,t),!1===e.result&&e.preventDefault());return e.type=d,r||e.isDefaultPrevented()||c._default&&!1!==c._default.apply(p.pop(),t)||!V(n)||u&&m(n[d])&&!x(n)&&((a=n[u])&&(n[u]=null),S.event.triggered=d,e.isPropagationStopped()&&f.addEventListener(d,wt),n[d](),e.isPropagationStopped()&&f.removeEventListener(d,wt),S.event.triggered=void 0,a&&(n[u]=a)),e.result}},simulate:function(e,t,n){var r=S.extend(new S.Event,n,{type:e,isSimulated:!0});S.event.trigger(r,null,t)}}),S.fn.extend({trigger:function(e,t){return this.each(function(){S.event.trigger(e,t,this)})},triggerHandler:function(e,t){var n=this[0];if(n)return S.event.trigger(e,t,n,!0)}}),y.focusin||S.each({focus:"focusin",blur:"focusout"},function(n,r){var i=function(e){S.event.simulate(r,e.target,S.event.fix(e))};S.event.special[r]={setup:function(){var e=this.ownerDocument||this.document||this,t=Y.access(e,r);t||e.addEventListener(n,i,!0),Y.access(e,r,(t||0)+1)},teardown:function(){var e=this.ownerDocument||this.document||this,t=Y.access(e,r)-1;t?Y.access(e,r,t):(e.removeEventListener(n,i,!0),Y.remove(e,r))}}});var Tt=C.location,Ct={guid:Date.now()},Et=/\?/;S.parseXML=function(e){var t;if(!e||"string"!=typeof e)return null;try{t=(new C.DOMParser).parseFromString(e,"text/xml")}catch(e){t=void 0}return t&&!t.getElementsByTagName("parsererror").length||S.error("Invalid XML: "+e),t};var St=/\[\]$/,kt=/\r?\n/g,At=/^(?:submit|button|image|reset|file)$/i,Nt=/^(?:input|select|textarea|keygen)/i;function Dt(n,e,r,i){var t;if(Array.isArray(e))S.each(e,function(e,t){r||St.test(n)?i(n,t):Dt(n+"["+("object"==typeof t&&null!=t?e:"")+"]",t,r,i)});else if(r||"object"!==w(e))i(n,e);else for(t in e)Dt(n+"["+t+"]",e[t],r,i)}S.param=function(e,t){var n,r=[],i=function(e,t){var n=m(t)?t():t;r[r.length]=encodeURIComponent(e)+"="+encodeURIComponent(null==n?"":n)};if(null==e)return"";if(Array.isArray(e)||e.jquery&&!S.isPlainObject(e))S.each(e,function(){i(this.name,this.value)});else for(n in e)Dt(n,e[n],t,i);return r.join("&")},S.fn.extend({serialize:function(){return S.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=S.prop(this,"elements");return e?S.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!S(this).is(":disabled")&&Nt.test(this.nodeName)&&!At.test(e)&&(this.checked||!pe.test(e))}).map(function(e,t){var n=S(this).val();return null==n?null:Array.isArray(n)?S.map(n,function(e){return{name:t.name,value:e.replace(kt,"\r\n")}}):{name:t.name,value:n.replace(kt,"\r\n")}}).get()}});var jt=/%20/g,qt=/#.*$/,Lt=/([?&])_=[^&]*/,Ht=/^(.*?):[ \t]*([^\r\n]*)$/gm,Ot=/^(?:GET|HEAD)$/,Pt=/^\/\//,Rt={},Mt={},It="*/".concat("*"),Wt=E.createElement("a");function Ft(o){return function(e,t){"string"!=typeof e&&(t=e,e="*");var n,r=0,i=e.toLowerCase().match(P)||[];if(m(t))while(n=i[r++])"+"===n[0]?(n=n.slice(1)||"*",(o[n]=o[n]||[]).unshift(t)):(o[n]=o[n]||[]).push(t)}}function Bt(t,i,o,a){var s={},u=t===Mt;function l(e){var r;return s[e]=!0,S.each(t[e]||[],function(e,t){var n=t(i,o,a);return"string"!=typeof n||u||s[n]?u?!(r=n):void 0:(i.dataTypes.unshift(n),l(n),!1)}),r}return l(i.dataTypes[0])||!s["*"]&&l("*")}function $t(e,t){var n,r,i=S.ajaxSettings.flatOptions||{};for(n in t)void 0!==t[n]&&((i[n]?e:r||(r={}))[n]=t[n]);return r&&S.extend(!0,e,r),e}Wt.href=Tt.href,S.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:Tt.href,type:"GET",isLocal:/^(?:about|app|app-storage|.+-extension|file|res|widget):$/.test(Tt.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":It,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":S.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?$t($t(e,S.ajaxSettings),t):$t(S.ajaxSettings,e)},ajaxPrefilter:Ft(Rt),ajaxTransport:Ft(Mt),ajax:function(e,t){"object"==typeof e&&(t=e,e=void 0),t=t||{};var c,f,p,n,d,r,h,g,i,o,v=S.ajaxSetup({},t),y=v.context||v,m=v.context&&(y.nodeType||y.jquery)?S(y):S.event,x=S.Deferred(),b=S.Callbacks("once memory"),w=v.statusCode||{},a={},s={},u="canceled",T={readyState:0,getResponseHeader:function(e){var t;if(h){if(!n){n={};while(t=Ht.exec(p))n[t[1].toLowerCase()+" "]=(n[t[1].toLowerCase()+" "]||[]).concat(t[2])}t=n[e.toLowerCase()+" "]}return null==t?null:t.join(", ")},getAllResponseHeaders:function(){return h?p:null},setRequestHeader:function(e,t){return null==h&&(e=s[e.toLowerCase()]=s[e.toLowerCase()]||e,a[e]=t),this},overrideMimeType:function(e){return null==h&&(v.mimeType=e),this},statusCode:function(e){var t;if(e)if(h)T.always(e[T.status]);else for(t in e)w[t]=[w[t],e[t]];return this},abort:function(e){var t=e||u;return c&&c.abort(t),l(0,t),this}};if(x.promise(T),v.url=((e||v.url||Tt.href)+"").replace(Pt,Tt.protocol+"//"),v.type=t.method||t.type||v.method||v.type,v.dataTypes=(v.dataType||"*").toLowerCase().match(P)||[""],null==v.crossDomain){r=E.createElement("a");try{r.href=v.url,r.href=r.href,v.crossDomain=Wt.protocol+"//"+Wt.host!=r.protocol+"//"+r.host}catch(e){v.crossDomain=!0}}if(v.data&&v.processData&&"string"!=typeof v.data&&(v.data=S.param(v.data,v.traditional)),Bt(Rt,v,t,T),h)return T;for(i in(g=S.event&&v.global)&&0==S.active++&&S.event.trigger("ajaxStart"),v.type=v.type.toUpperCase(),v.hasContent=!Ot.test(v.type),f=v.url.replace(qt,""),v.hasContent?v.data&&v.processData&&0===(v.contentType||"").indexOf("application/x-www-form-urlencoded")&&(v.data=v.data.replace(jt,"+")):(o=v.url.slice(f.length),v.data&&(v.processData||"string"==typeof v.data)&&(f+=(Et.test(f)?"&":"?")+v.data,delete v.data),!1===v.cache&&(f=f.replace(Lt,"$1"),o=(Et.test(f)?"&":"?")+"_="+Ct.guid+++o),v.url=f+o),v.ifModified&&(S.lastModified[f]&&T.setRequestHeader("If-Modified-Since",S.lastModified[f]),S.etag[f]&&T.setRequestHeader("If-None-Match",S.etag[f])),(v.data&&v.hasContent&&!1!==v.contentType||t.contentType)&&T.setRequestHeader("Content-Type",v.contentType),T.setRequestHeader("Accept",v.dataTypes[0]&&v.accepts[v.dataTypes[0]]?v.accepts[v.dataTypes[0]]+("*"!==v.dataTypes[0]?", "+It+"; q=0.01":""):v.accepts["*"]),v.headers)T.setRequestHeader(i,v.headers[i]);if(v.beforeSend&&(!1===v.beforeSend.call(y,T,v)||h))return T.abort();if(u="abort",b.add(v.complete),T.done(v.success),T.fail(v.error),c=Bt(Mt,v,t,T)){if(T.readyState=1,g&&m.trigger("ajaxSend",[T,v]),h)return T;v.async&&0<v.timeout&&(d=C.setTimeout(function(){T.abort("timeout")},v.timeout));try{h=!1,c.send(a,l)}catch(e){if(h)throw e;l(-1,e)}}else l(-1,"No Transport");function l(e,t,n,r){var i,o,a,s,u,l=t;h||(h=!0,d&&C.clearTimeout(d),c=void 0,p=r||"",T.readyState=0<e?4:0,i=200<=e&&e<300||304===e,n&&(s=function(e,t,n){var r,i,o,a,s=e.contents,u=e.dataTypes;while("*"===u[0])u.shift(),void 0===r&&(r=e.mimeType||t.getResponseHeader("Content-Type"));if(r)for(i in s)if(s[i]&&s[i].test(r)){u.unshift(i);break}if(u[0]in n)o=u[0];else{for(i in n){if(!u[0]||e.converters[i+" "+u[0]]){o=i;break}a||(a=i)}o=o||a}if(o)return o!==u[0]&&u.unshift(o),n[o]}(v,T,n)),!i&&-1<S.inArray("script",v.dataTypes)&&(v.converters["text script"]=function(){}),s=function(e,t,n,r){var i,o,a,s,u,l={},c=e.dataTypes.slice();if(c[1])for(a in e.converters)l[a.toLowerCase()]=e.converters[a];o=c.shift();while(o)if(e.responseFields[o]&&(n[e.responseFields[o]]=t),!u&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),u=o,o=c.shift())if("*"===o)o=u;else if("*"!==u&&u!==o){if(!(a=l[u+" "+o]||l["* "+o]))for(i in l)if((s=i.split(" "))[1]===o&&(a=l[u+" "+s[0]]||l["* "+s[0]])){!0===a?a=l[i]:!0!==l[i]&&(o=s[0],c.unshift(s[1]));break}if(!0!==a)if(a&&e["throws"])t=a(t);else try{t=a(t)}catch(e){return{state:"parsererror",error:a?e:"No conversion from "+u+" to "+o}}}return{state:"success",data:t}}(v,s,T,i),i?(v.ifModified&&((u=T.getResponseHeader("Last-Modified"))&&(S.lastModified[f]=u),(u=T.getResponseHeader("etag"))&&(S.etag[f]=u)),204===e||"HEAD"===v.type?l="nocontent":304===e?l="notmodified":(l=s.state,o=s.data,i=!(a=s.error))):(a=l,!e&&l||(l="error",e<0&&(e=0))),T.status=e,T.statusText=(t||l)+"",i?x.resolveWith(y,[o,l,T]):x.rejectWith(y,[T,l,a]),T.statusCode(w),w=void 0,g&&m.trigger(i?"ajaxSuccess":"ajaxError",[T,v,i?o:a]),b.fireWith(y,[T,l]),g&&(m.trigger("ajaxComplete",[T,v]),--S.active||S.event.trigger("ajaxStop")))}return T},getJSON:function(e,t,n){return S.get(e,t,n,"json")},getScript:function(e,t){return S.get(e,void 0,t,"script")}}),S.each(["get","post"],function(e,i){S[i]=function(e,t,n,r){return m(t)&&(r=r||n,n=t,t=void 0),S.ajax(S.extend({url:e,type:i,dataType:r,data:t,success:n},S.isPlainObject(e)&&e))}}),S.ajaxPrefilter(function(e){var t;for(t in e.headers)"content-type"===t.toLowerCase()&&(e.contentType=e.headers[t]||"")}),S._evalUrl=function(e,t,n){return S.ajax({url:e,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,converters:{"text script":function(){}},dataFilter:function(e){S.globalEval(e,t,n)}})},S.fn.extend({wrapAll:function(e){var t;return this[0]&&(m(e)&&(e=e.call(this[0])),t=S(e,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstElementChild)e=e.firstElementChild;return e}).append(this)),this},wrapInner:function(n){return m(n)?this.each(function(e){S(this).wrapInner(n.call(this,e))}):this.each(function(){var e=S(this),t=e.contents();t.length?t.wrapAll(n):e.append(n)})},wrap:function(t){var n=m(t);return this.each(function(e){S(this).wrapAll(n?t.call(this,e):t)})},unwrap:function(e){return this.parent(e).not("body").each(function(){S(this).replaceWith(this.childNodes)}),this}}),S.expr.pseudos.hidden=function(e){return!S.expr.pseudos.visible(e)},S.expr.pseudos.visible=function(e){return!!(e.offsetWidth||e.offsetHeight||e.getClientRects().length)},S.ajaxSettings.xhr=function(){try{return new C.XMLHttpRequest}catch(e){}};var _t={0:200,1223:204},zt=S.ajaxSettings.xhr();y.cors=!!zt&&"withCredentials"in zt,y.ajax=zt=!!zt,S.ajaxTransport(function(i){var o,a;if(y.cors||zt&&!i.crossDomain)return{send:function(e,t){var n,r=i.xhr();if(r.open(i.type,i.url,i.async,i.username,i.password),i.xhrFields)for(n in i.xhrFields)r[n]=i.xhrFields[n];for(n in i.mimeType&&r.overrideMimeType&&r.overrideMimeType(i.mimeType),i.crossDomain||e["X-Requested-With"]||(e["X-Requested-With"]="XMLHttpRequest"),e)r.setRequestHeader(n,e[n]);o=function(e){return function(){o&&(o=a=r.onload=r.onerror=r.onabort=r.ontimeout=r.onreadystatechange=null,"abort"===e?r.abort():"error"===e?"number"!=typeof r.status?t(0,"error"):t(r.status,r.statusText):t(_t[r.status]||r.status,r.statusText,"text"!==(r.responseType||"text")||"string"!=typeof r.responseText?{binary:r.response}:{text:r.responseText},r.getAllResponseHeaders()))}},r.onload=o(),a=r.onerror=r.ontimeout=o("error"),void 0!==r.onabort?r.onabort=a:r.onreadystatechange=function(){4===r.readyState&&C.setTimeout(function(){o&&a()})},o=o("abort");try{r.send(i.hasContent&&i.data||null)}catch(e){if(o)throw e}},abort:function(){o&&o()}}}),S.ajaxPrefilter(function(e){e.crossDomain&&(e.contents.script=!1)}),S.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(e){return S.globalEval(e),e}}}),S.ajaxPrefilter("script",function(e){void 0===e.cache&&(e.cache=!1),e.crossDomain&&(e.type="GET")}),S.ajaxTransport("script",function(n){var r,i;if(n.crossDomain||n.scriptAttrs)return{send:function(e,t){r=S("<script>").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var Ut,Xt=[],Vt=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Xt.pop()||S.expando+"_"+Ct.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Vt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Vt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Vt,"$1"+r):!1!==e.jsonp&&(e.url+=(Et.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Xt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((Ut=E.implementation.createHTMLDocument("").body).innerHTML="<form></form><form></form>",2===Ut.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1<s&&(r=vt(e.slice(s)),e=e.slice(0,s)),m(t)?(n=t,t=void 0):t&&"object"==typeof t&&(i="POST"),0<a.length&&S.ajax({url:e,type:i||"GET",dataType:"html",data:t}).done(function(e){o=arguments,a.html(r?S("<div>").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):("number"==typeof f.top&&(f.top+="px"),"number"==typeof f.left&&(f.left+="px"),c.css(f))}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=$e(y.pixelPosition,function(e,t){if(t)return t=Be(e,n),Me.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0<arguments.length?this.on(n,null,e,t):this.trigger(n)}});var Gt=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;S.proxy=function(e,t){var n,r,i;if("string"==typeof t&&(n=e[t],t=e,e=n),m(e))return r=s.call(arguments,2),(i=function(){return e.apply(t||this,r.concat(s.call(arguments)))}).guid=e.guid=e.guid||S.guid++,i},S.holdReady=function(e){e?S.readyWait++:S.ready(!0)},S.isArray=Array.isArray,S.parseJSON=JSON.parse,S.nodeName=A,S.isFunction=m,S.isWindow=x,S.camelCase=X,S.type=w,S.now=Date.now,S.isNumeric=function(e){var t=S.type(e);return("number"===t||"string"===t)&&!isNaN(e-parseFloat(e))},S.trim=function(e){return null==e?"":(e+"").replace(Gt,"")},"function"==typeof define&&define.amd&&define("jquery",[],function(){return S});var Yt=C.jQuery,Qt=C.$;return S.noConflict=function(e){return C.$===S&&(C.$=Qt),e&&C.jQuery===S&&(C.jQuery=Yt),S},"undefined"==typeof e&&(C.jQuery=C.$=S),S});
_static/searchtools.js+4−1
@@ -251,6 +251,7 @@ var Search = {
251251 var item = results.pop();
252252 var listItem = $('<li style="display:none"></li>');
253253 var requestUrl = "";
254+ var linkUrl = "";
254255 if (DOCUMENTATION_OPTIONS.BUILDER === 'dirhtml') {
255256 // dirhtml builder
256257 var dirname = item[0] + '/';
@@ -260,13 +261,15 @@ var Search = {
260261 dirname = '';
261262 }
262263 requestUrl = DOCUMENTATION_OPTIONS.URL_ROOT + dirname;
264+ linkUrl = requestUrl;
263265
264266 } else {
265267 // normal html builders
266268 requestUrl = DOCUMENTATION_OPTIONS.URL_ROOT + item[0] + DOCUMENTATION_OPTIONS.FILE_SUFFIX;
269+ linkUrl = item[0] + DOCUMENTATION_OPTIONS.LINK_SUFFIX;
267270 }
268271 listItem.append($('<a/>').attr('href',
269− requestUrl +
272+ linkUrl +
270273 highlightstring + item[2]).html(item[1]));
271274 if (item[3]) {
272275 listItem.append($('<span> (' + item[3] + ')</span>'));
_static/searx.css+40−1
@@ -33,7 +33,7 @@ p.sidebar-title, .sidebar p {
3333/* admonitions
3434*/
3535
36−div.admonition, div.topic {
36+div.admonition, div.topic, div.toctree-wrapper {
3737 background-color: #fafafa;
3838 margin: 8px 0px;
3939 padding: 1em;
@@ -42,6 +42,16 @@ div.admonition, div.topic {
4242 border-right: none;
4343 border-bottom: none;
4444 border-left: 5pt solid #ccc;
45+ list-style-type: disclosure-closed;
46+}
47+
48+div.toctree-wrapper p.caption {
49+ font-weight: normal;
50+ font-size: 24px;
51+ margin: 0 0 10px 0;
52+ padding: 0;
53+ line-height: 1;
54+ display: inline;
4555}
4656
4757p.admonition-title:after {
@@ -128,3 +138,32 @@ caption {
128138 caption-side: top;
129139 text-align: left;
130140}
141+
142+/* bugs since sphinx 3.1
143+
144+See sphinx-doc project, PR 7838 & 7484 with elementary patch to the basic CSS:
145+
146+- https://github.com/sphinx-doc/sphinx/issues/7838#issuecomment-646009605
147+- https://github.com/sphinx-doc/sphinx/pull/7484#issuecomment-646058972
148+
149+*/
150+
151+li > p:first-child {
152+ margin-top: 0;
153+}
154+
155+li > p:last-child {
156+ margin-bottom: 0;
157+}
158+
159+div.admonition dl {
160+ margin-bottom: 0;
161+}
162+
163+div.sidebar {
164+ clear: none;
165+}
166+
167+div.admonition, div.topic, pre {
168+ clear: none;
169+}
admin/api.html+6−3
@@ -1,9 +1,10 @@
11
22<!DOCTYPE html>
33
4−<html xmlns="http://www.w3.org/1999/xhtml">
4+<html>
55 <head>
66 <meta charset="utf-8" />
7+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
78 <meta name="viewport" content="width=device-width, initial-scale=1">
89 <title>Administration API &#8212; Searx Documentation (Searx-0.16.0.tex)</title>
910 <link rel="stylesheet" href="../_static/searx.css" type="text/css" />
@@ -33,7 +34,8 @@
3334 <a href="settings.html" title="settings.yml"
3435 accesskey="P">previous</a> |</li>
3536 <li class="nav-item nav-item-0"><a href="../index.html">Searx Documentation (Searx-0.16.0.tex)</a> &#187;</li>
36− <li class="nav-item nav-item-1"><a href="index.html" accesskey="U">Administrator documentation</a> &#187;</li>
37+ <li class="nav-item nav-item-1"><a href="index.html" accesskey="U">Administrator documentation</a> &#187;</li>
38+ <li class="nav-item nav-item-this"><a href="">Administration API</a></li>
3739 </ul>
3840 </div>
3941
@@ -133,6 +135,7 @@ HTML of the site. URL of the searx instance and values are customizable.</p>
133135</div>
134136
135137
138+ <div class="clearer"></div>
136139 </div>
137140 </div>
138141 </div>
@@ -184,7 +187,7 @@ HTML of the site. URL of the searx instance and values are customizable.</p>
184187
185188 <div class="footer" role="contentinfo">
186189 &#169; Copyright 2015-2020, Adam Tauber, Noémi Ványi.
187− Created using <a href="http://sphinx-doc.org/">Sphinx</a> 2.4.4.
190+ Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 3.1.1.
188191 </div>
189192 <script src="../_static/version_warning_offset.js"></script>
190193
admin/architecture.html+16−8
@@ -1,9 +1,10 @@
11
22<!DOCTYPE html>
33
4−<html xmlns="http://www.w3.org/1999/xhtml">
4+<html>
55 <head>
66 <meta charset="utf-8" />
7+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
78 <meta name="viewport" content="width=device-width, initial-scale=1">
89 <title>Architecture &#8212; Searx Documentation (Searx-0.16.0.tex)</title>
910 <link rel="stylesheet" href="../_static/searx.css" type="text/css" />
@@ -33,7 +34,8 @@
3334 <a href="api.html" title="Administration API"
3435 accesskey="P">previous</a> |</li>
3536 <li class="nav-item nav-item-0"><a href="../index.html">Searx Documentation (Searx-0.16.0.tex)</a> &#187;</li>
36− <li class="nav-item nav-item-1"><a href="index.html" accesskey="U">Administrator documentation</a> &#187;</li>
37+ <li class="nav-item nav-item-1"><a href="index.html" accesskey="U">Administrator documentation</a> &#187;</li>
38+ <li class="nav-item nav-item-this"><a href="">Architecture</a></li>
3739 </ul>
3840 </div>
3941
@@ -45,21 +47,27 @@
4547 <div class="section" id="architecture">
4648<span id="id1"></span><h1>Architecture<a class="headerlink" href="#architecture" title="Permalink to this headline">¶</a></h1>
4749<div class="sidebar">
48−<p class="sidebar-title">Needs work!</p>
49−<p>This article needs some work / Searx is a collaborative effort. If you have
50−any contribution, feel welcome to send us your <a class="reference external" href="https://github.com/asciimoo/searx/pull/../pulls">PR</a>, see
51−<a class="reference internal" href="../dev/contribution_guide.html#how-to-contribute"><span class="std std-ref">How to contribute</span></a>.</p>
50+<p class="sidebar-title">Further reading</p>
51+<ul class="simple">
52+<li><p>Reverse Proxy: <a class="reference internal" href="installation-apache.html#apache-searx-site"><span class="std std-ref">Apache</span></a> &amp; <a class="reference internal" href="installation-nginx.html#nginx-searx-site"><span class="std std-ref">nginx</span></a></p></li>
53+<li><p>Filtron: <a class="reference internal" href="filtron.html#searx-filtron"><span class="std std-ref">How to protect an instance</span></a></p></li>
54+<li><p>Morty: <a class="reference internal" href="morty.html#searx-morty"><span class="std std-ref">How to setup result proxy</span></a></p></li>
55+<li><p>uWSGI: <a class="reference internal" href="installation-uwsgi.html#searx-uwsgi"><span class="std std-ref">uwsgi</span></a></p></li>
56+<li><p>Searx: <a class="reference internal" href="installation-searx.html#installation-basic"><span class="std std-ref">Step by step installation</span></a></p></li>
57+</ul>
5258</div>
5359<p>Herein you will find some hints and suggestions about typical architectures of
5460searx infrastructures.</p>
5561<p>We start with a contribution from <a class="reference external" href="https://github.com/asciimoo/searx/pull/1776#issuecomment-567917320">&#64;dalf</a>.
56−It shows a <em>reference</em> setup for public searx instances.</p>
62+It shows a <em>reference</em> setup for public searx instances which can build up and
63+maintained by the scripts from our <a class="reference internal" href="../utils/index.html#toolboxing"><span class="std std-ref">Tooling box utils/*</span></a>.</p>
5764<div class="figure align-default" id="id2">
5865<img alt="arch_public.dot" src="../_images/arch_public.svg" /><p class="caption"><span class="caption-number">Fig. 1 </span><span class="caption-text">Reference architecture of a public searx setup.</span><a class="headerlink" href="#id2" title="Permalink to this image">¶</a></p>
5966</div>
6067</div>
6168
6269
70+ <div class="clearer"></div>
6371 </div>
6472 </div>
6573 </div>
@@ -111,7 +119,7 @@ It shows a <em>reference</em> setup for public searx instances.</p>
111119
112120 <div class="footer" role="contentinfo">
113121 &#169; Copyright 2015-2020, Adam Tauber, Noémi Ványi.
114− Created using <a href="http://sphinx-doc.org/">Sphinx</a> 2.4.4.
122+ Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 3.1.1.
115123 </div>
116124 <script src="../_static/version_warning_offset.js"></script>
117125
admin/buildhosts.html+158−13
@@ -1,9 +1,10 @@
11
22<!DOCTYPE html>
33
4−<html xmlns="http://www.w3.org/1999/xhtml">
4+<html>
55 <head>
66 <meta charset="utf-8" />
7+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
78 <meta name="viewport" content="width=device-width, initial-scale=1">
89 <title>Buildhosts &#8212; Searx Documentation (Searx-0.16.0.tex)</title>
910 <link rel="stylesheet" href="../_static/searx.css" type="text/css" />
@@ -39,7 +40,8 @@
3940 <a href="plugins.html" title="Plugins builtin"
4041 accesskey="P">previous</a> |</li>
4142 <li class="nav-item nav-item-0"><a href="../index.html">Searx Documentation (Searx-0.16.0.tex)</a> &#187;</li>
42− <li class="nav-item nav-item-1"><a href="index.html" accesskey="U">Administrator documentation</a> &#187;</li>
43+ <li class="nav-item nav-item-1"><a href="index.html" accesskey="U">Administrator documentation</a> &#187;</li>
44+ <li class="nav-item nav-item-this"><a href="">Buildhosts</a></li>
4345 </ul>
4446 </div>
4547
@@ -55,10 +57,111 @@
5557<p>If you have any contribution send us your <a class="reference external" href="https://github.com/asciimoo/searx/pull/../pulls">PR</a>, see
5658<a class="reference internal" href="../dev/contribution_guide.html#how-to-contribute"><span class="std std-ref">How to contribute</span></a>.</p>
5759</div>
60+<div class="contents local topic" id="contents">
61+<p class="topic-title">Contents</p>
62+<ul class="simple">
63+<li><p><a class="reference internal" href="#build-docs" id="id2">Build docs</a></p></li>
64+<li><p><a class="reference internal" href="#lint-shell-scripts" id="id3">Lint shell scripts</a></p></li>
65+</ul>
66+</div>
5867<p>To get best results from build, its recommend to install additional packages
59−on build hosts.</p>
68+on build hosts (see <a class="reference internal" href="../utils/searx.sh.html#searx-sh"><span class="std std-ref">utils/searx.sh</span></a>).:</p>
69+<div class="highlight-none notranslate"><div class="highlight"><pre><span></span>sudo -H ./utils/searx.sh install buildhost
70+</pre></div>
71+</div>
72+<p>This will install packages needed by searx:</p>
73+<div class="sphinx-tabs docutils container">
74+<div class="ui top attached tabular menu sphinx-menu docutils container">
75+<div class="active item sphinx-data-tab-VWJ1bnR1IC8gZGViaWFu docutils container">
76+<div class="docutils container">
77+<p>Ubuntu / debian</p>
78+</div>
79+</div>
80+<div class="item sphinx-data-tab-QXJjaCBMaW51eA== docutils container">
81+<div class="docutils container">
82+<p>Arch Linux</p>
83+</div>
84+</div>
85+<div class="item sphinx-data-tab-RmVkb3JhIC8gUkhFTA== docutils container">
86+<div class="docutils container">
87+<p>Fedora / RHEL</p>
88+</div>
89+</div>
90+</div>
91+<div class="ui bottom attached sphinx-tab tab segment sphinx-data-tab-VWJ1bnR1IC8gZGViaWFu active docutils container">
92+<div class="highlight-sh notranslate"><div class="highlight"><pre><span></span>$ sudo -H apt-get install -y <span class="se">\</span>
93+ virtualenv python3-dev python3-babel python3-venv <span class="se">\</span>
94+ uwsgi uwsgi-plugin-python3 <span class="se">\</span>
95+ git build-essential libxslt-dev zlib1g-dev libffi-dev libssl-dev <span class="se">\</span>
96+ shellcheck
97+</pre></div>
98+</div>
99+</div>
100+<div class="ui bottom attached sphinx-tab tab segment sphinx-data-tab-QXJjaCBMaW51eA== docutils container">
101+<div class="highlight-sh notranslate"><div class="highlight"><pre><span></span>$ sudo -H pacman -S --noconfirm <span class="se">\</span>
102+ python-virtualenv python python-pip python-lxml python-babel <span class="se">\</span>
103+ uwsgi uwsgi-plugin-python <span class="se">\</span>
104+ git base-devel libxml2 <span class="se">\</span>
105+ shellcheck
106+</pre></div>
107+</div>
108+</div>
109+<div class="ui bottom attached sphinx-tab tab segment sphinx-data-tab-RmVkb3JhIC8gUkhFTA== docutils container">
110+<div class="highlight-sh notranslate"><div class="highlight"><pre><span></span>$ sudo -H dnf install -y <span class="se">\</span>
111+ virtualenv python python-pip python-lxml python-babel <span class="se">\</span>
112+ uwsgi uwsgi-plugin-python3 <span class="se">\</span>
113+ git @development-tools libxml2 <span class="se">\</span>
114+ ShellCheck
115+</pre></div>
116+</div>
117+</div>
118+</div>
119+<p>and packages needed to build docuemtation and run tests:</p>
120+<div class="sphinx-tabs docutils container">
121+<div class="ui top attached tabular menu sphinx-menu docutils container">
122+<div class="active item sphinx-data-tab-VWJ1bnR1IC8gZGViaWFu docutils container">
123+<div class="docutils container">
124+<p>Ubuntu / debian</p>
125+</div>
126+</div>
127+<div class="item sphinx-data-tab-QXJjaCBMaW51eA== docutils container">
128+<div class="docutils container">
129+<p>Arch Linux</p>
130+</div>
131+</div>
132+<div class="item sphinx-data-tab-RmVkb3JhIC8gUkhFTA== docutils container">
133+<div class="docutils container">
134+<p>Fedora / RHEL</p>
135+</div>
136+</div>
137+</div>
138+<div class="ui bottom attached sphinx-tab tab segment sphinx-data-tab-VWJ1bnR1IC8gZGViaWFu active docutils container">
139+<div class="highlight-sh notranslate"><div class="highlight"><pre><span></span>$ sudo -H apt-get install -y <span class="se">\</span>
140+ firefox graphviz imagemagick texlive-xetex librsvg2-bin <span class="se">\</span>
141+ texlive-latex-recommended texlive-extra-utils ttf-dejavu <span class="se">\</span>
142+ latexmk
143+</pre></div>
144+</div>
145+</div>
146+<div class="ui bottom attached sphinx-tab tab segment sphinx-data-tab-QXJjaCBMaW51eA== docutils container">
147+<div class="highlight-sh notranslate"><div class="highlight"><pre><span></span>$ sudo -H pacman -S --noconfirm <span class="se">\</span>
148+ firefox graphviz imagemagick texlive-bin extra/librsvg <span class="se">\</span>
149+ texlive-core texlive-latexextra ttf-dejavu
150+</pre></div>
151+</div>
152+</div>
153+<div class="ui bottom attached sphinx-tab tab segment sphinx-data-tab-RmVkb3JhIC8gUkhFTA== docutils container">
154+<div class="highlight-sh notranslate"><div class="highlight"><pre><span></span>$ sudo -H dnf install -y <span class="se">\</span>
155+ firefox graphviz graphviz-gd ImageMagick librsvg2-tools <span class="se">\</span>
156+ texlive-xetex-bin texlive-collection-fontsrecommended <span class="se">\</span>
157+ texlive-collection-latex dejavu-sans-fonts dejavu-serif-fonts <span class="se">\</span>
158+ dejavu-sans-mono-fonts
159+</pre></div>
160+</div>
161+</div>
162+</div>
60163<div class="section" id="build-docs">
61−<span id="docs-build"></span><h2>Build docs<a class="headerlink" href="#build-docs" title="Permalink to this headline">¶</a></h2>
164+<span id="docs-build"></span><h2><a class="toc-backref" href="#id2">Build docs</a><a class="headerlink" href="#build-docs" title="Permalink to this headline">¶</a></h2>
62165<div class="sidebar">
63166<p class="sidebar-title">Sphinx build needs</p>
64167<ul class="simple">
@@ -72,9 +175,16 @@ on build hosts.</p>
72175docs can be build from scratch with <code class="docutils literal notranslate"><span class="pre">make</span> <span class="pre">docs</span></code>. For better math and image
73176processing additional packages are needed. The <a class="reference external" href="https://tug.org/xetex/">XeTeX</a> needed not only for PDF
74177creation, its also needed for <a class="reference internal" href="../dev/reST.html#math"><span class="std std-ref">Math equations</span></a> when HTML output is build.</p>
75−<p>To be able to do <a class="reference external" href="https://www.sphinx-doc.org/en/master/usage/extensions/math.html#math-support" title="(in Sphinx v4.0.0+/b1400ac42)"><span>Math support for HTML outputs in Sphinx</span></a> without CDNs, the math are rendered
76−as images (<code class="docutils literal notranslate"><span class="pre">sphinx.ext.imgmath</span></code> extension). If your docs build (<code class="docutils literal notranslate"><span class="pre">make</span>
77−<span class="pre">docs</span></code>) shows warnings like this:</p>
178+<p>To be able to do <a class="reference external" href="https://www.sphinx-doc.org/en/master/usage/extensions/math.html#math-support" title="(in Sphinx v4.0.0+)"><span>Math support for HTML outputs in Sphinx</span></a> without CDNs, the math are rendered
179+as images (<code class="docutils literal notranslate"><span class="pre">sphinx.ext.imgmath</span></code> extension).</p>
180+<p>Here is the extract from the <a class="reference external" href="https://github.com/asciimoo/searx/blob/master/docs/conf.py">git://docs/conf.py</a> file, setting math renderer
181+to <code class="docutils literal notranslate"><span class="pre">imgmath</span></code>:</p>
182+<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">html_math_renderer</span> <span class="o">=</span> <span class="s1">&#39;imgmath&#39;</span>
183+<span class="n">imgmath_image_format</span> <span class="o">=</span> <span class="s1">&#39;svg&#39;</span>
184+<span class="n">imgmath_font_size</span> <span class="o">=</span> <span class="mi">14</span>
185+</pre></div>
186+</div>
187+<p>If your docs build (<code class="docutils literal notranslate"><span class="pre">make</span> <span class="pre">docs</span></code>) shows warnings like this:</p>
78188<div class="highlight-none notranslate"><div class="highlight"><pre><span></span>WARNING: dot(1) not found, for better output quality install \
79189 graphviz from http://www.graphviz.org
80190..
@@ -84,7 +194,7 @@ WARNING: LaTeX command &#39;latex&#39; cannot be run (needed for math \
84194</div>
85195<p>you need to install additional packages on your build host, to get better HTML
86196output.</p>
87−<div class="sphinx-tabs docutils container" id="system-requirements">
197+<div class="sphinx-tabs docutils container">
88198<div class="ui top attached tabular menu sphinx-menu docutils container">
89199<div class="active item sphinx-data-tab-VWJ1bnR1IC8gZGViaWFu docutils container">
90200<div class="docutils container">
@@ -150,20 +260,55 @@ output.</p>
150260<div class="ui bottom attached sphinx-tab tab segment sphinx-data-tab-RmVkb3JhIC8gUkhFTA== docutils container">
151261<div class="highlight-sh notranslate"><div class="highlight"><pre><span></span>$ sudo dnf install <span class="se">\</span>
152262 texlive-collection-fontsrecommended texlive-collection-latex <span class="se">\</span>
153− dejavu-sans-fonts dejavu-serif-fonts dejavu-sans-mono-fonts
263+ dejavu-sans-fonts dejavu-serif-fonts dejavu-sans-mono-fonts <span class="se">\</span>
264+ ImageMagick
154265</pre></div>
155266</div>
156267</div>
157268</div>
158−<div class="highlight-python notranslate" id="system-requirements-end"><div class="highlight"><pre><span></span><span class="n">html_math_renderer</span> <span class="o">=</span> <span class="s1">&#39;imgmath&#39;</span>
159−<span class="n">imgmath_image_format</span> <span class="o">=</span> <span class="s1">&#39;svg&#39;</span>
160−<span class="n">imgmath_font_size</span> <span class="o">=</span> <span class="mi">14</span>
269+</div>
270+<div class="section" id="lint-shell-scripts">
271+<span id="sh-lint"></span><h2><a class="toc-backref" href="#id3">Lint shell scripts</a><a class="headerlink" href="#lint-shell-scripts" title="Permalink to this headline">¶</a></h2>
272+<p>To lint shell scripts, we use <a class="reference external" href="https://github.com/koalaman/shellcheck">ShellCheck</a> - A shell script static analysis tool.</p>
273+<div class="sphinx-tabs docutils container">
274+<div class="ui top attached tabular menu sphinx-menu docutils container">
275+<div class="active item sphinx-data-tab-VWJ1bnR1IC8gZGViaWFu docutils container">
276+<div class="docutils container">
277+<p>Ubuntu / debian</p>
278+</div>
279+</div>
280+<div class="item sphinx-data-tab-QXJjaCBMaW51eA== docutils container">
281+<div class="docutils container">
282+<p>Arch Linux</p>
283+</div>
284+</div>
285+<div class="item sphinx-data-tab-RmVkb3JhIC8gUkhFTA== docutils container">
286+<div class="docutils container">
287+<p>Fedora / RHEL</p>
288+</div>
289+</div>
290+</div>
291+<div class="ui bottom attached sphinx-tab tab segment sphinx-data-tab-VWJ1bnR1IC8gZGViaWFu active docutils container">
292+<div class="highlight-sh notranslate"><div class="highlight"><pre><span></span>$ sudo apt install shellcheck
293+</pre></div>
294+</div>
295+</div>
296+<div class="ui bottom attached sphinx-tab tab segment sphinx-data-tab-QXJjaCBMaW51eA== docutils container">
297+<div class="highlight-sh notranslate"><div class="highlight"><pre><span></span>$ sudo pacman -S shellcheck
161298</pre></div>
162299</div>
163300</div>
301+<div class="ui bottom attached sphinx-tab tab segment sphinx-data-tab-RmVkb3JhIC8gUkhFTA== docutils container">
302+<div class="highlight-sh notranslate"><div class="highlight"><pre><span></span>$ sudo dnf install ShellCheck
303+</pre></div>
304+</div>
305+</div>
306+</div>
307+</div>
164308</div>
165309
166310
311+ <div class="clearer"></div>
167312 </div>
168313 </div>
169314 </div>
@@ -215,7 +360,7 @@ output.</p>
215360
216361 <div class="footer" role="contentinfo">
217362 &#169; Copyright 2015-2020, Adam Tauber, Noémi Ványi.
218− Created using <a href="http://sphinx-doc.org/">Sphinx</a> 2.4.4.
363+ Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 3.1.1.
219364 </div>
220365 <script src="../_static/version_warning_offset.js"></script>
221366
admin/engines.html+299−90
@@ -1,9 +1,10 @@
11
22<!DOCTYPE html>
33
4−<html xmlns="http://www.w3.org/1999/xhtml">
4+<html>
55 <head>
66 <meta charset="utf-8" />
7+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
78 <meta name="viewport" content="width=device-width, initial-scale=1">
89 <title>Engines &#8212; Searx Documentation (Searx-0.16.0.tex)</title>
910 <link rel="stylesheet" href="../_static/searx.css" type="text/css" />
@@ -33,7 +34,8 @@
3334 <a href="morty.html" title="How to setup result proxy"
3435 accesskey="P">previous</a> |</li>
3536 <li class="nav-item nav-item-0"><a href="../index.html">Searx Documentation (Searx-0.16.0.tex)</a> &#187;</li>
36− <li class="nav-item nav-item-1"><a href="index.html" accesskey="U">Administrator documentation</a> &#187;</li>
37+ <li class="nav-item nav-item-1"><a href="index.html" accesskey="U">Administrator documentation</a> &#187;</li>
38+ <li class="nav-item nav-item-this"><a href="">Engines</a></li>
3739 </ul>
3840 </div>
3941
@@ -97,25 +99,30 @@
9799<td><p><strong>D</strong></p></td>
98100<td colspan="2"></td>
99101</tr>
102+<tr class="row-even"><td><p>Show errors</p></td>
103+<td><p><strong>DE</strong></p></td>
104+<td colspan="2"></td>
105+</tr>
100106</tbody>
101107</table>
102108<p>Configuration defaults (at built time):</p>
103109<span id="configured-engines"></span><table class="docutils align-default" id="id1">
104110<caption><span class="caption-number">Table 1 </span><span class="caption-text">Engines configured at built time (defaults)</span><a class="headerlink" href="#id1" title="Permalink to this table">¶</a></caption>
105111<colgroup>
106−<col style="width: 8%" />
107−<col style="width: 8%" />
108−<col style="width: 8%" />
109−<col style="width: 8%" />
110−<col style="width: 8%" />
111−<col style="width: 8%" />
112−<col style="width: 8%" />
113−<col style="width: 8%" />
114−<col style="width: 8%" />
115−<col style="width: 8%" />
116−<col style="width: 8%" />
117−<col style="width: 8%" />
118−<col style="width: 8%" />
112+<col style="width: 7%" />
113+<col style="width: 7%" />
114+<col style="width: 7%" />
115+<col style="width: 7%" />
116+<col style="width: 7%" />
117+<col style="width: 7%" />
118+<col style="width: 7%" />
119+<col style="width: 7%" />
120+<col style="width: 7%" />
121+<col style="width: 7%" />
122+<col style="width: 7%" />
123+<col style="width: 7%" />
124+<col style="width: 7%" />
125+<col style="width: 7%" />
119126</colgroup>
120127<thead>
121128<tr class="row-odd"><th class="head stub"><p>Name (cfg)</p></th>
@@ -131,6 +138,7 @@
131138<th class="head"><p>O</p></th>
132139<th class="head"><p>W</p></th>
133140<th class="head"><p>D</p></th>
141+<th class="head"><p>DE</p></th>
134142</tr>
135143</thead>
136144<tbody>
@@ -147,6 +155,7 @@
147155<td></td>
148156<td><p>1</p></td>
149157<td><p>y</p></td>
158+<td><p>y</p></td>
150159</tr>
151160<tr class="row-odd"><th class="stub"><p>arch linux wiki</p></th>
152161<th class="stub"><p>!al</p></th>
@@ -161,6 +170,7 @@
161170<td></td>
162171<td><p>1</p></td>
163172<td></td>
173+<td><p>y</p></td>
164174</tr>
165175<tr class="row-even"><th class="stub"><p>archive is</p></th>
166176<th class="stub"><p>!ai</p></th>
@@ -175,6 +185,7 @@
175185<td></td>
176186<td><p>1</p></td>
177187<td><p>y</p></td>
188+<td><p>y</p></td>
178189</tr>
179190<tr class="row-odd"><th class="stub"><p>arxiv</p></th>
180191<th class="stub"><p>!arx</p></th>
@@ -189,6 +200,7 @@
189200<td></td>
190201<td><p>1</p></td>
191202<td></td>
203+<td><p>y</p></td>
192204</tr>
193205<tr class="row-even"><th class="stub"><p>wikipedia</p></th>
194206<th class="stub"><p>!wp</p></th>
@@ -203,6 +215,7 @@
203215<td></td>
204216<td><p>1</p></td>
205217<td></td>
218+<td><p>y</p></td>
206219</tr>
207220<tr class="row-odd"><th class="stub"><p>bing</p></th>
208221<th class="stub"><p>!bi</p></th>
@@ -217,6 +230,7 @@
217230<td></td>
218231<td><p>1</p></td>
219232<td></td>
233+<td><p>y</p></td>
220234</tr>
221235<tr class="row-even"><th class="stub"><p>bing images</p></th>
222236<th class="stub"><p>!bii</p></th>
@@ -231,6 +245,7 @@
231245<td></td>
232246<td><p>1</p></td>
233247<td></td>
248+<td><p>y</p></td>
234249</tr>
235250<tr class="row-odd"><th class="stub"><p>bing news</p></th>
236251<th class="stub"><p>!bin</p></th>
@@ -245,6 +260,7 @@
245260<td></td>
246261<td><p>1</p></td>
247262<td></td>
263+<td><p>y</p></td>
248264</tr>
249265<tr class="row-even"><th class="stub"><p>bing videos</p></th>
250266<th class="stub"><p>!biv</p></th>
@@ -259,6 +275,7 @@
259275<td></td>
260276<td><p>1</p></td>
261277<td></td>
278+<td><p>y</p></td>
262279</tr>
263280<tr class="row-odd"><th class="stub"><p>bitbucket</p></th>
264281<th class="stub"><p>!bb</p></th>
@@ -273,6 +290,7 @@
273290<td></td>
274291<td><p>1</p></td>
275292<td><p>y</p></td>
293+<td><p>y</p></td>
276294</tr>
277295<tr class="row-even"><th class="stub"><p>btdigg</p></th>
278296<th class="stub"><p>!bt</p></th>
@@ -287,6 +305,7 @@
287305<td></td>
288306<td><p>1</p></td>
289307<td></td>
308+<td><p>y</p></td>
290309</tr>
291310<tr class="row-odd"><th class="stub"><p>ccc-tv</p></th>
292311<th class="stub"><p>!c3tv</p></th>
@@ -301,6 +320,7 @@
301320<td></td>
302321<td><p>1</p></td>
303322<td><p>y</p></td>
323+<td><p>y</p></td>
304324</tr>
305325<tr class="row-even"><th class="stub"><p>crossref</p></th>
306326<th class="stub"><p>!cr</p></th>
@@ -315,6 +335,7 @@
315335<td></td>
316336<td><p>1</p></td>
317337<td></td>
338+<td><p>y</p></td>
318339</tr>
319340<tr class="row-odd"><th class="stub"><p>currency</p></th>
320341<th class="stub"><p>!cc</p></th>
@@ -329,6 +350,7 @@
329350<td></td>
330351<td><p>100</p></td>
331352<td></td>
353+<td><p>y</p></td>
332354</tr>
333355<tr class="row-even"><th class="stub"><p>deezer</p></th>
334356<th class="stub"><p>!dz</p></th>
@@ -343,6 +365,7 @@
343365<td></td>
344366<td><p>1</p></td>
345367<td></td>
368+<td><p>y</p></td>
346369</tr>
347370<tr class="row-odd"><th class="stub"><p>deviantart</p></th>
348371<th class="stub"><p>!da</p></th>
@@ -357,6 +380,7 @@
357380<td></td>
358381<td><p>1</p></td>
359382<td></td>
383+<td><p>y</p></td>
360384</tr>
361385<tr class="row-even"><th class="stub"><p>ddg definitions</p></th>
362386<th class="stub"><p>!ddd</p></th>
@@ -371,6 +395,7 @@
371395<td></td>
372396<td><p>2</p></td>
373397<td><p>y</p></td>
398+<td><p>y</p></td>
374399</tr>
375400<tr class="row-odd"><th class="stub"><p>digg</p></th>
376401<th class="stub"><p>!dg</p></th>
@@ -385,6 +410,7 @@
385410<td></td>
386411<td><p>1</p></td>
387412<td></td>
413+<td><p>y</p></td>
388414</tr>
389415<tr class="row-even"><th class="stub"><p>erowid</p></th>
390416<th class="stub"><p>!ew</p></th>
@@ -399,6 +425,7 @@
399425<td></td>
400426<td><p>1</p></td>
401427<td><p>y</p></td>
428+<td><p>y</p></td>
402429</tr>
403430<tr class="row-odd"><th class="stub"><p>wikidata</p></th>
404431<th class="stub"><p>!wd</p></th>
@@ -413,6 +440,7 @@
413440<td></td>
414441<td><p>2</p></td>
415442<td></td>
443+<td><p>y</p></td>
416444</tr>
417445<tr class="row-even"><th class="stub"><p>duckduckgo</p></th>
418446<th class="stub"><p>!ddg</p></th>
@@ -427,6 +455,7 @@
427455<td></td>
428456<td><p>1</p></td>
429457<td><p>y</p></td>
458+<td><p>y</p></td>
430459</tr>
431460<tr class="row-odd"><th class="stub"><p>duckduckgo images</p></th>
432461<th class="stub"><p>!ddi</p></th>
@@ -441,6 +470,7 @@
441470<td></td>
442471<td><p>1</p></td>
443472<td><p>y</p></td>
473+<td><p>y</p></td>
444474</tr>
445475<tr class="row-even"><th class="stub"><p>etools</p></th>
446476<th class="stub"><p>!eto</p></th>
@@ -455,6 +485,7 @@
455485<td></td>
456486<td><p>1</p></td>
457487<td><p>y</p></td>
488+<td><p>y</p></td>
458489</tr>
459490<tr class="row-odd"><th class="stub"><p>etymonline</p></th>
460491<th class="stub"><p>!et</p></th>
@@ -469,22 +500,9 @@
469500<td></td>
470501<td><p>1</p></td>
471502<td><p>y</p></td>
472−</tr>
473−<tr class="row-even"><th class="stub"><p>faroo</p></th>
474−<th class="stub"><p>!fa</p></th>
475−<td><p>faroo</p></td>
476−<td><p>2.0</p></td>
477−<td><p>general, news</p></td>
478−<td><p>y</p></td>
479−<td><p>y</p></td>
480−<td></td>
481−<td><p>y</p></td>
482−<td></td>
483−<td></td>
484−<td><p>1</p></td>
485503<td><p>y</p></td>
486504</tr>
487−<tr class="row-odd"><th class="stub"><p>1x</p></th>
505+<tr class="row-even"><th class="stub"><p>1x</p></th>
488506<th class="stub"><p>!1x</p></th>
489507<td><p>www1x</p></td>
490508<td><p>2.0</p></td>
@@ -497,8 +515,9 @@
497515<td></td>
498516<td><p>1</p></td>
499517<td><p>y</p></td>
518+<td><p>y</p></td>
500519</tr>
501−<tr class="row-even"><th class="stub"><p>fdroid</p></th>
520+<tr class="row-odd"><th class="stub"><p>fdroid</p></th>
502521<th class="stub"><p>!fd</p></th>
503522<td><p>fdroid</p></td>
504523<td><p>2.0</p></td>
@@ -511,8 +530,9 @@
511530<td></td>
512531<td><p>1</p></td>
513532<td><p>y</p></td>
533+<td><p>y</p></td>
514534</tr>
515−<tr class="row-odd"><th class="stub"><p>flickr</p></th>
535+<tr class="row-even"><th class="stub"><p>flickr</p></th>
516536<th class="stub"><p>!fl</p></th>
517537<td><p>flickr_noapi</p></td>
518538<td><p>2.0</p></td>
@@ -525,8 +545,9 @@
525545<td></td>
526546<td><p>1</p></td>
527547<td></td>
548+<td><p>y</p></td>
528549</tr>
529−<tr class="row-even"><th class="stub"><p>free software directory</p></th>
550+<tr class="row-odd"><th class="stub"><p>free software directory</p></th>
530551<th class="stub"><p>!fsd</p></th>
531552<td><p>mediawiki</p></td>
532553<td><p>5.0</p></td>
@@ -539,8 +560,9 @@
539560<td></td>
540561<td><p>1</p></td>
541562<td><p>y</p></td>
563+<td><p>y</p></td>
542564</tr>
543−<tr class="row-odd"><th class="stub"><p>frinkiac</p></th>
565+<tr class="row-even"><th class="stub"><p>frinkiac</p></th>
544566<th class="stub"><p>!frk</p></th>
545567<td><p>frinkiac</p></td>
546568<td><p>2.0</p></td>
@@ -553,8 +575,9 @@
553575<td></td>
554576<td><p>1</p></td>
555577<td><p>y</p></td>
578+<td><p>y</p></td>
556579</tr>
557−<tr class="row-even"><th class="stub"><p>genius</p></th>
580+<tr class="row-odd"><th class="stub"><p>genius</p></th>
558581<th class="stub"><p>!gen</p></th>
559582<td><p>genius</p></td>
560583<td><p>2.0</p></td>
@@ -567,8 +590,9 @@
567590<td></td>
568591<td><p>1</p></td>
569592<td></td>
593+<td><p>y</p></td>
570594</tr>
571−<tr class="row-odd"><th class="stub"><p>gigablast</p></th>
595+<tr class="row-even"><th class="stub"><p>gigablast</p></th>
572596<th class="stub"><p>!gb</p></th>
573597<td><p>gigablast</p></td>
574598<td><p>3.0</p></td>
@@ -581,8 +605,9 @@
581605<td></td>
582606<td><p>1</p></td>
583607<td><p>y</p></td>
608+<td><p>y</p></td>
584609</tr>
585−<tr class="row-even"><th class="stub"><p>gentoo</p></th>
610+<tr class="row-odd"><th class="stub"><p>gentoo</p></th>
586611<th class="stub"><p>!ge</p></th>
587612<td><p>gentoo</p></td>
588613<td><p>2.0</p></td>
@@ -595,8 +620,9 @@
595620<td></td>
596621<td><p>1</p></td>
597622<td></td>
623+<td><p>y</p></td>
598624</tr>
599−<tr class="row-odd"><th class="stub"><p>gitlab</p></th>
625+<tr class="row-even"><th class="stub"><p>gitlab</p></th>
600626<th class="stub"><p>!gl</p></th>
601627<td><p>json_engine</p></td>
602628<td><p>10.0</p></td>
@@ -609,8 +635,9 @@
609635<td></td>
610636<td><p>1</p></td>
611637<td><p>y</p></td>
638+<td><p>y</p></td>
612639</tr>
613−<tr class="row-even"><th class="stub"><p>github</p></th>
640+<tr class="row-odd"><th class="stub"><p>github</p></th>
614641<th class="stub"><p>!gh</p></th>
615642<td><p>github</p></td>
616643<td><p>2.0</p></td>
@@ -623,8 +650,9 @@
623650<td></td>
624651<td><p>1</p></td>
625652<td></td>
653+<td><p>y</p></td>
626654</tr>
627−<tr class="row-odd"><th class="stub"><p>google</p></th>
655+<tr class="row-even"><th class="stub"><p>google</p></th>
628656<th class="stub"><p>!go</p></th>
629657<td><p>google</p></td>
630658<td><p>2.0</p></td>
@@ -637,8 +665,9 @@
637665<td></td>
638666<td><p>1</p></td>
639667<td></td>
668+<td><p>y</p></td>
640669</tr>
641−<tr class="row-even"><th class="stub"><p>google images</p></th>
670+<tr class="row-odd"><th class="stub"><p>google images</p></th>
642671<th class="stub"><p>!goi</p></th>
643672<td><p>google_images</p></td>
644673<td><p>2.0</p></td>
@@ -651,8 +680,9 @@
651680<td></td>
652681<td><p>1</p></td>
653682<td></td>
683+<td><p>y</p></td>
654684</tr>
655−<tr class="row-odd"><th class="stub"><p>google news</p></th>
685+<tr class="row-even"><th class="stub"><p>google news</p></th>
656686<th class="stub"><p>!gon</p></th>
657687<td><p>google_news</p></td>
658688<td><p>2.0</p></td>
@@ -665,8 +695,9 @@
665695<td></td>
666696<td><p>1</p></td>
667697<td></td>
698+<td><p>y</p></td>
668699</tr>
669−<tr class="row-even"><th class="stub"><p>google videos</p></th>
700+<tr class="row-odd"><th class="stub"><p>google videos</p></th>
670701<th class="stub"><p>!gov</p></th>
671702<td><p>google_videos</p></td>
672703<td><p>2.0</p></td>
@@ -679,8 +710,9 @@
679710<td></td>
680711<td><p>1</p></td>
681712<td></td>
713+<td><p>y</p></td>
682714</tr>
683−<tr class="row-odd"><th class="stub"><p>google scholar</p></th>
715+<tr class="row-even"><th class="stub"><p>google scholar</p></th>
684716<th class="stub"><p>!gos</p></th>
685717<td><p>xpath</p></td>
686718<td><p>2.0</p></td>
@@ -693,8 +725,9 @@
693725<td></td>
694726<td><p>1</p></td>
695727<td></td>
728+<td><p>y</p></td>
696729</tr>
697−<tr class="row-even"><th class="stub"><p>google play apps</p></th>
730+<tr class="row-odd"><th class="stub"><p>google play apps</p></th>
698731<th class="stub"><p>!gpa</p></th>
699732<td><p>xpath</p></td>
700733<td><p>2.0</p></td>
@@ -707,8 +740,9 @@
707740<td></td>
708741<td><p>1</p></td>
709742<td><p>y</p></td>
743+<td><p>y</p></td>
710744</tr>
711−<tr class="row-odd"><th class="stub"><p>google play movies</p></th>
745+<tr class="row-even"><th class="stub"><p>google play movies</p></th>
712746<th class="stub"><p>!gpm</p></th>
713747<td><p>xpath</p></td>
714748<td><p>2.0</p></td>
@@ -721,8 +755,9 @@
721755<td></td>
722756<td><p>1</p></td>
723757<td><p>y</p></td>
758+<td><p>y</p></td>
724759</tr>
725−<tr class="row-even"><th class="stub"><p>google play music</p></th>
760+<tr class="row-odd"><th class="stub"><p>google play music</p></th>
726761<th class="stub"><p>!gps</p></th>
727762<td><p>xpath</p></td>
728763<td><p>2.0</p></td>
@@ -735,8 +770,9 @@
735770<td></td>
736771<td><p>1</p></td>
737772<td><p>y</p></td>
773+<td><p>y</p></td>
738774</tr>
739−<tr class="row-odd"><th class="stub"><p>geektimes</p></th>
775+<tr class="row-even"><th class="stub"><p>geektimes</p></th>
740776<th class="stub"><p>!gt</p></th>
741777<td><p>xpath</p></td>
742778<td><p>4.0</p></td>
@@ -749,8 +785,9 @@
749785<td></td>
750786<td><p>1</p></td>
751787<td><p>y</p></td>
788+<td><p>y</p></td>
752789</tr>
753−<tr class="row-even"><th class="stub"><p>habrahabr</p></th>
790+<tr class="row-odd"><th class="stub"><p>habrahabr</p></th>
754791<th class="stub"><p>!habr</p></th>
755792<td><p>xpath</p></td>
756793<td><p>4.0</p></td>
@@ -763,8 +800,9 @@
763800<td></td>
764801<td><p>1</p></td>
765802<td><p>y</p></td>
803+<td><p>y</p></td>
766804</tr>
767−<tr class="row-odd"><th class="stub"><p>hoogle</p></th>
805+<tr class="row-even"><th class="stub"><p>hoogle</p></th>
768806<th class="stub"><p>!ho</p></th>
769807<td><p>json_engine</p></td>
770808<td><p>2.0</p></td>
@@ -777,8 +815,9 @@
777815<td></td>
778816<td><p>1</p></td>
779817<td></td>
818+<td><p>y</p></td>
780819</tr>
781−<tr class="row-even"><th class="stub"><p>ina</p></th>
820+<tr class="row-odd"><th class="stub"><p>ina</p></th>
782821<th class="stub"><p>!in</p></th>
783822<td><p>ina</p></td>
784823<td><p>6.0</p></td>
@@ -791,8 +830,9 @@
791830<td></td>
792831<td><p>1</p></td>
793832<td><p>y</p></td>
833+<td><p>y</p></td>
794834</tr>
795−<tr class="row-odd"><th class="stub"><p>invidious</p></th>
835+<tr class="row-even"><th class="stub"><p>invidious</p></th>
796836<th class="stub"><p>!iv</p></th>
797837<td><p>invidious</p></td>
798838<td><p>5.0</p></td>
@@ -805,8 +845,9 @@
805845<td></td>
806846<td><p>1</p></td>
807847<td></td>
848+<td><p>y</p></td>
808849</tr>
809−<tr class="row-even"><th class="stub"><p>kickass</p></th>
850+<tr class="row-odd"><th class="stub"><p>kickass</p></th>
810851<th class="stub"><p>!kc</p></th>
811852<td><p>kickass</p></td>
812853<td><p>4.0</p></td>
@@ -819,8 +860,9 @@
819860<td></td>
820861<td><p>1</p></td>
821862<td><p>y</p></td>
863+<td><p>y</p></td>
822864</tr>
823−<tr class="row-odd"><th class="stub"><p>library genesis</p></th>
865+<tr class="row-even"><th class="stub"><p>library genesis</p></th>
824866<th class="stub"><p>!lg</p></th>
825867<td><p>xpath</p></td>
826868<td><p>7.0</p></td>
@@ -833,8 +875,9 @@
833875<td></td>
834876<td><p>1</p></td>
835877<td><p>y</p></td>
878+<td><p>y</p></td>
836879</tr>
837−<tr class="row-even"><th class="stub"><p>lobste.rs</p></th>
880+<tr class="row-odd"><th class="stub"><p>lobste.rs</p></th>
838881<th class="stub"><p>!lo</p></th>
839882<td><p>xpath</p></td>
840883<td><p>2.0</p></td>
@@ -847,8 +890,9 @@
847890<td></td>
848891<td><p>1</p></td>
849892<td></td>
893+<td><p>y</p></td>
850894</tr>
851−<tr class="row-odd"><th class="stub"><p>microsoft academic</p></th>
895+<tr class="row-even"><th class="stub"><p>microsoft academic</p></th>
852896<th class="stub"><p>!ma</p></th>
853897<td><p>microsoft_academic</p></td>
854898<td><p>2.0</p></td>
@@ -861,8 +905,9 @@
861905<td></td>
862906<td><p>1</p></td>
863907<td></td>
908+<td><p>y</p></td>
864909</tr>
865−<tr class="row-even"><th class="stub"><p>mixcloud</p></th>
910+<tr class="row-odd"><th class="stub"><p>mixcloud</p></th>
866911<th class="stub"><p>!mc</p></th>
867912<td><p>mixcloud</p></td>
868913<td><p>2.0</p></td>
@@ -875,8 +920,9 @@
875920<td></td>
876921<td><p>1</p></td>
877922<td></td>
923+<td><p>y</p></td>
878924</tr>
879−<tr class="row-odd"><th class="stub"><p>npm</p></th>
925+<tr class="row-even"><th class="stub"><p>npm</p></th>
880926<th class="stub"><p>!npm</p></th>
881927<td><p>json_engine</p></td>
882928<td><p>5.0</p></td>
@@ -889,8 +935,9 @@
889935<td></td>
890936<td><p>1</p></td>
891937<td><p>y</p></td>
938+<td><p>y</p></td>
892939</tr>
893−<tr class="row-even"><th class="stub"><p>nyaa</p></th>
940+<tr class="row-odd"><th class="stub"><p>nyaa</p></th>
894941<th class="stub"><p>!nt</p></th>
895942<td><p>nyaa</p></td>
896943<td><p>2.0</p></td>
@@ -903,8 +950,9 @@
903950<td></td>
904951<td><p>1</p></td>
905952<td><p>y</p></td>
953+<td><p>y</p></td>
906954</tr>
907−<tr class="row-odd"><th class="stub"><p>acgsou</p></th>
955+<tr class="row-even"><th class="stub"><p>acgsou</p></th>
908956<th class="stub"><p>!acg</p></th>
909957<td><p>acgsou</p></td>
910958<td><p>5.0</p></td>
@@ -917,8 +965,9 @@
917965<td></td>
918966<td><p>1</p></td>
919967<td><p>y</p></td>
968+<td><p>y</p></td>
920969</tr>
921−<tr class="row-even"><th class="stub"><p>openairedatasets</p></th>
970+<tr class="row-odd"><th class="stub"><p>openairedatasets</p></th>
922971<th class="stub"><p>!oad</p></th>
923972<td><p>json_engine</p></td>
924973<td><p>5.0</p></td>
@@ -931,8 +980,9 @@
931980<td></td>
932981<td><p>1</p></td>
933982<td></td>
983+<td><p>y</p></td>
934984</tr>
935−<tr class="row-odd"><th class="stub"><p>openairepublications</p></th>
985+<tr class="row-even"><th class="stub"><p>openairepublications</p></th>
936986<th class="stub"><p>!oap</p></th>
937987<td><p>json_engine</p></td>
938988<td><p>5.0</p></td>
@@ -945,8 +995,9 @@
945995<td></td>
946996<td><p>1</p></td>
947997<td></td>
998+<td><p>y</p></td>
948999</tr>
949−<tr class="row-even"><th class="stub"><p>openstreetmap</p></th>
1000+<tr class="row-odd"><th class="stub"><p>openstreetmap</p></th>
9501001<th class="stub"><p>!osm</p></th>
9511002<td><p>openstreetmap</p></td>
9521003<td><p>2.0</p></td>
@@ -959,8 +1010,9 @@
9591010<td></td>
9601011<td><p>1</p></td>
9611012<td></td>
1013+<td><p>y</p></td>
9621014</tr>
963−<tr class="row-odd"><th class="stub"><p>openrepos</p></th>
1015+<tr class="row-even"><th class="stub"><p>openrepos</p></th>
9641016<th class="stub"><p>!or</p></th>
9651017<td><p>xpath</p></td>
9661018<td><p>4.0</p></td>
@@ -973,8 +1025,9 @@
9731025<td></td>
9741026<td><p>1</p></td>
9751027<td><p>y</p></td>
1028+<td><p>y</p></td>
9761029</tr>
977−<tr class="row-even"><th class="stub"><p>pdbe</p></th>
1030+<tr class="row-odd"><th class="stub"><p>pdbe</p></th>
9781031<th class="stub"><p>!pdb</p></th>
9791032<td><p>pdbe</p></td>
9801033<td><p>2.0</p></td>
@@ -987,8 +1040,9 @@
9871040<td></td>
9881041<td><p>1</p></td>
9891042<td></td>
1043+<td><p>y</p></td>
9901044</tr>
991−<tr class="row-odd"><th class="stub"><p>photon</p></th>
1045+<tr class="row-even"><th class="stub"><p>photon</p></th>
9921046<th class="stub"><p>!ph</p></th>
9931047<td><p>photon</p></td>
9941048<td><p>2.0</p></td>
@@ -1001,8 +1055,9 @@
10011055<td></td>
10021056<td><p>1</p></td>
10031057<td></td>
1058+<td><p>y</p></td>
10041059</tr>
1005−<tr class="row-even"><th class="stub"><p>piratebay</p></th>
1060+<tr class="row-odd"><th class="stub"><p>piratebay</p></th>
10061061<th class="stub"><p>!tpb</p></th>
10071062<td><p>piratebay</p></td>
10081063<td><p>3.0</p></td>
@@ -1015,8 +1070,9 @@
10151070<td></td>
10161071<td><p>1</p></td>
10171072<td></td>
1073+<td><p>y</p></td>
10181074</tr>
1019−<tr class="row-odd"><th class="stub"><p>pubmed</p></th>
1075+<tr class="row-even"><th class="stub"><p>pubmed</p></th>
10201076<th class="stub"><p>!pub</p></th>
10211077<td><p>pubmed</p></td>
10221078<td><p>3.0</p></td>
@@ -1029,8 +1085,9 @@
10291085<td></td>
10301086<td><p>1</p></td>
10311087<td></td>
1088+<td><p>y</p></td>
10321089</tr>
1033−<tr class="row-even"><th class="stub"><p>qwant</p></th>
1090+<tr class="row-odd"><th class="stub"><p>qwant</p></th>
10341091<th class="stub"><p>!qw</p></th>
10351092<td><p>qwant</p></td>
10361093<td><p>2.0</p></td>
@@ -1043,8 +1100,9 @@
10431100<td></td>
10441101<td><p>1</p></td>
10451102<td><p>y</p></td>
1103+<td><p>y</p></td>
10461104</tr>
1047−<tr class="row-odd"><th class="stub"><p>qwant images</p></th>
1105+<tr class="row-even"><th class="stub"><p>qwant images</p></th>
10481106<th class="stub"><p>!qwi</p></th>
10491107<td><p>qwant</p></td>
10501108<td><p>2.0</p></td>
@@ -1057,8 +1115,9 @@
10571115<td></td>
10581116<td><p>1</p></td>
10591117<td></td>
1118+<td><p>y</p></td>
10601119</tr>
1061−<tr class="row-even"><th class="stub"><p>qwant news</p></th>
1120+<tr class="row-odd"><th class="stub"><p>qwant news</p></th>
10621121<th class="stub"><p>!qwn</p></th>
10631122<td><p>qwant</p></td>
10641123<td><p>2.0</p></td>
@@ -1071,8 +1130,9 @@
10711130<td></td>
10721131<td><p>1</p></td>
10731132<td></td>
1133+<td><p>y</p></td>
10741134</tr>
1075−<tr class="row-odd"><th class="stub"><p>qwant social</p></th>
1135+<tr class="row-even"><th class="stub"><p>qwant social</p></th>
10761136<th class="stub"><p>!qws</p></th>
10771137<td><p>qwant</p></td>
10781138<td><p>2.0</p></td>
@@ -1085,8 +1145,9 @@
10851145<td></td>
10861146<td><p>1</p></td>
10871147<td></td>
1148+<td><p>y</p></td>
10881149</tr>
1089−<tr class="row-even"><th class="stub"><p>reddit</p></th>
1150+<tr class="row-odd"><th class="stub"><p>reddit</p></th>
10901151<th class="stub"><p>!re</p></th>
10911152<td><p>reddit</p></td>
10921153<td><p>10.0</p></td>
@@ -1099,8 +1160,9 @@
10991160<td></td>
11001161<td><p>1</p></td>
11011162<td><p>y</p></td>
1163+<td><p>y</p></td>
11021164</tr>
1103−<tr class="row-odd"><th class="stub"><p>soundcloud</p></th>
1165+<tr class="row-even"><th class="stub"><p>soundcloud</p></th>
11041166<th class="stub"><p>!sc</p></th>
11051167<td><p>soundcloud</p></td>
11061168<td><p>2.0</p></td>
@@ -1113,8 +1175,9 @@
11131175<td></td>
11141176<td><p>1</p></td>
11151177<td></td>
1178+<td><p>y</p></td>
11161179</tr>
1117−<tr class="row-even"><th class="stub"><p>stackoverflow</p></th>
1180+<tr class="row-odd"><th class="stub"><p>stackoverflow</p></th>
11181181<th class="stub"><p>!st</p></th>
11191182<td><p>stackoverflow</p></td>
11201183<td><p>2.0</p></td>
@@ -1127,8 +1190,9 @@
11271190<td></td>
11281191<td><p>1</p></td>
11291192<td></td>
1193+<td><p>y</p></td>
11301194</tr>
1131−<tr class="row-odd"><th class="stub"><p>searchcode doc</p></th>
1195+<tr class="row-even"><th class="stub"><p>searchcode doc</p></th>
11321196<th class="stub"><p>!scd</p></th>
11331197<td><p>searchcode_doc</p></td>
11341198<td><p>2.0</p></td>
@@ -1141,8 +1205,9 @@
11411205<td></td>
11421206<td><p>1</p></td>
11431207<td></td>
1208+<td><p>y</p></td>
11441209</tr>
1145−<tr class="row-even"><th class="stub"><p>searchcode code</p></th>
1210+<tr class="row-odd"><th class="stub"><p>searchcode code</p></th>
11461211<th class="stub"><p>!scc</p></th>
11471212<td><p>searchcode_code</p></td>
11481213<td><p>2.0</p></td>
@@ -1155,8 +1220,9 @@
11551220<td></td>
11561221<td><p>1</p></td>
11571222<td><p>y</p></td>
1223+<td><p>y</p></td>
11581224</tr>
1159−<tr class="row-odd"><th class="stub"><p>framalibre</p></th>
1225+<tr class="row-even"><th class="stub"><p>framalibre</p></th>
11601226<th class="stub"><p>!frl</p></th>
11611227<td><p>framalibre</p></td>
11621228<td><p>2.0</p></td>
@@ -1169,8 +1235,9 @@
11691235<td></td>
11701236<td><p>1</p></td>
11711237<td><p>y</p></td>
1238+<td><p>y</p></td>
11721239</tr>
1173−<tr class="row-even"><th class="stub"><p>semantic scholar</p></th>
1240+<tr class="row-odd"><th class="stub"><p>semantic scholar</p></th>
11741241<th class="stub"><p>!se</p></th>
11751242<td><p>xpath</p></td>
11761243<td><p>2.0</p></td>
@@ -1183,8 +1250,9 @@
11831250<td></td>
11841251<td><p>1</p></td>
11851252<td></td>
1253+<td><p>y</p></td>
11861254</tr>
1187−<tr class="row-odd"><th class="stub"><p>startpage</p></th>
1255+<tr class="row-even"><th class="stub"><p>startpage</p></th>
11881256<th class="stub"><p>!sp</p></th>
11891257<td><p>startpage</p></td>
11901258<td><p>6.0</p></td>
@@ -1197,8 +1265,9 @@
11971265<td></td>
11981266<td><p>1</p></td>
11991267<td><p>y</p></td>
1268+<td><p>y</p></td>
12001269</tr>
1201−<tr class="row-even"><th class="stub"><p>tokyotoshokan</p></th>
1270+<tr class="row-odd"><th class="stub"><p>tokyotoshokan</p></th>
12021271<th class="stub"><p>!tt</p></th>
12031272<td><p>tokyotoshokan</p></td>
12041273<td><p>6.0</p></td>
@@ -1211,8 +1280,9 @@
12111280<td></td>
12121281<td><p>1</p></td>
12131282<td><p>y</p></td>
1283+<td><p>y</p></td>
12141284</tr>
1215−<tr class="row-odd"><th class="stub"><p>torrentz</p></th>
1285+<tr class="row-even"><th class="stub"><p>torrentz</p></th>
12161286<th class="stub"><p>!tor</p></th>
12171287<td><p>torrentz</p></td>
12181288<td><p>3.0</p></td>
@@ -1225,8 +1295,9 @@
12251295<td></td>
12261296<td><p>1</p></td>
12271297<td></td>
1298+<td><p>y</p></td>
12281299</tr>
1229−<tr class="row-even"><th class="stub"><p>twitter</p></th>
1300+<tr class="row-odd"><th class="stub"><p>twitter</p></th>
12301301<th class="stub"><p>!tw</p></th>
12311302<td><p>twitter</p></td>
12321303<td><p>2.0</p></td>
@@ -1239,8 +1310,9 @@
12391310<td></td>
12401311<td><p>1</p></td>
12411312<td></td>
1313+<td><p>y</p></td>
12421314</tr>
1243−<tr class="row-odd"><th class="stub"><p>unsplash</p></th>
1315+<tr class="row-even"><th class="stub"><p>unsplash</p></th>
12441316<th class="stub"><p>!us</p></th>
12451317<td><p>unsplash</p></td>
12461318<td><p>2.0</p></td>
@@ -1253,8 +1325,9 @@
12531325<td></td>
12541326<td><p>1</p></td>
12551327<td><p>y</p></td>
1328+<td><p>y</p></td>
12561329</tr>
1257−<tr class="row-even"><th class="stub"><p>yahoo</p></th>
1330+<tr class="row-odd"><th class="stub"><p>yahoo</p></th>
12581331<th class="stub"><p>!yh</p></th>
12591332<td><p>yahoo</p></td>
12601333<td><p>2.0</p></td>
@@ -1267,8 +1340,9 @@
12671340<td></td>
12681341<td><p>1</p></td>
12691342<td><p>y</p></td>
1343+<td><p>y</p></td>
12701344</tr>
1271−<tr class="row-odd"><th class="stub"><p>yandex</p></th>
1345+<tr class="row-even"><th class="stub"><p>yandex</p></th>
12721346<th class="stub"><p>!yn</p></th>
12731347<td><p>yandex</p></td>
12741348<td><p>2.0</p></td>
@@ -1281,8 +1355,9 @@
12811355<td></td>
12821356<td><p>1</p></td>
12831357<td><p>y</p></td>
1358+<td><p>y</p></td>
12841359</tr>
1285−<tr class="row-even"><th class="stub"><p>yahoo news</p></th>
1360+<tr class="row-odd"><th class="stub"><p>yahoo news</p></th>
12861361<th class="stub"><p>!yhn</p></th>
12871362<td><p>yahoo_news</p></td>
12881363<td><p>2.0</p></td>
@@ -1295,8 +1370,9 @@
12951370<td></td>
12961371<td><p>1</p></td>
12971372<td></td>
1373+<td><p>y</p></td>
12981374</tr>
1299−<tr class="row-odd"><th class="stub"><p>youtube</p></th>
1375+<tr class="row-even"><th class="stub"><p>youtube</p></th>
13001376<th class="stub"><p>!yt</p></th>
13011377<td><p>youtube_noapi</p></td>
13021378<td><p>2.0</p></td>
@@ -1309,8 +1385,9 @@
13091385<td></td>
13101386<td><p>1</p></td>
13111387<td></td>
1388+<td><p>y</p></td>
13121389</tr>
1313−<tr class="row-even"><th class="stub"><p>dailymotion</p></th>
1390+<tr class="row-odd"><th class="stub"><p>dailymotion</p></th>
13141391<th class="stub"><p>!dm</p></th>
13151392<td><p>dailymotion</p></td>
13161393<td><p>2.0</p></td>
@@ -1323,8 +1400,9 @@
13231400<td></td>
13241401<td><p>1</p></td>
13251402<td></td>
1403+<td><p>y</p></td>
13261404</tr>
1327−<tr class="row-odd"><th class="stub"><p>vimeo</p></th>
1405+<tr class="row-even"><th class="stub"><p>vimeo</p></th>
13281406<th class="stub"><p>!vm</p></th>
13291407<td><p>vimeo</p></td>
13301408<td><p>2.0</p></td>
@@ -1337,6 +1415,112 @@
13371415<td></td>
13381416<td><p>1</p></td>
13391417<td></td>
1418+<td><p>y</p></td>
1419+</tr>
1420+<tr class="row-odd"><th class="stub"><p>wikibooks</p></th>
1421+<th class="stub"><p>!wb</p></th>
1422+<td><p>mediawiki</p></td>
1423+<td><p>2.0</p></td>
1424+<td><p>general</p></td>
1425+<td><p>y</p></td>
1426+<td><p>y</p></td>
1427+<td></td>
1428+<td><p>y</p></td>
1429+<td></td>
1430+<td></td>
1431+<td><p>1</p></td>
1432+<td><p>y</p></td>
1433+<td><p>y</p></td>
1434+</tr>
1435+<tr class="row-even"><th class="stub"><p>wikinews</p></th>
1436+<th class="stub"><p>!wn</p></th>
1437+<td><p>mediawiki</p></td>
1438+<td><p>2.0</p></td>
1439+<td><p>news</p></td>
1440+<td><p>y</p></td>
1441+<td><p>y</p></td>
1442+<td></td>
1443+<td><p>y</p></td>
1444+<td></td>
1445+<td></td>
1446+<td><p>1</p></td>
1447+<td><p>y</p></td>
1448+<td><p>y</p></td>
1449+</tr>
1450+<tr class="row-odd"><th class="stub"><p>wikiquote</p></th>
1451+<th class="stub"><p>!wq</p></th>
1452+<td><p>mediawiki</p></td>
1453+<td><p>2.0</p></td>
1454+<td><p>general</p></td>
1455+<td><p>y</p></td>
1456+<td><p>y</p></td>
1457+<td></td>
1458+<td><p>y</p></td>
1459+<td></td>
1460+<td></td>
1461+<td><p>1</p></td>
1462+<td><p>y</p></td>
1463+<td><p>y</p></td>
1464+</tr>
1465+<tr class="row-even"><th class="stub"><p>wikisource</p></th>
1466+<th class="stub"><p>!ws</p></th>
1467+<td><p>mediawiki</p></td>
1468+<td><p>2.0</p></td>
1469+<td><p>general</p></td>
1470+<td><p>y</p></td>
1471+<td><p>y</p></td>
1472+<td></td>
1473+<td><p>y</p></td>
1474+<td></td>
1475+<td></td>
1476+<td><p>1</p></td>
1477+<td><p>y</p></td>
1478+<td><p>y</p></td>
1479+</tr>
1480+<tr class="row-odd"><th class="stub"><p>wiktionary</p></th>
1481+<th class="stub"><p>!wt</p></th>
1482+<td><p>mediawiki</p></td>
1483+<td><p>2.0</p></td>
1484+<td><p>general</p></td>
1485+<td><p>y</p></td>
1486+<td><p>y</p></td>
1487+<td></td>
1488+<td><p>y</p></td>
1489+<td></td>
1490+<td></td>
1491+<td><p>1</p></td>
1492+<td><p>y</p></td>
1493+<td><p>y</p></td>
1494+</tr>
1495+<tr class="row-even"><th class="stub"><p>wikiversity</p></th>
1496+<th class="stub"><p>!wv</p></th>
1497+<td><p>mediawiki</p></td>
1498+<td><p>2.0</p></td>
1499+<td><p>general</p></td>
1500+<td><p>y</p></td>
1501+<td><p>y</p></td>
1502+<td></td>
1503+<td><p>y</p></td>
1504+<td></td>
1505+<td></td>
1506+<td><p>1</p></td>
1507+<td><p>y</p></td>
1508+<td><p>y</p></td>
1509+</tr>
1510+<tr class="row-odd"><th class="stub"><p>wikivoyage</p></th>
1511+<th class="stub"><p>!wy</p></th>
1512+<td><p>mediawiki</p></td>
1513+<td><p>2.0</p></td>
1514+<td><p>general</p></td>
1515+<td><p>y</p></td>
1516+<td><p>y</p></td>
1517+<td></td>
1518+<td><p>y</p></td>
1519+<td></td>
1520+<td></td>
1521+<td><p>1</p></td>
1522+<td><p>y</p></td>
1523+<td><p>y</p></td>
13401524</tr>
13411525<tr class="row-even"><th class="stub"><p>wolframalpha</p></th>
13421526<th class="stub"><p>!wa</p></th>
@@ -1351,6 +1535,7 @@
13511535<td></td>
13521536<td><p>1</p></td>
13531537<td></td>
1538+<td><p>y</p></td>
13541539</tr>
13551540<tr class="row-odd"><th class="stub"><p>dictzone</p></th>
13561541<th class="stub"><p>!dc</p></th>
@@ -1365,6 +1550,7 @@
13651550<td></td>
13661551<td><p>100</p></td>
13671552<td></td>
1553+<td><p>y</p></td>
13681554</tr>
13691555<tr class="row-even"><th class="stub"><p>mymemory translated</p></th>
13701556<th class="stub"><p>!tl</p></th>
@@ -1379,6 +1565,7 @@
13791565<td></td>
13801566<td><p>100</p></td>
13811567<td><p>y</p></td>
1568+<td><p>y</p></td>
13821569</tr>
13831570<tr class="row-odd"><th class="stub"><p>voat</p></th>
13841571<th class="stub"><p>!vo</p></th>
@@ -1393,6 +1580,7 @@
13931580<td></td>
13941581<td><p>1</p></td>
13951582<td><p>y</p></td>
1583+<td><p>y</p></td>
13961584</tr>
13971585<tr class="row-even"><th class="stub"><p>1337x</p></th>
13981586<th class="stub"><p>!1337x</p></th>
@@ -1407,6 +1595,7 @@
14071595<td></td>
14081596<td><p>1</p></td>
14091597<td><p>y</p></td>
1598+<td><p>y</p></td>
14101599</tr>
14111600<tr class="row-odd"><th class="stub"><p>duden</p></th>
14121601<th class="stub"><p>!du</p></th>
@@ -1421,6 +1610,7 @@
14211610<td></td>
14221611<td><p>1</p></td>
14231612<td><p>y</p></td>
1613+<td><p>y</p></td>
14241614</tr>
14251615<tr class="row-even"><th class="stub"><p>seznam</p></th>
14261616<th class="stub"><p>!szn</p></th>
@@ -1435,6 +1625,7 @@
14351625<td></td>
14361626<td><p>1</p></td>
14371627<td><p>y</p></td>
1628+<td><p>y</p></td>
14381629</tr>
14391630<tr class="row-odd"><th class="stub"><p>mojeek</p></th>
14401631<th class="stub"><p>!mjk</p></th>
@@ -1449,6 +1640,7 @@
14491640<td></td>
14501641<td><p>1</p></td>
14511642<td><p>y</p></td>
1643+<td><p>y</p></td>
14521644</tr>
14531645<tr class="row-even"><th class="stub"><p>seedpeer</p></th>
14541646<th class="stub"><p>!speu</p></th>
@@ -1463,12 +1655,29 @@
14631655<td></td>
14641656<td><p>1</p></td>
14651657<td></td>
1658+<td><p>y</p></td>
1659+</tr>
1660+<tr class="row-odd"><th class="stub"><p>rubygems</p></th>
1661+<th class="stub"><p>!rbg</p></th>
1662+<td><p>xpath</p></td>
1663+<td><p>2.0</p></td>
1664+<td><p>it</p></td>
1665+<td><p>y</p></td>
1666+<td><p>y</p></td>
1667+<td></td>
1668+<td><p>y</p></td>
1669+<td></td>
1670+<td></td>
1671+<td><p>1</p></td>
1672+<td><p>y</p></td>
1673+<td><p>y</p></td>
14661674</tr>
14671675</tbody>
14681676</table>
14691677</div>
14701678
14711679
1680+ <div class="clearer"></div>
14721681 </div>
14731682 </div>
14741683 </div>
@@ -1520,7 +1729,7 @@
15201729
15211730 <div class="footer" role="contentinfo">
15221731 &#169; Copyright 2015-2020, Adam Tauber, Noémi Ványi.
1523− Created using <a href="http://sphinx-doc.org/">Sphinx</a> 2.4.4.
1732+ Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 3.1.1.
15241733 </div>
15251734 <script src="../_static/version_warning_offset.js"></script>
15261735
admin/filtron.html+144−103
@@ -1,9 +1,10 @@
11
22<!DOCTYPE html>
33
4−<html xmlns="http://www.w3.org/1999/xhtml">
4+<html>
55 <head>
66 <meta charset="utf-8" />
7+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
78 <meta name="viewport" content="width=device-width, initial-scale=1">
89 <title>How to protect an instance &#8212; Searx Documentation (Searx-0.16.0.tex)</title>
910 <link rel="stylesheet" href="../_static/searx.css" type="text/css" />
@@ -33,7 +34,8 @@
3334 <a href="architecture.html" title="Architecture"
3435 accesskey="P">previous</a> |</li>
3536 <li class="nav-item nav-item-0"><a href="../index.html">Searx Documentation (Searx-0.16.0.tex)</a> &#187;</li>
36− <li class="nav-item nav-item-1"><a href="index.html" accesskey="U">Administrator documentation</a> &#187;</li>
37+ <li class="nav-item nav-item-1"><a href="index.html" accesskey="U">Administrator documentation</a> &#187;</li>
38+ <li class="nav-item nav-item-this"><a href="">How to protect an instance</a></li>
3739 </ul>
3840 </div>
3941
@@ -43,13 +45,42 @@
4345 <div class="body" role="main">
4446
4547 <div class="section" id="how-to-protect-an-instance">
46−<h1>How to protect an instance<a class="headerlink" href="#how-to-protect-an-instance" title="Permalink to this headline">¶</a></h1>
47−<p>Searx depens on external search services. To avoid the abuse of these services
48+<span id="searx-filtron"></span><h1>How to protect an instance<a class="headerlink" href="#how-to-protect-an-instance" title="Permalink to this headline">¶</a></h1>
49+<div class="sidebar">
50+<p class="sidebar-title">further reading</p>
51+<ul class="simple">
52+<li><p><a class="reference internal" href="../utils/filtron.sh.html#filtron-sh"><span class="std std-ref">utils/filtron.sh</span></a></p></li>
53+<li><p><a class="reference internal" href="installation-nginx.html#nginx-searx-site"><span class="std std-ref">A nginx searx site</span></a></p></li>
54+</ul>
55+</div>
56+<div class="contents local topic" id="contents">
57+<p class="topic-title">Contents</p>
58+<ul class="simple">
59+<li><p><a class="reference internal" href="#filtron-go" id="id2">filtron &amp; go</a></p></li>
60+<li><p><a class="reference internal" href="#sample-configuration-of-filtron" id="id3">Sample configuration of filtron</a></p></li>
61+<li><p><a class="reference internal" href="#route-request-through-filtron" id="id4">Route request through filtron</a></p></li>
62+</ul>
63+</div>
64+<p>Searx depends on external search services. To avoid the abuse of these services
4865it is advised to limit the number of requests processed by searx.</p>
49−<p>An application firewall, <code class="docutils literal notranslate"><span class="pre">filtron</span></code> solves exactly this problem. Information
50−on how to install it can be found at the <a class="reference external" href="https://github.com/asciimoo/filtron">project page of filtron</a>.</p>
66+<p>An application firewall, <a class="reference external" href="https://github.com/asciimoo/filtron">filtron</a> solves exactly this problem. Filtron is just
67+a middleware between your web server (nginx, apache, …) and searx, we describe
68+such infratructures in chapter: <a class="reference internal" href="architecture.html#architecture"><span class="std std-ref">Architecture</span></a>.</p>
69+<div class="section" id="filtron-go">
70+<h2><a class="toc-backref" href="#id2">filtron &amp; go</a><a class="headerlink" href="#filtron-go" title="Permalink to this headline">¶</a></h2>
71+<p>Filtron needs <a class="reference external" href="https://golang.org/">Go</a> installed. If <a class="reference external" href="https://golang.org/">Go</a> is preinstalled, <a class="reference external" href="https://github.com/asciimoo/filtron">filtron</a> is simply
72+installed by <code class="docutils literal notranslate"><span class="pre">go</span> <span class="pre">get</span></code> package management (see <a class="reference external" href="https://github.com/asciimoo/filtron/blob/master/README.md">filtron README</a>). If you use
73+filtron as middleware, a more isolated setup is recommended. To simplify such
74+an installation and the maintenance of, use our script <a class="reference internal" href="../utils/filtron.sh.html#filtron-sh"><span class="std std-ref">utils/filtron.sh</span></a>.</p>
75+</div>
5176<div class="section" id="sample-configuration-of-filtron">
52−<h2>Sample configuration of filtron<a class="headerlink" href="#sample-configuration-of-filtron" title="Permalink to this headline">¶</a></h2>
77+<span id="id1"></span><h2><a class="toc-backref" href="#id3">Sample configuration of filtron</a><a class="headerlink" href="#sample-configuration-of-filtron" title="Permalink to this headline">¶</a></h2>
78+<div class="sidebar">
79+<p class="sidebar-title">Tooling box</p>
80+<ul class="simple">
81+<li><p><a class="reference external" href="https://github.com/asciimoo/searx/blob/master/utils/templates/etc/filtron/rules.json">/etc/filtron/rules.json</a></p></li>
82+</ul>
83+</div>
5384<p>An example configuration can be find below. This configuration limits the access
5485of:</p>
5586<ul class="simple">
@@ -59,104 +90,104 @@ of:</p>
5990<li><p>too many json, csv, etc. requests (rss/json limit)</p></li>
6091<li><p>the same UserAgent of if too many requests (useragent limit)</p></li>
6192</ul>
62−<div class="highlight-json notranslate"><div class="highlight"><pre><span></span><span class="p">[{</span>
63− <span class="nt">&quot;name&quot;</span><span class="p">:</span><span class="s2">&quot;search request&quot;</span><span class="p">,</span>
64− <span class="nt">&quot;filters&quot;</span><span class="p">:[</span>
65− <span class="s2">&quot;Param:q&quot;</span><span class="p">,</span>
66− <span class="s2">&quot;Path=^(/|/search)$&quot;</span>
67− <span class="p">],</span>
68− <span class="nt">&quot;interval&quot;</span><span class="p">:</span><span class="s2">&quot;&lt;time-interval-in-sec (int)&gt;&quot;</span><span class="p">,</span>
69− <span class="nt">&quot;limit&quot;</span><span class="p">:</span><span class="s2">&quot;&lt;max-request-number-in-interval (int)&gt;&quot;</span><span class="p">,</span>
70− <span class="nt">&quot;subrules&quot;</span><span class="p">:[</span>
71− <span class="p">{</span>
72− <span class="nt">&quot;name&quot;</span><span class="p">:</span><span class="s2">&quot;roboagent limit&quot;</span><span class="p">,</span>
73− <span class="nt">&quot;interval&quot;</span><span class="p">:</span><span class="s2">&quot;&lt;time-interval-in-sec (int)&gt;&quot;</span><span class="p">,</span>
74− <span class="nt">&quot;limit&quot;</span><span class="p">:</span><span class="s2">&quot;&lt;max-request-number-in-interval (int)&gt;&quot;</span><span class="p">,</span>
75− <span class="nt">&quot;filters&quot;</span><span class="p">:[</span>
76− <span class="s2">&quot;Header:User-Agent=(curl|cURL|Wget|python-requests|Scrapy|FeedFetcher|Go-http-client)&quot;</span>
77− <span class="p">],</span>
78− <span class="nt">&quot;actions&quot;</span><span class="p">:[</span>
93+<div class="highlight-json notranslate"><div class="highlight"><pre><span></span><span class="p">[</span>
94+ <span class="p">{</span>
95+ <span class="nt">&quot;name&quot;</span><span class="p">:</span> <span class="s2">&quot;search request&quot;</span><span class="p">,</span>
96+ <span class="nt">&quot;filters&quot;</span><span class="p">:</span> <span class="p">[</span>
97+ <span class="s2">&quot;Param:q&quot;</span><span class="p">,</span>
98+ <span class="s2">&quot;Path=^(/|/search)$&quot;</span>
99+ <span class="p">],</span>
100+ <span class="nt">&quot;interval&quot;</span><span class="p">:</span> <span class="s2">&quot;&lt;time-interval-in-sec (int)&gt;&quot;</span>
101+ <span class="s2">&quot;limit&quot;</span><span class="p">:</span> <span class="s2">&quot;&lt;max-request-number-in-interval (int)&gt;&quot;</span><span class="p">,</span>
102+ <span class="nt">&quot;subrules&quot;</span><span class="p">:</span> <span class="p">[</span>
79103 <span class="p">{</span>
80− <span class="nt">&quot;name&quot;</span><span class="p">:</span><span class="s2">&quot;block&quot;</span><span class="p">,</span>
81− <span class="nt">&quot;params&quot;</span><span class="p">:{</span>
82− <span class="nt">&quot;message&quot;</span><span class="p">:</span><span class="s2">&quot;Rate limit exceeded&quot;</span>
83− <span class="p">}</span>
84− <span class="p">}</span>
85− <span class="p">]</span>
86− <span class="p">},</span>
87− <span class="p">{</span>
88− <span class="nt">&quot;name&quot;</span><span class="p">:</span><span class="s2">&quot;botlimit&quot;</span><span class="p">,</span>
89− <span class="nt">&quot;limit&quot;</span><span class="p">:</span><span class="mi">0</span><span class="p">,</span>
90− <span class="nt">&quot;stop&quot;</span><span class="p">:</span><span class="kc">true</span><span class="p">,</span>
91− <span class="nt">&quot;filters&quot;</span><span class="p">:[</span>
92− <span class="s2">&quot;Header:User-Agent=(Googlebot|bingbot|Baiduspider|yacybot|YandexMobileBot|YandexBot|Yahoo! Slurp|MJ12bot|AhrefsBot|archive.org_bot|msnbot|MJ12bot|SeznamBot|linkdexbot|Netvibes|SMTBot|zgrab|James BOT)&quot;</span>
93− <span class="p">],</span>
94− <span class="nt">&quot;actions&quot;</span><span class="p">:[</span>
104+ <span class="nt">&quot;name&quot;</span><span class="p">:</span> <span class="s2">&quot;missing Accept-Language&quot;</span><span class="p">,</span>
105+ <span class="nt">&quot;filters&quot;</span><span class="p">:</span> <span class="p">[</span><span class="s2">&quot;!Header:Accept-Language&quot;</span><span class="p">],</span>
106+ <span class="nt">&quot;limit&quot;</span><span class="p">:</span> <span class="s2">&quot;&lt;max-request-number-in-interval (int)&gt;&quot;</span><span class="p">,</span>
107+ <span class="nt">&quot;stop&quot;</span><span class="p">:</span> <span class="kc">true</span><span class="p">,</span>
108+ <span class="nt">&quot;actions&quot;</span><span class="p">:</span> <span class="p">[</span>
109+ <span class="p">{</span><span class="nt">&quot;name&quot;</span><span class="p">:</span><span class="s2">&quot;log&quot;</span><span class="p">},</span>
110+ <span class="p">{</span><span class="nt">&quot;name&quot;</span><span class="p">:</span> <span class="s2">&quot;block&quot;</span><span class="p">,</span>
111+ <span class="nt">&quot;params&quot;</span><span class="p">:</span> <span class="p">{</span><span class="nt">&quot;message&quot;</span><span class="p">:</span> <span class="s2">&quot;Rate limit exceeded&quot;</span><span class="p">}}</span>
112+ <span class="p">]</span>
113+ <span class="p">},</span>
95114 <span class="p">{</span>
96− <span class="nt">&quot;name&quot;</span><span class="p">:</span><span class="s2">&quot;block&quot;</span><span class="p">,</span>
97− <span class="nt">&quot;params&quot;</span><span class="p">:{</span>
98− <span class="nt">&quot;message&quot;</span><span class="p">:</span><span class="s2">&quot;Rate limit exceeded&quot;</span>
99− <span class="p">}</span>
100− <span class="p">}</span>
101− <span class="p">]</span>
102− <span class="p">},</span>
103− <span class="p">{</span>
104− <span class="nt">&quot;name&quot;</span><span class="p">:</span><span class="s2">&quot;IP limit&quot;</span><span class="p">,</span>
105− <span class="nt">&quot;interval&quot;</span><span class="p">:</span><span class="s2">&quot;&lt;time-interval-in-sec (int)&gt;&quot;</span><span class="p">,</span>
106− <span class="nt">&quot;limit&quot;</span><span class="p">:</span><span class="s2">&quot;&lt;max-request-number-in-interval (int)&gt;&quot;</span><span class="p">,</span>
107− <span class="nt">&quot;stop&quot;</span><span class="p">:</span><span class="kc">true</span><span class="p">,</span>
108− <span class="nt">&quot;aggregations&quot;</span><span class="p">:[</span>
109− <span class="s2">&quot;Header:X-Forwarded-For&quot;</span>
110− <span class="p">],</span>
111− <span class="nt">&quot;actions&quot;</span><span class="p">:[</span>
115+ <span class="nt">&quot;name&quot;</span><span class="p">:</span> <span class="s2">&quot;suspiciously Connection=close header&quot;</span><span class="p">,</span>
116+ <span class="nt">&quot;filters&quot;</span><span class="p">:</span> <span class="p">[</span><span class="s2">&quot;Header:Connection=close&quot;</span><span class="p">],</span>
117+ <span class="nt">&quot;limit&quot;</span><span class="p">:</span> <span class="s2">&quot;&lt;max-request-number-in-interval (int)&gt;&quot;</span><span class="p">,</span>
118+ <span class="nt">&quot;stop&quot;</span><span class="p">:</span> <span class="kc">true</span><span class="p">,</span>
119+ <span class="nt">&quot;actions&quot;</span><span class="p">:</span> <span class="p">[</span>
120+ <span class="p">{</span><span class="nt">&quot;name&quot;</span><span class="p">:</span><span class="s2">&quot;log&quot;</span><span class="p">},</span>
121+ <span class="p">{</span><span class="nt">&quot;name&quot;</span><span class="p">:</span> <span class="s2">&quot;block&quot;</span><span class="p">,</span>
122+ <span class="nt">&quot;params&quot;</span><span class="p">:</span> <span class="p">{</span><span class="nt">&quot;message&quot;</span><span class="p">:</span> <span class="s2">&quot;Rate limit exceeded&quot;</span><span class="p">}}</span>
123+ <span class="p">]</span>
124+ <span class="p">},</span>
112125 <span class="p">{</span>
113− <span class="nt">&quot;name&quot;</span><span class="p">:</span><span class="s2">&quot;block&quot;</span><span class="p">,</span>
114− <span class="nt">&quot;params&quot;</span><span class="p">:{</span>
115− <span class="nt">&quot;message&quot;</span><span class="p">:</span><span class="s2">&quot;Rate limit exceeded&quot;</span>
116− <span class="p">}</span>
117− <span class="p">}</span>
118− <span class="p">]</span>
119− <span class="p">},</span>
120− <span class="p">{</span>
121− <span class="nt">&quot;name&quot;</span><span class="p">:</span><span class="s2">&quot;rss/json limit&quot;</span><span class="p">,</span>
122− <span class="nt">&quot;interval&quot;</span><span class="p">:</span><span class="s2">&quot;&lt;time-interval-in-sec (int)&gt;&quot;</span><span class="p">,</span>
123− <span class="nt">&quot;limit&quot;</span><span class="p">:</span><span class="s2">&quot;&lt;max-request-number-in-interval (int)&gt;&quot;</span><span class="p">,</span>
124− <span class="nt">&quot;stop&quot;</span><span class="p">:</span><span class="kc">true</span><span class="p">,</span>
125− <span class="nt">&quot;filters&quot;</span><span class="p">:[</span>
126− <span class="s2">&quot;Param:format=(csv|json|rss)&quot;</span>
127− <span class="p">],</span>
128− <span class="nt">&quot;actions&quot;</span><span class="p">:[</span>
126+ <span class="nt">&quot;name&quot;</span><span class="p">:</span> <span class="s2">&quot;IP limit&quot;</span><span class="p">,</span>
127+ <span class="nt">&quot;interval&quot;</span><span class="p">:</span> <span class="s2">&quot;&lt;time-interval-in-sec (int)&gt;&quot;</span>
128+ <span class="s2">&quot;limit&quot;</span><span class="p">:</span> <span class="s2">&quot;&lt;max-request-number-in-interval (int)&gt;&quot;</span><span class="p">,</span>
129+ <span class="nt">&quot;stop&quot;</span><span class="p">:</span> <span class="kc">true</span><span class="p">,</span>
130+ <span class="nt">&quot;aggregations&quot;</span><span class="p">:</span> <span class="p">[</span>
131+ <span class="s2">&quot;Header:X-Forwarded-For&quot;</span>
132+ <span class="p">],</span>
133+ <span class="nt">&quot;actions&quot;</span><span class="p">:</span> <span class="p">[</span>
134+ <span class="p">{</span> <span class="nt">&quot;name&quot;</span><span class="p">:</span> <span class="s2">&quot;log&quot;</span><span class="p">},</span>
135+ <span class="p">{</span> <span class="nt">&quot;name&quot;</span><span class="p">:</span> <span class="s2">&quot;block&quot;</span><span class="p">,</span>
136+ <span class="nt">&quot;params&quot;</span><span class="p">:</span> <span class="p">{</span>
137+ <span class="nt">&quot;message&quot;</span><span class="p">:</span> <span class="s2">&quot;Rate limit exceeded&quot;</span>
138+ <span class="p">}</span>
139+ <span class="p">}</span>
140+ <span class="p">]</span>
141+ <span class="p">},</span>
129142 <span class="p">{</span>
130− <span class="nt">&quot;name&quot;</span><span class="p">:</span><span class="s2">&quot;block&quot;</span><span class="p">,</span>
131− <span class="nt">&quot;params&quot;</span><span class="p">:{</span>
132− <span class="nt">&quot;message&quot;</span><span class="p">:</span><span class="s2">&quot;Rate limit exceeded&quot;</span>
133− <span class="p">}</span>
134− <span class="p">}</span>
135− <span class="p">]</span>
136− <span class="p">},</span>
137− <span class="p">{</span>
138− <span class="nt">&quot;name&quot;</span><span class="p">:</span><span class="s2">&quot;useragent limit&quot;</span><span class="p">,</span>
139− <span class="nt">&quot;interval&quot;</span><span class="p">:</span><span class="s2">&quot;&lt;time-interval-in-sec (int)&gt;&quot;</span><span class="p">,</span>
140− <span class="nt">&quot;limit&quot;</span><span class="p">:</span><span class="s2">&quot;&lt;max-request-number-in-interval (int)&gt;&quot;</span><span class="p">,</span>
141− <span class="nt">&quot;aggregations&quot;</span><span class="p">:[</span>
142− <span class="s2">&quot;Header:User-Agent&quot;</span>
143− <span class="p">],</span>
144− <span class="nt">&quot;actions&quot;</span><span class="p">:[</span>
143+ <span class="nt">&quot;name&quot;</span><span class="p">:</span> <span class="s2">&quot;rss/json limit&quot;</span><span class="p">,</span>
144+ <span class="nt">&quot;filters&quot;</span><span class="p">:</span> <span class="p">[</span>
145+ <span class="s2">&quot;Param:format=(csv|json|rss)&quot;</span>
146+ <span class="p">],</span>
147+ <span class="nt">&quot;interval&quot;</span><span class="p">:</span> <span class="s2">&quot;&lt;time-interval-in-sec (int)&gt;&quot;</span>
148+ <span class="s2">&quot;limit&quot;</span><span class="p">:</span> <span class="s2">&quot;&lt;max-request-number-in-interval (int)&gt;&quot;</span><span class="p">,</span>
149+ <span class="nt">&quot;stop&quot;</span><span class="p">:</span> <span class="kc">true</span><span class="p">,</span>
150+ <span class="nt">&quot;actions&quot;</span><span class="p">:</span> <span class="p">[</span>
151+ <span class="p">{</span> <span class="nt">&quot;name&quot;</span><span class="p">:</span> <span class="s2">&quot;log&quot;</span><span class="p">},</span>
152+ <span class="p">{</span> <span class="nt">&quot;name&quot;</span><span class="p">:</span> <span class="s2">&quot;block&quot;</span><span class="p">,</span>
153+ <span class="nt">&quot;params&quot;</span><span class="p">:</span> <span class="p">{</span>
154+ <span class="nt">&quot;message&quot;</span><span class="p">:</span> <span class="s2">&quot;Rate limit exceeded&quot;</span>
155+ <span class="p">}</span>
156+ <span class="p">}</span>
157+ <span class="p">]</span>
158+ <span class="p">},</span>
145159 <span class="p">{</span>
146− <span class="nt">&quot;name&quot;</span><span class="p">:</span><span class="s2">&quot;block&quot;</span><span class="p">,</span>
147− <span class="nt">&quot;params&quot;</span><span class="p">:{</span>
148− <span class="nt">&quot;message&quot;</span><span class="p">:</span><span class="s2">&quot;Rate limit exceeded&quot;</span>
149− <span class="p">}</span>
160+ <span class="nt">&quot;name&quot;</span><span class="p">:</span> <span class="s2">&quot;useragent limit&quot;</span><span class="p">,</span>
161+ <span class="nt">&quot;interval&quot;</span><span class="p">:</span> <span class="s2">&quot;&lt;time-interval-in-sec (int)&gt;&quot;</span>
162+ <span class="s2">&quot;limit&quot;</span><span class="p">:</span> <span class="s2">&quot;&lt;max-request-number-in-interval (int)&gt;&quot;</span><span class="p">,</span>
163+ <span class="nt">&quot;aggregations&quot;</span><span class="p">:</span> <span class="p">[</span>
164+ <span class="s2">&quot;Header:User-Agent&quot;</span>
165+ <span class="p">],</span>
166+ <span class="nt">&quot;actions&quot;</span><span class="p">:</span> <span class="p">[</span>
167+ <span class="p">{</span> <span class="nt">&quot;name&quot;</span><span class="p">:</span> <span class="s2">&quot;log&quot;</span><span class="p">},</span>
168+ <span class="p">{</span> <span class="nt">&quot;name&quot;</span><span class="p">:</span> <span class="s2">&quot;block&quot;</span><span class="p">,</span>
169+ <span class="nt">&quot;params&quot;</span><span class="p">:</span> <span class="p">{</span>
170+ <span class="nt">&quot;message&quot;</span><span class="p">:</span> <span class="s2">&quot;Rate limit exceeded&quot;</span>
171+ <span class="p">}</span>
172+ <span class="p">}</span>
173+ <span class="p">]</span>
150174 <span class="p">}</span>
151− <span class="p">]</span>
152− <span class="p">}</span>
153− <span class="p">]</span>
154−<span class="p">}]</span>
175+ <span class="p">]</span>
176+ <span class="p">}</span>
177+<span class="p">]</span>
155178</pre></div>
156179</div>
157180</div>
158181<div class="section" id="route-request-through-filtron">
159−<h2>Route request through filtron<a class="headerlink" href="#route-request-through-filtron" title="Permalink to this headline">¶</a></h2>
182+<span id="filtron-route-request"></span><h2><a class="toc-backref" href="#id4">Route request through filtron</a><a class="headerlink" href="#route-request-through-filtron" title="Permalink to this headline">¶</a></h2>
183+<div class="sidebar">
184+<p class="sidebar-title">further reading</p>
185+<ul class="simple">
186+<li><p><a class="reference internal" href="../utils/filtron.sh.html#filtron-sh-overview"><span class="std std-ref">Overview</span></a></p></li>
187+<li><p><a class="reference internal" href="installation-nginx.html#installation-nginx"><span class="std std-ref">Install with nginx</span></a></p></li>
188+<li><p><a class="reference internal" href="installation-apache.html#installation-apache"><span class="std std-ref">Install with apache</span></a></p></li>
189+</ul>
190+</div>
160191<p>Filtron can be started using the following command:</p>
161192<div class="highlight-sh notranslate"><div class="highlight"><pre><span></span>$ filtron -rules rules.json
162193</pre></div>
@@ -164,21 +195,31 @@ of:</p>
164195<p>It listens on <code class="docutils literal notranslate"><span class="pre">127.0.0.1:4004</span></code> and forwards filtered requests to
165196<code class="docutils literal notranslate"><span class="pre">127.0.0.1:8888</span></code> by default.</p>
166197<p>Use it along with <code class="docutils literal notranslate"><span class="pre">nginx</span></code> with the following example configuration.</p>
167−<div class="highlight-nginx notranslate"><div class="highlight"><pre><span></span><span class="k">location</span> <span class="s">/</span> <span class="p">{</span>
168− <span class="kn">proxy_set_header</span> <span class="s">Host</span> <span class="nv">$http_host</span><span class="p">;</span>
169− <span class="kn">proxy_set_header</span> <span class="s">X-Real-IP</span> <span class="nv">$remote_addr</span><span class="p">;</span>
170− <span class="kn">proxy_set_header</span> <span class="s">X-Forwarded-For</span> <span class="nv">$proxy_add_x_forwarded_for</span><span class="p">;</span>
171− <span class="kn">proxy_set_header</span> <span class="s">X-Scheme</span> <span class="nv">$scheme</span><span class="p">;</span>
172− <span class="kn">proxy_pass</span> <span class="s">http://127.0.0.1:4004/</span><span class="p">;</span>
198+<div class="highlight-nginx notranslate"><div class="highlight"><pre><span></span><span class="c1"># https://example.org/searx</span>
199+
200+<span class="k">location</span> <span class="s">/searx</span> <span class="p">{</span>
201+ <span class="kn">proxy_pass</span> <span class="s">http://127.0.0.1:4004/</span><span class="p">;</span>
202+
203+ <span class="kn">proxy_set_header</span> <span class="s">Host</span> <span class="nv">$http_host</span><span class="p">;</span>
204+ <span class="kn">proxy_set_header</span> <span class="s">Connection</span> <span class="nv">$http_connection</span><span class="p">;</span>
205+ <span class="kn">proxy_set_header</span> <span class="s">X-Real-IP</span> <span class="nv">$remote_addr</span><span class="p">;</span>
206+ <span class="kn">proxy_set_header</span> <span class="s">X-Forwarded-For</span> <span class="nv">$proxy_add_x_forwarded_for</span><span class="p">;</span>
207+ <span class="kn">proxy_set_header</span> <span class="s">X-Scheme</span> <span class="nv">$scheme</span><span class="p">;</span>
208+ <span class="kn">proxy_set_header</span> <span class="s">X-Script-Name</span> <span class="s">/searx</span><span class="p">;</span>
209+<span class="p">}</span>
210+
211+<span class="k">location</span> <span class="s">/searx/static</span> <span class="p">{</span>
212+ <span class="kn">/usr/local/searx/searx-src/searx/static</span><span class="p">;</span>
173213<span class="p">}</span>
174214</pre></div>
175215</div>
176216<p>Requests are coming from port 4004 going through filtron and then forwarded to
177−port 8888 where a searx is being run.</p>
217+port 8888 where a searx is being run. For a complete setup see: <a class="reference internal" href="installation-nginx.html#nginx-searx-site"><span class="std std-ref">A nginx searx site</span></a>.</p>
178218</div>
179219</div>
180220
181221
222+ <div class="clearer"></div>
182223 </div>
183224 </div>
184225 </div>
@@ -230,7 +271,7 @@ port 8888 where a searx is being run.</p>
230271
231272 <div class="footer" role="contentinfo">
232273 &#169; Copyright 2015-2020, Adam Tauber, Noémi Ványi.
233− Created using <a href="http://sphinx-doc.org/">Sphinx</a> 2.4.4.
274+ Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 3.1.1.
234275 </div>
235276 <script src="../_static/version_warning_offset.js"></script>
236277
admin/index.html+63−8
@@ -1,9 +1,10 @@
11
22<!DOCTYPE html>
33
4−<html xmlns="http://www.w3.org/1999/xhtml">
4+<html>
55 <head>
66 <meta charset="utf-8" />
7+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
78 <meta name="viewport" content="width=device-width, initial-scale=1">
89 <title>Administrator documentation &#8212; Searx Documentation (Searx-0.16.0.tex)</title>
910 <link rel="stylesheet" href="../_static/searx.css" type="text/css" />
@@ -32,7 +33,8 @@
3233 <li class="right" >
3334 <a href="../user/own-instance.html" title="Why use a private instance?"
3435 accesskey="P">previous</a> |</li>
35− <li class="nav-item nav-item-0"><a href="../index.html">Searx Documentation (Searx-0.16.0.tex)</a> &#187;</li>
36+ <li class="nav-item nav-item-0"><a href="../index.html">Searx Documentation (Searx-0.16.0.tex)</a> &#187;</li>
37+ <li class="nav-item nav-item-this"><a href="">Administrator documentation</a></li>
3638 </ul>
3739 </div>
3840
@@ -44,21 +46,74 @@
4446 <div class="section" id="administrator-documentation">
4547<h1>Administrator documentation<a class="headerlink" href="#administrator-documentation" title="Permalink to this headline">¶</a></h1>
4648<div class="toctree-wrapper compound">
49+<p class="caption"><span class="caption-text">Contents</span></p>
4750<ul>
48−<li class="toctree-l1"><a class="reference internal" href="installation.html">Installation</a></li>
49−<li class="toctree-l1"><a class="reference internal" href="settings.html"><code class="docutils literal notranslate"><span class="pre">settings.yml</span></code></a></li>
50−<li class="toctree-l1"><a class="reference internal" href="api.html">Administration API</a></li>
51+<li class="toctree-l1"><a class="reference internal" href="installation.html">Installation</a><ul>
52+<li class="toctree-l2"><a class="reference internal" href="installation.html#installation-scripts">Installation scripts</a></li>
53+</ul>
54+</li>
55+<li class="toctree-l1"><a class="reference internal" href="installation-searx.html">Step by step installation</a><ul>
56+<li class="toctree-l2"><a class="reference internal" href="installation-searx.html#install-packages">Install packages</a></li>
57+<li class="toctree-l2"><a class="reference internal" href="installation-searx.html#create-user">Create user</a></li>
58+<li class="toctree-l2"><a class="reference internal" href="installation-searx.html#install-searx-dependencies">install searx &amp; dependencies</a></li>
59+<li class="toctree-l2"><a class="reference internal" href="installation-searx.html#configuration">Configuration</a></li>
60+<li class="toctree-l2"><a class="reference internal" href="installation-searx.html#check">Check</a></li>
61+</ul>
62+</li>
63+<li class="toctree-l1"><a class="reference internal" href="installation-uwsgi.html">uwsgi</a><ul>
64+<li class="toctree-l2"><a class="reference internal" href="installation-uwsgi.html#origin-uwsgi">Origin uWSGI</a></li>
65+<li class="toctree-l2"><a class="reference internal" href="installation-uwsgi.html#distributors">Distributors</a></li>
66+<li class="toctree-l2"><a class="reference internal" href="installation-uwsgi.html#alltogether">Alltogether</a></li>
67+</ul>
68+</li>
69+<li class="toctree-l1"><a class="reference internal" href="installation-nginx.html">Install with nginx</a><ul>
70+<li class="toctree-l2"><a class="reference internal" href="installation-nginx.html#the-nginx-http-server">The nginx HTTP server</a></li>
71+<li class="toctree-l2"><a class="reference internal" href="installation-nginx.html#a-nginx-searx-site">A nginx searx site</a></li>
72+<li class="toctree-l2"><a class="reference internal" href="installation-nginx.html#disable-logs">Disable logs</a></li>
73+</ul>
74+</li>
75+<li class="toctree-l1"><a class="reference internal" href="installation-apache.html">Install with apache</a><ul>
76+<li class="toctree-l2"><a class="reference internal" href="installation-apache.html#the-apache-http-server">The apache HTTP server</a></li>
77+<li class="toctree-l2"><a class="reference internal" href="installation-apache.html#apache-reverse-proxy">Apache Reverse Proxy</a></li>
78+<li class="toctree-l2"><a class="reference internal" href="installation-apache.html#uwsgi-support">uWSGI support</a></li>
79+<li class="toctree-l2"><a class="reference internal" href="installation-apache.html#restart-service">Restart service</a></li>
80+<li class="toctree-l2"><a class="reference internal" href="installation-apache.html#disable-logs">disable logs</a></li>
81+<li class="toctree-l2"><a class="reference internal" href="installation-apache.html#the-debian-layout">The Debian Layout</a></li>
82+</ul>
83+</li>
84+<li class="toctree-l1"><a class="reference internal" href="installation-docker.html">Docker installation</a></li>
85+<li class="toctree-l1"><a class="reference internal" href="update-searx.html">How to update</a></li>
86+<li class="toctree-l1"><a class="reference internal" href="settings.html"><code class="docutils literal notranslate"><span class="pre">settings.yml</span></code></a><ul>
87+<li class="toctree-l2"><a class="reference internal" href="settings.html#global-settings">Global Settings</a></li>
88+<li class="toctree-l2"><a class="reference internal" href="settings.html#engine-settings">Engine settings</a></li>
89+</ul>
90+</li>
91+<li class="toctree-l1"><a class="reference internal" href="api.html">Administration API</a><ul>
92+<li class="toctree-l2"><a class="reference internal" href="api.html#get-configuration-data">Get configuration data</a></li>
93+<li class="toctree-l2"><a class="reference internal" href="api.html#embed-search-bar">Embed search bar</a></li>
94+</ul>
95+</li>
5196<li class="toctree-l1"><a class="reference internal" href="architecture.html">Architecture</a></li>
52−<li class="toctree-l1"><a class="reference internal" href="filtron.html">How to protect an instance</a></li>
97+<li class="toctree-l1"><a class="reference internal" href="filtron.html">How to protect an instance</a><ul>
98+<li class="toctree-l2"><a class="reference internal" href="filtron.html#filtron-go">filtron &amp; go</a></li>
99+<li class="toctree-l2"><a class="reference internal" href="filtron.html#sample-configuration-of-filtron">Sample configuration of filtron</a></li>
100+<li class="toctree-l2"><a class="reference internal" href="filtron.html#route-request-through-filtron">Route request through filtron</a></li>
101+</ul>
102+</li>
53103<li class="toctree-l1"><a class="reference internal" href="morty.html">How to setup result proxy</a></li>
54104<li class="toctree-l1"><a class="reference internal" href="engines.html">Engines</a></li>
55105<li class="toctree-l1"><a class="reference internal" href="plugins.html">Plugins builtin</a></li>
56−<li class="toctree-l1"><a class="reference internal" href="buildhosts.html">Buildhosts</a></li>
106+<li class="toctree-l1"><a class="reference internal" href="buildhosts.html">Buildhosts</a><ul>
107+<li class="toctree-l2"><a class="reference internal" href="buildhosts.html#build-docs">Build docs</a></li>
108+<li class="toctree-l2"><a class="reference internal" href="buildhosts.html#lint-shell-scripts">Lint shell scripts</a></li>
109+</ul>
110+</li>
57111</ul>
58112</div>
59113</div>
60114
61115
116+ <div class="clearer"></div>
62117 </div>
63118 </div>
64119 </div>
@@ -107,7 +162,7 @@
107162
108163 <div class="footer" role="contentinfo">
109164 &#169; Copyright 2015-2020, Adam Tauber, Noémi Ványi.
110− Created using <a href="http://sphinx-doc.org/">Sphinx</a> 2.4.4.
165+ Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 3.1.1.
111166 </div>
112167 <script src="../_static/version_warning_offset.js"></script>
113168
admin/installation-apache.htmlnew file+651
@@ -0,0 +1,651 @@
1+
2+<!DOCTYPE html>
3+
4+<html>
5+ <head>
6+ <meta charset="utf-8" />
7+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
8+ <meta name="viewport" content="width=device-width, initial-scale=1">
9+ <title>Install with apache &#8212; Searx Documentation (Searx-0.16.0.tex)</title>
10+ <link rel="stylesheet" href="../_static/searx.css" type="text/css" />
11+ <link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
12+ <link rel="stylesheet" type="text/css" href="../_static/sphinx_tabs/semantic-ui-2.4.1/segment.min.css" />
13+ <link rel="stylesheet" type="text/css" href="../_static/sphinx_tabs/semantic-ui-2.4.1/menu.min.css" />
14+ <link rel="stylesheet" type="text/css" href="../_static/sphinx_tabs/semantic-ui-2.4.1/tab.min.css" />
15+ <link rel="stylesheet" type="text/css" href="../_static/sphinx_tabs/tabs.css" />
16+ <script id="documentation_options" data-url_root="../" src="../_static/documentation_options.js"></script>
17+ <script src="../_static/jquery.js"></script>
18+ <script src="../_static/underscore.js"></script>
19+ <script src="../_static/doctools.js"></script>
20+ <script src="../_static/language_data.js"></script>
21+ <script src="../_static/sphinx_tabs/semantic-ui-2.4.1/tab.min.js"></script>
22+ <script src="../_static/sphinx_tabs/tabs.js"></script>
23+ <link rel="index" title="Index" href="../genindex.html" />
24+ <link rel="search" title="Search" href="../search.html" />
25+ <link rel="next" title="Docker installation" href="installation-docker.html" />
26+ <link rel="prev" title="Install with nginx" href="installation-nginx.html" />
27+ <script>DOCUMENTATION_OPTIONS.URL_ROOT = '../';</script>
28+
29+ </head><body>
30+ <div class="related" role="navigation" aria-label="related navigation">
31+ <h3>Navigation</h3>
32+ <ul>
33+ <li class="right" style="margin-right: 10px">
34+ <a href="../genindex.html" title="General Index"
35+ accesskey="I">index</a></li>
36+ <li class="right" >
37+ <a href="installation-docker.html" title="Docker installation"
38+ accesskey="N">next</a> |</li>
39+ <li class="right" >
40+ <a href="installation-nginx.html" title="Install with nginx"
41+ accesskey="P">previous</a> |</li>
42+ <li class="nav-item nav-item-0"><a href="../index.html">Searx Documentation (Searx-0.16.0.tex)</a> &#187;</li>
43+ <li class="nav-item nav-item-1"><a href="index.html" accesskey="U">Administrator documentation</a> &#187;</li>
44+ <li class="nav-item nav-item-this"><a href="">Install with apache</a></li>
45+ </ul>
46+ </div>
47+
48+ <div class="document">
49+ <div class="documentwrapper">
50+ <div class="bodywrapper">
51+ <div class="body" role="main">
52+
53+ <div class="section" id="install-with-apache">
54+<span id="installation-apache"></span><h1>Install with apache<a class="headerlink" href="#install-with-apache" title="Permalink to this headline">¶</a></h1>
55+<div class="sidebar">
56+<p class="sidebar-title">further read</p>
57+<ul class="simple">
58+<li><p><a class="reference external" href="https://wiki.archlinux.org/index.php/Apache_HTTP_Server">Apache Arch Linux</a></p></li>
59+<li><p><a class="reference external" href="https://cwiki.apache.org/confluence/display/HTTPD/DistrosDefaultLayout#DistrosDefaultLayout-Debian,Ubuntu(Apachehttpd2.x):">Apache Debian</a> and <a class="reference external" href="https://salsa.debian.org/apache-team/apache2/raw/master/debian/apache2.README.Debian">README.Debian</a></p></li>
60+<li><p><a class="reference external" href="https://docs.fedoraproject.org/en-US/quick-docs/getting-started-with-apache-http-server/index.html">Apache Fedora</a></p></li>
61+<li><p><a class="reference external" href="https://httpd.apache.org/docs/trunk/mod/directives.html">Apache directives</a></p></li>
62+</ul>
63+</div>
64+<div class="contents local topic" id="contents">
65+<p class="topic-title">Contents</p>
66+<ul class="simple">
67+<li><p><a class="reference internal" href="#the-apache-http-server" id="id2">The apache HTTP server</a></p></li>
68+<li><p><a class="reference internal" href="#apache-reverse-proxy" id="id3">Apache Reverse Proxy</a></p></li>
69+<li><p><a class="reference internal" href="#uwsgi-support" id="id4">uWSGI support</a></p></li>
70+<li><p><a class="reference internal" href="#restart-service" id="id5">Restart service</a></p></li>
71+<li><p><a class="reference internal" href="#disable-logs" id="id6">disable logs</a></p></li>
72+<li><p><a class="reference internal" href="#the-debian-layout" id="id7">The Debian Layout</a></p></li>
73+</ul>
74+</div>
75+<hr class="docutils" />
76+<p><strong>Install</strong> <a class="reference internal" href="#apache-searx-site"><span class="std std-ref">Apache Reverse Proxy</span></a> using <a class="reference internal" href="../utils/filtron.sh.html#filtron-sh-overview"><span class="std std-ref">filtron.sh</span></a></p>
77+<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$ sudo -H ./utils/filtron.sh apache install
78+</pre></div>
79+</div>
80+<p><strong>Install</strong> <a class="reference internal" href="#apache-searx-site"><span class="std std-ref">Apache Reverse Proxy</span></a> using <a class="reference internal" href="../utils/morty.sh.html#morty-sh-overview"><span class="std std-ref">morty.sh</span></a></p>
81+<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$ sudo -H ./utils/morty.sh apache install
82+</pre></div>
83+</div>
84+<hr class="docutils" />
85+<div class="section" id="the-apache-http-server">
86+<h2><a class="toc-backref" href="#id2">The apache HTTP server</a><a class="headerlink" href="#the-apache-http-server" title="Permalink to this headline">¶</a></h2>
87+<p>If <a class="reference external" href="https://httpd.apache.org/">Apache</a> is not installed, install it now. If <a class="reference external" href="https://httpd.apache.org/">apache</a> is new to you, the
88+<a class="reference external" href="https://httpd.apache.org/docs/current/en/getting-started.html">Getting Started</a>, <a class="reference external" href="https://httpd.apache.org/docs/current/en/configuring.html">Configuration Files</a> and <a class="reference external" href="https://httpd.apache.org/docs/current/en/mod/directive-dict.html">Terms Used to Describe
89+Directives</a> documentation gives first orientation. There is also a list of
90+<a class="reference external" href="https://httpd.apache.org/docs/trunk/mod/directives.html">Apache directives</a> <em>to keep in the pocket</em>.</p>
91+<div class="sphinx-tabs docutils container">
92+<div class="ui top attached tabular menu sphinx-menu docutils container">
93+<div class="active item sphinx-data-tab-VWJ1bnR1IC8gZGViaWFu docutils container">
94+<div class="docutils container">
95+<p>Ubuntu / debian</p>
96+</div>
97+</div>
98+<div class="item sphinx-data-tab-QXJjaCBMaW51eA== docutils container">
99+<div class="docutils container">
100+<p>Arch Linux</p>
101+</div>
102+</div>
103+<div class="item sphinx-data-tab-RmVkb3JhIC8gUkhFTA== docutils container">
104+<div class="docutils container">
105+<p>Fedora / RHEL</p>
106+</div>
107+</div>
108+</div>
109+<div class="ui bottom attached sphinx-tab tab segment sphinx-data-tab-VWJ1bnR1IC8gZGViaWFu active docutils container">
110+<div class="highlight-sh notranslate"><div class="highlight"><pre><span></span>sudo -H apt-get install apache2
111+</pre></div>
112+</div>
113+</div>
114+<div class="ui bottom attached sphinx-tab tab segment sphinx-data-tab-QXJjaCBMaW51eA== docutils container">
115+<div class="highlight-sh notranslate"><div class="highlight"><pre><span></span>sudo -H pacman -S apache
116+sudo -H systemctl <span class="nb">enable</span> httpd
117+sudo -H systemctl start http
118+</pre></div>
119+</div>
120+</div>
121+<div class="ui bottom attached sphinx-tab tab segment sphinx-data-tab-RmVkb3JhIC8gUkhFTA== docutils container">
122+<div class="highlight-sh notranslate"><div class="highlight"><pre><span></span>sudo -H dnf install httpd
123+sudo -H systemctl <span class="nb">enable</span> httpd
124+sudo -H systemctl start httpd
125+</pre></div>
126+</div>
127+</div>
128+</div>
129+<p>Now at <a class="reference external" href="http://localhost">http://localhost</a> you should see any kind of <em>Welcome</em> or <em>Test</em> page.
130+How this default intro site is configured, depends on the linux distribution
131+(compare <a class="reference external" href="https://httpd.apache.org/docs/trunk/mod/directives.html">Apache directives</a>).</p>
132+<div class="sphinx-tabs docutils container">
133+<div class="ui top attached tabular menu sphinx-menu docutils container">
134+<div class="active item sphinx-data-tab-VWJ1bnR1IC8gZGViaWFu docutils container">
135+<div class="docutils container">
136+<p>Ubuntu / debian</p>
137+</div>
138+</div>
139+<div class="item sphinx-data-tab-QXJjaCBMaW51eA== docutils container">
140+<div class="docutils container">
141+<p>Arch Linux</p>
142+</div>
143+</div>
144+<div class="item sphinx-data-tab-RmVkb3JhIC8gUkhFTA== docutils container">
145+<div class="docutils container">
146+<p>Fedora / RHEL</p>
147+</div>
148+</div>
149+</div>
150+<div class="ui bottom attached sphinx-tab tab segment sphinx-data-tab-VWJ1bnR1IC8gZGViaWFu active docutils container">
151+<div class="highlight-sh notranslate"><div class="highlight"><pre><span></span>less /etc/apache2/sites-enabled/000-default.conf
152+</pre></div>
153+</div>
154+<p>In this file, there is a line setting the <a class="reference external" href="https://httpd.apache.org/docs/trunk/mod/core.html#documentroot">DocumentRoot</a> directive:</p>
155+<div class="highlight-apache notranslate"><div class="highlight"><pre><span></span><span class="nb">DocumentRoot</span> <span class="sx">/var/www/html</span>
156+</pre></div>
157+</div>
158+<p>And the <em>welcome</em> page is the HTML file at <code class="docutils literal notranslate"><span class="pre">/var/www/html/index.html</span></code>.</p>
159+</div>
160+<div class="ui bottom attached sphinx-tab tab segment sphinx-data-tab-QXJjaCBMaW51eA== docutils container">
161+<div class="highlight-sh notranslate"><div class="highlight"><pre><span></span>less /etc/httpd/conf/httpd.conf
162+</pre></div>
163+</div>
164+<p>In this file, there is a line setting the <a class="reference external" href="https://httpd.apache.org/docs/trunk/mod/core.html#documentroot">DocumentRoot</a> directive:</p>
165+<div class="highlight-apache notranslate"><div class="highlight"><pre><span></span><span class="nb">DocumentRoot</span> <span class="s2">&quot;/srv/http&quot;</span>
166+<span class="nt">&lt;Directory</span> <span class="s">&quot;/srv/http&quot;</span><span class="nt">&gt;</span>
167+ <span class="nb">Options</span> Indexes FollowSymLinks
168+ <span class="nb">AllowOverride</span> <span class="k">None</span>
169+ <span class="nb">Require</span> <span class="k">all</span> granted
170+<span class="nt">&lt;/Directory&gt;</span>
171+</pre></div>
172+</div>
173+<p>The <em>welcome</em> page of Arch Linux is a page showing directory located at
174+<code class="docutils literal notranslate"><span class="pre">DocumentRoot</span></code>. This is <em>directory</em> page is generated by the Module
175+<a class="reference external" href="https://httpd.apache.org/docs/2.4/mod/mod_autoindex.html">mod_autoindex</a>:</p>
176+<div class="highlight-apache notranslate"><div class="highlight"><pre><span></span><span class="nb">LoadModule</span> autoindex_module modules/mod_autoindex.so
177+...
178+<span class="nb">Include</span> conf/extra/httpd-autoindex.conf
179+</pre></div>
180+</div>
181+</div>
182+<div class="ui bottom attached sphinx-tab tab segment sphinx-data-tab-RmVkb3JhIC8gUkhFTA== docutils container">
183+<div class="highlight-sh notranslate"><div class="highlight"><pre><span></span>less /etc/httpd/conf/httpd.conf
184+</pre></div>
185+</div>
186+<p>In this file, there is a line setting the <code class="docutils literal notranslate"><span class="pre">DocumentRoot</span></code> directive:</p>
187+<div class="highlight-apache notranslate"><div class="highlight"><pre><span></span><span class="nb">DocumentRoot</span> <span class="s2">&quot;/var/www/html&quot;</span>
188+...
189+<span class="nt">&lt;Directory</span> <span class="s">&quot;/var/www&quot;</span><span class="nt">&gt;</span>
190+ <span class="nb">AllowOverride</span> <span class="k">None</span>
191+ <span class="c"># Allow open access:</span>
192+ <span class="nb">Require</span> <span class="k">all</span> granted
193+<span class="nt">&lt;/Directory&gt;</span>
194+</pre></div>
195+</div>
196+<p>On fresh installations, the <code class="docutils literal notranslate"><span class="pre">/var/www</span></code> is empty and the <em>default
197+welcome page</em> is shown, the configuration is located at:</p>
198+<div class="highlight-none notranslate"><div class="highlight"><pre><span></span>less /etc/httpd/conf.d/welcome.conf
199+</pre></div>
200+</div>
201+</div>
202+</div>
203+</div>
204+<div class="section" id="apache-reverse-proxy">
205+<span id="apache-searx-site"></span><h2><a class="toc-backref" href="#id3">Apache Reverse Proxy</a><a class="headerlink" href="#apache-reverse-proxy" title="Permalink to this headline">¶</a></h2>
206+<div class="sidebar">
207+<p class="sidebar-title">public to the internet?</p>
208+<p>If your searx instance is public, stop here and first install <a class="reference internal" href="../utils/filtron.sh.html#filtron-sh"><span class="std std-ref">filtron
209+reverse proxy</span></a> and <a class="reference internal" href="../utils/morty.sh.html#morty-sh"><span class="std std-ref">result proxy morty</span></a>, see
210+<a class="reference internal" href="installation.html#installation-scripts"><span class="std std-ref">Installation scripts</span></a>. If already done, follow setup: <em>searx via
211+filtron plus morty</em>.</p>
212+</div>
213+<p>To setup a Apache revers proxy you have to enable the <em>headers</em> and <em>proxy</em>
214+modules and create a <a class="reference external" href="https://httpd.apache.org/docs/trunk/mod/core.html#location">Location</a> configuration for the searx site. In most
215+distributions you have to un-comment the lines in the main configuration file,
216+except in <a class="reference internal" href="#the-debian-layout"><span class="std std-ref">The Debian Layout</span></a>.</p>
217+<p>To pass the HTTP HOST header
218+With <a class="reference external" href="https://httpd.apache.org/docs/trunk/mod/mod_proxy.html#proxypreservehost">ProxyPreserveHost</a> the incoming Host HTTP request header is passed to the
219+proxied host.</p>
220+<div class="sphinx-tabs docutils container">
221+<div class="ui top attached tabular menu sphinx-menu docutils container">
222+<div class="active item sphinx-data-tab-VWJ1bnR1IC8gZGViaWFu docutils container">
223+<div class="docutils container">
224+<p>Ubuntu / debian</p>
225+</div>
226+</div>
227+<div class="item sphinx-data-tab-QXJjaCBMaW51eA== docutils container">
228+<div class="docutils container">
229+<p>Arch Linux</p>
230+</div>
231+</div>
232+<div class="item sphinx-data-tab-RmVkb3JhIC8gUkhFTA== docutils container">
233+<div class="docutils container">
234+<p>Fedora / RHEL</p>
235+</div>
236+</div>
237+</div>
238+<div class="ui bottom attached sphinx-tab tab segment sphinx-data-tab-VWJ1bnR1IC8gZGViaWFu active docutils container">
239+<p>In the Apache setup, enable headers and proxy modules:</p>
240+<div class="highlight-sh notranslate"><div class="highlight"><pre><span></span>sudo -H a2enmod headers
241+sudo -H a2enmod proxy
242+sudo -H a2enmod proxy_http
243+</pre></div>
244+</div>
245+<p>In <a class="reference internal" href="#the-debian-layout"><span class="std std-ref">The Debian Layout</span></a> you create a <code class="docutils literal notranslate"><span class="pre">searx.conf</span></code> with the
246+<code class="docutils literal notranslate"><span class="pre">&lt;Location</span> <span class="pre">/searx</span> <span class="pre">&gt;</span></code> directive and save this file in the <em>sites
247+available</em> folder at <code class="docutils literal notranslate"><span class="pre">/etc/apache2/sites-available</span></code>. To enable the
248+<code class="docutils literal notranslate"><span class="pre">searx.conf</span></code> use <a class="reference external" href="https://manpages.debian.org/jump?q=a2ensite">a2ensite</a>:</p>
249+<div class="highlight-sh notranslate"><div class="highlight"><pre><span></span>sudo -H a2ensite searx.conf
250+</pre></div>
251+</div>
252+</div>
253+<div class="ui bottom attached sphinx-tab tab segment sphinx-data-tab-QXJjaCBMaW51eA== docutils container">
254+<p>In the <code class="docutils literal notranslate"><span class="pre">/etc/httpd/conf/httpd.conf</span></code> file, activate headers and proxy
255+modules (<a class="reference external" href="https://httpd.apache.org/docs/2.4/mod/mod_so.html#loadmodule">LoadModule</a>):</p>
256+<div class="highlight-apache notranslate"><div class="highlight"><pre><span></span><span class="nb">FIXME</span> needs test
257+
258+<span class="nb">LoadModule</span> headers_module modules/mod_headers.so
259+<span class="nb">LoadModule</span> proxy_module modules/mod_proxy.so
260+<span class="nb">LoadModule</span> proxy_http_module modules/mod_proxy_http.so
261+</pre></div>
262+</div>
263+</div>
264+<div class="ui bottom attached sphinx-tab tab segment sphinx-data-tab-RmVkb3JhIC8gUkhFTA== docutils container">
265+<p>In the <code class="docutils literal notranslate"><span class="pre">/etc/httpd/conf/httpd.conf</span></code> file, activate headers and proxy
266+modules (<a class="reference external" href="https://httpd.apache.org/docs/2.4/mod/mod_so.html#loadmodule">LoadModule</a>):</p>
267+<div class="highlight-apache notranslate"><div class="highlight"><pre><span></span><span class="nb">FIXME</span> needs test
268+
269+<span class="nb">LoadModule</span> headers_module modules/mod_headers.so
270+<span class="nb">LoadModule</span> proxy_module modules/mod_proxy.so
271+<span class="nb">LoadModule</span> proxy_http_module modules/mod_proxy_http.so
272+</pre></div>
273+</div>
274+</div>
275+</div>
276+<div class="sphinx-tabs docutils container">
277+<div class="ui top attached tabular menu sphinx-menu docutils container">
278+<div class="active item sphinx-data-tab-c2VhcnggdmlhIGZpbHRyb24gcGx1cyBtb3J0eQ== docutils container">
279+<div class="docutils container">
280+<p>searx via filtron plus morty</p>
281+</div>
282+</div>
283+</div>
284+<div class="ui bottom attached sphinx-tab tab segment sphinx-data-tab-c2VhcnggdmlhIGZpbHRyb24gcGx1cyBtb3J0eQ== active docutils container">
285+<p>Use this setup, if your instance is public to the internet, compare
286+figure: <a class="reference internal" href="architecture.html#arch-public"><span class="std std-ref">architecture</span></a> and <a class="reference internal" href="installation.html#installation-scripts"><span class="std std-ref">Installation scripts</span></a>.</p>
287+<ol class="arabic simple">
288+<li><p>Configure a reverse proxy for <a class="reference internal" href="../utils/filtron.sh.html#filtron-sh"><span class="std std-ref">filtron</span></a>, listening on
289+<em>localhost 4004</em> (<a class="reference internal" href="filtron.html#filtron-route-request"><span class="std std-ref">Route request through filtron</span></a>):</p></li>
290+</ol>
291+<div class="highlight-apache notranslate"><div class="highlight"><pre><span></span><span class="nt">&lt;Location</span> <span class="s">/searx </span><span class="nt">&gt;</span>
292+
293+ <span class="c"># SetEnvIf Request_URI &quot;/searx&quot; dontlog</span>
294+ <span class="c"># CustomLog /dev/null combined env=dontlog</span>
295+
296+ <span class="nb">Require</span> <span class="k">all</span> granted
297+
298+ <span class="nb">Order</span> deny,allow
299+ <span class="nb">Deny</span> from <span class="k">all</span>
300+ <span class="c">#Allow from fd00::/8 192.168.0.0/16 fe80::/10 127.0.0.0/8 ::1</span>
301+ <span class="nb">Allow</span> from <span class="k">all</span>
302+
303+ <span class="nb">ProxyPreserveHost</span> <span class="k">On</span>
304+ <span class="nb">ProxyPass</span> http://127.0.0.1:4004
305+ <span class="nb">RequestHeader</span> set X-Script-Name <span class="sx">/searx</span>
306+
307+<span class="nt">&lt;/Location&gt;</span>
308+</pre></div>
309+</div>
310+<p>2. Configure reverse proxy for <a class="reference internal" href="morty.html#searx-morty"><span class="std std-ref">morty</span></a>, listening on
311+<em>localhost 3000</em></p>
312+<div class="highlight-apache notranslate"><div class="highlight"><pre><span></span><span class="nb">ProxyPreserveHost</span> <span class="k">On</span>
313+
314+<span class="nt">&lt;Location</span> <span class="s">/morty </span><span class="nt">&gt;</span>
315+
316+ <span class="c"># SetEnvIf Request_URI &quot;/morty&quot; dontlog</span>
317+ <span class="c"># CustomLog /dev/null combined env=dontlog</span>
318+
319+ <span class="nb">Require</span> <span class="k">all</span> granted
320+
321+ <span class="nb">Order</span> deny,allow
322+ <span class="nb">Deny</span> from <span class="k">all</span>
323+ <span class="c">#Allow from fd00::/8 192.168.0.0/16 fe80::/10 127.0.0.0/8 ::1</span>
324+ <span class="nb">Allow</span> from <span class="k">all</span>
325+
326+ <span class="nb">ProxyPass</span> http://127.0.0.1:3000
327+ <span class="nb">RequestHeader</span> set X-Script-Name <span class="sx">/morty</span>
328+
329+<span class="nt">&lt;/Location&gt;</span>
330+</pre></div>
331+</div>
332+<p>Note that reverse proxy advised to be used in case of single-user or
333+low-traffic instances. For a fully result proxification add <a class="reference internal" href="morty.html#searx-morty"><span class="std std-ref">morty’s</span></a> <strong>public URL</strong> to your <a class="reference external" href="https://github.com/asciimoo/searx/blob/master/searx/settings.yml">git://searx/settings.yml</a>:</p>
334+<div class="highlight-yaml notranslate"><div class="highlight"><pre><span></span><span class="l l-Scalar l-Scalar-Plain">result_proxy</span><span class="p p-Indicator">:</span>
335+ <span class="c1"># replace example.org with your server&#39;s public name</span>
336+ <span class="l l-Scalar l-Scalar-Plain">url</span> <span class="p p-Indicator">:</span> <span class="l l-Scalar l-Scalar-Plain">https://example.org/morty</span>
337+
338+<span class="l l-Scalar l-Scalar-Plain">server</span><span class="p p-Indicator">:</span>
339+ <span class="l l-Scalar l-Scalar-Plain">image_proxy</span> <span class="p p-Indicator">:</span> <span class="l l-Scalar l-Scalar-Plain">True</span>
340+</pre></div>
341+</div>
342+</div>
343+</div>
344+</div>
345+<div class="section" id="uwsgi-support">
346+<h2><a class="toc-backref" href="#id4">uWSGI support</a><a class="headerlink" href="#uwsgi-support" title="Permalink to this headline">¶</a></h2>
347+<p>Be warned, with this setup, your instance isn’t <a class="reference internal" href="filtron.html#searx-filtron"><span class="std std-ref">protected</span></a>, nevertheless it is good enough for intranet usage. In modern Linux
348+distributions, the <a class="reference external" href="https://uwsgi-docs.readthedocs.io/en/latest/Apache.html#mod-proxy-uwsgi">mod_proxy_uwsgi</a> is compiled into the <em>normal</em> apache
349+package and you need to install only the <a class="reference internal" href="installation-uwsgi.html#searx-uwsgi"><span class="std std-ref">uWSGI</span></a> package:</p>
350+<div class="sphinx-tabs docutils container">
351+<div class="ui top attached tabular menu sphinx-menu docutils container">
352+<div class="active item sphinx-data-tab-VWJ1bnR1IC8gZGViaWFu docutils container">
353+<div class="docutils container">
354+<p>Ubuntu / debian</p>
355+</div>
356+</div>
357+<div class="item sphinx-data-tab-QXJjaCBMaW51eA== docutils container">
358+<div class="docutils container">
359+<p>Arch Linux</p>
360+</div>
361+</div>
362+<div class="item sphinx-data-tab-RmVkb3JhIC8gUkhFTA== docutils container">
363+<div class="docutils container">
364+<p>Fedora / RHEL</p>
365+</div>
366+</div>
367+</div>
368+<div class="ui bottom attached sphinx-tab tab segment sphinx-data-tab-VWJ1bnR1IC8gZGViaWFu active docutils container">
369+<div class="highlight-sh notranslate"><div class="highlight"><pre><span></span>sudo -H apt-get install uwsgi
370+
371+<span class="c1"># Ubuntu =&lt; 18.04</span>
372+sudo -H apt-get install libapache2-mod-proxy-uwsgi
373+</pre></div>
374+</div>
375+</div>
376+<div class="ui bottom attached sphinx-tab tab segment sphinx-data-tab-QXJjaCBMaW51eA== docutils container">
377+<div class="highlight-sh notranslate"><div class="highlight"><pre><span></span>sudo -H pacman -S uwsgi
378+</pre></div>
379+</div>
380+</div>
381+<div class="ui bottom attached sphinx-tab tab segment sphinx-data-tab-RmVkb3JhIC8gUkhFTA== docutils container">
382+<div class="highlight-sh notranslate"><div class="highlight"><pre><span></span>sudo -H dnf install uwsgi
383+</pre></div>
384+</div>
385+</div>
386+</div>
387+<p>The next example shows a configuration using the <a class="reference external" href="https://uwsgi-docs.readthedocs.io/en/latest/Apache.html">uWSGI Apache support</a> via
388+unix sockets and <a class="reference external" href="https://uwsgi-docs.readthedocs.io/en/latest/Apache.html#mod-proxy-uwsgi">mod_proxy_uwsgi</a>.</p>
389+<p>For socket communication, you have to activate <code class="docutils literal notranslate"><span class="pre">socket</span> <span class="pre">=</span>
390+<span class="pre">/run/uwsgi/app/searx/socket</span></code> and comment out the <code class="docutils literal notranslate"><span class="pre">http</span> <span class="pre">=</span> <span class="pre">127.0.0.1:8888</span></code>
391+configuration in your <a class="reference internal" href="installation-uwsgi.html#uwsgi-configuration"><span class="std std-ref">uwsgi ini file</span></a>. If not
392+already exists, create a folder for the unix sockets, which can be used by the
393+searx account (see <a class="reference internal" href="installation-searx.html#create-searx-user"><span class="std std-ref">Create user</span></a>):</p>
394+<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>sudo -H mkdir -p /run/uwsgi/app/searx/
395+sudo -H chown -R searx:searx /run/uwsgi/app/searx/
396+</pre></div>
397+</div>
398+<p>If the server is public; to limit access to your intranet replace <code class="docutils literal notranslate"><span class="pre">Allow</span> <span class="pre">from</span>
399+<span class="pre">all</span></code> directive and replace <code class="docutils literal notranslate"><span class="pre">192.168.0.0/16</span></code> with your subnet IP/class.</p>
400+<div class="sphinx-tabs docutils container">
401+<div class="ui top attached tabular menu sphinx-menu docutils container">
402+<div class="active item sphinx-data-tab-VWJ1bnR1IC8gZGViaWFu docutils container">
403+<div class="docutils container">
404+<p>Ubuntu / debian</p>
405+</div>
406+</div>
407+<div class="item sphinx-data-tab-QXJjaCBMaW51eA== docutils container">
408+<div class="docutils container">
409+<p>Arch Linux</p>
410+</div>
411+</div>
412+<div class="item sphinx-data-tab-RmVkb3JhIC8gUkhFTA== docutils container">
413+<div class="docutils container">
414+<p>Fedora / RHEL</p>
415+</div>
416+</div>
417+<div class="item sphinx-data-tab-b2xkIG1vZF93c2dp docutils container">
418+<div class="docutils container">
419+<p>old mod_wsgi</p>
420+</div>
421+</div>
422+</div>
423+<div class="ui bottom attached sphinx-tab tab segment sphinx-data-tab-VWJ1bnR1IC8gZGViaWFu active docutils container">
424+<div class="highlight-apache notranslate"><div class="highlight"><pre><span></span><span class="nb">LoadModule</span> headers_module <span class="sx">/usr/lib/apache2/mod_headers.so</span>
425+<span class="nb">LoadModule</span> proxy_module <span class="sx">/usr/lib/apache2/modules/mod_proxy.so</span>
426+<span class="nb">LoadModule</span> proxy_uwsgi_module <span class="sx">/usr/lib/apache2/modules/mod_proxy_uwsgi.so</span>
427+
428+<span class="c"># SetEnvIf Request_URI /searx dontlog</span>
429+<span class="c"># CustomLog /dev/null combined env=dontlog</span>
430+
431+<span class="nt">&lt;Location</span> <span class="s">/searx</span><span class="nt">&gt;</span>
432+
433+ <span class="nb">Require</span> <span class="k">all</span> granted
434+ <span class="nb">Order</span> deny,allow
435+ <span class="nb">Deny</span> from <span class="k">all</span>
436+ <span class="c"># Allow from fd00::/8 192.168.0.0/16 fe80::/10 127.0.0.0/8 ::1</span>
437+ <span class="nb">Allow</span> from <span class="k">all</span>
438+
439+ <span class="nb">ProxyPreserveHost</span> <span class="k">On</span>
440+ <span class="nb">ProxyPass</span> unix:/run/uwsgi/app/searx/socket|uwsgi://uwsgi-uds-searx/
441+
442+<span class="nt">&lt;/Location&gt;</span>
443+</pre></div>
444+</div>
445+</div>
446+<div class="ui bottom attached sphinx-tab tab segment sphinx-data-tab-QXJjaCBMaW51eA== docutils container">
447+<div class="highlight-apache notranslate"><div class="highlight"><pre><span></span><span class="nb">FIXME</span> needs test
448+
449+<span class="nb">LoadModule</span> proxy_module modules/mod_proxy.so
450+<span class="nb">LoadModule</span> proxy_uwsgi_module modules/mod_proxy_uwsgi.so
451+
452+<span class="c"># SetEnvIf Request_URI /searx dontlog</span>
453+<span class="c"># CustomLog /dev/null combined env=dontlog</span>
454+
455+<span class="nt">&lt;Location</span> <span class="s">/searx</span><span class="nt">&gt;</span>
456+
457+ <span class="nb">Require</span> <span class="k">all</span> granted
458+ <span class="nb">Order</span> deny,allow
459+ <span class="nb">Deny</span> from <span class="k">all</span>
460+ <span class="c"># Allow from fd00::/8 192.168.0.0/16 fe80::/10 127.0.0.0/8 ::1</span>
461+ <span class="nb">Allow</span> from <span class="k">all</span>
462+
463+ <span class="nb">ProxyPreserveHost</span> <span class="k">On</span>
464+ <span class="nb">ProxyPass</span> unix:/run/uwsgi/app/searx/socket|uwsgi://uwsgi-uds-searx/
465+
466+<span class="nt">&lt;/Location&gt;</span>
467+</pre></div>
468+</div>
469+</div>
470+<div class="ui bottom attached sphinx-tab tab segment sphinx-data-tab-RmVkb3JhIC8gUkhFTA== docutils container">
471+<div class="highlight-apache notranslate"><div class="highlight"><pre><span></span><span class="nb">FIXME</span> needs test
472+
473+<span class="nb">LoadModule</span> proxy_module modules/mod_proxy.so
474+<span class="nb">LoadModule</span> proxy_uwsgi_module modules/mod_proxy_uwsgi.so
475+<span class="nt">&lt;IfModule</span> <span class="s">proxy_uwsgi_module</span><span class="nt">&gt;</span>
476+
477+ <span class="c"># SetEnvIf Request_URI /searx dontlog</span>
478+ <span class="c"># CustomLog /dev/null combined env=dontlog</span>
479+
480+ <span class="nt">&lt;Location</span> <span class="s">/searx</span><span class="nt">&gt;</span>
481+
482+ <span class="nb">Require</span> <span class="k">all</span> granted
483+ <span class="nb">Order</span> deny,allow
484+ <span class="nb">Deny</span> from <span class="k">all</span>
485+ <span class="c"># Allow from fd00::/8 192.168.0.0/16 fe80::/10 127.0.0.0/8 ::1</span>
486+ <span class="nb">Allow</span> from <span class="k">all</span>
487+
488+ <span class="nb">ProxyPreserveHost</span> <span class="k">On</span>
489+ <span class="nb">ProxyPass</span> unix:/run/uwsgi/app/searx/socket|uwsgi://uwsgi-uds-searx/
490+
491+ <span class="nt">&lt;/Location&gt;</span>
492+
493+<span class="nt">&lt;/IfModule&gt;</span>
494+</pre></div>
495+</div>
496+</div>
497+<div class="ui bottom attached sphinx-tab tab segment sphinx-data-tab-b2xkIG1vZF93c2dp docutils container">
498+<p>We show this only for historical reasons, DON’T USE <a class="reference external" href="https://uwsgi-docs.readthedocs.io/en/latest/Apache.html#mod-uwsgi">mod_uwsgi</a>.
499+ANYMORE!</p>
500+<div class="highlight-apache notranslate"><div class="highlight"><pre><span></span><span class="nt">&lt;IfModule</span> <span class="s">mod_uwsgi.c</span><span class="nt">&gt;</span>
501+
502+ <span class="c"># SetEnvIf Request_URI &quot;/searx&quot; dontlog</span>
503+ <span class="c"># CustomLog /dev/null combined env=dontlog</span>
504+
505+ <span class="nt">&lt;Location</span> <span class="s">/searx </span><span class="nt">&gt;</span>
506+
507+ <span class="nb">Require</span> <span class="k">all</span> granted
508+
509+ <span class="nb">Options</span> FollowSymLinks Indexes
510+ <span class="nb">SetHandler</span> uwsgi-handler
511+ <span class="nb">uWSGISocket</span> <span class="sx">/run/uwsgi/app/searx/socket</span>
512+
513+ <span class="nb">Order</span> deny,allow
514+ <span class="nb">Deny</span> from <span class="k">all</span>
515+ <span class="c"># Allow from fd00::/8 192.168.0.0/16 fe80::/10 127.0.0.0/8 ::1</span>
516+ <span class="nb">Allow</span> from <span class="k">all</span>
517+
518+ <span class="nt">&lt;/Location&gt;</span>
519+
520+<span class="nt">&lt;/IfModule&gt;</span>
521+</pre></div>
522+</div>
523+</div>
524+</div>
525+</div>
526+<div class="section" id="restart-service">
527+<span id="restart-apache"></span><h2><a class="toc-backref" href="#id5">Restart service</a><a class="headerlink" href="#restart-service" title="Permalink to this headline">¶</a></h2>
528+<div class="sphinx-tabs docutils container">
529+<div class="ui top attached tabular menu sphinx-menu docutils container">
530+<div class="active item sphinx-data-tab-VWJ1bnR1IC8gZGViaWFu docutils container">
531+<div class="docutils container">
532+<p>Ubuntu / debian</p>
533+</div>
534+</div>
535+<div class="item sphinx-data-tab-QXJjaCBMaW51eA== docutils container">
536+<div class="docutils container">
537+<p>Arch Linux</p>
538+</div>
539+</div>
540+<div class="item sphinx-data-tab-RmVkb3JhIC8gUkhFTA== docutils container">
541+<div class="docutils container">
542+<p>Fedora / RHEL</p>
543+</div>
544+</div>
545+</div>
546+<div class="ui bottom attached sphinx-tab tab segment sphinx-data-tab-VWJ1bnR1IC8gZGViaWFu active docutils container">
547+<div class="highlight-sh notranslate"><div class="highlight"><pre><span></span>sudo -H systemctl restart apache2
548+sudo -H service uwsgi restart searx
549+</pre></div>
550+</div>
551+</div>
552+<div class="ui bottom attached sphinx-tab tab segment sphinx-data-tab-QXJjaCBMaW51eA== docutils container">
553+<div class="highlight-sh notranslate"><div class="highlight"><pre><span></span>sudo -H systemctl restart httpd
554+sudo -H systemctl restart uwsgi@searx
555+</pre></div>
556+</div>
557+</div>
558+<div class="ui bottom attached sphinx-tab tab segment sphinx-data-tab-RmVkb3JhIC8gUkhFTA== docutils container">
559+<div class="highlight-sh notranslate"><div class="highlight"><pre><span></span>sudo -H systemctl restart httpd
560+sudo -H touch /etc/uwsgi.d/searx.ini
561+</pre></div>
562+</div>
563+</div>
564+</div>
565+</div>
566+<div class="section" id="disable-logs">
567+<h2><a class="toc-backref" href="#id6">disable logs</a><a class="headerlink" href="#disable-logs" title="Permalink to this headline">¶</a></h2>
568+<p>For better privacy you can disable Apache logs. In the examples above activate
569+one of the lines and <a class="reference internal" href="#restart-apache">restart apache</a>:</p>
570+<div class="highlight-none notranslate"><div class="highlight"><pre><span></span># SetEnvIf Request_URI &quot;/searx&quot; dontlog
571+# CustomLog /dev/null combined env=dontlog
572+</pre></div>
573+</div>
574+<p>The <code class="docutils literal notranslate"><span class="pre">CustomLog</span></code> directive disable logs for the whole (virtual) server, use it
575+when the URL of the service does not have a path component (<code class="docutils literal notranslate"><span class="pre">/searx</span></code>) / is
576+located at root (<code class="docutils literal notranslate"><span class="pre">/</span></code>).</p>
577+</div>
578+<div class="section" id="the-debian-layout">
579+<span id="id1"></span><h2><a class="toc-backref" href="#id7">The Debian Layout</a><a class="headerlink" href="#the-debian-layout" title="Permalink to this headline">¶</a></h2>
580+<p>Be aware that the Debian layout is quite different from the standard Apache
581+configuration. For details look at the <a class="reference external" href="https://salsa.debian.org/apache-team/apache2/raw/master/debian/apache2.README.Debian">README.Debian</a>
582+(<code class="docutils literal notranslate"><span class="pre">/usr/share/doc/apache2/README.Debian.gz</span></code>). Some commands you should know on
583+Debian:</p>
584+<ul class="simple">
585+<li><p><a class="reference external" href="https://manpages.debian.org/jump?q=apache2ctl">apache2ctl</a>: Apache HTTP server control interface</p></li>
586+<li><p><a class="reference external" href="https://manpages.debian.org/jump?q=a2enmod">a2enmod</a>, <a class="reference external" href="https://manpages.debian.org/jump?q=a2dismod">a2dismod</a>: switch on/off modules</p></li>
587+<li><p><a class="reference external" href="https://manpages.debian.org/jump?q=a2enconf">a2enconf</a>, <a class="reference external" href="https://manpages.debian.org/jump?q=a2disconf">a2disconf</a>: switch on/off configurations</p></li>
588+<li><p><a class="reference external" href="https://manpages.debian.org/jump?q=a2ensite">a2ensite</a>, <a class="reference external" href="https://manpages.debian.org/jump?q=a2dissite">a2dissite</a>: switch on/off sites</p></li>
589+</ul>
590+</div>
591+</div>
592+
593+
594+ <div class="clearer"></div>
595+ </div>
596+ </div>
597+ </div>
598+ <span id="sidebar-top"></span>
599+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
600+ <div class="sphinxsidebarwrapper">
601+
602+
603+ <p class="logo"><a href="../index.html">
604+ <img class="logo" src="../_static/searx_logo_small.png" alt="Logo"/>
605+ </a></p>
606+
607+
608+ <h3>Project Links</h3>
609+ <ul>
610+ <li><a href="https://github.com/asciimoo/searx">Source</a>
611+
612+ <li><a href="https://github.com/asciimoo/searx/wiki">Wiki</a>
613+
614+ <li><a href="https://searx.space/">Public instances</a>
615+
616+ <li><a href="https://twitter.com/Searx_engine">Twitter</a>
617+ </ul><h3>Navigation</h3>
618+<ul>
619+ <li><a href="../index.html">Overview</a>
620+ <ul>
621+ <li><a href="index.html">Administrator documentation</a>
622+ <ul>
623+ <li>Previous: <a href="installation-nginx.html" title="previous chapter">Install with nginx</a>
624+ <li>Next: <a href="installation-docker.html" title="next chapter">Docker installation</a></ul>
625+ </li>
626+ </ul>
627+ </li>
628+</ul>
629+<div id="searchbox" style="display: none" role="search">
630+ <h3 id="searchlabel">Quick search</h3>
631+ <div class="searchformwrapper">
632+ <form class="search" action="../search.html" method="get">
633+ <input type="text" name="q" aria-labelledby="searchlabel" />
634+ <input type="submit" value="Go" />
635+ </form>
636+ </div>
637+</div>
638+<script>$('#searchbox').show(0);</script>
639+ </div>
640+ </div>
641+ <div class="clearer"></div>
642+ </div>
643+
644+ <div class="footer" role="contentinfo">
645+ &#169; Copyright 2015-2020, Adam Tauber, Noémi Ványi.
646+ Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 3.1.1.
647+ </div>
648+ <script src="../_static/version_warning_offset.js"></script>
649+
650+ </body>
651+</html>
user/public_instances.html → admin/installation-docker.htmlrenamed+39−6
@@ -1,11 +1,12 @@
11
22<!DOCTYPE html>
33
4−<html xmlns="http://www.w3.org/1999/xhtml">
4+<html>
55 <head>
66 <meta charset="utf-8" />
7+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
78 <meta name="viewport" content="width=device-width, initial-scale=1">
8− <title>&lt;no title&gt; &#8212; Searx Documentation (Searx-0.16.0.tex)</title>
9+ <title>Docker installation &#8212; Searx Documentation (Searx-0.16.0.tex)</title>
910 <link rel="stylesheet" href="../_static/searx.css" type="text/css" />
1011 <link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
1112 <script id="documentation_options" data-url_root="../" src="../_static/documentation_options.js"></script>
@@ -15,6 +16,8 @@
1516 <script src="../_static/language_data.js"></script>
1617 <link rel="index" title="Index" href="../genindex.html" />
1718 <link rel="search" title="Search" href="../search.html" />
19+ <link rel="next" title="How to update" href="update-searx.html" />
20+ <link rel="prev" title="Install with apache" href="installation-apache.html" />
1821 <script>DOCUMENTATION_OPTIONS.URL_ROOT = '../';</script>
1922
2023 </head><body>
@@ -24,7 +27,15 @@
2427 <li class="right" style="margin-right: 10px">
2528 <a href="../genindex.html" title="General Index"
2629 accesskey="I">index</a></li>
27− <li class="nav-item nav-item-0"><a href="../index.html">Searx Documentation (Searx-0.16.0.tex)</a> &#187;</li>
30+ <li class="right" >
31+ <a href="update-searx.html" title="How to update"
32+ accesskey="N">next</a> |</li>
33+ <li class="right" >
34+ <a href="installation-apache.html" title="Install with apache"
35+ accesskey="P">previous</a> |</li>
36+ <li class="nav-item nav-item-0"><a href="../index.html">Searx Documentation (Searx-0.16.0.tex)</a> &#187;</li>
37+ <li class="nav-item nav-item-1"><a href="index.html" accesskey="U">Administrator documentation</a> &#187;</li>
38+ <li class="nav-item nav-item-this"><a href="">Docker installation</a></li>
2839 </ul>
2940 </div>
3041
@@ -33,9 +44,25 @@
3344 <div class="bodywrapper">
3445 <div class="body" role="main">
3546
36− <p>This page page has been moved to <a class="reference external" href="https://searx.space/">searx.space</a></p>
47+ <div class="section" id="docker-installation">
48+<span id="installation-docker"></span><h1>Docker installation<a class="headerlink" href="#docker-installation" title="Permalink to this headline">¶</a></h1>
49+<p>Make sure you have installed Docker. For instance, you can deploy searx like this:</p>
50+<div class="highlight-sh notranslate"><div class="highlight"><pre><span></span>docker pull wonderfall/searx
51+docker run -d --name searx -p <span class="nv">$PORT</span>:8888 wonderfall/searx
52+</pre></div>
53+</div>
54+<p>Go to <code class="docutils literal notranslate"><span class="pre">http://localhost:$PORT</span></code>.</p>
55+<p>See <a class="reference external" href="https://hub.docker.com/r/wonderfall/searx/">https://hub.docker.com/r/wonderfall/searx/</a> for more informations. It’s also
56+possible to build searx from the embedded Dockerfile.</p>
57+<div class="highlight-sh notranslate"><div class="highlight"><pre><span></span>git clone https://github.com/asciimoo/searx.git
58+<span class="nb">cd</span> searx
59+docker build -t whatever/searx .
60+</pre></div>
61+</div>
62+</div>
3763
3864
65+ <div class="clearer"></div>
3966 </div>
4067 </div>
4168 </div>
@@ -61,7 +88,13 @@
6188 </ul><h3>Navigation</h3>
6289<ul>
6390 <li><a href="../index.html">Overview</a>
64−
91+ <ul>
92+ <li><a href="index.html">Administrator documentation</a>
93+ <ul>
94+ <li>Previous: <a href="installation-apache.html" title="previous chapter">Install with apache</a>
95+ <li>Next: <a href="update-searx.html" title="next chapter">How to update</a></ul>
96+ </li>
97+ </ul>
6598 </li>
6699</ul>
67100<div id="searchbox" style="display: none" role="search">
@@ -81,7 +114,7 @@
81114
82115 <div class="footer" role="contentinfo">
83116 &#169; Copyright 2015-2020, Adam Tauber, Noémi Ványi.
84− Created using <a href="http://sphinx-doc.org/">Sphinx</a> 2.4.4.
117+ Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 3.1.1.
85118 </div>
86119 <script src="../_static/version_warning_offset.js"></script>
87120
admin/installation-nginx.htmlnew file+508
@@ -0,0 +1,508 @@
1+
2+<!DOCTYPE html>
3+
4+<html>
5+ <head>
6+ <meta charset="utf-8" />
7+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
8+ <meta name="viewport" content="width=device-width, initial-scale=1">
9+ <title>Install with nginx &#8212; Searx Documentation (Searx-0.16.0.tex)</title>
10+ <link rel="stylesheet" href="../_static/searx.css" type="text/css" />
11+ <link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
12+ <link rel="stylesheet" type="text/css" href="../_static/sphinx_tabs/semantic-ui-2.4.1/segment.min.css" />
13+ <link rel="stylesheet" type="text/css" href="../_static/sphinx_tabs/semantic-ui-2.4.1/menu.min.css" />
14+ <link rel="stylesheet" type="text/css" href="../_static/sphinx_tabs/semantic-ui-2.4.1/tab.min.css" />
15+ <link rel="stylesheet" type="text/css" href="../_static/sphinx_tabs/tabs.css" />
16+ <script id="documentation_options" data-url_root="../" src="../_static/documentation_options.js"></script>
17+ <script src="../_static/jquery.js"></script>
18+ <script src="../_static/underscore.js"></script>
19+ <script src="../_static/doctools.js"></script>
20+ <script src="../_static/language_data.js"></script>
21+ <script src="../_static/sphinx_tabs/semantic-ui-2.4.1/tab.min.js"></script>
22+ <script src="../_static/sphinx_tabs/tabs.js"></script>
23+ <link rel="index" title="Index" href="../genindex.html" />
24+ <link rel="search" title="Search" href="../search.html" />
25+ <link rel="next" title="Install with apache" href="installation-apache.html" />
26+ <link rel="prev" title="uwsgi" href="installation-uwsgi.html" />
27+ <script>DOCUMENTATION_OPTIONS.URL_ROOT = '../';</script>
28+
29+ </head><body>
30+ <div class="related" role="navigation" aria-label="related navigation">
31+ <h3>Navigation</h3>
32+ <ul>
33+ <li class="right" style="margin-right: 10px">
34+ <a href="../genindex.html" title="General Index"
35+ accesskey="I">index</a></li>
36+ <li class="right" >
37+ <a href="installation-apache.html" title="Install with apache"
38+ accesskey="N">next</a> |</li>
39+ <li class="right" >
40+ <a href="installation-uwsgi.html" title="uwsgi"
41+ accesskey="P">previous</a> |</li>
42+ <li class="nav-item nav-item-0"><a href="../index.html">Searx Documentation (Searx-0.16.0.tex)</a> &#187;</li>
43+ <li class="nav-item nav-item-1"><a href="index.html" accesskey="U">Administrator documentation</a> &#187;</li>
44+ <li class="nav-item nav-item-this"><a href="">Install with nginx</a></li>
45+ </ul>
46+ </div>
47+
48+ <div class="document">
49+ <div class="documentwrapper">
50+ <div class="bodywrapper">
51+ <div class="body" role="main">
52+
53+ <div class="section" id="install-with-nginx">
54+<span id="installation-nginx"></span><h1>Install with nginx<a class="headerlink" href="#install-with-nginx" title="Permalink to this headline">¶</a></h1>
55+<div class="sidebar">
56+<p class="sidebar-title">further reading</p>
57+<ul class="simple">
58+<li><p><a class="reference external" href="https://docs.nginx.com/nginx/admin-guide/">nginx</a></p></li>
59+<li><p><a class="reference external" href="http://nginx.org/en/docs/beginners_guide.html">nginx beginners guide</a></p></li>
60+<li><p><a class="reference external" href="https://docs.nginx.com/nginx/admin-guide/web-server/web-server/#setting-up-virtual-servers">nginx server configuration</a></p></li>
61+<li><p><a class="reference external" href="https://www.nginx.com/resources/wiki/start/">Getting Started wiki</a></p></li>
62+<li><p><a class="reference external" href="https://uwsgi-docs.readthedocs.io/en/latest/Nginx.html">uWSGI support from nginx</a></p></li>
63+</ul>
64+</div>
65+<div class="contents local topic" id="contents">
66+<p class="topic-title">Contents</p>
67+<ul class="simple">
68+<li><p><a class="reference internal" href="#the-nginx-http-server" id="id1">The nginx HTTP server</a></p></li>
69+<li><p><a class="reference internal" href="#a-nginx-searx-site" id="id2">A nginx searx site</a></p></li>
70+<li><p><a class="reference internal" href="#disable-logs" id="id3">Disable logs</a></p></li>
71+</ul>
72+</div>
73+<hr class="docutils" />
74+<p><strong>Install</strong> <a class="reference internal" href="#nginx-searx-site"><span class="std std-ref">A nginx searx site</span></a> using <a class="reference internal" href="../utils/filtron.sh.html#filtron-sh-overview"><span class="std std-ref">filtron.sh</span></a></p>
75+<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$ sudo -H ./utils/filtron.sh nginx install
76+</pre></div>
77+</div>
78+<p><strong>Install</strong> <a class="reference internal" href="#nginx-searx-site"><span class="std std-ref">A nginx searx site</span></a> using <a class="reference internal" href="../utils/morty.sh.html#morty-sh-overview"><span class="std std-ref">morty.sh</span></a></p>
79+<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$ sudo -H ./utils/morty.sh nginx install
80+</pre></div>
81+</div>
82+<hr class="docutils" />
83+<div class="section" id="the-nginx-http-server">
84+<h2><a class="toc-backref" href="#id1">The nginx HTTP server</a><a class="headerlink" href="#the-nginx-http-server" title="Permalink to this headline">¶</a></h2>
85+<p>If <a class="reference external" href="https://docs.nginx.com/nginx/admin-guide/">nginx</a> is not installed (uwsgi will not work with the package nginx-light),
86+install it now.</p>
87+<div class="sphinx-tabs docutils container">
88+<div class="ui top attached tabular menu sphinx-menu docutils container">
89+<div class="active item sphinx-data-tab-VWJ1bnR1IC8gZGViaWFu docutils container">
90+<div class="docutils container">
91+<p>Ubuntu / debian</p>
92+</div>
93+</div>
94+<div class="item sphinx-data-tab-QXJjaCBMaW51eA== docutils container">
95+<div class="docutils container">
96+<p>Arch Linux</p>
97+</div>
98+</div>
99+<div class="item sphinx-data-tab-RmVkb3JhIC8gUkhFTA== docutils container">
100+<div class="docutils container">
101+<p>Fedora / RHEL</p>
102+</div>
103+</div>
104+</div>
105+<div class="ui bottom attached sphinx-tab tab segment sphinx-data-tab-VWJ1bnR1IC8gZGViaWFu active docutils container">
106+<div class="highlight-sh notranslate"><div class="highlight"><pre><span></span>sudo -H apt-get install nginx
107+</pre></div>
108+</div>
109+</div>
110+<div class="ui bottom attached sphinx-tab tab segment sphinx-data-tab-QXJjaCBMaW51eA== docutils container">
111+<div class="highlight-sh notranslate"><div class="highlight"><pre><span></span>sudo -H pacman -S nginx-mainline
112+sudo -H systemctl <span class="nb">enable</span> nginx
113+sudo -H systemctl start nginx
114+</pre></div>
115+</div>
116+</div>
117+<div class="ui bottom attached sphinx-tab tab segment sphinx-data-tab-RmVkb3JhIC8gUkhFTA== docutils container">
118+<div class="highlight-sh notranslate"><div class="highlight"><pre><span></span>sudo -H dnf install nginx
119+sudo -H systemctl <span class="nb">enable</span> nginx
120+sudo -H systemctl start nginx
121+</pre></div>
122+</div>
123+</div>
124+</div>
125+<p>Now at <a class="reference external" href="http://localhost">http://localhost</a> you should see a <em>Welcome to nginx!</em> page, on Fedora you
126+see a <em>Fedora Webserver - Test Page</em>. The test page comes from the default
127+<a class="reference external" href="https://docs.nginx.com/nginx/admin-guide/web-server/web-server/#setting-up-virtual-servers">nginx server configuration</a>. How this default intro site is configured,
128+depends on the linux distribution:</p>
129+<div class="sphinx-tabs docutils container">
130+<div class="ui top attached tabular menu sphinx-menu docutils container">
131+<div class="active item sphinx-data-tab-VWJ1bnR1IC8gZGViaWFu docutils container">
132+<div class="docutils container">
133+<p>Ubuntu / debian</p>
134+</div>
135+</div>
136+<div class="item sphinx-data-tab-QXJjaCBMaW51eA== docutils container">
137+<div class="docutils container">
138+<p>Arch Linux</p>
139+</div>
140+</div>
141+<div class="item sphinx-data-tab-RmVkb3JhIC8gUkhFTA== docutils container">
142+<div class="docutils container">
143+<p>Fedora / RHEL</p>
144+</div>
145+</div>
146+</div>
147+<div class="ui bottom attached sphinx-tab tab segment sphinx-data-tab-VWJ1bnR1IC8gZGViaWFu active docutils container">
148+<div class="highlight-sh notranslate"><div class="highlight"><pre><span></span>less /etc/nginx/nginx.conf
149+</pre></div>
150+</div>
151+<p>there is a line including site configurations from:</p>
152+<div class="highlight-nginx notranslate"><div class="highlight"><pre><span></span><span class="k">include</span> <span class="n">/etc/nginx/sites-enabled/*</span>;
153+</pre></div>
154+</div>
155+</div>
156+<div class="ui bottom attached sphinx-tab tab segment sphinx-data-tab-QXJjaCBMaW51eA== docutils container">
157+<div class="highlight-sh notranslate"><div class="highlight"><pre><span></span>less /etc/nginx/nginx.conf
158+</pre></div>
159+</div>
160+<p>in there is a configuration section named <code class="docutils literal notranslate"><span class="pre">server</span></code>:</p>
161+<div class="highlight-nginx notranslate"><div class="highlight"><pre><span></span><span class="k">server</span> <span class="p">{</span>
162+ <span class="kn">listen</span> <span class="mi">80</span><span class="p">;</span>
163+ <span class="kn">server_name</span> <span class="s">localhost</span><span class="p">;</span>
164+ <span class="c1"># ...</span>
165+<span class="p">}</span>
166+</pre></div>
167+</div>
168+</div>
169+<div class="ui bottom attached sphinx-tab tab segment sphinx-data-tab-RmVkb3JhIC8gUkhFTA== docutils container">
170+<div class="highlight-sh notranslate"><div class="highlight"><pre><span></span>less /etc/nginx/nginx.conf
171+</pre></div>
172+</div>
173+<p>there is a line including site configurations from:</p>
174+<div class="highlight-nginx notranslate"><div class="highlight"><pre><span></span><span class="k">include</span> <span class="n">/etc/nginx/conf.d/*.conf</span>;
175+</pre></div>
176+</div>
177+</div>
178+</div>
179+</div>
180+<div class="section" id="a-nginx-searx-site">
181+<span id="nginx-searx-site"></span><h2><a class="toc-backref" href="#id2">A nginx searx site</a><a class="headerlink" href="#a-nginx-searx-site" title="Permalink to this headline">¶</a></h2>
182+<div class="sidebar">
183+<p class="sidebar-title">public to the internet?</p>
184+<p>If your searx instance is public, stop here and first install <a class="reference internal" href="../utils/filtron.sh.html#filtron-sh"><span class="std std-ref">filtron
185+reverse proxy</span></a> and <a class="reference internal" href="../utils/morty.sh.html#morty-sh"><span class="std std-ref">result proxy morty</span></a>, see
186+<a class="reference internal" href="installation.html#installation-scripts"><span class="std std-ref">Installation scripts</span></a>. If already done, follow setup: <em>searx via
187+filtron plus morty</em>.</p>
188+</div>
189+<p>Now you have to create a configuration for the searx site. If <a class="reference external" href="https://docs.nginx.com/nginx/admin-guide/">nginx</a> is new to
190+you, the <a class="reference external" href="http://nginx.org/en/docs/beginners_guide.html">nginx beginners guide</a> is a good starting point and the <a class="reference external" href="https://www.nginx.com/resources/wiki/start/">Getting
191+Started wiki</a> is always a good resource <em>to keep in the pocket</em>.</p>
192+<div class="sphinx-tabs docutils container">
193+<div class="ui top attached tabular menu sphinx-menu docutils container">
194+<div class="active item sphinx-data-tab-VWJ1bnR1IC8gZGViaWFu docutils container">
195+<div class="docutils container">
196+<p>Ubuntu / debian</p>
197+</div>
198+</div>
199+<div class="item sphinx-data-tab-QXJjaCBMaW51eA== docutils container">
200+<div class="docutils container">
201+<p>Arch Linux</p>
202+</div>
203+</div>
204+<div class="item sphinx-data-tab-RmVkb3JhIC8gUkhFTA== docutils container">
205+<div class="docutils container">
206+<p>Fedora / RHEL</p>
207+</div>
208+</div>
209+</div>
210+<div class="ui bottom attached sphinx-tab tab segment sphinx-data-tab-VWJ1bnR1IC8gZGViaWFu active docutils container">
211+<p>Create configuration at <code class="docutils literal notranslate"><span class="pre">/etc/nginx/sites-available/searx</span></code> and place a
212+symlink to sites-enabled:</p>
213+<div class="highlight-sh notranslate"><div class="highlight"><pre><span></span>sudo -H ln -s /etc/nginx/sites-available/searx /etc/nginx/sites-enabled/searx
214+</pre></div>
215+</div>
216+</div>
217+<div class="ui bottom attached sphinx-tab tab segment sphinx-data-tab-QXJjaCBMaW51eA== docutils container">
218+<p>In the <code class="docutils literal notranslate"><span class="pre">/etc/nginx/nginx.conf</span></code> file, replace the configuration section
219+named <code class="docutils literal notranslate"><span class="pre">server</span></code>.</p>
220+</div>
221+<div class="ui bottom attached sphinx-tab tab segment sphinx-data-tab-RmVkb3JhIC8gUkhFTA== docutils container">
222+<p>Create configuration at <code class="docutils literal notranslate"><span class="pre">/etc/nginx/conf.d/searx</span></code> and place a
223+symlink to sites-enabled:</p>
224+</div>
225+</div>
226+<div class="sphinx-tabs docutils container">
227+<div class="ui top attached tabular menu sphinx-menu docutils container">
228+<div class="active item sphinx-data-tab-c2VhcnggdmlhIGZpbHRyb24gcGx1cyBtb3J0eQ== docutils container">
229+<div class="docutils container">
230+<p>searx via filtron plus morty</p>
231+</div>
232+</div>
233+<div class="item sphinx-data-tab-cHJveHkgb3IgdVdTR0k= docutils container">
234+<div class="docutils container">
235+<p>proxy or uWSGI</p>
236+</div>
237+</div>
238+<div class="item sphinx-data-tab-XC5cLiBhdCBzdWJkaXIgVVJM docutils container">
239+<div class="docutils container">
240+<p>.. at subdir URL</p>
241+</div>
242+</div>
243+</div>
244+<div class="ui bottom attached sphinx-tab tab segment sphinx-data-tab-c2VhcnggdmlhIGZpbHRyb24gcGx1cyBtb3J0eQ== active docutils container">
245+<p>Use this setup, if your instance is public to the internet, compare
246+figure: <a class="reference internal" href="architecture.html#arch-public"><span class="std std-ref">architecture</span></a> and <a class="reference internal" href="installation.html#installation-scripts"><span class="std std-ref">Installation scripts</span></a>.</p>
247+<ol class="arabic simple">
248+<li><p>Configure a reverse proxy for <a class="reference internal" href="../utils/filtron.sh.html#filtron-sh"><span class="std std-ref">filtron</span></a>, listening on
249+<em>localhost 4004</em> (<a class="reference internal" href="filtron.html#filtron-route-request"><span class="std std-ref">Route request through filtron</span></a>):</p></li>
250+</ol>
251+<div class="highlight-nginx notranslate"><div class="highlight"><pre><span></span><span class="c1"># https://example.org/searx</span>
252+
253+<span class="k">location</span> <span class="s">/searx</span> <span class="p">{</span>
254+ <span class="kn">proxy_pass</span> <span class="s">http://127.0.0.1:4004/</span><span class="p">;</span>
255+
256+ <span class="kn">proxy_set_header</span> <span class="s">Host</span> <span class="nv">$http_host</span><span class="p">;</span>
257+ <span class="kn">proxy_set_header</span> <span class="s">Connection</span> <span class="nv">$http_connection</span><span class="p">;</span>
258+ <span class="kn">proxy_set_header</span> <span class="s">X-Real-IP</span> <span class="nv">$remote_addr</span><span class="p">;</span>
259+ <span class="kn">proxy_set_header</span> <span class="s">X-Forwarded-For</span> <span class="nv">$proxy_add_x_forwarded_for</span><span class="p">;</span>
260+ <span class="kn">proxy_set_header</span> <span class="s">X-Scheme</span> <span class="nv">$scheme</span><span class="p">;</span>
261+ <span class="kn">proxy_set_header</span> <span class="s">X-Script-Name</span> <span class="s">/searx</span><span class="p">;</span>
262+<span class="p">}</span>
263+
264+<span class="k">location</span> <span class="s">/searx/static</span> <span class="p">{</span>
265+ <span class="kn">/usr/local/searx/searx-src/searx/static</span><span class="p">;</span>
266+<span class="p">}</span>
267+</pre></div>
268+</div>
269+<ol class="arabic simple" start="2">
270+<li><p>Configure reverse proxy for <a class="reference internal" href="morty.html#searx-morty"><span class="std std-ref">morty</span></a>, listening on
271+<em>localhost 3000</em>:</p></li>
272+</ol>
273+<div class="highlight-nginx notranslate"><div class="highlight"><pre><span></span><span class="c1"># https://example.org/morty</span>
274+
275+<span class="k">location</span> <span class="s">/morty</span> <span class="p">{</span>
276+ <span class="kn">proxy_pass</span> <span class="s">http://127.0.0.1:3000/</span><span class="p">;</span>
277+
278+ <span class="kn">proxy_set_header</span> <span class="s">Host</span> <span class="nv">$http_host</span><span class="p">;</span>
279+ <span class="kn">proxy_set_header</span> <span class="s">Connection</span> <span class="nv">$http_connection</span><span class="p">;</span>
280+ <span class="kn">proxy_set_header</span> <span class="s">X-Real-IP</span> <span class="nv">$remote_addr</span><span class="p">;</span>
281+ <span class="kn">proxy_set_header</span> <span class="s">X-Forwarded-For</span> <span class="nv">$proxy_add_x_forwarded_for</span><span class="p">;</span>
282+ <span class="kn">proxy_set_header</span> <span class="s">X-Scheme</span> <span class="nv">$scheme</span><span class="p">;</span>
283+<span class="p">}</span>
284+</pre></div>
285+</div>
286+<p>Note that reverse proxy advised to be used in case of single-user or
287+low-traffic instances. For a fully result proxification add <a class="reference internal" href="morty.html#searx-morty"><span class="std std-ref">morty’s</span></a> <strong>public URL</strong> to your <a class="reference external" href="https://github.com/asciimoo/searx/blob/master/searx/settings.yml">git://searx/settings.yml</a>:</p>
288+<div class="highlight-yaml notranslate"><div class="highlight"><pre><span></span><span class="l l-Scalar l-Scalar-Plain">result_proxy</span><span class="p p-Indicator">:</span>
289+ <span class="c1"># replace example.org with your server&#39;s public name</span>
290+ <span class="l l-Scalar l-Scalar-Plain">url</span> <span class="p p-Indicator">:</span> <span class="l l-Scalar l-Scalar-Plain">https://example.org/morty</span>
291+
292+<span class="l l-Scalar l-Scalar-Plain">server</span><span class="p p-Indicator">:</span>
293+ <span class="l l-Scalar l-Scalar-Plain">image_proxy</span> <span class="p p-Indicator">:</span> <span class="l l-Scalar l-Scalar-Plain">True</span>
294+</pre></div>
295+</div>
296+</div>
297+<div class="ui bottom attached sphinx-tab tab segment sphinx-data-tab-cHJveHkgb3IgdVdTR0k= docutils container">
298+<p>Be warned, with this setup, your instance isn’t <a class="reference internal" href="filtron.html#searx-filtron"><span class="std std-ref">protected</span></a>. Nevertheless it is good enough for intranet usage and it is a
299+excellent example of; <em>how different services can be set up</em>. The next
300+example shows a reverse proxy configuration wrapping the <a class="reference internal" href="installation-uwsgi.html#uwsgi-configuration"><span class="std std-ref">searx-uWSGI
301+application</span></a>, listening on <code class="docutils literal notranslate"><span class="pre">http</span> <span class="pre">=</span>
302+<span class="pre">127.0.0.1:8888</span></code>.</p>
303+<div class="highlight-nginx notranslate"><div class="highlight"><pre><span></span><span class="c1"># https://hostname.local/</span>
304+
305+<span class="k">location</span> <span class="s">/</span> <span class="p">{</span>
306+ <span class="kn">proxy_pass</span> <span class="s">http://127.0.0.1:8888</span><span class="p">;</span>
307+
308+ <span class="kn">proxy_set_header</span> <span class="s">Host</span> <span class="nv">$host</span><span class="p">;</span>
309+ <span class="kn">proxy_set_header</span> <span class="s">Connection</span> <span class="nv">$http_connection</span><span class="p">;</span>
310+ <span class="kn">proxy_set_header</span> <span class="s">X-Forwarded-For</span> <span class="nv">$proxy_add_x_forwarded_for</span><span class="p">;</span>
311+ <span class="kn">proxy_set_header</span> <span class="s">X-Scheme</span> <span class="nv">$scheme</span><span class="p">;</span>
312+ <span class="kn">proxy_buffering</span> <span class="no">off</span><span class="p">;</span>
313+<span class="p">}</span>
314+</pre></div>
315+</div>
316+<p>Alternatively you can use the <a class="reference external" href="https://uwsgi-docs.readthedocs.io/en/latest/Nginx.html">uWSGI support from nginx</a> via unix
317+sockets. For socket communication, you have to activate <code class="docutils literal notranslate"><span class="pre">socket</span> <span class="pre">=</span>
318+<span class="pre">/run/uwsgi/app/searx/socket</span></code> and comment out the <code class="docutils literal notranslate"><span class="pre">http</span> <span class="pre">=</span>
319+<span class="pre">127.0.0.1:8888</span></code> configuration in your <a class="reference internal" href="installation-uwsgi.html#uwsgi-configuration"><span class="std std-ref">uwsgi ini file</span></a>.</p>
320+<p>The example shows a nginx virtual <code class="docutils literal notranslate"><span class="pre">server</span></code> configuration, listening on
321+port 80 (IPv4 and IPv6 <a class="reference external" href="http://[::]:80">http://[::]:80</a>). The uWSGI app is configured at
322+location <code class="docutils literal notranslate"><span class="pre">/</span></code> by importing the <a class="reference external" href="https://uwsgi-docs.readthedocs.io/en/latest/Nginx.html#configuring-nginx">uwsgi_params</a> and passing requests to
323+the uWSGI socket (<code class="docutils literal notranslate"><span class="pre">uwsgi_pass</span></code>). The <code class="docutils literal notranslate"><span class="pre">server</span></code>'s root points to the
324+<a class="reference internal" href="installation-searx.html#searx-src"><span class="std std-ref">searx-src clone</span></a> and wraps directly the
325+<a class="reference external" href="https://github.com/asciimoo/searx/blob/master/searx/static/">git://searx/static/</a> content at <code class="docutils literal notranslate"><span class="pre">location</span> <span class="pre">/static</span></code>.</p>
326+<div class="highlight-nginx notranslate"><div class="highlight"><pre><span></span><span class="k">server</span> <span class="p">{</span>
327+ <span class="c1"># replace hostname.local with your server&#39;s name</span>
328+ <span class="kn">server_name</span> <span class="s">hostname.local</span><span class="p">;</span>
329+
330+ <span class="kn">listen</span> <span class="mi">80</span><span class="p">;</span>
331+ <span class="kn">listen</span> <span class="s">[::]:80</span><span class="p">;</span>
332+
333+ <span class="kn">location</span> <span class="s">/</span> <span class="p">{</span>
334+ <span class="kn">include</span> <span class="s">uwsgi_params</span><span class="p">;</span>
335+ <span class="kn">uwsgi_pass</span> <span class="s">unix:/run/uwsgi/app/searx/socket</span><span class="p">;</span>
336+ <span class="p">}</span>
337+
338+ <span class="kn">root</span> <span class="s">/usr/local/searx/searx-src/searx</span><span class="p">;</span>
339+ <span class="kn">location</span> <span class="s">/static</span> <span class="p">{</span> <span class="p">}</span>
340+<span class="p">}</span>
341+</pre></div>
342+</div>
343+<p>If not already exists, create a folder for the unix sockets, which can be
344+used by the searx account:</p>
345+<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>mkdir -p /run/uwsgi/app/searx/
346+sudo -H chown -R searx:searx /run/uwsgi/app/searx/
347+</pre></div>
348+</div>
349+</div>
350+<div class="ui bottom attached sphinx-tab tab segment sphinx-data-tab-XC5cLiBhdCBzdWJkaXIgVVJM docutils container">
351+<p>Be warned, with these setups, your instance isn’t <a class="reference internal" href="filtron.html#searx-filtron"><span class="std std-ref">protected</span></a>. The examples are just here to demonstrate how to export the
352+searx application from a subdirectory URL <code class="docutils literal notranslate"><span class="pre">https://example.org/searx/</span></code>.</p>
353+<div class="highlight-nginx notranslate"><div class="highlight"><pre><span></span><span class="c1"># https://hostname.local/searx</span>
354+
355+<span class="k">location</span> <span class="s">/searx</span> <span class="p">{</span>
356+ <span class="kn">proxy_pass</span> <span class="s">http://127.0.0.1:8888</span><span class="p">;</span>
357+
358+ <span class="kn">proxy_set_header</span> <span class="s">Host</span> <span class="nv">$host</span><span class="p">;</span>
359+ <span class="kn">proxy_set_header</span> <span class="s">Connection</span> <span class="nv">$http_connection</span><span class="p">;</span>
360+ <span class="kn">proxy_set_header</span> <span class="s">X-Forwarded-For</span> <span class="nv">$proxy_add_x_forwarded_for</span><span class="p">;</span>
361+ <span class="kn">proxy_set_header</span> <span class="s">X-Scheme</span> <span class="nv">$scheme</span><span class="p">;</span>
362+ <span class="kn">proxy_set_header</span> <span class="s">X-Script-Name</span> <span class="s">/searx</span><span class="p">;</span>
363+ <span class="kn">proxy_buffering</span> <span class="no">off</span><span class="p">;</span>
364+<span class="p">}</span>
365+
366+<span class="k">location</span> <span class="s">/searx/static</span> <span class="p">{</span>
367+ <span class="kn">alias</span> <span class="s">/usr/local/searx/searx-src/searx/static</span><span class="p">;</span>
368+<span class="p">}</span>
369+</pre></div>
370+</div>
371+<p>The <code class="docutils literal notranslate"><span class="pre">X-Script-Name</span> <span class="pre">/searx</span></code> is needed by the searx implementation to
372+calculate relative URLs correct. The next example shows a uWSGI
373+configuration. Since there are no HTTP headers in a (u)WSGI protocol, the
374+value is shipped via the <a class="reference external" href="https://werkzeug.palletsprojects.com/en/1.0.x/wsgi/#werkzeug.wsgi.get_script_name">SCRIPT_NAME</a> in the WSGI environment.</p>
375+<div class="highlight-nginx notranslate"><div class="highlight"><pre><span></span><span class="c1"># https://hostname.local/searx</span>
376+
377+<span class="k">location</span> <span class="s">/searx</span> <span class="p">{</span>
378+ <span class="kn">uwsgi_param</span> <span class="s">SCRIPT_NAME</span> <span class="s">/searx</span><span class="p">;</span>
379+ <span class="kn">include</span> <span class="s">uwsgi_params</span><span class="p">;</span>
380+ <span class="kn">uwsgi_pass</span> <span class="s">unix:/run/uwsgi/app/searx/socket</span><span class="p">;</span>
381+<span class="p">}</span>
382+
383+<span class="k">location</span> <span class="s">/searx/static</span> <span class="p">{</span>
384+ <span class="kn">alias</span> <span class="s">/usr/local/searx/searx-src/searx</span><span class="p">;</span>
385+<span class="p">}</span>
386+</pre></div>
387+</div>
388+<p>For searx to work correctly the <code class="docutils literal notranslate"><span class="pre">base_url</span></code> must be set in the
389+<a class="reference external" href="https://github.com/asciimoo/searx/blob/master/searx/settings.yml">git://searx/settings.yml</a>.</p>
390+<div class="highlight-yaml notranslate"><div class="highlight"><pre><span></span><span class="l l-Scalar l-Scalar-Plain">server</span><span class="p p-Indicator">:</span>
391+ <span class="c1"># replace example.org with your server&#39;s public name</span>
392+ <span class="l l-Scalar l-Scalar-Plain">base_url</span> <span class="p p-Indicator">:</span> <span class="l l-Scalar l-Scalar-Plain">https://example.org/searx/</span>
393+</pre></div>
394+</div>
395+</div>
396+</div>
397+<p>Restart service:</p>
398+<div class="sphinx-tabs docutils container">
399+<div class="ui top attached tabular menu sphinx-menu docutils container">
400+<div class="active item sphinx-data-tab-VWJ1bnR1IC8gZGViaWFu docutils container">
401+<div class="docutils container">
402+<p>Ubuntu / debian</p>
403+</div>
404+</div>
405+<div class="item sphinx-data-tab-QXJjaCBMaW51eA== docutils container">
406+<div class="docutils container">
407+<p>Arch Linux</p>
408+</div>
409+</div>
410+<div class="item sphinx-data-tab-RmVkb3Jh docutils container">
411+<div class="docutils container">
412+<p>Fedora</p>
413+</div>
414+</div>
415+</div>
416+<div class="ui bottom attached sphinx-tab tab segment sphinx-data-tab-VWJ1bnR1IC8gZGViaWFu active docutils container">
417+<div class="highlight-sh notranslate"><div class="highlight"><pre><span></span>sudo -H systemctl restart nginx
418+sudo -H service uwsgi restart searx
419+</pre></div>
420+</div>
421+</div>
422+<div class="ui bottom attached sphinx-tab tab segment sphinx-data-tab-QXJjaCBMaW51eA== docutils container">
423+<div class="highlight-sh notranslate"><div class="highlight"><pre><span></span>sudo -H systemctl restart nginx
424+sudo -H systemctl restart uwsgi@searx
425+</pre></div>
426+</div>
427+</div>
428+<div class="ui bottom attached sphinx-tab tab segment sphinx-data-tab-RmVkb3Jh docutils container">
429+<div class="highlight-sh notranslate"><div class="highlight"><pre><span></span>sudo -H systemctl restart nginx
430+sudo -H touch /etc/uwsgi.d/searx.ini
431+</pre></div>
432+</div>
433+</div>
434+</div>
435+</div>
436+<div class="section" id="disable-logs">
437+<h2><a class="toc-backref" href="#id3">Disable logs</a><a class="headerlink" href="#disable-logs" title="Permalink to this headline">¶</a></h2>
438+<p>For better privacy you can disable nginx logs in <code class="docutils literal notranslate"><span class="pre">/etc/nginx/nginx.conf</span></code>.</p>
439+<div class="highlight-nginx notranslate"><div class="highlight"><pre><span></span><span class="k">http</span> <span class="p">{</span>
440+ <span class="c1"># ...</span>
441+ <span class="kn">access_log</span> <span class="s">/dev/null</span><span class="p">;</span>
442+ <span class="kn">error_log</span> <span class="s">/dev/null</span><span class="p">;</span>
443+ <span class="c1"># ...</span>
444+<span class="p">}</span>
445+</pre></div>
446+</div>
447+</div>
448+</div>
449+
450+
451+ <div class="clearer"></div>
452+ </div>
453+ </div>
454+ </div>
455+ <span id="sidebar-top"></span>
456+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
457+ <div class="sphinxsidebarwrapper">
458+
459+
460+ <p class="logo"><a href="../index.html">
461+ <img class="logo" src="../_static/searx_logo_small.png" alt="Logo"/>
462+ </a></p>
463+
464+
465+ <h3>Project Links</h3>
466+ <ul>
467+ <li><a href="https://github.com/asciimoo/searx">Source</a>
468+
469+ <li><a href="https://github.com/asciimoo/searx/wiki">Wiki</a>
470+
471+ <li><a href="https://searx.space/">Public instances</a>
472+
473+ <li><a href="https://twitter.com/Searx_engine">Twitter</a>
474+ </ul><h3>Navigation</h3>
475+<ul>
476+ <li><a href="../index.html">Overview</a>
477+ <ul>
478+ <li><a href="index.html">Administrator documentation</a>
479+ <ul>
480+ <li>Previous: <a href="installation-uwsgi.html" title="previous chapter">uwsgi</a>
481+ <li>Next: <a href="installation-apache.html" title="next chapter">Install with apache</a></ul>
482+ </li>
483+ </ul>
484+ </li>
485+</ul>
486+<div id="searchbox" style="display: none" role="search">
487+ <h3 id="searchlabel">Quick search</h3>
488+ <div class="searchformwrapper">
489+ <form class="search" action="../search.html" method="get">
490+ <input type="text" name="q" aria-labelledby="searchlabel" />
491+ <input type="submit" value="Go" />
492+ </form>
493+ </div>
494+</div>
495+<script>$('#searchbox').show(0);</script>
496+ </div>
497+ </div>
498+ <div class="clearer"></div>
499+ </div>
500+
501+ <div class="footer" role="contentinfo">
502+ &#169; Copyright 2015-2020, Adam Tauber, Noémi Ványi.
503+ Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 3.1.1.
504+ </div>
505+ <script src="../_static/version_warning_offset.js"></script>
506+
507+ </body>
508+</html>
admin/installation-searx.htmlnew file+367
@@ -0,0 +1,367 @@
1+
2+<!DOCTYPE html>
3+
4+<html>
5+ <head>
6+ <meta charset="utf-8" />
7+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
8+ <meta name="viewport" content="width=device-width, initial-scale=1">
9+ <title>Step by step installation &#8212; Searx Documentation (Searx-0.16.0.tex)</title>
10+ <link rel="stylesheet" href="../_static/searx.css" type="text/css" />
11+ <link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
12+ <link rel="stylesheet" type="text/css" href="../_static/sphinx_tabs/semantic-ui-2.4.1/segment.min.css" />
13+ <link rel="stylesheet" type="text/css" href="../_static/sphinx_tabs/semantic-ui-2.4.1/menu.min.css" />
14+ <link rel="stylesheet" type="text/css" href="../_static/sphinx_tabs/semantic-ui-2.4.1/tab.min.css" />
15+ <link rel="stylesheet" type="text/css" href="../_static/sphinx_tabs/tabs.css" />
16+ <script id="documentation_options" data-url_root="../" src="../_static/documentation_options.js"></script>
17+ <script src="../_static/jquery.js"></script>
18+ <script src="../_static/underscore.js"></script>
19+ <script src="../_static/doctools.js"></script>
20+ <script src="../_static/language_data.js"></script>
21+ <script src="../_static/sphinx_tabs/semantic-ui-2.4.1/tab.min.js"></script>
22+ <script src="../_static/sphinx_tabs/tabs.js"></script>
23+ <link rel="index" title="Index" href="../genindex.html" />
24+ <link rel="search" title="Search" href="../search.html" />
25+ <link rel="next" title="uwsgi" href="installation-uwsgi.html" />
26+ <link rel="prev" title="Installation" href="installation.html" />
27+ <script>DOCUMENTATION_OPTIONS.URL_ROOT = '../';</script>
28+
29+ </head><body>
30+ <div class="related" role="navigation" aria-label="related navigation">
31+ <h3>Navigation</h3>
32+ <ul>
33+ <li class="right" style="margin-right: 10px">
34+ <a href="../genindex.html" title="General Index"
35+ accesskey="I">index</a></li>
36+ <li class="right" >
37+ <a href="installation-uwsgi.html" title="uwsgi"
38+ accesskey="N">next</a> |</li>
39+ <li class="right" >
40+ <a href="installation.html" title="Installation"
41+ accesskey="P">previous</a> |</li>
42+ <li class="nav-item nav-item-0"><a href="../index.html">Searx Documentation (Searx-0.16.0.tex)</a> &#187;</li>
43+ <li class="nav-item nav-item-1"><a href="index.html" accesskey="U">Administrator documentation</a> &#187;</li>
44+ <li class="nav-item nav-item-this"><a href="">Step by step installation</a></li>
45+ </ul>
46+ </div>
47+
48+ <div class="document">
49+ <div class="documentwrapper">
50+ <div class="bodywrapper">
51+ <div class="body" role="main">
52+
53+ <div class="section" id="step-by-step-installation">
54+<span id="installation-basic"></span><h1>Step by step installation<a class="headerlink" href="#step-by-step-installation" title="Permalink to this headline">¶</a></h1>
55+<div class="contents local topic" id="contents">
56+<p class="topic-title">Contents</p>
57+<ul class="simple">
58+<li><p><a class="reference internal" href="#install-packages" id="id2">Install packages</a></p></li>
59+<li><p><a class="reference internal" href="#create-user" id="id3">Create user</a></p></li>
60+<li><p><a class="reference internal" href="#install-searx-dependencies" id="id4">install searx &amp; dependencies</a></p></li>
61+<li><p><a class="reference internal" href="#configuration" id="id5">Configuration</a></p></li>
62+<li><p><a class="reference internal" href="#check" id="id6">Check</a></p></li>
63+</ul>
64+</div>
65+<p>Step by step installation with virtualenv. For Ubuntu, be sure to have enable
66+universe repository.</p>
67+<div class="section" id="install-packages">
68+<span id="id1"></span><h2><a class="toc-backref" href="#id2">Install packages</a><a class="headerlink" href="#install-packages" title="Permalink to this headline">¶</a></h2>
69+<div class="sphinx-tabs docutils container">
70+<div class="ui top attached tabular menu sphinx-menu docutils container">
71+<div class="active item sphinx-data-tab-VWJ1bnR1IC8gZGViaWFu docutils container">
72+<div class="docutils container">
73+<p>Ubuntu / debian</p>
74+</div>
75+</div>
76+<div class="item sphinx-data-tab-QXJjaCBMaW51eA== docutils container">
77+<div class="docutils container">
78+<p>Arch Linux</p>
79+</div>
80+</div>
81+<div class="item sphinx-data-tab-RmVkb3JhIC8gUkhFTA== docutils container">
82+<div class="docutils container">
83+<p>Fedora / RHEL</p>
84+</div>
85+</div>
86+</div>
87+<div class="ui bottom attached sphinx-tab tab segment sphinx-data-tab-VWJ1bnR1IC8gZGViaWFu active docutils container">
88+<div class="highlight-sh notranslate"><div class="highlight"><pre><span></span>$ sudo -H apt-get install -y <span class="se">\</span>
89+ virtualenv python3-dev python3-babel python3-venv <span class="se">\</span>
90+ uwsgi uwsgi-plugin-python3 <span class="se">\</span>
91+ git build-essential libxslt-dev zlib1g-dev libffi-dev libssl-dev <span class="se">\</span>
92+ shellcheck
93+</pre></div>
94+</div>
95+</div>
96+<div class="ui bottom attached sphinx-tab tab segment sphinx-data-tab-QXJjaCBMaW51eA== docutils container">
97+<div class="highlight-sh notranslate"><div class="highlight"><pre><span></span>$ sudo -H pacman -S --noconfirm <span class="se">\</span>
98+ python-virtualenv python python-pip python-lxml python-babel <span class="se">\</span>
99+ uwsgi uwsgi-plugin-python <span class="se">\</span>
100+ git base-devel libxml2 <span class="se">\</span>
101+ shellcheck
102+</pre></div>
103+</div>
104+</div>
105+<div class="ui bottom attached sphinx-tab tab segment sphinx-data-tab-RmVkb3JhIC8gUkhFTA== docutils container">
106+<div class="highlight-sh notranslate"><div class="highlight"><pre><span></span>$ sudo -H dnf install -y <span class="se">\</span>
107+ virtualenv python python-pip python-lxml python-babel <span class="se">\</span>
108+ uwsgi uwsgi-plugin-python3 <span class="se">\</span>
109+ git @development-tools libxml2 <span class="se">\</span>
110+ ShellCheck
111+</pre></div>
112+</div>
113+</div>
114+</div>
115+<div class="admonition hint">
116+<p class="admonition-title">Hint</p>
117+<p>This installs also the packages needed by <a class="reference internal" href="installation-uwsgi.html#searx-uwsgi"><span class="std std-ref">uwsgi</span></a></p>
118+</div>
119+</div>
120+<div class="section" id="create-user">
121+<span id="create-searx-user"></span><h2><a class="toc-backref" href="#id3">Create user</a><a class="headerlink" href="#create-user" title="Permalink to this headline">¶</a></h2>
122+<div class="sphinx-tabs docutils container">
123+<div class="ui top attached tabular menu sphinx-menu docutils container">
124+<div class="active item sphinx-data-tab-YmFzaA== docutils container">
125+<div class="docutils container">
126+<p>bash</p>
127+</div>
128+</div>
129+</div>
130+<div class="ui bottom attached sphinx-tab tab segment sphinx-data-tab-YmFzaA== active docutils container">
131+<div class="highlight-sh notranslate"><div class="highlight"><pre><span></span>$ sudo -H useradd --shell /bin/bash --system <span class="se">\</span>
132+ --home-dir /usr/local/searx <span class="se">\</span>
133+ --comment Privacy-respecting metasearch engine searx
134+
135+$ sudo -H mkdir /usr/local/searx
136+$ sudo -H chown -R searx:searx /usr/local/searx
137+</pre></div>
138+</div>
139+</div>
140+</div>
141+</div>
142+<div class="section" id="install-searx-dependencies">
143+<span id="searx-src"></span><h2><a class="toc-backref" href="#id4">install searx &amp; dependencies</a><a class="headerlink" href="#install-searx-dependencies" title="Permalink to this headline">¶</a></h2>
144+<p>Start a interactive shell from new created user and clone searx:</p>
145+<div class="sphinx-tabs docutils container">
146+<div class="ui top attached tabular menu sphinx-menu docutils container">
147+<div class="active item sphinx-data-tab-YmFzaA== docutils container">
148+<div class="docutils container">
149+<p>bash</p>
150+</div>
151+</div>
152+</div>
153+<div class="ui bottom attached sphinx-tab tab segment sphinx-data-tab-YmFzaA== active docutils container">
154+<div class="highlight-sh notranslate"><div class="highlight"><pre><span></span>$ sudo -H -u searx -i
155+<span class="o">(</span>searx<span class="o">)</span>$ git clone https://github.com/asciimoo/searx.git /usr/local/searx/searx-src
156+</pre></div>
157+</div>
158+</div>
159+</div>
160+<p>In the same shell create <em>virtualenv</em>:</p>
161+<div class="sphinx-tabs docutils container">
162+<div class="ui top attached tabular menu sphinx-menu docutils container">
163+<div class="active item sphinx-data-tab-YmFzaA== docutils container">
164+<div class="docutils container">
165+<p>bash</p>
166+</div>
167+</div>
168+</div>
169+<div class="ui bottom attached sphinx-tab tab segment sphinx-data-tab-YmFzaA== active docutils container">
170+<div class="highlight-sh notranslate"><div class="highlight"><pre><span></span><span class="o">(</span>searx<span class="o">)</span>$ python3 -m venv /usr/local/searx/searx-pyenv
171+<span class="o">(</span>searx<span class="o">)</span>$ <span class="nb">echo</span> . /usr/local/searx/searx-pyenv/bin/activate &gt;&gt; /usr/local/searx/.profile
172+</pre></div>
173+</div>
174+</div>
175+</div>
176+<p>To install searx’s dependencies, exit the searx <em>bash</em> session you opened above
177+and restart a new. Before install, first check if your <em>virualenv</em> was sourced
178+from the login (<em>~/.profile</em>):</p>
179+<div class="sphinx-tabs docutils container">
180+<div class="ui top attached tabular menu sphinx-menu docutils container">
181+<div class="active item sphinx-data-tab-YmFzaA== docutils container">
182+<div class="docutils container">
183+<p>bash</p>
184+</div>
185+</div>
186+</div>
187+<div class="ui bottom attached sphinx-tab tab segment sphinx-data-tab-YmFzaA== active docutils container">
188+<div class="highlight-sh notranslate"><div class="highlight"><pre><span></span>$ sudo -H -u searx -i
189+
190+<span class="o">(</span>searx<span class="o">)</span>$ <span class="nb">command</span> -v python <span class="o">&amp;&amp;</span> python --version
191+/usr/local/searx/searx-pyenv/bin/python
192+Python 3.8.1
193+
194+<span class="c1"># update pip&#39;s boilerplate ..</span>
195+pip install -U pip
196+pip install -U setuptools
197+pip install -U wheel
198+
199+<span class="c1"># jump to searx&#39;s working tree and install searx into virtualenv</span>
200+<span class="o">(</span>searx<span class="o">)</span>$ <span class="nb">cd</span> /usr/local/searx/searx-src
201+<span class="o">(</span>searx<span class="o">)</span>$ pip install -e .
202+</pre></div>
203+</div>
204+</div>
205+</div>
206+<div class="admonition tip">
207+<p class="admonition-title">Tip</p>
208+<p>Open a second terminal for the configuration tasks and left the <code class="docutils literal notranslate"><span class="pre">(searx)$</span></code>
209+terminal open for the tasks below.</p>
210+</div>
211+</div>
212+<div class="section" id="configuration">
213+<h2><a class="toc-backref" href="#id5">Configuration</a><a class="headerlink" href="#configuration" title="Permalink to this headline">¶</a></h2>
214+<p>Create a copy of the <a class="reference external" href="https://github.com/asciimoo/searx/blob/master/searx/settings.yml">git://searx/settings.yml</a> configuration file in system’s
215+<em>/etc</em> folder. Configure like shown below – replace <code class="docutils literal notranslate"><span class="pre">searx&#64;\$(uname</span> <span class="pre">-n)</span></code> with
216+a name of your choice – <em>and/or</em> edit <code class="docutils literal notranslate"><span class="pre">/etc/searx/settings.yml</span></code> if necessary.</p>
217+<div class="sphinx-tabs docutils container">
218+<div class="ui top attached tabular menu sphinx-menu docutils container">
219+<div class="active item sphinx-data-tab-YmFzaA== docutils container">
220+<div class="docutils container">
221+<p>bash</p>
222+</div>
223+</div>
224+</div>
225+<div class="ui bottom attached sphinx-tab tab segment sphinx-data-tab-YmFzaA== active docutils container">
226+<div class="highlight-sh notranslate"><div class="highlight"><pre><span></span>$ sudo -H cp /usr/local/searx/searx-src/searx/settings.yml /etc/searx/settings.yml
227+$ sudo -H sed -i -e s/ultrasecretkey/<span class="se">\1</span>0f5827a1c699bdc92caa3c0e921a6cd/g /etc/searx/settings.yml
228+$ sudo -H sed -i -e s/<span class="o">{</span>instance_name<span class="o">}</span>/searx@<span class="se">\r</span>yzen/g /etc/searx/settings.yml
229+</pre></div>
230+</div>
231+</div>
232+</div>
233+</div>
234+<div class="section" id="check">
235+<h2><a class="toc-backref" href="#id6">Check</a><a class="headerlink" href="#check" title="Permalink to this headline">¶</a></h2>
236+<p>To check your searx setup, optional enable debugging and start the <em>webapp</em>.
237+Searx looks at the exported environment <code class="docutils literal notranslate"><span class="pre">$SEARX_SETTINGS_PATH</span></code> for a
238+configuration file.</p>
239+<div class="sphinx-tabs docutils container">
240+<div class="ui top attached tabular menu sphinx-menu docutils container">
241+<div class="active item sphinx-data-tab-YmFzaA== docutils container">
242+<div class="docutils container">
243+<p>bash</p>
244+</div>
245+</div>
246+</div>
247+<div class="ui bottom attached sphinx-tab tab segment sphinx-data-tab-YmFzaA== active docutils container">
248+<div class="highlight-sh notranslate"><div class="highlight"><pre><span></span><span class="c1"># enable debug ..</span>
249+$ sudo -H sed -i -e s/debug : False/debug : True/g /etc/searx/settings.yml
250+
251+<span class="c1"># start webapp</span>
252+$ sudo -H -u searx -i
253+<span class="o">(</span>searx<span class="o">)</span>$ <span class="nb">cd</span> /usr/local/searx/searx-src
254+<span class="o">(</span>searx<span class="o">)</span>$ <span class="nb">export</span> <span class="nv">SEARX_SETTINGS_PATH</span><span class="o">=</span>/etc/searx/settings.yml
255+<span class="o">(</span>searx<span class="o">)</span>$ python searx/webapp.py
256+
257+<span class="c1"># disable debug</span>
258+$ sudo -H sed -i -e s/debug : True/debug : False/g /etc/searx/settings.yml
259+</pre></div>
260+</div>
261+</div>
262+</div>
263+<p>Open WEB browser and visit <a class="reference external" href="http://">http://</a> . If you are inside a
264+container or in a script, test with curl:</p>
265+<div class="sphinx-tabs docutils container">
266+<div class="ui top attached tabular menu sphinx-menu docutils container">
267+<div class="active item sphinx-data-tab-V0VCIGJyb3dzZXI= docutils container">
268+<div class="docutils container">
269+<p>WEB browser</p>
270+</div>
271+</div>
272+<div class="item sphinx-data-tab-Y3VybA== docutils container">
273+<div class="docutils container">
274+<p>curl</p>
275+</div>
276+</div>
277+</div>
278+<div class="ui bottom attached sphinx-tab tab segment sphinx-data-tab-V0VCIGJyb3dzZXI= active docutils container">
279+<div class="highlight-sh notranslate"><div class="highlight"><pre><span></span>$ xgd-open http://
280+</pre></div>
281+</div>
282+</div>
283+<div class="ui bottom attached sphinx-tab tab segment sphinx-data-tab-Y3VybA== docutils container">
284+<div class="highlight-none notranslate"><div class="highlight"><pre><span></span>$ curl --location --verbose --head --insecure
285+
286+* Trying 127.0.0.1:8888...
287+* TCP_NODELAY set
288+* Connected to 127.0.0.1 (127.0.0.1) port 8888 (#0)
289+&gt; HEAD / HTTP/1.1
290+&gt; Host: 127.0.0.1:8888
291+&gt; User-Agent: curl/7.68.0
292+&gt; Accept: */*
293+&gt;
294+* Mark bundle as not supporting multiuse
295+* HTTP 1.0, assume close after body
296+&lt; HTTP/1.0 200 OK
297+HTTP/1.0 200 OK
298+...
299+</pre></div>
300+</div>
301+</div>
302+</div>
303+<p>If everything works fine, hit <code class="docutils literal notranslate"><span class="pre">[CTRL-C]</span></code> to stop the <em>webapp</em> and disable the
304+debug option in <code class="docutils literal notranslate"><span class="pre">settings.yml</span></code>. You can now exit searx user bash (enter exit
305+command twice). At this point searx is not demonized; uwsgi allows this.</p>
306+</div>
307+</div>
308+
309+
310+ <div class="clearer"></div>
311+ </div>
312+ </div>
313+ </div>
314+ <span id="sidebar-top"></span>
315+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
316+ <div class="sphinxsidebarwrapper">
317+
318+
319+ <p class="logo"><a href="../index.html">
320+ <img class="logo" src="../_static/searx_logo_small.png" alt="Logo"/>
321+ </a></p>
322+
323+
324+ <h3>Project Links</h3>
325+ <ul>
326+ <li><a href="https://github.com/asciimoo/searx">Source</a>
327+
328+ <li><a href="https://github.com/asciimoo/searx/wiki">Wiki</a>
329+
330+ <li><a href="https://searx.space/">Public instances</a>
331+
332+ <li><a href="https://twitter.com/Searx_engine">Twitter</a>
333+ </ul><h3>Navigation</h3>
334+<ul>
335+ <li><a href="../index.html">Overview</a>
336+ <ul>
337+ <li><a href="index.html">Administrator documentation</a>
338+ <ul>
339+ <li>Previous: <a href="installation.html" title="previous chapter">Installation</a>
340+ <li>Next: <a href="installation-uwsgi.html" title="next chapter">uwsgi</a></ul>
341+ </li>
342+ </ul>
343+ </li>
344+</ul>
345+<div id="searchbox" style="display: none" role="search">
346+ <h3 id="searchlabel">Quick search</h3>
347+ <div class="searchformwrapper">
348+ <form class="search" action="../search.html" method="get">
349+ <input type="text" name="q" aria-labelledby="searchlabel" />
350+ <input type="submit" value="Go" />
351+ </form>
352+ </div>
353+</div>
354+<script>$('#searchbox').show(0);</script>
355+ </div>
356+ </div>
357+ <div class="clearer"></div>
358+ </div>
359+
360+ <div class="footer" role="contentinfo">
361+ &#169; Copyright 2015-2020, Adam Tauber, Noémi Ványi.
362+ Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 3.1.1.
363+ </div>
364+ <script src="../_static/version_warning_offset.js"></script>
365+
366+ </body>
367+</html>
admin/installation-uwsgi.htmlnew file+517
@@ -0,0 +1,517 @@
1+
2+<!DOCTYPE html>
3+
4+<html>
5+ <head>
6+ <meta charset="utf-8" />
7+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
8+ <meta name="viewport" content="width=device-width, initial-scale=1">
9+ <title>uwsgi &#8212; Searx Documentation (Searx-0.16.0.tex)</title>
10+ <link rel="stylesheet" href="../_static/searx.css" type="text/css" />
11+ <link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
12+ <link rel="stylesheet" type="text/css" href="../_static/sphinx_tabs/semantic-ui-2.4.1/segment.min.css" />
13+ <link rel="stylesheet" type="text/css" href="../_static/sphinx_tabs/semantic-ui-2.4.1/menu.min.css" />
14+ <link rel="stylesheet" type="text/css" href="../_static/sphinx_tabs/semantic-ui-2.4.1/tab.min.css" />
15+ <link rel="stylesheet" type="text/css" href="../_static/sphinx_tabs/tabs.css" />
16+ <script id="documentation_options" data-url_root="../" src="../_static/documentation_options.js"></script>
17+ <script src="../_static/jquery.js"></script>
18+ <script src="../_static/underscore.js"></script>
19+ <script src="../_static/doctools.js"></script>
20+ <script src="../_static/language_data.js"></script>
21+ <script src="../_static/sphinx_tabs/semantic-ui-2.4.1/tab.min.js"></script>
22+ <script src="../_static/sphinx_tabs/tabs.js"></script>
23+ <link rel="index" title="Index" href="../genindex.html" />
24+ <link rel="search" title="Search" href="../search.html" />
25+ <link rel="next" title="Install with nginx" href="installation-nginx.html" />
26+ <link rel="prev" title="Step by step installation" href="installation-searx.html" />
27+ <script>DOCUMENTATION_OPTIONS.URL_ROOT = '../';</script>
28+
29+ </head><body>
30+ <div class="related" role="navigation" aria-label="related navigation">
31+ <h3>Navigation</h3>
32+ <ul>
33+ <li class="right" style="margin-right: 10px">
34+ <a href="../genindex.html" title="General Index"
35+ accesskey="I">index</a></li>
36+ <li class="right" >
37+ <a href="installation-nginx.html" title="Install with nginx"
38+ accesskey="N">next</a> |</li>
39+ <li class="right" >
40+ <a href="installation-searx.html" title="Step by step installation"
41+ accesskey="P">previous</a> |</li>
42+ <li class="nav-item nav-item-0"><a href="../index.html">Searx Documentation (Searx-0.16.0.tex)</a> &#187;</li>
43+ <li class="nav-item nav-item-1"><a href="index.html" accesskey="U">Administrator documentation</a> &#187;</li>
44+ <li class="nav-item nav-item-this"><a href="">uwsgi</a></li>
45+ </ul>
46+ </div>
47+
48+ <div class="document">
49+ <div class="documentwrapper">
50+ <div class="bodywrapper">
51+ <div class="body" role="main">
52+
53+ <div class="section" id="uwsgi">
54+<span id="searx-uwsgi"></span><h1>uwsgi<a class="headerlink" href="#uwsgi" title="Permalink to this headline">¶</a></h1>
55+<div class="sidebar">
56+<p class="sidebar-title">further reading</p>
57+<ul class="simple">
58+<li><p><a class="reference external" href="https://www.freedesktop.org/software/systemd/man/systemd.unit.html">systemd.unit</a></p></li>
59+<li><p><a class="reference external" href="https://uwsgi-docs.readthedocs.io/en/latest/Emperor.html">uWSGI Emperor</a></p></li>
60+</ul>
61+</div>
62+<div class="contents local topic" id="contents">
63+<p class="topic-title">Contents</p>
64+<ul class="simple">
65+<li><p><a class="reference internal" href="#origin-uwsgi" id="id1">Origin uWSGI</a></p></li>
66+<li><p><a class="reference internal" href="#distributors" id="id2">Distributors</a></p></li>
67+<li><p><a class="reference internal" href="#alltogether" id="id3">Alltogether</a></p></li>
68+</ul>
69+</div>
70+<div class="section" id="origin-uwsgi">
71+<h2><a class="toc-backref" href="#id1">Origin uWSGI</a><a class="headerlink" href="#origin-uwsgi" title="Permalink to this headline">¶</a></h2>
72+<p>How uWSGI is implemented by distributors is different. uWSGI itself
73+recommend two methods</p>
74+<p><a class="reference external" href="https://www.freedesktop.org/software/systemd/man/systemd.unit.html">systemd.unit</a> template files as described here <a class="reference external" href="https://uwsgi-docs.readthedocs.io/en/latest/Systemd.html#one-service-per-app-in-systemd">One service per app in systemd</a>.</p>
75+<blockquote>
76+<div><p>There is one <a class="reference external" href="http://0pointer.de/blog/projects/instances.html">systemd unit template</a> and one <a class="reference external" href="https://uwsgi-docs.readthedocs.io/en/latest/Configuration.html#ini-files">uwsgi ini file</a> per uWSGI-app
77+placed at dedicated locations. Take archlinux and a searx.ini as example:</p>
78+<div class="highlight-none notranslate"><div class="highlight"><pre><span></span>unit template --&gt; /usr/lib/systemd/system/uwsgi@.service
79+uwsgi ini files --&gt; /etc/uwsgi/searx.ini
80+</pre></div>
81+</div>
82+<p>The searx app can be maintained as know from common systemd units:</p>
83+<div class="highlight-none notranslate"><div class="highlight"><pre><span></span>systemctl enable uwsgi@searx
84+systemctl start uwsgi@searx
85+systemctl restart uwsgi@searx
86+systemctl stop uwsgi@searx
87+</pre></div>
88+</div>
89+</div></blockquote>
90+<p>The <a class="reference external" href="https://uwsgi-docs.readthedocs.io/en/latest/Emperor.html">uWSGI Emperor</a> mode which fits for maintaining a large range of uwsgi apps.</p>
91+<blockquote>
92+<div><p>The Emperor mode is a special uWSGI instance that will monitor specific
93+events. The Emperor mode (service) is started by a (common, not template)
94+systemd unit. The Emperor service will scan specific directories for <a class="reference external" href="https://uwsgi-docs.readthedocs.io/en/latest/Configuration.html#ini-files">uwsgi
95+ini file</a>s (also know as <em>vassals</em>). If a <em>vassal</em> is added, removed or the
96+timestamp is modified, a corresponding action takes place: a new uWSGI
97+instance is started, reload or stopped. Take Fedora and a searx.ini as
98+example:</p>
99+<div class="highlight-none notranslate"><div class="highlight"><pre><span></span>to start a new searx instance create --&gt; /etc/uwsgi.d/searx.ini
100+to reload the instance edit timestamp --&gt; touch /etc/uwsgi.d/searx.ini
101+to stop instance remove ini --&gt; rm /etc/uwsgi.d/searx.ini
102+</pre></div>
103+</div>
104+</div></blockquote>
105+</div>
106+<div class="section" id="distributors">
107+<h2><a class="toc-backref" href="#id2">Distributors</a><a class="headerlink" href="#distributors" title="Permalink to this headline">¶</a></h2>
108+<p>The <a class="reference external" href="https://uwsgi-docs.readthedocs.io/en/latest/Emperor.html">uWSGI Emperor</a> mode and <a class="reference external" href="http://0pointer.de/blog/projects/instances.html">systemd unit template</a> is what the distributors
109+mostly offer their users, even if they differ in the way they implement both
110+modes and their defaults. Another point they might differ is the packaging of
111+plugins (if so, compare <a class="reference internal" href="installation-searx.html#install-packages"><span class="std std-ref">Install packages</span></a>) and what the default python
112+interpreter is (python2 vs. python3).</p>
113+<p>Fedora starts a Emperor by default, while archlinux does not start any uwsgi
114+service by default. Worth to know; debian (ubuntu) follow a complete different
115+approach. <em>debian</em>: your are familiar with the apache infrastructure? .. they
116+do similar for the uWSGI infrastructure (with less comfort), the folders are:</p>
117+<div class="highlight-none notranslate"><div class="highlight"><pre><span></span>/etc/uwsgi/apps-available/
118+/etc/uwsgi/apps-enabled/
119+</pre></div>
120+</div>
121+<p>The <a class="reference external" href="https://uwsgi-docs.readthedocs.io/en/latest/Configuration.html#ini-files">uwsgi ini file</a> is enabled by a symbolic link:</p>
122+<div class="highlight-none notranslate"><div class="highlight"><pre><span></span>ln -s /etc/uwsgi/apps-available/searx.ini /etc/uwsgi/apps-enabled/
123+</pre></div>
124+</div>
125+<p>From debian’s documentation (<code class="docutils literal notranslate"><span class="pre">/usr/share/doc/uwsgi/README.Debian.gz</span></code>): You
126+could control specific instance(s) by issuing:</p>
127+<div class="highlight-none notranslate"><div class="highlight"><pre><span></span>service uwsgi &lt;command&gt; &lt;confname&gt; &lt;confname&gt; ...
128+
129+sudo -H service uwsgi start searx
130+sudo -H service uwsgi stop searx
131+</pre></div>
132+</div>
133+<p>My experience is, that this command is a bit buggy.</p>
134+</div>
135+<div class="section" id="alltogether">
136+<span id="uwsgi-configuration"></span><h2><a class="toc-backref" href="#id3">Alltogether</a><a class="headerlink" href="#alltogether" title="Permalink to this headline">¶</a></h2>
137+<p>Create the configuration ini-file according to your distribution (see below) and
138+restart the uwsgi application.</p>
139+<div class="sphinx-tabs docutils container">
140+<div class="ui top attached tabular menu sphinx-menu docutils container">
141+<div class="active item sphinx-data-tab-VWJ1bnR1IC8gZGViaWFu docutils container">
142+<div class="docutils container">
143+<p>Ubuntu / debian</p>
144+</div>
145+</div>
146+<div class="item sphinx-data-tab-RmVkb3JhIC8gUkhFTA== docutils container">
147+<div class="docutils container">
148+<p>Fedora / RHEL</p>
149+</div>
150+</div>
151+</div>
152+<div class="ui bottom attached sphinx-tab tab segment sphinx-data-tab-VWJ1bnR1IC8gZGViaWFu active docutils container">
153+<p># init.d –&gt; /usr/share/doc/uwsgi/README.Debian.gz
154+# For uWSGI debian uses the LSB init process, this might be changed
155+# one day, see <a class="reference external" href="https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=833067">https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=833067</a></p>
156+<p>create /etc/uwsgi/apps-available/searx.ini
157+enable: sudo -H ln -s /etc/uwsgi/apps-available/searx.ini /etc/uwsgi/apps-enabled/
158+start: sudo -H service uwsgi start searx
159+restart: sudo -H service uwsgi restart searx
160+stop: sudo -H service uwsgi stop searx
161+disable: sudo -H rm /etc/uwsgi/apps-enabled/searx.ini
162+..</p>
163+</div>
164+<blockquote>
165+<div><p># systemd –&gt; /usr/lib/systemd/system/uwsgi&#64;.service
166+# For uWSGI archlinux uses systemd template units, see
167+# - <a class="reference external" href="http://0pointer.de/blog/projects/instances.html">http://0pointer.de/blog/projects/instances.html</a>
168+# - <a class="reference external" href="https://uwsgi-docs.readthedocs.io/en/latest/Systemd.html#one-service-per-app-in-systemd">https://uwsgi-docs.readthedocs.io/en/latest/Systemd.html#one-service-per-app-in-systemd</a></p>
169+<p>create: /etc/uwsgi/searx.ini
170+enable: sudo -H systemctl enable <a class="reference external" href="mailto:uwsgi&#37;&#52;&#48;searx">uwsgi<span>&#64;</span>searx</a>
171+start: sudo -H systemctl start <a class="reference external" href="mailto:uwsgi&#37;&#52;&#48;searx">uwsgi<span>&#64;</span>searx</a>
172+restart: sudo -H systemctl restart <a class="reference external" href="mailto:uwsgi&#37;&#52;&#48;searx">uwsgi<span>&#64;</span>searx</a>
173+stop: sudo -H systemctl stop <a class="reference external" href="mailto:uwsgi&#37;&#52;&#48;searx">uwsgi<span>&#64;</span>searx</a>
174+disable: sudo -H systemctl disable <a class="reference external" href="mailto:uwsgi&#37;&#52;&#48;searx">uwsgi<span>&#64;</span>searx</a>
175+..</p>
176+</div></blockquote>
177+<div class="ui bottom attached sphinx-tab tab segment sphinx-data-tab-RmVkb3JhIC8gUkhFTA== docutils container">
178+<p># systemd –&gt; /usr/lib/systemd/system/uwsgi.service
179+# The unit file starts uWSGI in emperor mode (/etc/uwsgi.ini), see
180+# - <a class="reference external" href="https://uwsgi-docs.readthedocs.io/en/latest/Emperor.html">https://uwsgi-docs.readthedocs.io/en/latest/Emperor.html</a></p>
181+<p>create: /etc/uwsgi.d/searx.ini
182+restart: sudo -H touch /etc/uwsgi.d/searx.ini
183+disable: sudo -H rm /etc/uwsgi.d/searx.ini
184+..</p>
185+</div>
186+</div>
187+<div class="sphinx-tabs docutils container">
188+<div class="ui top attached tabular menu sphinx-menu docutils container">
189+<div class="active item sphinx-data-tab-VWJ1bnR1IC8gZGViaWFu docutils container">
190+<div class="docutils container">
191+<p>Ubuntu / debian</p>
192+</div>
193+</div>
194+<div class="item sphinx-data-tab-QXJjaCBMaW51eA== docutils container">
195+<div class="docutils container">
196+<p>Arch Linux</p>
197+</div>
198+</div>
199+<div class="item sphinx-data-tab-RmVkb3JhIC8gUkhFTA== docutils container">
200+<div class="docutils container">
201+<p>Fedora / RHEL</p>
202+</div>
203+</div>
204+</div>
205+<div class="ui bottom attached sphinx-tab tab segment sphinx-data-tab-VWJ1bnR1IC8gZGViaWFu active docutils container">
206+<pre class="code ini literal-block"><code><span class="keyword">[uwsgi]</span>
207+
208+<span class="comment single"># uWSGI core</span>
209+<span class="comment single"># ----------</span>
210+<span class="comment single">#</span>
211+<span class="comment single"># https://uwsgi-docs.readthedocs.io/en/latest/Options.html#uwsgi-core</span>
212+
213+<span class="comment single"># Who will run the code</span>
214+<span class="name attribute">uid</span> <span class="operator">=</span> <span class="literal string">searx</span>
215+<span class="name attribute">gid</span> <span class="operator">=</span> <span class="literal string">searx</span>
216+
217+<span class="comment single"># chdir to specified directory before apps loading</span>
218+<span class="name attribute">chdir</span> <span class="operator">=</span> <span class="literal string">/usr/local/searx/searx-src/searx</span>
219+
220+<span class="comment single"># searx configuration (settings.yml)</span>
221+<span class="name attribute">env</span> <span class="operator">=</span> <span class="literal string">SEARX_SETTINGS_PATH=/etc/searx/settings.yml</span>
222+
223+<span class="comment single"># disable logging for privacy</span>
224+<span class="name attribute">disable-logging</span> <span class="operator">=</span> <span class="literal string">true</span>
225+
226+<span class="comment single"># The right granted on the created socket</span>
227+<span class="name attribute">chmod-socket</span> <span class="operator">=</span> <span class="literal string">666</span>
228+
229+<span class="comment single"># Plugin to use and interpretor config</span>
230+<span class="name attribute">single-interpreter</span> <span class="operator">=</span> <span class="literal string">true</span>
231+
232+<span class="comment single"># enable master process</span>
233+<span class="name attribute">master</span> <span class="operator">=</span> <span class="literal string">true</span>
234+
235+<span class="comment single"># load apps in each worker instead of the master</span>
236+<span class="name attribute">lazy-apps</span> <span class="operator">=</span> <span class="literal string">true</span>
237+
238+<span class="comment single"># load uWSGI plugins</span>
239+<span class="name attribute">plugin</span> <span class="operator">=</span> <span class="literal string">python3,http</span>
240+
241+<span class="comment single"># By default the Python plugin does not initialize the GIL. This means your</span>
242+<span class="comment single"># app-generated threads will not run. If you need threads, remember to enable</span>
243+<span class="comment single"># them with enable-threads. Running uWSGI in multithreading mode (with the</span>
244+<span class="comment single"># threads options) will automatically enable threading support. This *strange*</span>
245+<span class="comment single"># default behaviour is for performance reasons.</span>
246+<span class="name attribute">enable-threads</span> <span class="operator">=</span> <span class="literal string">true</span>
247+
248+
249+<span class="comment single"># plugin: python</span>
250+<span class="comment single"># --------------</span>
251+<span class="comment single">#</span>
252+<span class="comment single"># https://uwsgi-docs.readthedocs.io/en/latest/Options.html#plugin-python</span>
253+
254+<span class="comment single"># load a WSGI module</span>
255+<span class="name attribute">module</span> <span class="operator">=</span> <span class="literal string">searx.webapp</span>
256+
257+<span class="comment single"># set PYTHONHOME/virtualenv</span>
258+<span class="name attribute">virtualenv</span> <span class="operator">=</span> <span class="literal string">/usr/local/searx/searx-pyenv</span>
259+
260+<span class="comment single"># add directory (or glob) to pythonpath</span>
261+<span class="name attribute">pythonpath</span> <span class="operator">=</span> <span class="literal string">/usr/local/searx/searx-src</span>
262+
263+
264+<span class="comment single"># speak to upstream</span>
265+<span class="comment single"># -----------------</span>
266+<span class="comment single">#</span>
267+<span class="comment single"># Activate the 'http' configuration for filtron or activate the 'socket'</span>
268+<span class="comment single"># configuration if you setup your HTTP server to use uWSGI protocol via sockets.</span>
269+
270+<span class="comment single"># using IP:</span>
271+<span class="comment single">#</span>
272+<span class="comment single"># https://uwsgi-docs.readthedocs.io/en/latest/Options.html#plugin-http</span>
273+<span class="comment single"># Native HTTP support: https://uwsgi-docs.readthedocs.io/en/latest/HTTP.html</span>
274+
275+<span class="name attribute">http</span> <span class="operator">=</span> <span class="literal string">127.0.0.1:8888</span>
276+
277+<span class="comment single"># using unix-sockets:</span>
278+<span class="comment single">#</span>
279+<span class="comment single"># On some distributions you need to create the app folder for the sockets::</span>
280+<span class="comment single">#</span>
281+<span class="comment single"># mkdir -p /run/uwsgi/app/searx</span>
282+<span class="comment single"># chmod -R searx:searx /run/uwsgi/app/searx</span>
283+<span class="comment single">#</span>
284+<span class="comment single"># socket = /run/uwsgi/app/searx/socket</span>
285+
286+<span class="error">..</span></code></pre>
287+</div>
288+<div class="ui bottom attached sphinx-tab tab segment sphinx-data-tab-QXJjaCBMaW51eA== docutils container">
289+<pre class="code ini literal-block"><code><span class="keyword">[uwsgi]</span>
290+
291+<span class="comment single"># uWSGI core</span>
292+<span class="comment single"># ----------</span>
293+<span class="comment single">#</span>
294+<span class="comment single"># https://uwsgi-docs.readthedocs.io/en/latest/Options.html#uwsgi-core</span>
295+
296+<span class="comment single"># Who will run the code</span>
297+<span class="name attribute">uid</span> <span class="operator">=</span> <span class="literal string">searx</span>
298+<span class="name attribute">gid</span> <span class="operator">=</span> <span class="literal string">searx</span>
299+
300+<span class="comment single"># chdir to specified directory before apps loading</span>
301+<span class="name attribute">chdir</span> <span class="operator">=</span> <span class="literal string">/usr/local/searx/searx-src/searx</span>
302+
303+<span class="comment single"># searx configuration (settings.yml)</span>
304+<span class="name attribute">env</span> <span class="operator">=</span> <span class="literal string">SEARX_SETTINGS_PATH=/etc/searx/settings.yml</span>
305+
306+<span class="comment single"># disable logging for privacy</span>
307+<span class="name attribute">logger</span> <span class="operator">=</span> <span class="literal string">systemd</span>
308+<span class="name attribute">disable-logging</span> <span class="operator">=</span> <span class="literal string">true</span>
309+
310+<span class="comment single"># The right granted on the created socket</span>
311+<span class="name attribute">chmod-socket</span> <span class="operator">=</span> <span class="literal string">666</span>
312+
313+<span class="comment single"># Plugin to use and interpretor config</span>
314+<span class="name attribute">single-interpreter</span> <span class="operator">=</span> <span class="literal string">true</span>
315+
316+<span class="comment single"># enable master process</span>
317+<span class="name attribute">master</span> <span class="operator">=</span> <span class="literal string">true</span>
318+
319+<span class="comment single"># load apps in each worker instead of the master</span>
320+<span class="name attribute">lazy-apps</span> <span class="operator">=</span> <span class="literal string">true</span>
321+
322+<span class="comment single"># load uWSGI plugins</span>
323+<span class="name attribute">plugin</span> <span class="operator">=</span> <span class="literal string">python</span>
324+
325+<span class="comment single"># By default the Python plugin does not initialize the GIL. This means your</span>
326+<span class="comment single"># app-generated threads will not run. If you need threads, remember to enable</span>
327+<span class="comment single"># them with enable-threads. Running uWSGI in multithreading mode (with the</span>
328+<span class="comment single"># threads options) will automatically enable threading support. This *strange*</span>
329+<span class="comment single"># default behaviour is for performance reasons.</span>
330+<span class="name attribute">enable-threads</span> <span class="operator">=</span> <span class="literal string">true</span>
331+
332+
333+<span class="comment single"># plugin: python</span>
334+<span class="comment single"># --------------</span>
335+<span class="comment single">#</span>
336+<span class="comment single"># https://uwsgi-docs.readthedocs.io/en/latest/Options.html#plugin-python</span>
337+
338+<span class="comment single"># load a WSGI module</span>
339+<span class="name attribute">module</span> <span class="operator">=</span> <span class="literal string">searx.webapp</span>
340+
341+<span class="comment single"># set PYTHONHOME/virtualenv</span>
342+<span class="name attribute">virtualenv</span> <span class="operator">=</span> <span class="literal string">/usr/local/searx/searx-pyenv</span>
343+
344+<span class="comment single"># add directory (or glob) to pythonpath</span>
345+<span class="name attribute">pythonpath</span> <span class="operator">=</span> <span class="literal string">/usr/local/searx/searx-src</span>
346+
347+
348+<span class="comment single"># speak to upstream</span>
349+<span class="comment single"># -----------------</span>
350+<span class="comment single">#</span>
351+<span class="comment single"># Activate the 'http' configuration for filtron or activate the 'socket'</span>
352+<span class="comment single"># configuration if you setup your HTTP server to use uWSGI protocol via sockets.</span>
353+
354+<span class="comment single"># using IP:</span>
355+<span class="comment single">#</span>
356+<span class="comment single"># https://uwsgi-docs.readthedocs.io/en/latest/Options.html#plugin-http</span>
357+<span class="comment single"># Native HTTP support: https://uwsgi-docs.readthedocs.io/en/latest/HTTP.html</span>
358+
359+<span class="name attribute">http</span> <span class="operator">=</span> <span class="literal string">127.0.0.1:8888</span>
360+
361+<span class="comment single"># using unix-sockets:</span>
362+<span class="comment single">#</span>
363+<span class="comment single"># On some distributions you need to create the app folder for the sockets::</span>
364+<span class="comment single">#</span>
365+<span class="comment single"># mkdir -p /run/uwsgi/app/searx</span>
366+<span class="comment single"># chown -R searx:searx /run/uwsgi/app/searx</span>
367+<span class="comment single">#</span>
368+<span class="comment single"># socket = /run/uwsgi/app/searx/socket</span>
369+
370+<span class="error">..</span></code></pre>
371+</div>
372+<div class="ui bottom attached sphinx-tab tab segment sphinx-data-tab-RmVkb3JhIC8gUkhFTA== docutils container">
373+<pre class="code ini literal-block"><code><span class="keyword">[uwsgi]</span>
374+
375+<span class="comment single"># uWSGI core</span>
376+<span class="comment single"># ----------</span>
377+<span class="comment single">#</span>
378+<span class="comment single"># https://uwsgi-docs.readthedocs.io/en/latest/Options.html#uwsgi-core</span>
379+
380+<span class="comment single"># Who will run the code</span>
381+<span class="name attribute">uid</span> <span class="operator">=</span> <span class="literal string">searx</span>
382+<span class="name attribute">gid</span> <span class="operator">=</span> <span class="literal string">searx</span>
383+
384+<span class="comment single"># chdir to specified directory before apps loading</span>
385+<span class="name attribute">chdir</span> <span class="operator">=</span> <span class="literal string">/usr/local/searx/searx-src/searx</span>
386+
387+<span class="comment single"># searx configuration (settings.yml)</span>
388+<span class="name attribute">env</span> <span class="operator">=</span> <span class="literal string">SEARX_SETTINGS_PATH=/etc/searx/settings.yml</span>
389+
390+<span class="comment single"># disable logging for privacy</span>
391+<span class="name attribute">disable-logging</span> <span class="operator">=</span> <span class="literal string">true</span>
392+
393+<span class="comment single"># The right granted on the created socket</span>
394+<span class="name attribute">chmod-socket</span> <span class="operator">=</span> <span class="literal string">666</span>
395+
396+<span class="comment single"># Plugin to use and interpretor config</span>
397+<span class="name attribute">single-interpreter</span> <span class="operator">=</span> <span class="literal string">true</span>
398+
399+<span class="comment single"># enable master process</span>
400+<span class="name attribute">master</span> <span class="operator">=</span> <span class="literal string">true</span>
401+
402+<span class="comment single"># load apps in each worker instead of the master</span>
403+<span class="name attribute">lazy-apps</span> <span class="operator">=</span> <span class="literal string">true</span>
404+
405+<span class="comment single"># load uWSGI plugins</span>
406+<span class="name attribute">plugin</span> <span class="operator">=</span> <span class="literal string">python3,http</span>
407+
408+<span class="comment single"># By default the Python plugin does not initialize the GIL. This means your</span>
409+<span class="comment single"># app-generated threads will not run. If you need threads, remember to enable</span>
410+<span class="comment single"># them with enable-threads. Running uWSGI in multithreading mode (with the</span>
411+<span class="comment single"># threads options) will automatically enable threading support. This *strange*</span>
412+<span class="comment single"># default behaviour is for performance reasons.</span>
413+<span class="name attribute">enable-threads</span> <span class="operator">=</span> <span class="literal string">true</span>
414+
415+
416+<span class="comment single"># plugin: python</span>
417+<span class="comment single"># --------------</span>
418+<span class="comment single">#</span>
419+<span class="comment single"># https://uwsgi-docs.readthedocs.io/en/latest/Options.html#plugin-python</span>
420+
421+<span class="comment single"># load a WSGI module</span>
422+<span class="name attribute">module</span> <span class="operator">=</span> <span class="literal string">searx.webapp</span>
423+
424+<span class="comment single"># set PYTHONHOME/virtualenv</span>
425+<span class="name attribute">virtualenv</span> <span class="operator">=</span> <span class="literal string">/usr/local/searx/searx-pyenv</span>
426+
427+<span class="comment single"># add directory (or glob) to pythonpath</span>
428+<span class="name attribute">pythonpath</span> <span class="operator">=</span> <span class="literal string">/usr/local/searx/searx-src</span>
429+
430+
431+<span class="comment single"># speak to upstream</span>
432+<span class="comment single"># -----------------</span>
433+<span class="comment single">#</span>
434+<span class="comment single"># Activate the 'http' configuration for filtron or activate the 'socket'</span>
435+<span class="comment single"># configuration if you setup your HTTP server to use uWSGI protocol via sockets.</span>
436+
437+<span class="comment single"># using IP:</span>
438+<span class="comment single">#</span>
439+<span class="comment single"># https://uwsgi-docs.readthedocs.io/en/latest/Options.html#plugin-http</span>
440+<span class="comment single"># Native HTTP support: https://uwsgi-docs.readthedocs.io/en/latest/HTTP.html</span>
441+
442+<span class="name attribute">http</span> <span class="operator">=</span> <span class="literal string">127.0.0.1:8888</span>
443+
444+<span class="comment single"># using unix-sockets:</span>
445+<span class="comment single">#</span>
446+<span class="comment single"># On some distributions you need to create the app folder for the sockets::</span>
447+<span class="comment single">#</span>
448+<span class="comment single"># mkdir -p /run/uwsgi/app/searx</span>
449+<span class="comment single"># chmod -R searx:searx /run/uwsgi/app/searx</span>
450+<span class="comment single">#</span>
451+<span class="comment single"># socket = /run/uwsgi/app/searx/socket</span>
452+
453+<span class="error">..</span></code></pre>
454+</div>
455+</div>
456+</div>
457+</div>
458+
459+
460+ <div class="clearer"></div>
461+ </div>
462+ </div>
463+ </div>
464+ <span id="sidebar-top"></span>
465+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
466+ <div class="sphinxsidebarwrapper">
467+
468+
469+ <p class="logo"><a href="../index.html">
470+ <img class="logo" src="../_static/searx_logo_small.png" alt="Logo"/>
471+ </a></p>
472+
473+
474+ <h3>Project Links</h3>
475+ <ul>
476+ <li><a href="https://github.com/asciimoo/searx">Source</a>
477+
478+ <li><a href="https://github.com/asciimoo/searx/wiki">Wiki</a>
479+
480+ <li><a href="https://searx.space/">Public instances</a>
481+
482+ <li><a href="https://twitter.com/Searx_engine">Twitter</a>
483+ </ul><h3>Navigation</h3>
484+<ul>
485+ <li><a href="../index.html">Overview</a>
486+ <ul>
487+ <li><a href="index.html">Administrator documentation</a>
488+ <ul>
489+ <li>Previous: <a href="installation-searx.html" title="previous chapter">Step by step installation</a>
490+ <li>Next: <a href="installation-nginx.html" title="next chapter">Install with nginx</a></ul>
491+ </li>
492+ </ul>
493+ </li>
494+</ul>
495+<div id="searchbox" style="display: none" role="search">
496+ <h3 id="searchlabel">Quick search</h3>
497+ <div class="searchformwrapper">
498+ <form class="search" action="../search.html" method="get">
499+ <input type="text" name="q" aria-labelledby="searchlabel" />
500+ <input type="submit" value="Go" />
501+ </form>
502+ </div>
503+</div>
504+<script>$('#searchbox').show(0);</script>
505+ </div>
506+ </div>
507+ <div class="clearer"></div>
508+ </div>
509+
510+ <div class="footer" role="contentinfo">
511+ &#169; Copyright 2015-2020, Adam Tauber, Noémi Ványi.
512+ Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 3.1.1.
513+ </div>
514+ <script src="../_static/version_warning_offset.js"></script>
515+
516+ </body>
517+</html>
admin/installation.html+42−289
@@ -1,9 +1,10 @@
11
22<!DOCTYPE html>
33
4−<html xmlns="http://www.w3.org/1999/xhtml">
4+<html>
55 <head>
66 <meta charset="utf-8" />
7+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
78 <meta name="viewport" content="width=device-width, initial-scale=1">
89 <title>Installation &#8212; Searx Documentation (Searx-0.16.0.tex)</title>
910 <link rel="stylesheet" href="../_static/searx.css" type="text/css" />
@@ -15,7 +16,7 @@
1516 <script src="../_static/language_data.js"></script>
1617 <link rel="index" title="Index" href="../genindex.html" />
1718 <link rel="search" title="Search" href="../search.html" />
18− <link rel="next" title="settings.yml" href="settings.html" />
19+ <link rel="next" title="Step by step installation" href="installation-searx.html" />
1920 <link rel="prev" title="Administrator documentation" href="index.html" />
2021 <script>DOCUMENTATION_OPTIONS.URL_ROOT = '../';</script>
2122
@@ -27,13 +28,14 @@
2728 <a href="../genindex.html" title="General Index"
2829 accesskey="I">index</a></li>
2930 <li class="right" >
30− <a href="settings.html" title="settings.yml"
31+ <a href="installation-searx.html" title="Step by step installation"
3132 accesskey="N">next</a> |</li>
3233 <li class="right" >
3334 <a href="index.html" title="Administrator documentation"
3435 accesskey="P">previous</a> |</li>
3536 <li class="nav-item nav-item-0"><a href="../index.html">Searx Documentation (Searx-0.16.0.tex)</a> &#187;</li>
36− <li class="nav-item nav-item-1"><a href="index.html" accesskey="U">Administrator documentation</a> &#187;</li>
37+ <li class="nav-item nav-item-1"><a href="index.html" accesskey="U">Administrator documentation</a> &#187;</li>
38+ <li class="nav-item nav-item-this"><a href="">Installation</a></li>
3739 </ul>
3840 </div>
3941
@@ -43,306 +45,57 @@
4345 <div class="body" role="main">
4446
4547 <div class="section" id="installation">
46−<span id="id1"></span><h1><a class="toc-backref" href="#id3">Installation</a><a class="headerlink" href="#installation" title="Permalink to this headline">¶</a></h1>
47−<div class="contents topic" id="contents">
48−<p class="topic-title">Contents</p>
48+<span id="id1"></span><h1>Installation<a class="headerlink" href="#installation" title="Permalink to this headline">¶</a></h1>
49+<p><em>You’re spoilt for choice</em>, choose your preferred method of installation.</p>
4950<ul class="simple">
50−<li><p><a class="reference internal" href="#installation" id="id3">Installation</a></p>
51−<ul>
52−<li><p><a class="reference internal" href="#basic-installation" id="id4">Basic installation</a></p></li>
53−<li><p><a class="reference internal" href="#configuration" id="id5">Configuration</a></p></li>
54−<li><p><a class="reference internal" href="#check" id="id6">Check</a></p></li>
55−<li><p><a class="reference internal" href="#uwsgi" id="id7">uwsgi</a></p></li>
56−<li><p><a class="reference internal" href="#web-server" id="id8">Web server</a></p>
57−<ul>
58−<li><p><a class="reference internal" href="#with-nginx" id="id9">with nginx</a></p></li>
59−<li><p><a class="reference internal" href="#with-apache" id="id10">with apache</a></p></li>
60−</ul>
61−</li>
62−<li><p><a class="reference internal" href="#how-to-update" id="id11">How to update</a></p></li>
63−<li><p><a class="reference internal" href="#docker" id="id12">Docker</a></p></li>
64−<li><p><a class="reference internal" href="#references" id="id13">References</a></p></li>
51+<li><p><a class="reference internal" href="installation-docker.html#installation-docker"><span class="std std-ref">Docker installation</span></a></p></li>
52+<li><p><a class="reference internal" href="#installation-scripts"><span class="std std-ref">Installation scripts</span></a></p></li>
53+<li><p><a class="reference internal" href="installation-searx.html#installation-basic"><span class="std std-ref">Step by step installation</span></a></p></li>
6554</ul>
66−</li>
67−</ul>
68−</div>
69−<div class="section" id="basic-installation">
70−<h2><a class="toc-backref" href="#id4">Basic installation</a><a class="headerlink" href="#basic-installation" title="Permalink to this headline">¶</a></h2>
71−<p>Step by step installation for Debian/Ubuntu with virtualenv. For Ubuntu, be sure
72−to have enable universe repository.</p>
73−<p>Install packages:</p>
74−<div class="highlight-sh notranslate"><div class="highlight"><pre><span></span>$ sudo -H apt-get install <span class="se">\</span>
75− git build-essential libxslt-dev <span class="se">\</span>
76− python-dev python-virtualenv python-babel <span class="se">\</span>
77− zlib1g-dev libffi-dev libssl-dev
78−</pre></div>
55+<p>The <a class="reference internal" href="installation-searx.html#installation-basic"><span class="std std-ref">Step by step installation</span></a> is good enough for intranet usage and it is a
56+excellent illustration of <em>how a searx instance is build up</em>. If you place your
57+instance public to the internet you should really consider to install a
58+<a class="reference internal" href="../utils/filtron.sh.html#filtron-sh"><span class="std std-ref">filtron reverse proxy</span></a> and for privacy a <a class="reference internal" href="../utils/morty.sh.html#morty-sh"><span class="std std-ref">result proxy</span></a> is mandatory.</p>
59+<p>Therefore, if you do not have any special preferences, its recommend to use the
60+<a class="reference internal" href="installation-docker.html#installation-docker"><span class="std std-ref">Docker installation</span></a> or the <a class="reference internal" href="#installation-scripts">Installation scripts</a> from our <a class="reference internal" href="../utils/index.html#toolboxing"><span class="std std-ref">tooling
61+box</span></a> as described below.</p>
62+<div class="section" id="installation-scripts">
63+<span id="id2"></span><h2>Installation scripts<a class="headerlink" href="#installation-scripts" title="Permalink to this headline">¶</a></h2>
64+<div class="sidebar">
65+<p class="sidebar-title">Update OS first!</p>
66+<p>To avoid unwanted side effects, update your OS before installing searx.</p>
7967</div>
80−<p>Install searx:</p>
81−<div class="highlight-sh notranslate"><div class="highlight"><pre><span></span><span class="nb">cd</span> /usr/local
82−sudo -H git clone https://github.com/asciimoo/searx.git
83−sudo -H useradd searx -d /usr/local/searx
84−sudo -H chown searx:searx -R /usr/local/searx
68+<p>The following will install a setup as shown in <a class="reference internal" href="architecture.html#architecture"><span class="std std-ref">Architecture</span></a>. First you
69+need to get a clone. The clone is only needed for the installation procedure
70+and some maintenance tasks (alternatively you can create your own fork).</p>
71+<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$ <span class="nb">cd</span> ~/Downloads
72+$ git clone https://github.com/asciimoo/searx searx
73+$ <span class="nb">cd</span> searx
8574</pre></div>
8675</div>
87−<p>Install dependencies in a virtualenv:</p>
88−<div class="highlight-sh notranslate"><div class="highlight"><pre><span></span><span class="nb">cd</span> /usr/local/searx
89−sudo -H -u searx -i
76+<p><strong>Install</strong> <a class="reference internal" href="../utils/searx.sh.html#searx-sh"><span class="std std-ref">searx service</span></a></p>
77+<p>This installs searx as described in <a class="reference internal" href="installation-searx.html#installation-basic"><span class="std std-ref">Step by step installation</span></a>.</p>
78+<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$ sudo -H ./utils/searx.sh install all
9079</pre></div>
9180</div>
92−<div class="highlight-sh notranslate"><div class="highlight"><pre><span></span><span class="o">(</span>searx<span class="o">)</span>$ virtualenv searx-ve
93−<span class="o">(</span>searx<span class="o">)</span>$ . ./searx-ve/bin/activate
94−<span class="o">(</span>searx<span class="o">)</span>$ ./manage.sh update_packages
81+<p><strong>Install</strong> <a class="reference internal" href="../utils/filtron.sh.html#filtron-sh"><span class="std std-ref">filtron reverse proxy</span></a></p>
82+<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$ sudo -H ./utils/filtron.sh install all
9583</pre></div>
9684</div>
97−</div>
98−<div class="section" id="configuration">
99−<h2><a class="toc-backref" href="#id5">Configuration</a><a class="headerlink" href="#configuration" title="Permalink to this headline">¶</a></h2>
100−<div class="highlight-sh notranslate"><div class="highlight"><pre><span></span>sed -i -e <span class="s2">&quot;s/ultrasecretkey/`openssl rand -hex 16`/g&quot;</span> searx/settings.yml
101−</pre></div>
102−</div>
103−<p>Edit searx/settings.yml if necessary.</p>
104−</div>
105−<div class="section" id="check">
106−<h2><a class="toc-backref" href="#id6">Check</a><a class="headerlink" href="#check" title="Permalink to this headline">¶</a></h2>
107−<p>Start searx:</p>
108−<div class="highlight-sh notranslate"><div class="highlight"><pre><span></span>python searx/webapp.py
109−</pre></div>
110−</div>
111−<p>Go to <a class="reference external" href="http://localhost:8888">http://localhost:8888</a></p>
112−<p>If everything works fine, disable the debug option in settings.yml:</p>
113−<div class="highlight-sh notranslate"><div class="highlight"><pre><span></span>sed -i -e <span class="s2">&quot;s/debug : True/debug : False/g&quot;</span> searx/settings.yml
114−</pre></div>
115−</div>
116−<p>At this point searx is not demonized ; uwsgi allows this.</p>
117−<p>You can exit the virtualenv and the searx user bash (enter exit command
118−twice).</p>
119−</div>
120−<div class="section" id="uwsgi">
121−<h2><a class="toc-backref" href="#id7">uwsgi</a><a class="headerlink" href="#uwsgi" title="Permalink to this headline">¶</a></h2>
122−<p>Install packages:</p>
123−<div class="highlight-sh notranslate"><div class="highlight"><pre><span></span>sudo -H apt-get install <span class="se">\</span>
124− uwsgi uwsgi-plugin-python
125−</pre></div>
126−</div>
127−<p>Create the configuration file <code class="docutils literal notranslate"><span class="pre">/etc/uwsgi/apps-available/searx.ini</span></code> with this
128−content:</p>
129−<div class="highlight-ini notranslate"><div class="highlight"><pre><span></span><span class="k">[uwsgi]</span>
130−<span class="c1"># Who will run the code</span>
131−<span class="na">uid</span> <span class="o">=</span> <span class="s">searx</span>
132−<span class="na">gid</span> <span class="o">=</span> <span class="s">searx</span>
133−
134−<span class="c1"># disable logging for privacy</span>
135−<span class="na">disable-logging</span> <span class="o">=</span> <span class="s">true</span>
136−
137−<span class="c1"># Number of workers (usually CPU count)</span>
138−<span class="na">workers</span> <span class="o">=</span> <span class="s">4</span>
139−
140−<span class="c1"># The right granted on the created socket</span>
141−<span class="na">chmod-socket</span> <span class="o">=</span> <span class="s">666</span>
142−
143−<span class="c1"># Plugin to use and interpretor config</span>
144−<span class="na">single-interpreter</span> <span class="o">=</span> <span class="s">true</span>
145−<span class="na">master</span> <span class="o">=</span> <span class="s">true</span>
146−<span class="na">plugin</span> <span class="o">=</span> <span class="s">python</span>
147−<span class="na">lazy-apps</span> <span class="o">=</span> <span class="s">true</span>
148−<span class="na">enable-threads</span> <span class="o">=</span> <span class="s">true</span>
149−
150−<span class="c1"># Module to import</span>
151−<span class="na">module</span> <span class="o">=</span> <span class="s">searx.webapp</span>
152−
153−<span class="c1"># Support running the module from a webserver subdirectory.</span>
154−<span class="na">route-run</span> <span class="o">=</span> <span class="s">fixpathinfo:</span>
155−
156−<span class="c1"># Virtualenv and python path</span>
157−<span class="na">virtualenv</span> <span class="o">=</span> <span class="s">/usr/local/searx/searx-ve/</span>
158−<span class="na">pythonpath</span> <span class="o">=</span> <span class="s">/usr/local/searx/</span>
159−<span class="na">chdir</span> <span class="o">=</span> <span class="s">/usr/local/searx/searx/</span>
160−</pre></div>
161−</div>
162−<p>Activate the uwsgi application and restart:</p>
163−<div class="highlight-sh notranslate"><div class="highlight"><pre><span></span><span class="nb">cd</span> /etc/uwsgi/apps-enabled
164−ln -s ../apps-available/searx.ini
165−/etc/init.d/uwsgi restart
166−</pre></div>
167−</div>
168−</div>
169−<div class="section" id="web-server">
170−<h2><a class="toc-backref" href="#id8">Web server</a><a class="headerlink" href="#web-server" title="Permalink to this headline">¶</a></h2>
171−<div class="section" id="with-nginx">
172−<h3><a class="toc-backref" href="#id9">with nginx</a><a class="headerlink" href="#with-nginx" title="Permalink to this headline">¶</a></h3>
173−<p>If nginx is not installed (uwsgi will not work with the package
174−nginx-light):</p>
175−<div class="highlight-sh notranslate"><div class="highlight"><pre><span></span>sudo -H apt-get install nginx
176−</pre></div>
177−</div>
178−<div class="section" id="hosted-at">
179−<h4>Hosted at /<a class="headerlink" href="#hosted-at" title="Permalink to this headline">¶</a></h4>
180−<p>Create the configuration file <code class="docutils literal notranslate"><span class="pre">/etc/nginx/sites-available/searx</span></code> with this
181−content:</p>
182−<div class="highlight-nginx notranslate"><div class="highlight"><pre><span></span><span class="k">server</span> <span class="p">{</span>
183− <span class="kn">listen</span> <span class="mi">80</span><span class="p">;</span>
184− <span class="kn">server_name</span> <span class="s">searx.example.com</span><span class="p">;</span>
185− <span class="kn">root</span> <span class="s">/usr/local/searx/searx</span><span class="p">;</span>
186−
187− <span class="kn">location</span> <span class="s">/static</span> <span class="p">{</span>
188− <span class="p">}</span>
189−
190− <span class="kn">location</span> <span class="s">/</span> <span class="p">{</span>
191− <span class="kn">include</span> <span class="s">uwsgi_params</span><span class="p">;</span>
192− <span class="kn">uwsgi_pass</span> <span class="s">unix:/run/uwsgi/app/searx/socket</span><span class="p">;</span>
193− <span class="p">}</span>
194−<span class="p">}</span>
195−</pre></div>
196−</div>
197−<p>Create a symlink to sites-enabled:</p>
198−<div class="highlight-sh notranslate"><div class="highlight"><pre><span></span>sudo -H ln -s /etc/nginx/sites-available/searx /etc/nginx/sites-enabled/searx
199−</pre></div>
200−</div>
201−<p>Restart service:</p>
202−<div class="highlight-sh notranslate"><div class="highlight"><pre><span></span>sudo -H service nginx restart
203−sudo -H service uwsgi restart
204−</pre></div>
205−</div>
206−</div>
207−<div class="section" id="from-subdirectory-url-searx">
208−<h4>from subdirectory URL (/searx)<a class="headerlink" href="#from-subdirectory-url-searx" title="Permalink to this headline">¶</a></h4>
209−<p>Add this configuration in the server config file
210−<code class="docutils literal notranslate"><span class="pre">/etc/nginx/sites-enabled/default</span></code>:</p>
211−<div class="highlight-nginx notranslate"><div class="highlight"><pre><span></span><span class="k">location</span> <span class="s">/searx/static</span> <span class="p">{</span>
212− <span class="kn">alias</span> <span class="s">/usr/local/searx/searx/static</span><span class="p">;</span>
213−<span class="p">}</span>
214−
215−<span class="k">location</span> <span class="s">/searx</span> <span class="p">{</span>
216− <span class="kn">uwsgi_param</span> <span class="s">SCRIPT_NAME</span> <span class="s">/searx</span><span class="p">;</span>
217− <span class="kn">include</span> <span class="s">uwsgi_params</span><span class="p">;</span>
218− <span class="kn">uwsgi_pass</span> <span class="s">unix:/run/uwsgi/app/searx/socket</span><span class="p">;</span>
219−<span class="p">}</span>
85+<p><strong>Install</strong> <a class="reference internal" href="../utils/morty.sh.html#morty-sh"><span class="std std-ref">result proxy</span></a></p>
86+<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$ sudo -H ./utils/morty.sh install all
22087</pre></div>
22188</div>
222−<p><strong>OR</strong> using reverse proxy (Please, note that reverse proxy advised to be used
223−in case of single-user or low-traffic instances.)</p>
224−<div class="highlight-nginx notranslate"><div class="highlight"><pre><span></span><span class="k">location</span> <span class="s">/searx/static</span> <span class="p">{</span>
225− <span class="kn">alias</span> <span class="s">/usr/local/searx/searx/static</span><span class="p">;</span>
226−<span class="p">}</span>
227−
228−<span class="k">location</span> <span class="s">/searx</span> <span class="p">{</span>
229− <span class="kn">proxy_pass</span> <span class="s">http://127.0.0.1:8888</span><span class="p">;</span>
230− <span class="kn">proxy_set_header</span> <span class="s">Host</span> <span class="nv">$host</span><span class="p">;</span>
231− <span class="kn">proxy_set_header</span> <span class="s">X-Forwarded-For</span> <span class="nv">$proxy_add_x_forwarded_for</span><span class="p">;</span>
232− <span class="kn">proxy_set_header</span> <span class="s">X-Scheme</span> <span class="nv">$scheme</span><span class="p">;</span>
233− <span class="kn">proxy_set_header</span> <span class="s">X-Script-Name</span> <span class="s">/searx</span><span class="p">;</span>
234− <span class="kn">proxy_buffering</span> <span class="no">off</span><span class="p">;</span>
235−<span class="p">}</span>
236−</pre></div>
237−</div>
238−<p>Enable <code class="docutils literal notranslate"><span class="pre">base_url</span></code> in <code class="docutils literal notranslate"><span class="pre">searx/settings.yml</span></code></p>
239−<div class="highlight-yaml notranslate"><div class="highlight"><pre><span></span><span class="l l-Scalar l-Scalar-Plain">base_url</span> <span class="p p-Indicator">:</span> <span class="l l-Scalar l-Scalar-Plain">http://your.domain.tld/searx/</span>
240−</pre></div>
241−</div>
242−<p>Restart service:</p>
243−<div class="highlight-sh notranslate"><div class="highlight"><pre><span></span>sudo -H service nginx restart
244−sudo -H service uwsgi restart
245−</pre></div>
246−</div>
247−<div class="section" id="disable-logs">
248−<h5>disable logs<a class="headerlink" href="#disable-logs" title="Permalink to this headline">¶</a></h5>
249−<p>for better privacy you can disable nginx logs about searx.</p>
250−<p>how to proceed: below <code class="docutils literal notranslate"><span class="pre">uwsgi_pass</span></code> in <code class="docutils literal notranslate"><span class="pre">/etc/nginx/sites-available/default</span></code>
251−add:</p>
252−<div class="highlight-nginx notranslate"><div class="highlight"><pre><span></span><span class="k">access_log</span> <span class="s">/dev/null</span><span class="p">;</span>
253−<span class="k">error_log</span> <span class="s">/dev/null</span><span class="p">;</span>
254−</pre></div>
255−</div>
256−<p>Restart service:</p>
257−<div class="highlight-sh notranslate"><div class="highlight"><pre><span></span>sudo -H service nginx restart
258−</pre></div>
259−</div>
260−</div>
261−</div>
262−</div>
263−<div class="section" id="with-apache">
264−<h3><a class="toc-backref" href="#id10">with apache</a><a class="headerlink" href="#with-apache" title="Permalink to this headline">¶</a></h3>
265−<p>Add wsgi mod:</p>
266−<div class="highlight-sh notranslate"><div class="highlight"><pre><span></span>sudo -H apt-get install libapache2-mod-uwsgi
267−sudo -H a2enmod uwsgi
268−</pre></div>
269−</div>
270−<p>Add this configuration in the file <code class="docutils literal notranslate"><span class="pre">/etc/apache2/apache2.conf</span></code>:</p>
271−<div class="highlight-apache notranslate"><div class="highlight"><pre><span></span><span class="nt">&lt;Location</span> <span class="s">/</span><span class="nt">&gt;</span>
272− <span class="nb">Options</span> FollowSymLinks Indexes
273− <span class="nb">SetHandler</span> uwsgi-handler
274− <span class="nb">uWSGISocket</span> <span class="sx">/run/uwsgi/app/searx/socket</span>
275−<span class="nt">&lt;/Location&gt;</span>
276−</pre></div>
277−</div>
278−<p>Note that if your instance of searx is not at the root, you should change
279−<code class="docutils literal notranslate"><span class="pre">&lt;Location</span> <span class="pre">/&gt;</span></code> by the location of your instance, like <code class="docutils literal notranslate"><span class="pre">&lt;Location</span> <span class="pre">/searx&gt;</span></code>.</p>
280−<p>Restart Apache:</p>
281−<div class="highlight-sh notranslate"><div class="highlight"><pre><span></span>sudo -H /etc/init.d/apache2 restart
282−</pre></div>
283−</div>
284−<div class="section" id="id2">
285−<h4>disable logs<a class="headerlink" href="#id2" title="Permalink to this headline">¶</a></h4>
286−<p>For better privacy you can disable Apache logs.</p>
287−<div class="admonition warning">
288−<p class="admonition-title">Warning</p>
289−<p>You can only disable logs for the whole (virtual) server not for a specific
290−path.</p>
291−</div>
292−<p>Go back to <code class="docutils literal notranslate"><span class="pre">/etc/apache2/apache2.conf</span></code> and above <code class="docutils literal notranslate"><span class="pre">&lt;Location</span> <span class="pre">/&gt;</span></code> add:</p>
293−<div class="highlight-apache notranslate"><div class="highlight"><pre><span></span><span class="nb">CustomLog</span> <span class="sx">/dev/null</span> combined
294−</pre></div>
295−</div>
296−<p>Restart Apache:</p>
297−<div class="highlight-sh notranslate"><div class="highlight"><pre><span></span>sudo -H /etc/init.d/apache2 restart
298−</pre></div>
299−</div>
300−</div>
301−</div>
302−</div>
303−<div class="section" id="how-to-update">
304−<h2><a class="toc-backref" href="#id11">How to update</a><a class="headerlink" href="#how-to-update" title="Permalink to this headline">¶</a></h2>
305−<div class="highlight-sh notranslate"><div class="highlight"><pre><span></span><span class="nb">cd</span> /usr/local/searx
306−sudo -H -u searx -i
307−</pre></div>
308−</div>
309−<div class="highlight-sh notranslate"><div class="highlight"><pre><span></span><span class="o">(</span>searx<span class="o">)</span>$ . ./searx-ve/bin/activate
310−<span class="o">(</span>searx<span class="o">)</span>$ git stash
311−<span class="o">(</span>searx<span class="o">)</span>$ git pull origin master
312−<span class="o">(</span>searx<span class="o">)</span>$ git stash apply
313−<span class="o">(</span>searx<span class="o">)</span>$ ./manage.sh update_packages
314−</pre></div>
315−</div>
316−<div class="highlight-sh notranslate"><div class="highlight"><pre><span></span>sudo -H service uwsgi restart
317−</pre></div>
318−</div>
319−</div>
320−<div class="section" id="docker">
321−<h2><a class="toc-backref" href="#id12">Docker</a><a class="headerlink" href="#docker" title="Permalink to this headline">¶</a></h2>
322−<p>Make sure you have installed Docker. For instance, you can deploy searx like this:</p>
323−<div class="highlight-sh notranslate"><div class="highlight"><pre><span></span>docker pull wonderfall/searx
324−docker run -d --name searx -p <span class="nv">$PORT</span>:8888 wonderfall/searx
325−</pre></div>
326−</div>
327−<p>Go to <code class="docutils literal notranslate"><span class="pre">http://localhost:$PORT</span></code>.</p>
328−<p>See <a class="reference external" href="https://hub.docker.com/r/wonderfall/searx/">https://hub.docker.com/r/wonderfall/searx/</a> for more informations. It’s also
329−possible to build searx from the embedded Dockerfile.</p>
330−<div class="highlight-sh notranslate"><div class="highlight"><pre><span></span>git clone https://github.com/asciimoo/searx.git
331−<span class="nb">cd</span> searx
332−docker build -t whatever/searx .
333−</pre></div>
334−</div>
335−</div>
336−<div class="section" id="references">
337−<h2><a class="toc-backref" href="#id13">References</a><a class="headerlink" href="#references" title="Permalink to this headline">¶</a></h2>
89+<p>If all services are running fine, you can add it to your HTTP server:</p>
33890<ul class="simple">
339−<li><p><a class="reference external" href="https://about.okhin.fr/posts/Searx/">https://about.okhin.fr/posts/Searx/</a> with some additions</p></li>
340−<li><p>How to: <a class="reference external" href="https://www.reddit.com/r/privacytoolsIO/comments/366kvn/how_to_setup_your_own_privacy_respecting_search/">Setup searx in a couple of hours with a free SSL certificate</a></p></li>
91+<li><p><a class="reference internal" href="installation-apache.html#installation-apache"><span class="std std-ref">Install with apache</span></a></p></li>
92+<li><p><a class="reference internal" href="installation-nginx.html#installation-nginx"><span class="std std-ref">Install with nginx</span></a></p></li>
34193</ul>
34294</div>
34395</div>
34496
34597
98+ <div class="clearer"></div>
34699 </div>
347100 </div>
348101 </div>
@@ -372,7 +125,7 @@ docker build -t whatever/searx .
372125 <li><a href="index.html">Administrator documentation</a>
373126 <ul>
374127 <li>Previous: <a href="index.html" title="previous chapter">Administrator documentation</a>
375− <li>Next: <a href="settings.html" title="next chapter"><code class="docutils literal notranslate"><span class="pre">settings.yml</span></code></a></ul>
128+ <li>Next: <a href="installation-searx.html" title="next chapter">Step by step installation</a></ul>
376129 </li>
377130 </ul>
378131 </li>
@@ -394,7 +147,7 @@ docker build -t whatever/searx .
394147
395148 <div class="footer" role="contentinfo">
396149 &#169; Copyright 2015-2020, Adam Tauber, Noémi Ványi.
397− Created using <a href="http://sphinx-doc.org/">Sphinx</a> 2.4.4.
150+ Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 3.1.1.
398151 </div>
399152 <script src="../_static/version_warning_offset.js"></script>
400153
admin/morty.html+13−4
@@ -1,9 +1,10 @@
11
22<!DOCTYPE html>
33
4−<html xmlns="http://www.w3.org/1999/xhtml">
4+<html>
55 <head>
66 <meta charset="utf-8" />
7+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
78 <meta name="viewport" content="width=device-width, initial-scale=1">
89 <title>How to setup result proxy &#8212; Searx Documentation (Searx-0.16.0.tex)</title>
910 <link rel="stylesheet" href="../_static/searx.css" type="text/css" />
@@ -33,7 +34,8 @@
3334 <a href="filtron.html" title="How to protect an instance"
3435 accesskey="P">previous</a> |</li>
3536 <li class="nav-item nav-item-0"><a href="../index.html">Searx Documentation (Searx-0.16.0.tex)</a> &#187;</li>
36− <li class="nav-item nav-item-1"><a href="index.html" accesskey="U">Administrator documentation</a> &#187;</li>
37+ <li class="nav-item nav-item-1"><a href="index.html" accesskey="U">Administrator documentation</a> &#187;</li>
38+ <li class="nav-item nav-item-this"><a href="">How to setup result proxy</a></li>
3739 </ul>
3840 </div>
3941
@@ -43,7 +45,13 @@
4345 <div class="body" role="main">
4446
4547 <div class="section" id="how-to-setup-result-proxy">
46−<h1>How to setup result proxy<a class="headerlink" href="#how-to-setup-result-proxy" title="Permalink to this headline">¶</a></h1>
48+<span id="searx-morty"></span><h1>How to setup result proxy<a class="headerlink" href="#how-to-setup-result-proxy" title="Permalink to this headline">¶</a></h1>
49+<div class="sidebar">
50+<p class="sidebar-title">further reading</p>
51+<ul class="simple">
52+<li><p><a class="reference internal" href="../utils/morty.sh.html#morty-sh"><span class="std std-ref">utils/morty.sh</span></a></p></li>
53+</ul>
54+</div>
4755<p>By default searx can only act as an image proxy for result images, but it is
4856possible to proxify all the result URLs with an external service, <a class="reference external" href="https://github.com/asciimoo/morty">morty</a>.</p>
4957<p>To use this feature, morty has to be installed and activated in searx’s
@@ -63,6 +71,7 @@ possible to proxify all the result URLs with an external service, <a class="refe
6371</div>
6472
6573
74+ <div class="clearer"></div>
6675 </div>
6776 </div>
6877 </div>
@@ -114,7 +123,7 @@ possible to proxify all the result URLs with an external service, <a class="refe
114123
115124 <div class="footer" role="contentinfo">
116125 &#169; Copyright 2015-2020, Adam Tauber, Noémi Ványi.
117− Created using <a href="http://sphinx-doc.org/">Sphinx</a> 2.4.4.
126+ Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 3.1.1.
118127 </div>
119128 <script src="../_static/version_warning_offset.js"></script>
120129
admin/plugins.html+6−7
@@ -1,9 +1,10 @@
11
22<!DOCTYPE html>
33
4−<html xmlns="http://www.w3.org/1999/xhtml">
4+<html>
55 <head>
66 <meta charset="utf-8" />
7+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
78 <meta name="viewport" content="width=device-width, initial-scale=1">
89 <title>Plugins builtin &#8212; Searx Documentation (Searx-0.16.0.tex)</title>
910 <link rel="stylesheet" href="../_static/searx.css" type="text/css" />
@@ -33,7 +34,8 @@
3334 <a href="engines.html" title="Engines"
3435 accesskey="P">previous</a> |</li>
3536 <li class="nav-item nav-item-0"><a href="../index.html">Searx Documentation (Searx-0.16.0.tex)</a> &#187;</li>
36− <li class="nav-item nav-item-1"><a href="index.html" accesskey="U">Administrator documentation</a> &#187;</li>
37+ <li class="nav-item nav-item-1"><a href="index.html" accesskey="U">Administrator documentation</a> &#187;</li>
38+ <li class="nav-item nav-item-this"><a href="">Plugins builtin</a></li>
3739 </ul>
3840 </div>
3941
@@ -122,15 +124,12 @@
122124</div>
123125</td>
124126</tr>
125−<tr class="row-even"><th class="stub"><p>Test</p></th>
126−<td></td>
127−<td><p>Test plugin</p></td>
128−</tr>
129127</tbody>
130128</table>
131129</div>
132130
133131
132+ <div class="clearer"></div>
134133 </div>
135134 </div>
136135 </div>
@@ -182,7 +181,7 @@
182181
183182 <div class="footer" role="contentinfo">
184183 &#169; Copyright 2015-2020, Adam Tauber, Noémi Ványi.
185− Created using <a href="http://sphinx-doc.org/">Sphinx</a> 2.4.4.
184+ Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 3.1.1.
186185 </div>
187186 <script src="../_static/version_warning_offset.js"></script>
188187
admin/settings.html+23−10
@@ -1,9 +1,10 @@
11
22<!DOCTYPE html>
33
4−<html xmlns="http://www.w3.org/1999/xhtml">
4+<html>
55 <head>
66 <meta charset="utf-8" />
7+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
78 <meta name="viewport" content="width=device-width, initial-scale=1">
89 <title>settings.yml &#8212; Searx Documentation (Searx-0.16.0.tex)</title>
910 <link rel="stylesheet" href="../_static/searx.css" type="text/css" />
@@ -16,7 +17,7 @@
1617 <link rel="index" title="Index" href="../genindex.html" />
1718 <link rel="search" title="Search" href="../search.html" />
1819 <link rel="next" title="Administration API" href="api.html" />
19− <link rel="prev" title="Installation" href="installation.html" />
20+ <link rel="prev" title="How to update" href="update-searx.html" />
2021 <script>DOCUMENTATION_OPTIONS.URL_ROOT = '../';</script>
2122
2223 </head><body>
@@ -30,10 +31,11 @@
3031 <a href="api.html" title="Administration API"
3132 accesskey="N">next</a> |</li>
3233 <li class="right" >
33− <a href="installation.html" title="Installation"
34+ <a href="update-searx.html" title="How to update"
3435 accesskey="P">previous</a> |</li>
3536 <li class="nav-item nav-item-0"><a href="../index.html">Searx Documentation (Searx-0.16.0.tex)</a> &#187;</li>
36− <li class="nav-item nav-item-1"><a href="index.html" accesskey="U">Administrator documentation</a> &#187;</li>
37+ <li class="nav-item nav-item-1"><a href="index.html" accesskey="U">Administrator documentation</a> &#187;</li>
38+ <li class="nav-item nav-item-this"><a href=""><code class="docutils literal notranslate"><span class="pre">settings.yml</span></code></a></li>
3739 </ul>
3840 </div>
3941
@@ -44,15 +46,23 @@
4446
4547 <div class="section" id="settings-yml">
4648<span id="id1"></span><h1><code class="docutils literal notranslate"><span class="pre">settings.yml</span></code><a class="headerlink" href="#settings-yml" title="Permalink to this headline">¶</a></h1>
49+<p>This page describe the options possibilities of the <a class="reference external" href="https://github.com/asciimoo/searx/blob/master/searx/settings.yml">git://searx/settings.yml</a>
50+file.</p>
4751<div class="sidebar">
4852<p class="sidebar-title">Further reading ..</p>
4953<ul class="simple">
5054<li><p><a class="reference internal" href="../dev/search_api.html#search-api"><span class="std std-ref">Search API</span></a></p></li>
5155</ul>
5256</div>
53−<p>This page describe the options possibilities of the settings.yml file.</p>
57+<div class="contents local topic" id="contents">
58+<p class="topic-title">Contents</p>
59+<ul class="simple">
60+<li><p><a class="reference internal" href="#global-settings" id="id2">Global Settings</a></p></li>
61+<li><p><a class="reference internal" href="#engine-settings" id="id3">Engine settings</a></p></li>
62+</ul>
63+</div>
5464<div class="section" id="global-settings">
55−<span id="settings-global"></span><h2>Global Settings<a class="headerlink" href="#global-settings" title="Permalink to this headline">¶</a></h2>
65+<span id="settings-global"></span><h2><a class="toc-backref" href="#id2">Global Settings</a><a class="headerlink" href="#global-settings" title="Permalink to this headline">¶</a></h2>
5666<div class="highlight-yaml notranslate"><div class="highlight"><pre><span></span><span class="l l-Scalar l-Scalar-Plain">server</span><span class="p p-Indicator">:</span>
5767 <span class="l l-Scalar l-Scalar-Plain">port</span> <span class="p p-Indicator">:</span> <span class="l l-Scalar l-Scalar-Plain">8888</span>
5868 <span class="l l-Scalar l-Scalar-Plain">secret_key</span> <span class="p p-Indicator">:</span> <span class="s">&quot;ultrasecretkey&quot;</span> <span class="c1"># change this!</span>
@@ -127,7 +137,7 @@ code, like <code class="docutils literal notranslate"><span class="pre">fr</span
127137</dd>
128138</dl>
129139<dl class="simple">
130−<dt><code class="docutils literal notranslate"><span class="pre">outgoing_proxies</span></code> :</dt><dd><p>Define a proxy you wish to use, see <a class="reference external" href="http://docs.python-requests.org/en/latest/user/advanced/#proxies">requests proxies</a>. SOCKS proxies are
140+<dt><code class="docutils literal notranslate"><span class="pre">outgoing_proxies</span></code> :</dt><dd><p>Define a proxy you wish to use, see <a class="reference external" href="http://requests.readthedocs.io/en/latest/user/advanced/#proxies">requests proxies</a>. SOCKS proxies are
131141not supported / see <cite>PR SOCKS support</cite>.</p>
132142</dd>
133143<dt><code class="docutils literal notranslate"><span class="pre">source_ips</span></code> :</dt><dd><p>If you use multiple nework interfaces, define from which IP the requests must
@@ -138,7 +148,7 @@ be made.</p>
138148</dl>
139149</div>
140150<div class="section" id="engine-settings">
141−<span id="settings-engine"></span><h2>Engine settings<a class="headerlink" href="#engine-settings" title="Permalink to this headline">¶</a></h2>
151+<span id="settings-engine"></span><h2><a class="toc-backref" href="#id3">Engine settings</a><a class="headerlink" href="#engine-settings" title="Permalink to this headline">¶</a></h2>
142152<div class="sidebar">
143153<p class="sidebar-title">Further reading ..</p>
144154<ul class="simple">
@@ -188,6 +198,8 @@ by using the full ISO code of language and country, like <code class="docutils l
188198</dd>
189199<dt><code class="docutils literal notranslate"><span class="pre">weigth</span></code><span class="classifier">default <code class="docutils literal notranslate"><span class="pre">1</span></code></span></dt><dd><p>Weighting of the results of this engine.</p>
190200</dd>
201+<dt><code class="docutils literal notranslate"><span class="pre">display_error_messages</span></code><span class="classifier">default <code class="docutils literal notranslate"><span class="pre">True</span></code></span></dt><dd><p>When an engine returns an error, the message is displayed on the user interface.</p>
202+</dd>
191203</dl>
192204<div class="admonition note">
193205<p class="admonition-title">Note</p>
@@ -198,6 +210,7 @@ engines, and so won’t be described here.</p>
198210</div>
199211
200212
213+ <div class="clearer"></div>
201214 </div>
202215 </div>
203216 </div>
@@ -226,7 +239,7 @@ engines, and so won’t be described here.</p>
226239 <ul>
227240 <li><a href="index.html">Administrator documentation</a>
228241 <ul>
229− <li>Previous: <a href="installation.html" title="previous chapter">Installation</a>
242+ <li>Previous: <a href="update-searx.html" title="previous chapter">How to update</a>
230243 <li>Next: <a href="api.html" title="next chapter">Administration API</a></ul>
231244 </li>
232245 </ul>
@@ -249,7 +262,7 @@ engines, and so won’t be described here.</p>
249262
250263 <div class="footer" role="contentinfo">
251264 &#169; Copyright 2015-2020, Adam Tauber, Noémi Ványi.
252− Created using <a href="http://sphinx-doc.org/">Sphinx</a> 2.4.4.
265+ Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 3.1.1.
253266 </div>
254267 <script src="../_static/version_warning_offset.js"></script>
255268
admin/update-searx.htmlnew file+137
@@ -0,0 +1,137 @@
1+
2+<!DOCTYPE html>
3+
4+<html>
5+ <head>
6+ <meta charset="utf-8" />
7+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
8+ <meta name="viewport" content="width=device-width, initial-scale=1">
9+ <title>How to update &#8212; Searx Documentation (Searx-0.16.0.tex)</title>
10+ <link rel="stylesheet" href="../_static/searx.css" type="text/css" />
11+ <link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
12+ <link rel="stylesheet" type="text/css" href="../_static/sphinx_tabs/semantic-ui-2.4.1/segment.min.css" />
13+ <link rel="stylesheet" type="text/css" href="../_static/sphinx_tabs/semantic-ui-2.4.1/menu.min.css" />
14+ <link rel="stylesheet" type="text/css" href="../_static/sphinx_tabs/semantic-ui-2.4.1/tab.min.css" />
15+ <link rel="stylesheet" type="text/css" href="../_static/sphinx_tabs/tabs.css" />
16+ <script id="documentation_options" data-url_root="../" src="../_static/documentation_options.js"></script>
17+ <script src="../_static/jquery.js"></script>
18+ <script src="../_static/underscore.js"></script>
19+ <script src="../_static/doctools.js"></script>
20+ <script src="../_static/language_data.js"></script>
21+ <script src="../_static/sphinx_tabs/semantic-ui-2.4.1/tab.min.js"></script>
22+ <script src="../_static/sphinx_tabs/tabs.js"></script>
23+ <link rel="index" title="Index" href="../genindex.html" />
24+ <link rel="search" title="Search" href="../search.html" />
25+ <link rel="next" title="settings.yml" href="settings.html" />
26+ <link rel="prev" title="Docker installation" href="installation-docker.html" />
27+ <script>DOCUMENTATION_OPTIONS.URL_ROOT = '../';</script>
28+
29+ </head><body>
30+ <div class="related" role="navigation" aria-label="related navigation">
31+ <h3>Navigation</h3>
32+ <ul>
33+ <li class="right" style="margin-right: 10px">
34+ <a href="../genindex.html" title="General Index"
35+ accesskey="I">index</a></li>
36+ <li class="right" >
37+ <a href="settings.html" title="settings.yml"
38+ accesskey="N">next</a> |</li>
39+ <li class="right" >
40+ <a href="installation-docker.html" title="Docker installation"
41+ accesskey="P">previous</a> |</li>
42+ <li class="nav-item nav-item-0"><a href="../index.html">Searx Documentation (Searx-0.16.0.tex)</a> &#187;</li>
43+ <li class="nav-item nav-item-1"><a href="index.html" accesskey="U">Administrator documentation</a> &#187;</li>
44+ <li class="nav-item nav-item-this"><a href="">How to update</a></li>
45+ </ul>
46+ </div>
47+
48+ <div class="document">
49+ <div class="documentwrapper">
50+ <div class="bodywrapper">
51+ <div class="body" role="main">
52+
53+ <div class="section" id="how-to-update">
54+<span id="update-searx"></span><h1>How to update<a class="headerlink" href="#how-to-update" title="Permalink to this headline">¶</a></h1>
55+<div class="highlight-sh notranslate"><div class="highlight"><pre><span></span>sudo -H -u searx -i
56+<span class="o">(</span>searx<span class="o">)</span>$ git stash
57+<span class="o">(</span>searx<span class="o">)</span>$ git pull origin master
58+<span class="o">(</span>searx<span class="o">)</span>$ git stash apply
59+<span class="o">(</span>searx<span class="o">)</span>$ ./manage.sh update_packages
60+</pre></div>
61+</div>
62+<p>Restart uwsgi:</p>
63+<div class="sphinx-tabs docutils container">
64+<div class="ui top attached tabular menu sphinx-menu docutils container">
65+<div class="active item sphinx-data-tab-VWJ1bnR1IC8gZGViaWFu docutils container">
66+<div class="docutils container">
67+<p>Ubuntu / debian</p>
68+</div>
69+</div>
70+</div>
71+<div class="ui bottom attached sphinx-tab tab segment sphinx-data-tab-VWJ1bnR1IC8gZGViaWFu active docutils container">
72+<div class="highlight-sh notranslate"><div class="highlight"><pre><span></span>sudo -H systemctl restart uwsgi
73+</pre></div>
74+</div>
75+</div>
76+</div>
77+</div>
78+
79+
80+ <div class="clearer"></div>
81+ </div>
82+ </div>
83+ </div>
84+ <span id="sidebar-top"></span>
85+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
86+ <div class="sphinxsidebarwrapper">
87+
88+
89+ <p class="logo"><a href="../index.html">
90+ <img class="logo" src="../_static/searx_logo_small.png" alt="Logo"/>
91+ </a></p>
92+
93+
94+ <h3>Project Links</h3>
95+ <ul>
96+ <li><a href="https://github.com/asciimoo/searx">Source</a>
97+
98+ <li><a href="https://github.com/asciimoo/searx/wiki">Wiki</a>
99+
100+ <li><a href="https://searx.space/">Public instances</a>
101+
102+ <li><a href="https://twitter.com/Searx_engine">Twitter</a>
103+ </ul><h3>Navigation</h3>
104+<ul>
105+ <li><a href="../index.html">Overview</a>
106+ <ul>
107+ <li><a href="index.html">Administrator documentation</a>
108+ <ul>
109+ <li>Previous: <a href="installation-docker.html" title="previous chapter">Docker installation</a>
110+ <li>Next: <a href="settings.html" title="next chapter"><code class="docutils literal notranslate"><span class="pre">settings.yml</span></code></a></ul>
111+ </li>
112+ </ul>
113+ </li>
114+</ul>
115+<div id="searchbox" style="display: none" role="search">
116+ <h3 id="searchlabel">Quick search</h3>
117+ <div class="searchformwrapper">
118+ <form class="search" action="../search.html" method="get">
119+ <input type="text" name="q" aria-labelledby="searchlabel" />
120+ <input type="submit" value="Go" />
121+ </form>
122+ </div>
123+</div>
124+<script>$('#searchbox').show(0);</script>
125+ </div>
126+ </div>
127+ <div class="clearer"></div>
128+ </div>
129+
130+ <div class="footer" role="contentinfo">
131+ &#169; Copyright 2015-2020, Adam Tauber, Noémi Ványi.
132+ Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 3.1.1.
133+ </div>
134+ <script src="../_static/version_warning_offset.js"></script>
135+
136+ </body>
137+</html>
blog/admin.html+6−3
@@ -1,9 +1,10 @@
11
22<!DOCTYPE html>
33
4−<html xmlns="http://www.w3.org/1999/xhtml">
4+<html>
55 <head>
66 <meta charset="utf-8" />
7+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
78 <meta name="viewport" content="width=device-width, initial-scale=1">
89 <title>Searx admin interface &#8212; Searx Documentation (Searx-0.16.0.tex)</title>
910 <link rel="stylesheet" href="../_static/searx.css" type="text/css" />
@@ -33,7 +34,8 @@
3334 <a href="python3.html" title="Introducing Python 3 support"
3435 accesskey="P">previous</a> |</li>
3536 <li class="nav-item nav-item-0"><a href="../index.html">Searx Documentation (Searx-0.16.0.tex)</a> &#187;</li>
36− <li class="nav-item nav-item-1"><a href="index.html" accesskey="U">Blog</a> &#187;</li>
37+ <li class="nav-item nav-item-1"><a href="index.html" accesskey="U">Blog</a> &#187;</li>
38+ <li class="nav-item nav-item-this"><a href="">Searx admin interface</a></li>
3739 </ul>
3840 </div>
3941
@@ -80,6 +82,7 @@ existing instances.</p>
8082</div>
8183
8284
85+ <div class="clearer"></div>
8386 </div>
8487 </div>
8588 </div>
@@ -131,7 +134,7 @@ existing instances.</p>
131134
132135 <div class="footer" role="contentinfo">
133136 &#169; Copyright 2015-2020, Adam Tauber, Noémi Ványi.
134− Created using <a href="http://sphinx-doc.org/">Sphinx</a> 2.4.4.
137+ Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 3.1.1.
135138 </div>
136139 <script src="../_static/version_warning_offset.js"></script>
137140
blog/index.html+34−10
@@ -1,9 +1,10 @@
11
22<!DOCTYPE html>
33
4−<html xmlns="http://www.w3.org/1999/xhtml">
4+<html>
55 <head>
66 <meta charset="utf-8" />
7+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
78 <meta name="viewport" content="width=device-width, initial-scale=1">
89 <title>Blog &#8212; Searx Documentation (Searx-0.16.0.tex)</title>
910 <link rel="stylesheet" href="../_static/searx.css" type="text/css" />
@@ -16,7 +17,7 @@
1617 <link rel="index" title="Index" href="../genindex.html" />
1718 <link rel="search" title="Search" href="../search.html" />
1819 <link rel="next" title="Introducing Python 3 support" href="python3.html" />
19− <link rel="prev" title="reST primer" href="../dev/reST.html" />
20+ <link rel="prev" title="utils/lxc.sh" href="../utils/lxc.sh.html" />
2021 <script>DOCUMENTATION_OPTIONS.URL_ROOT = '../';</script>
2122
2223 </head><body>
@@ -30,9 +31,10 @@
3031 <a href="python3.html" title="Introducing Python 3 support"
3132 accesskey="N">next</a> |</li>
3233 <li class="right" >
33− <a href="../dev/reST.html" title="reST primer"
34+ <a href="../utils/lxc.sh.html" title="utils/lxc.sh"
3435 accesskey="P">previous</a> |</li>
35− <li class="nav-item nav-item-0"><a href="../index.html">Searx Documentation (Searx-0.16.0.tex)</a> &#187;</li>
36+ <li class="nav-item nav-item-0"><a href="../index.html">Searx Documentation (Searx-0.16.0.tex)</a> &#187;</li>
37+ <li class="nav-item nav-item-this"><a href="">Blog</a></li>
3638 </ul>
3739 </div>
3840
@@ -44,16 +46,38 @@
4446 <div class="section" id="blog">
4547<h1>Blog<a class="headerlink" href="#blog" title="Permalink to this headline">¶</a></h1>
4648<div class="toctree-wrapper compound">
49+<p class="caption"><span class="caption-text">Contents</span></p>
4750<ul>
48−<li class="toctree-l1"><a class="reference internal" href="python3.html">Introducing Python 3 support</a></li>
49−<li class="toctree-l1"><a class="reference internal" href="admin.html">Searx admin interface</a></li>
50−<li class="toctree-l1"><a class="reference internal" href="intro-offline.html">Preparation for offline engines</a></li>
51−<li class="toctree-l1"><a class="reference internal" href="private-engines.html">Limit access to your searx engines</a></li>
51+<li class="toctree-l1"><a class="reference internal" href="python3.html">Introducing Python 3 support</a><ul>
52+<li class="toctree-l2"><a class="reference internal" href="python3.html#how-to-run-searx-using-python-3">How to run searx using Python 3</a></li>
53+<li class="toctree-l2"><a class="reference internal" href="python3.html#fun-facts">Fun facts</a></li>
54+<li class="toctree-l2"><a class="reference internal" href="python3.html#if-you-found-bugs">If you found bugs</a></li>
55+<li class="toctree-l2"><a class="reference internal" href="python3.html#acknowledgment">Acknowledgment</a></li>
56+</ul>
57+</li>
58+<li class="toctree-l1"><a class="reference internal" href="admin.html">Searx admin interface</a><ul>
59+<li class="toctree-l2"><a class="reference internal" href="admin.html#acknowledgements">Acknowledgements</a></li>
60+</ul>
61+</li>
62+<li class="toctree-l1"><a class="reference internal" href="intro-offline.html">Preparation for offline engines</a><ul>
63+<li class="toctree-l2"><a class="reference internal" href="intro-offline.html#offline-engines">Offline engines</a></li>
64+<li class="toctree-l2"><a class="reference internal" href="intro-offline.html#development-progress">Development progress</a></li>
65+<li class="toctree-l2"><a class="reference internal" href="intro-offline.html#next-steps">Next steps</a></li>
66+<li class="toctree-l2"><a class="reference internal" href="intro-offline.html#acknowledgement">Acknowledgement</a></li>
67+</ul>
68+</li>
69+<li class="toctree-l1"><a class="reference internal" href="private-engines.html">Limit access to your searx engines</a><ul>
70+<li class="toctree-l2"><a class="reference internal" href="private-engines.html#private-engines">Private engines</a></li>
71+<li class="toctree-l2"><a class="reference internal" href="private-engines.html#next-steps">Next steps</a></li>
72+<li class="toctree-l2"><a class="reference internal" href="private-engines.html#acknowledgement">Acknowledgement</a></li>
73+</ul>
74+</li>
5275</ul>
5376</div>
5477</div>
5578
5679
80+ <div class="clearer"></div>
5781 </div>
5882 </div>
5983 </div>
@@ -80,7 +104,7 @@
80104<ul>
81105 <li><a href="../index.html">Overview</a>
82106 <ul>
83− <li>Previous: <a href="../dev/reST.html" title="previous chapter">reST primer</a>
107+ <li>Previous: <a href="../utils/lxc.sh.html" title="previous chapter"><code class="docutils literal notranslate"><span class="pre">utils/lxc.sh</span></code></a>
84108 <li>Next: <a href="python3.html" title="next chapter">Introducing Python 3 support</a>
85109 </ul>
86110 </li>
@@ -102,7 +126,7 @@
102126
103127 <div class="footer" role="contentinfo">
104128 &#169; Copyright 2015-2020, Adam Tauber, Noémi Ványi.
105− Created using <a href="http://sphinx-doc.org/">Sphinx</a> 2.4.4.
129+ Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 3.1.1.
106130 </div>
107131 <script src="../_static/version_warning_offset.js"></script>
108132
blog/intro-offline.html+6−3
@@ -1,9 +1,10 @@
11
22<!DOCTYPE html>
33
4−<html xmlns="http://www.w3.org/1999/xhtml">
4+<html>
55 <head>
66 <meta charset="utf-8" />
7+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
78 <meta name="viewport" content="width=device-width, initial-scale=1">
89 <title>Preparation for offline engines &#8212; Searx Documentation (Searx-0.16.0.tex)</title>
910 <link rel="stylesheet" href="../_static/searx.css" type="text/css" />
@@ -33,7 +34,8 @@
3334 <a href="admin.html" title="Searx admin interface"
3435 accesskey="P">previous</a> |</li>
3536 <li class="nav-item nav-item-0"><a href="../index.html">Searx Documentation (Searx-0.16.0.tex)</a> &#187;</li>
36− <li class="nav-item nav-item-1"><a href="index.html" accesskey="U">Blog</a> &#187;</li>
37+ <li class="nav-item nav-item-1"><a href="index.html" accesskey="U">Blog</a> &#187;</li>
38+ <li class="nav-item nav-item-this"><a href="">Preparation for offline engines</a></li>
3739 </ul>
3840 </div>
3941
@@ -107,6 +109,7 @@ as a table. You can check out the pull request for more details see
107109</div>
108110
109111
112+ <div class="clearer"></div>
110113 </div>
111114 </div>
112115 </div>
@@ -158,7 +161,7 @@ as a table. You can check out the pull request for more details see
158161
159162 <div class="footer" role="contentinfo">
160163 &#169; Copyright 2015-2020, Adam Tauber, Noémi Ványi.
161− Created using <a href="http://sphinx-doc.org/">Sphinx</a> 2.4.4.
164+ Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 3.1.1.
162165 </div>
163166 <script src="../_static/version_warning_offset.js"></script>
164167
blog/private-engines.html+6−3
@@ -1,9 +1,10 @@
11
22<!DOCTYPE html>
33
4−<html xmlns="http://www.w3.org/1999/xhtml">
4+<html>
55 <head>
66 <meta charset="utf-8" />
7+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
78 <meta name="viewport" content="width=device-width, initial-scale=1">
89 <title>Limit access to your searx engines &#8212; Searx Documentation (Searx-0.16.0.tex)</title>
910 <link rel="stylesheet" href="../_static/searx.css" type="text/css" />
@@ -29,7 +30,8 @@
2930 <a href="intro-offline.html" title="Preparation for offline engines"
3031 accesskey="P">previous</a> |</li>
3132 <li class="nav-item nav-item-0"><a href="../index.html">Searx Documentation (Searx-0.16.0.tex)</a> &#187;</li>
32− <li class="nav-item nav-item-1"><a href="index.html" accesskey="U">Blog</a> &#187;</li>
33+ <li class="nav-item nav-item-1"><a href="index.html" accesskey="U">Blog</a> &#187;</li>
34+ <li class="nav-item nav-item-this"><a href="">Limit access to your searx engines</a></li>
3335 </ul>
3436 </div>
3537
@@ -90,6 +92,7 @@ and come up with new solutions which fit your use case.</p>
9092</div>
9193
9294
95+ <div class="clearer"></div>
9396 </div>
9497 </div>
9598 </div>
@@ -141,7 +144,7 @@ and come up with new solutions which fit your use case.</p>
141144
142145 <div class="footer" role="contentinfo">
143146 &#169; Copyright 2015-2020, Adam Tauber, Noémi Ványi.
144− Created using <a href="http://sphinx-doc.org/">Sphinx</a> 2.4.4.
147+ Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 3.1.1.
145148 </div>
146149 <script src="../_static/version_warning_offset.js"></script>
147150
blog/python3.html+6−3
@@ -1,9 +1,10 @@
11
22<!DOCTYPE html>
33
4−<html xmlns="http://www.w3.org/1999/xhtml">
4+<html>
55 <head>
66 <meta charset="utf-8" />
7+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
78 <meta name="viewport" content="width=device-width, initial-scale=1">
89 <title>Introducing Python 3 support &#8212; Searx Documentation (Searx-0.16.0.tex)</title>
910 <link rel="stylesheet" href="../_static/searx.css" type="text/css" />
@@ -33,7 +34,8 @@
3334 <a href="index.html" title="Blog"
3435 accesskey="P">previous</a> |</li>
3536 <li class="nav-item nav-item-0"><a href="../index.html">Searx Documentation (Searx-0.16.0.tex)</a> &#187;</li>
36− <li class="nav-item nav-item-1"><a href="index.html" accesskey="U">Blog</a> &#187;</li>
37+ <li class="nav-item nav-item-1"><a href="index.html" accesskey="U">Blog</a> &#187;</li>
38+ <li class="nav-item nav-item-this"><a href="">Introducing Python 3 support</a></li>
3739 </ul>
3840 </div>
3941
@@ -93,6 +95,7 @@ version in your issue, so we can investigate it properly.</p>
9395</div>
9496
9597
98+ <div class="clearer"></div>
9699 </div>
97100 </div>
98101 </div>
@@ -144,7 +147,7 @@ version in your issue, so we can investigate it properly.</p>
144147
145148 <div class="footer" role="contentinfo">
146149 &#169; Copyright 2015-2020, Adam Tauber, Noémi Ványi.
147− Created using <a href="http://sphinx-doc.org/">Sphinx</a> 2.4.4.
150+ Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 3.1.1.
148151 </div>
149152 <script src="../_static/version_warning_offset.js"></script>
150153
dev/contribution_guide.html+31−10
@@ -1,9 +1,10 @@
11
22<!DOCTYPE html>
33
4−<html xmlns="http://www.w3.org/1999/xhtml">
4+<html>
55 <head>
66 <meta charset="utf-8" />
7+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
78 <meta name="viewport" content="width=device-width, initial-scale=1">
89 <title>How to contribute &#8212; Searx Documentation (Searx-0.16.0.tex)</title>
910 <link rel="stylesheet" href="../_static/searx.css" type="text/css" />
@@ -33,7 +34,8 @@
3334 <a href="quickstart.html" title="Development Quickstart"
3435 accesskey="P">previous</a> |</li>
3536 <li class="nav-item nav-item-0"><a href="../index.html">Searx Documentation (Searx-0.16.0.tex)</a> &#187;</li>
36− <li class="nav-item nav-item-1"><a href="index.html" accesskey="U">Developer documentation</a> &#187;</li>
37+ <li class="nav-item nav-item-1"><a href="index.html" accesskey="U">Developer documentation</a> &#187;</li>
38+ <li class="nav-item nav-item-this"><a href="">How to contribute</a></li>
3739 </ul>
3840 </div>
3941
@@ -44,8 +46,26 @@
4446
4547 <div class="section" id="how-to-contribute">
4648<span id="id1"></span><h1>How to contribute<a class="headerlink" href="#how-to-contribute" title="Permalink to this headline">¶</a></h1>
49+<div class="contents local topic" id="contents">
50+<p class="topic-title">Contents</p>
51+<ul class="simple">
52+<li><p><a class="reference internal" href="#prime-directives-privacy-hackability" id="id3">Prime directives: Privacy, Hackability</a></p>
53+<ul>
54+<li><p><a class="reference internal" href="#privacy-by-design" id="id4">Privacy-by-design</a></p></li>
55+</ul>
56+</li>
57+<li><p><a class="reference internal" href="#code" id="id5">Code</a></p></li>
58+<li><p><a class="reference internal" href="#translation" id="id6">Translation</a></p></li>
59+<li><p><a class="reference internal" href="#documentation" id="id7">Documentation</a></p>
60+<ul>
61+<li><p><a class="reference internal" href="#live-build" id="id8">live build</a></p></li>
62+<li><p><a class="reference internal" href="#deploy-on-github-io" id="id9">deploy on github.io</a></p></li>
63+</ul>
64+</li>
65+</ul>
66+</div>
4767<div class="section" id="prime-directives-privacy-hackability">
48−<h2>Prime directives: Privacy, Hackability<a class="headerlink" href="#prime-directives-privacy-hackability" title="Permalink to this headline">¶</a></h2>
68+<h2><a class="toc-backref" href="#id3">Prime directives: Privacy, Hackability</a><a class="headerlink" href="#prime-directives-privacy-hackability" title="Permalink to this headline">¶</a></h2>
4969<p>Searx has two prime directives, <strong>privacy-by-design and hackability</strong> . The
5070hackability comes in three levels:</p>
5171<ul class="simple">
@@ -57,7 +77,7 @@ hackability comes in three levels:</p>
5777intention of wide mass-adoption, rounded corners, etc. The prime directive
5878“privacy” deserves a separate chapter, as it’s quite uncommon unfortunately.</p>
5979<div class="section" id="privacy-by-design">
60−<h3>Privacy-by-design<a class="headerlink" href="#privacy-by-design" title="Permalink to this headline">¶</a></h3>
80+<h3><a class="toc-backref" href="#id4">Privacy-by-design</a><a class="headerlink" href="#privacy-by-design" title="Permalink to this headline">¶</a></h3>
6181<p>Searx was born out of the need for a <strong>privacy-respecting</strong> search tool which
6282can be extended easily to maximize both, its search and its privacy protecting
6383capabilities.</p>
@@ -82,7 +102,7 @@ privacy concerns do not fancy you, simply fork it.</p>
82102</div>
83103</div>
84104<div class="section" id="code">
85−<h2>Code<a class="headerlink" href="#code" title="Permalink to this headline">¶</a></h2>
105+<h2><a class="toc-backref" href="#id5">Code</a><a class="headerlink" href="#code" title="Permalink to this headline">¶</a></h2>
86106<div class="sidebar">
87107<p class="sidebar-title">Create good commits!</p>
88108<ul class="simple">
@@ -121,7 +141,7 @@ code.</p></li>
121141<p>For more help on getting started with searx development, see <a class="reference internal" href="quickstart.html#devquickstart"><span class="std std-ref">Development Quickstart</span></a>.</p>
122142</div>
123143<div class="section" id="translation">
124−<h2>Translation<a class="headerlink" href="#translation" title="Permalink to this headline">¶</a></h2>
144+<h2><a class="toc-backref" href="#id6">Translation</a><a class="headerlink" href="#translation" title="Permalink to this headline">¶</a></h2>
125145<p>Translation currently takes place on <a class="reference internal" href="translation.html#translation"><span class="std std-ref">transifex</span></a>.</p>
126146<div class="admonition caution">
127147<p class="admonition-title">Caution</p>
@@ -129,7 +149,7 @@ code.</p></li>
129149</div>
130150</div>
131151<div class="section" id="documentation">
132−<span id="contrib-docs"></span><h2>Documentation<a class="headerlink" href="#documentation" title="Permalink to this headline">¶</a></h2>
152+<span id="contrib-docs"></span><h2><a class="toc-backref" href="#id7">Documentation</a><a class="headerlink" href="#documentation" title="Permalink to this headline">¶</a></h2>
133153<div class="sidebar">
134154<p class="sidebar-title">The reST sources</p>
135155<p>has been moved from <code class="docutils literal notranslate"><span class="pre">gh-branch</span></code> into <code class="docutils literal notranslate"><span class="pre">master</span></code> (<a class="reference external" href="https://github.com/asciimoo/searx/blob/master/docs">git://docs</a>).</p>
@@ -144,7 +164,7 @@ The HTML pages are in dist/docs.
144164</pre></div>
145165</div>
146166<div class="section" id="live-build">
147−<span id="make-docs-live"></span><h3>live build<a class="headerlink" href="#live-build" title="Permalink to this headline">¶</a></h3>
167+<span id="make-docs-live"></span><h3><a class="toc-backref" href="#id8">live build</a><a class="headerlink" href="#live-build" title="Permalink to this headline">¶</a></h3>
148168<div class="sidebar">
149169<p class="sidebar-title">docs-clean</p>
150170<p>It is recommended to assert a complete rebuild before deploying (use
@@ -163,7 +183,7 @@ The HTML pages are in dist/docs.
163183</div>
164184</div>
165185<div class="section" id="deploy-on-github-io">
166−<span id="id2"></span><h3>deploy on github.io<a class="headerlink" href="#deploy-on-github-io" title="Permalink to this headline">¶</a></h3>
186+<span id="id2"></span><h3><a class="toc-backref" href="#id9">deploy on github.io</a><a class="headerlink" href="#deploy-on-github-io" title="Permalink to this headline">¶</a></h3>
167187<p>To deploy documentation at <a class="reference external" href="https://asciimoo.github.io/searx/.">github.io</a> use Makefile target
168188<a class="reference internal" href="makefile.html#make-gh-pages"><span class="std std-ref">make gh-pages</span></a>, which will builds the documentation, clones searx into a sub
169189folder <code class="docutils literal notranslate"><span class="pre">gh-pages</span></code>, cleans it, copies the doc build into and runs all the
@@ -186,6 +206,7 @@ doc available at --&gt; https://asciimoo.github.io/searx
186206</div>
187207
188208
209+ <div class="clearer"></div>
189210 </div>
190211 </div>
191212 </div>
@@ -237,7 +258,7 @@ doc available at --&gt; https://asciimoo.github.io/searx
237258
238259 <div class="footer" role="contentinfo">
239260 &#169; Copyright 2015-2020, Adam Tauber, Noémi Ványi.
240− Created using <a href="http://sphinx-doc.org/">Sphinx</a> 2.4.4.
261+ Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 3.1.1.
241262 </div>
242263 <script src="../_static/version_warning_offset.js"></script>
243264
dev/engine_overview.html+10−3
@@ -1,9 +1,10 @@
11
22<!DOCTYPE html>
33
4−<html xmlns="http://www.w3.org/1999/xhtml">
4+<html>
55 <head>
66 <meta charset="utf-8" />
7+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
78 <meta name="viewport" content="width=device-width, initial-scale=1">
89 <title>Engine overview &#8212; Searx Documentation (Searx-0.16.0.tex)</title>
910 <link rel="stylesheet" href="../_static/searx.css" type="text/css" />
@@ -33,7 +34,8 @@
3334 <a href="contribution_guide.html" title="How to contribute"
3435 accesskey="P">previous</a> |</li>
3536 <li class="nav-item nav-item-0"><a href="../index.html">Searx Documentation (Searx-0.16.0.tex)</a> &#187;</li>
36− <li class="nav-item nav-item-1"><a href="index.html" accesskey="U">Developer documentation</a> &#187;</li>
37+ <li class="nav-item nav-item-1"><a href="index.html" accesskey="U">Developer documentation</a> &#187;</li>
38+ <li class="nav-item nav-item-this"><a href="">Engine overview</a></li>
3739 </ul>
3840 </div>
3941
@@ -160,6 +162,10 @@ settings. However, the standard way is the following:</p>
160162<td><p>string</p></td>
161163<td><p>specific timeout for search-engine</p></td>
162164</tr>
165+<tr class="row-even"><td><p>display_error_messages</p></td>
166+<td><p>boolean</p></td>
167+<td><p>display error messages on the web UI</p></td>
168+</tr>
163169</tbody>
164170</table>
165171</div>
@@ -579,6 +585,7 @@ time of publish <em>(not implemented yet)</em></p></td>
579585</div>
580586
581587
588+ <div class="clearer"></div>
582589 </div>
583590 </div>
584591 </div>
@@ -630,7 +637,7 @@ time of publish <em>(not implemented yet)</em></p></td>
630637
631638 <div class="footer" role="contentinfo">
632639 &#169; Copyright 2015-2020, Adam Tauber, Noémi Ványi.
633− Created using <a href="http://sphinx-doc.org/">Sphinx</a> 2.4.4.
640+ Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 3.1.1.
634641 </div>
635642 <script src="../_static/version_warning_offset.js"></script>
636643
dev/index.html+72−11
@@ -1,9 +1,10 @@
11
22<!DOCTYPE html>
33
4−<html xmlns="http://www.w3.org/1999/xhtml">
4+<html>
55 <head>
66 <meta charset="utf-8" />
7+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
78 <meta name="viewport" content="width=device-width, initial-scale=1">
89 <title>Developer documentation &#8212; Searx Documentation (Searx-0.16.0.tex)</title>
910 <link rel="stylesheet" href="../_static/searx.css" type="text/css" />
@@ -32,7 +33,8 @@
3233 <li class="right" >
3334 <a href="../admin/buildhosts.html" title="Buildhosts"
3435 accesskey="P">previous</a> |</li>
35− <li class="nav-item nav-item-0"><a href="../index.html">Searx Documentation (Searx-0.16.0.tex)</a> &#187;</li>
36+ <li class="nav-item nav-item-0"><a href="../index.html">Searx Documentation (Searx-0.16.0.tex)</a> &#187;</li>
37+ <li class="nav-item nav-item-this"><a href="">Developer documentation</a></li>
3638 </ul>
3739 </div>
3840
@@ -44,20 +46,79 @@
4446 <div class="section" id="developer-documentation">
4547<h1>Developer documentation<a class="headerlink" href="#developer-documentation" title="Permalink to this headline">¶</a></h1>
4648<div class="toctree-wrapper compound">
49+<p class="caption"><span class="caption-text">Contents</span></p>
4750<ul>
48−<li class="toctree-l1"><a class="reference internal" href="quickstart.html">Development Quickstart</a></li>
49−<li class="toctree-l1"><a class="reference internal" href="contribution_guide.html">How to contribute</a></li>
50−<li class="toctree-l1"><a class="reference internal" href="engine_overview.html">Engine overview</a></li>
51−<li class="toctree-l1"><a class="reference internal" href="search_api.html">Search API</a></li>
52−<li class="toctree-l1"><a class="reference internal" href="plugins.html">Plugins</a></li>
53−<li class="toctree-l1"><a class="reference internal" href="translation.html">Translation</a></li>
54−<li class="toctree-l1"><a class="reference internal" href="makefile.html">Makefile Targets</a></li>
55−<li class="toctree-l1"><a class="reference internal" href="reST.html">reST primer</a></li>
51+<li class="toctree-l1"><a class="reference internal" href="quickstart.html">Development Quickstart</a><ul>
52+<li class="toctree-l2"><a class="reference internal" href="quickstart.html#how-to-setup-your-development-environment">How to setup your development environment</a></li>
53+<li class="toctree-l2"><a class="reference internal" href="quickstart.html#how-to-run-tests">How to run tests</a></li>
54+<li class="toctree-l2"><a class="reference internal" href="quickstart.html#how-to-compile-styles-and-javascript">How to compile styles and javascript</a></li>
55+<li class="toctree-l2"><a class="reference internal" href="quickstart.html#how-to-build-the-source-of-the-themes">How to build the source of the themes</a></li>
56+<li class="toctree-l2"><a class="reference internal" href="quickstart.html#tips-for-debugging-development">Tips for debugging/development</a></li>
57+</ul>
58+</li>
59+<li class="toctree-l1"><a class="reference internal" href="contribution_guide.html">How to contribute</a><ul>
60+<li class="toctree-l2"><a class="reference internal" href="contribution_guide.html#prime-directives-privacy-hackability">Prime directives: Privacy, Hackability</a></li>
61+<li class="toctree-l2"><a class="reference internal" href="contribution_guide.html#code">Code</a></li>
62+<li class="toctree-l2"><a class="reference internal" href="contribution_guide.html#translation">Translation</a></li>
63+<li class="toctree-l2"><a class="reference internal" href="contribution_guide.html#documentation">Documentation</a></li>
64+</ul>
65+</li>
66+<li class="toctree-l1"><a class="reference internal" href="engine_overview.html">Engine overview</a><ul>
67+<li class="toctree-l2"><a class="reference internal" href="engine_overview.html#general-engine-configuration">general engine configuration</a></li>
68+<li class="toctree-l2"><a class="reference internal" href="engine_overview.html#making-a-request">making a request</a></li>
69+<li class="toctree-l2"><a class="reference internal" href="engine_overview.html#returned-results">returned results</a></li>
70+</ul>
71+</li>
72+<li class="toctree-l1"><a class="reference internal" href="search_api.html">Search API</a><ul>
73+<li class="toctree-l2"><a class="reference internal" href="search_api.html#parameters">Parameters</a></li>
74+</ul>
75+</li>
76+<li class="toctree-l1"><a class="reference internal" href="plugins.html">Plugins</a><ul>
77+<li class="toctree-l2"><a class="reference internal" href="plugins.html#example-plugin">Example plugin</a></li>
78+<li class="toctree-l2"><a class="reference internal" href="plugins.html#plugin-entry-points">Plugin entry points</a></li>
79+</ul>
80+</li>
81+<li class="toctree-l1"><a class="reference internal" href="translation.html">Translation</a><ul>
82+<li class="toctree-l2"><a class="reference internal" href="translation.html#requirements">Requirements</a></li>
83+<li class="toctree-l2"><a class="reference internal" href="translation.html#init-transifex-project">Init Transifex project</a></li>
84+<li class="toctree-l2"><a class="reference internal" href="translation.html#update-translations">Update translations</a></li>
85+</ul>
86+</li>
87+<li class="toctree-l1"><a class="reference internal" href="makefile.html">Makefile Targets</a><ul>
88+<li class="toctree-l2"><a class="reference internal" href="makefile.html#makefile-setup">Makefile setup</a></li>
89+<li class="toctree-l2"><a class="reference internal" href="makefile.html#python-environment">Python environment</a></li>
90+<li class="toctree-l2"><a class="reference internal" href="makefile.html#make-run"><code class="docutils literal notranslate"><span class="pre">make</span> <span class="pre">run</span></code></a></li>
91+<li class="toctree-l2"><a class="reference internal" href="makefile.html#make-clean"><code class="docutils literal notranslate"><span class="pre">make</span> <span class="pre">clean</span></code></a></li>
92+<li class="toctree-l2"><a class="reference internal" href="makefile.html#make-docs-docs-live-docs-clean"><code class="docutils literal notranslate"><span class="pre">make</span> <span class="pre">docs</span> <span class="pre">docs-live</span> <span class="pre">docs-clean</span></code></a></li>
93+<li class="toctree-l2"><a class="reference internal" href="makefile.html#make-gh-pages"><code class="docutils literal notranslate"><span class="pre">make</span> <span class="pre">gh-pages</span></code></a></li>
94+<li class="toctree-l2"><a class="reference internal" href="makefile.html#make-test"><code class="docutils literal notranslate"><span class="pre">make</span> <span class="pre">test</span></code></a></li>
95+<li class="toctree-l2"><a class="reference internal" href="makefile.html#make-pylint"><code class="docutils literal notranslate"><span class="pre">make</span> <span class="pre">pylint</span></code></a></li>
96+<li class="toctree-l2"><a class="reference internal" href="makefile.html#make-pybuild"><code class="docutils literal notranslate"><span class="pre">make</span> <span class="pre">pybuild</span></code></a></li>
97+</ul>
98+</li>
99+<li class="toctree-l1"><a class="reference internal" href="reST.html">reST primer</a><ul>
100+<li class="toctree-l2"><a class="reference internal" href="reST.html#soft-skills">Soft skills</a></li>
101+<li class="toctree-l2"><a class="reference internal" href="reST.html#basic-inline-markup">Basic inline markup</a></li>
102+<li class="toctree-l2"><a class="reference internal" href="reST.html#basic-article-structure">Basic article structure</a></li>
103+<li class="toctree-l2"><a class="reference internal" href="reST.html#anchors-links">Anchors &amp; Links</a></li>
104+<li class="toctree-l2"><a class="reference internal" href="reST.html#literal-blocks">Literal blocks</a></li>
105+<li class="toctree-l2"><a class="reference internal" href="reST.html#unicode-substitution">Unicode substitution</a></li>
106+<li class="toctree-l2"><a class="reference internal" href="reST.html#roles">Roles</a></li>
107+<li class="toctree-l2"><a class="reference internal" href="reST.html#figures-images">Figures &amp; Images</a></li>
108+<li class="toctree-l2"><a class="reference internal" href="reST.html#list-markups">List markups</a></li>
109+<li class="toctree-l2"><a class="reference internal" href="reST.html#admonitions">Admonitions</a></li>
110+<li class="toctree-l2"><a class="reference internal" href="reST.html#tables">Tables</a></li>
111+<li class="toctree-l2"><a class="reference internal" href="reST.html#templating">Templating</a></li>
112+<li class="toctree-l2"><a class="reference internal" href="reST.html#tabbed-views">Tabbed views</a></li>
113+<li class="toctree-l2"><a class="reference internal" href="reST.html#math-equations">Math equations</a></li>
114+</ul>
115+</li>
56116</ul>
57117</div>
58118</div>
59119
60120
121+ <div class="clearer"></div>
61122 </div>
62123 </div>
63124 </div>
@@ -106,7 +167,7 @@
106167
107168 <div class="footer" role="contentinfo">
108169 &#169; Copyright 2015-2020, Adam Tauber, Noémi Ványi.
109− Created using <a href="http://sphinx-doc.org/">Sphinx</a> 2.4.4.
170+ Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 3.1.1.
110171 </div>
111172 <script src="../_static/version_warning_offset.js"></script>
112173
dev/makefile.html+66−38
@@ -1,9 +1,10 @@
11
22<!DOCTYPE html>
33
4−<html xmlns="http://www.w3.org/1999/xhtml">
4+<html>
55 <head>
66 <meta charset="utf-8" />
7+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
78 <meta name="viewport" content="width=device-width, initial-scale=1">
89 <title>Makefile Targets &#8212; Searx Documentation (Searx-0.16.0.tex)</title>
910 <link rel="stylesheet" href="../_static/searx.css" type="text/css" />
@@ -33,7 +34,8 @@
3334 <a href="translation.html" title="Translation"
3435 accesskey="P">previous</a> |</li>
3536 <li class="nav-item nav-item-0"><a href="../index.html">Searx Documentation (Searx-0.16.0.tex)</a> &#187;</li>
36− <li class="nav-item nav-item-1"><a href="index.html" accesskey="U">Developer documentation</a> &#187;</li>
37+ <li class="nav-item nav-item-1"><a href="index.html" accesskey="U">Developer documentation</a> &#187;</li>
38+ <li class="nav-item nav-item-this"><a href="">Makefile Targets</a></li>
3739 </ul>
3840 </div>
3941
@@ -46,16 +48,16 @@
4648<span id="makefile"></span><h1>Makefile Targets<a class="headerlink" href="#makefile-targets" title="Permalink to this headline">¶</a></h1>
4749<div class="sidebar">
4850<p class="sidebar-title">build environment</p>
49−<p>Before looking deeper at the targets, first read about <a class="reference internal" href="#makefile-setup"><span class="std std-ref">Setup</span></a>
51+<p>Before looking deeper at the targets, first read about <a class="reference internal" href="#makefile-setup"><span class="std std-ref">Makefile setup</span></a>
5052and <a class="reference internal" href="#make-pyenv"><span class="std std-ref">Python environment</span></a>.</p>
53+<p>To install system requirements follow <a class="reference internal" href="../admin/buildhosts.html#buildhosts"><span class="std std-ref">Buildhosts</span></a>.</p>
5154</div>
5255<p>With the aim to simplify development cycles, started with <a class="reference external" href="https://github.com/asciimoo/searx/pull/1756">PR 1756</a> a
5356<code class="docutils literal notranslate"><span class="pre">Makefile</span></code> based boilerplate was added. If you are not familiar with
5457Makefiles, we recommend to read <a class="reference external" href="https://www.gnu.org/software/make/manual/make.html#Introduction">gnu-make</a> introduction.</p>
5558<p>The usage is simple, just type <code class="docutils literal notranslate"><span class="pre">make</span> <span class="pre">{target-name}</span></code> to <em>build</em> a target.
56−Calling the <code class="docutils literal notranslate"><span class="pre">help</span></code> target gives a first overview:</p>
57−<div class="highlight-none notranslate"><div class="highlight"><pre><span></span>$ make help
58− test - run developer tests
59+Calling the <code class="docutils literal notranslate"><span class="pre">help</span></code> target gives a first overview (<code class="docutils literal notranslate"><span class="pre">make</span> <span class="pre">help</span></code>):</p>
60+<div class="highlight-text notranslate"><div class="highlight"><pre><span></span> test - run developer tests
5961 docs - build documentation
6062 docs-live - autobuild HTML documentation while editing
6163 run - run developer instance
@@ -63,50 +65,75 @@ Calling the <code class="docutils literal notranslate"><span class="pre">help</s
6365 uninstall - uninstall (./local)
6466 gh-pages - build docs &amp; deploy on gh-pages branch
6567 clean - drop builds and environments
66− ...
68+ project - re-build generic files of the searx project
69+ buildenv - re-build environment files (aka brand)
70+ themes - re-build build the source of the themes
71+ docker - build Docker image
72+ node.env - download &amp; install npm dependencies locally
73+
74+environment
75+ SEARX_URL = https://searx.me
76+ GIT_URL = https://github.com/asciimoo/searx
77+ DOCS_URL = https://asciimoo.github.io/searx
78+
79+ make V=0|1 [targets] 0 =&gt; quiet build (default), 1 =&gt; verbose build
80+ make V=2 [targets] 2 =&gt; give reason for rebuild of target
81+
82+to get more help: make help-all
6783</pre></div>
6884</div>
6985<div class="contents local topic" id="contents">
7086<p class="topic-title">Contents</p>
7187<ul class="simple">
72−<li><p><a class="reference internal" href="#setup" id="id6">Setup</a></p></li>
73−<li><p><a class="reference internal" href="#python-environment" id="id7">Python environment</a></p></li>
74−<li><p><a class="reference internal" href="#make-run" id="id8"><code class="docutils literal notranslate"><span class="pre">make</span> <span class="pre">run</span></code></a></p></li>
75−<li><p><a class="reference internal" href="#make-clean" id="id9"><code class="docutils literal notranslate"><span class="pre">make</span> <span class="pre">clean</span></code></a></p></li>
76−<li><p><a class="reference internal" href="#make-docs-docs-live-docs-clean" id="id10"><code class="docutils literal notranslate"><span class="pre">make</span> <span class="pre">docs</span> <span class="pre">docs-live</span> <span class="pre">docs-clean</span></code></a></p></li>
77−<li><p><a class="reference internal" href="#make-gh-pages" id="id11"><code class="docutils literal notranslate"><span class="pre">make</span> <span class="pre">gh-pages</span></code></a></p></li>
78−<li><p><a class="reference internal" href="#make-test" id="id12"><code class="docutils literal notranslate"><span class="pre">make</span> <span class="pre">test</span></code></a></p></li>
79−<li><p><a class="reference internal" href="#make-pylint" id="id13"><code class="docutils literal notranslate"><span class="pre">make</span> <span class="pre">pylint</span></code></a></p></li>
80−<li><p><a class="reference internal" href="#make-pybuild" id="id14"><code class="docutils literal notranslate"><span class="pre">make</span> <span class="pre">pybuild</span></code></a></p></li>
88+<li><p><a class="reference internal" href="#makefile-setup" id="id7">Makefile setup</a></p></li>
89+<li><p><a class="reference internal" href="#python-environment" id="id8">Python environment</a></p></li>
90+<li><p><a class="reference internal" href="#make-run" id="id9"><code class="docutils literal notranslate"><span class="pre">make</span> <span class="pre">run</span></code></a></p></li>
91+<li><p><a class="reference internal" href="#make-clean" id="id10"><code class="docutils literal notranslate"><span class="pre">make</span> <span class="pre">clean</span></code></a></p></li>
92+<li><p><a class="reference internal" href="#make-docs-docs-live-docs-clean" id="id11"><code class="docutils literal notranslate"><span class="pre">make</span> <span class="pre">docs</span> <span class="pre">docs-live</span> <span class="pre">docs-clean</span></code></a></p></li>
93+<li><p><a class="reference internal" href="#make-gh-pages" id="id12"><code class="docutils literal notranslate"><span class="pre">make</span> <span class="pre">gh-pages</span></code></a></p></li>
94+<li><p><a class="reference internal" href="#make-test" id="id13"><code class="docutils literal notranslate"><span class="pre">make</span> <span class="pre">test</span></code></a></p></li>
95+<li><p><a class="reference internal" href="#make-pylint" id="id14"><code class="docutils literal notranslate"><span class="pre">make</span> <span class="pre">pylint</span></code></a></p></li>
96+<li><p><a class="reference internal" href="#make-pybuild" id="id15"><code class="docutils literal notranslate"><span class="pre">make</span> <span class="pre">pybuild</span></code></a></p></li>
8197</ul>
8298</div>
83−<div class="section" id="setup">
84−<span id="makefile-setup"></span><h2><a class="toc-backref" href="#id6">Setup</a><a class="headerlink" href="#setup" title="Permalink to this headline">¶</a></h2>
85−<p>The main setup is done in the <a class="reference external" href="https://github.com/asciimoo/searx/blob/master/Makefile">git://Makefile</a>:</p>
86−<div class="highlight-none notranslate"><div class="highlight"><pre><span></span>export GIT_URL=https://github.com/asciimoo/searx
87−export SEARX_URL=https://searx.me
88−export DOCS_URL=https://asciimoo.github.io/searx
89−</pre></div>
90−</div>
99+<div class="section" id="makefile-setup">
100+<span id="id1"></span><h2><a class="toc-backref" href="#id7">Makefile setup</a><a class="headerlink" href="#makefile-setup" title="Permalink to this headline">¶</a></h2>
91101<div class="sidebar">
92102<p class="sidebar-title">fork &amp; upstream</p>
93103<p>Commit changes in your (local) branch, fork or whatever, but do not push them
94104upstream / <a class="reference external" href="https://git-scm.com/docs/git-stash">git stash</a> is your friend.</p>
95105</div>
106+<p>The main setup is done in the <a class="reference external" href="https://github.com/asciimoo/searx/blob/master/Makefile">git://Makefile</a>.</p>
107+<div class="highlight-none notranslate"><div class="highlight"><pre><span></span>export GIT_URL=https://github.com/asciimoo/searx
108+export GIT_BRANCH=master
109+export SEARX_URL=https://searx.me
110+export DOCS_URL=https://asciimoo.github.io/searx
111+</pre></div>
112+</div>
96113<dl class="field-list simple">
97114<dt class="field-odd">GIT_URL</dt>
98115<dd class="field-odd"><p>Changes this, to point to your searx fork.</p>
99116</dd>
100−<dt class="field-even">SEARX_URL</dt>
101−<dd class="field-even"><p>Changes this, to point to your searx instance.</p>
117+<dt class="field-even">GIT_BRANCH</dt>
118+<dd class="field-even"><p>Changes this, to point to your searx branch.</p>
119+</dd>
120+<dt class="field-odd">SEARX_URL</dt>
121+<dd class="field-odd"><p>Changes this, to point to your searx instance.</p>
102122</dd>
103−<dt class="field-odd">DOCS_URL</dt>
104−<dd class="field-odd"><p>If you host your own (branded) documentation, change this URL.</p>
123+<dt class="field-even">DOCS_URL</dt>
124+<dd class="field-even"><p>If you host your own (<em>brand</em>) documentation, change this URL.</p>
105125</dd>
106126</dl>
127+<p>If you change any of this build environment variables, you have to run <code class="docutils literal notranslate"><span class="pre">make</span>
128+<span class="pre">buildenv</span></code>:</p>
129+<div class="highlight-none notranslate"><div class="highlight"><pre><span></span>$ make buildenv
130+build searx/brand.py
131+build utils/brand.env
132+</pre></div>
133+</div>
107134</div>
108135<div class="section" id="python-environment">
109−<span id="make-pyenv"></span><h2><a class="toc-backref" href="#id7">Python environment</a><a class="headerlink" href="#python-environment" title="Permalink to this headline">¶</a></h2>
136+<span id="make-pyenv"></span><h2><a class="toc-backref" href="#id8">Python environment</a><a class="headerlink" href="#python-environment" title="Permalink to this headline">¶</a></h2>
110137<div class="sidebar">
111138<p class="sidebar-title">activate environment</p>
112139<p><code class="docutils literal notranslate"><span class="pre">source</span> <span class="pre">./local/py3/bin/activate</span></code></p>
@@ -142,7 +169,7 @@ the <a class="reference external" href="https://github.com/asciimoo/searx/blob/m
142169<a class="reference internal" href="#make-clean"><span class="std std-ref">make clean</span></a>.</p>
143170</div>
144171<div class="section" id="make-run">
145−<span id="id1"></span><h2><a class="toc-backref" href="#id8"><code class="docutils literal notranslate"><span class="pre">make</span> <span class="pre">run</span></code></a><a class="headerlink" href="#make-run" title="Permalink to this headline">¶</a></h2>
172+<span id="id2"></span><h2><a class="toc-backref" href="#id9"><code class="docutils literal notranslate"><span class="pre">make</span> <span class="pre">run</span></code></a><a class="headerlink" href="#make-run" title="Permalink to this headline">¶</a></h2>
146173<p>To get up a running a developer instance simply call <code class="docutils literal notranslate"><span class="pre">make</span> <span class="pre">run</span></code>. This enables
147174<em>debug</em> option in <a class="reference external" href="https://github.com/asciimoo/searx/blob/master/searx/settings.yml">git://searx/settings.yml</a>, starts a <code class="docutils literal notranslate"><span class="pre">./searx/webapp.py</span></code>
148175instance, disables <em>debug</em> option again and opens the URL in your favorite WEB
@@ -158,7 +185,7 @@ INFO:werkzeug: * Running on http://127.0.0.1:8888/ <span class="o">(</span>Press
158185</div>
159186</div>
160187<div class="section" id="make-clean">
161−<span id="id2"></span><h2><a class="toc-backref" href="#id9"><code class="docutils literal notranslate"><span class="pre">make</span> <span class="pre">clean</span></code></a><a class="headerlink" href="#make-clean" title="Permalink to this headline">¶</a></h2>
188+<span id="id3"></span><h2><a class="toc-backref" href="#id10"><code class="docutils literal notranslate"><span class="pre">make</span> <span class="pre">clean</span></code></a><a class="headerlink" href="#make-clean" title="Permalink to this headline">¶</a></h2>
162189<p>Drop all intermediate files, all builds, but keep sources untouched. Includes
163190target <code class="docutils literal notranslate"><span class="pre">pyclean</span></code> which drops ./local environment. Before calling <code class="docutils literal notranslate"><span class="pre">make</span>
164191<span class="pre">clean</span></code> stop all processes using <a class="reference internal" href="#make-pyenv"><span class="std std-ref">Python environment</span></a>.</p>
@@ -169,22 +196,22 @@ CLEAN clean
169196</div>
170197</div>
171198<div class="section" id="make-docs-docs-live-docs-clean">
172−<span id="make-docs"></span><h2><a class="toc-backref" href="#id10"><code class="docutils literal notranslate"><span class="pre">make</span> <span class="pre">docs</span> <span class="pre">docs-live</span> <span class="pre">docs-clean</span></code></a><a class="headerlink" href="#make-docs-docs-live-docs-clean" title="Permalink to this headline">¶</a></h2>
199+<span id="make-docs"></span><h2><a class="toc-backref" href="#id11"><code class="docutils literal notranslate"><span class="pre">make</span> <span class="pre">docs</span> <span class="pre">docs-live</span> <span class="pre">docs-clean</span></code></a><a class="headerlink" href="#make-docs-docs-live-docs-clean" title="Permalink to this headline">¶</a></h2>
173200<p>We describe the usage of the <code class="docutils literal notranslate"><span class="pre">doc*</span></code> targets in the <a class="reference internal" href="contribution_guide.html#contrib-docs"><span class="std std-ref">How to contribute /
174201Documentation</span></a> section. If you want to edit the documentation
175202read our <a class="reference internal" href="contribution_guide.html#make-docs-live"><span class="std std-ref">live build</span></a> section. If you are working in your own brand,
176203adjust your <a class="reference internal" href="#makefile-setup"><span class="std std-ref">Makefile setup</span></a>.</p>
177204</div>
178205<div class="section" id="make-gh-pages">
179−<span id="id3"></span><h2><a class="toc-backref" href="#id11"><code class="docutils literal notranslate"><span class="pre">make</span> <span class="pre">gh-pages</span></code></a><a class="headerlink" href="#make-gh-pages" title="Permalink to this headline">¶</a></h2>
206+<span id="id4"></span><h2><a class="toc-backref" href="#id12"><code class="docutils literal notranslate"><span class="pre">make</span> <span class="pre">gh-pages</span></code></a><a class="headerlink" href="#make-gh-pages" title="Permalink to this headline">¶</a></h2>
180207<p>To deploy on github.io first adjust your <a class="reference internal" href="#makefile-setup"><span class="std std-ref">Makefile setup</span></a>. For any further read <a class="reference internal" href="contribution_guide.html#deploy-on-github-io"><span class="std std-ref">deploy on github.io</span></a>.</p>
181208</div>
182209<div class="section" id="make-test">
183−<span id="id4"></span><h2><a class="toc-backref" href="#id12"><code class="docutils literal notranslate"><span class="pre">make</span> <span class="pre">test</span></code></a><a class="headerlink" href="#make-test" title="Permalink to this headline">¶</a></h2>
210+<span id="id5"></span><h2><a class="toc-backref" href="#id13"><code class="docutils literal notranslate"><span class="pre">make</span> <span class="pre">test</span></code></a><a class="headerlink" href="#make-test" title="Permalink to this headline">¶</a></h2>
184211<p>Runs a series of tests: <code class="docutils literal notranslate"><span class="pre">test.pep8</span></code>, <code class="docutils literal notranslate"><span class="pre">test.unit</span></code>, <code class="docutils literal notranslate"><span class="pre">test.robot</span></code> and does
185212additional <a class="reference internal" href="#make-pylint"><span class="std std-ref">pylint checks</span></a>. You can run tests selective,
186213e.g.:</p>
187−<div class="highlight-sh notranslate"><div class="highlight"><pre><span></span>$ make test.pep8 test.unit
214+<div class="highlight-sh notranslate"><div class="highlight"><pre><span></span>$ make test.pep8 test.unit test.sh
188215. ./local/py3/bin/activate<span class="p">;</span> ./manage.sh pep8_check
189216<span class="o">[</span>!<span class="o">]</span> Running pep8 check
190217. ./local/py3/bin/activate<span class="p">;</span> ./manage.sh unit_tests
@@ -193,7 +220,7 @@ e.g.:</p>
193220</div>
194221</div>
195222<div class="section" id="make-pylint">
196−<span id="id5"></span><h2><a class="toc-backref" href="#id13"><code class="docutils literal notranslate"><span class="pre">make</span> <span class="pre">pylint</span></code></a><a class="headerlink" href="#make-pylint" title="Permalink to this headline">¶</a></h2>
223+<span id="id6"></span><h2><a class="toc-backref" href="#id14"><code class="docutils literal notranslate"><span class="pre">make</span> <span class="pre">pylint</span></code></a><a class="headerlink" href="#make-pylint" title="Permalink to this headline">¶</a></h2>
197224<p>Before commiting its recommend to do some (more) linting. <a class="reference external" href="https://www.pylint.org/">Pylint</a> is known as
198225one of the best source-code, bug and quality checker for the Python programming
199226language. <a class="reference external" href="https://www.pylint.org/">Pylint</a> is not yet a quality gate within our searx project (like
@@ -207,7 +234,7 @@ day, the linting is balanced out, we might decide to add Pylint as a quality
207234gate.</p>
208235</div>
209236<div class="section" id="make-pybuild">
210−<h2><a class="toc-backref" href="#id14"><code class="docutils literal notranslate"><span class="pre">make</span> <span class="pre">pybuild</span></code></a><a class="headerlink" href="#make-pybuild" title="Permalink to this headline">¶</a></h2>
237+<h2><a class="toc-backref" href="#id15"><code class="docutils literal notranslate"><span class="pre">make</span> <span class="pre">pybuild</span></code></a><a class="headerlink" href="#make-pybuild" title="Permalink to this headline">¶</a></h2>
211238<p>Build Python packages in <code class="docutils literal notranslate"><span class="pre">./dist/py</span></code>.</p>
212239<div class="highlight-sh notranslate"><div class="highlight"><pre><span></span>$ make pybuild
213240...
@@ -226,6 +253,7 @@ never need the latter.</p>
226253</div>
227254
228255
256+ <div class="clearer"></div>
229257 </div>
230258 </div>
231259 </div>
@@ -277,7 +305,7 @@ never need the latter.</p>
277305
278306 <div class="footer" role="contentinfo">
279307 &#169; Copyright 2015-2020, Adam Tauber, Noémi Ványi.
280− Created using <a href="http://sphinx-doc.org/">Sphinx</a> 2.4.4.
308+ Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 3.1.1.
281309 </div>
282310 <script src="../_static/version_warning_offset.js"></script>
283311
dev/plugins.html+6−3
@@ -1,9 +1,10 @@
11
22<!DOCTYPE html>
33
4−<html xmlns="http://www.w3.org/1999/xhtml">
4+<html>
55 <head>
66 <meta charset="utf-8" />
7+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
78 <meta name="viewport" content="width=device-width, initial-scale=1">
89 <title>Plugins &#8212; Searx Documentation (Searx-0.16.0.tex)</title>
910 <link rel="stylesheet" href="../_static/searx.css" type="text/css" />
@@ -33,7 +34,8 @@
3334 <a href="search_api.html" title="Search API"
3435 accesskey="P">previous</a> |</li>
3536 <li class="nav-item nav-item-0"><a href="../index.html">Searx Documentation (Searx-0.16.0.tex)</a> &#187;</li>
36− <li class="nav-item nav-item-1"><a href="index.html" accesskey="U">Developer documentation</a> &#187;</li>
37+ <li class="nav-item nav-item-1"><a href="index.html" accesskey="U">Developer documentation</a> &#187;</li>
38+ <li class="nav-item nav-item-this"><a href="">Plugins</a></li>
3739 </ul>
3840 </div>
3941
@@ -92,6 +94,7 @@ plugin.</p>
9294</div>
9395
9496
97+ <div class="clearer"></div>
9598 </div>
9699 </div>
97100 </div>
@@ -143,7 +146,7 @@ plugin.</p>
143146
144147 <div class="footer" role="contentinfo">
145148 &#169; Copyright 2015-2020, Adam Tauber, Noémi Ványi.
146− Created using <a href="http://sphinx-doc.org/">Sphinx</a> 2.4.4.
149+ Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 3.1.1.
147150 </div>
148151 <script src="../_static/version_warning_offset.js"></script>
149152
dev/quickstart.html+11−8
@@ -1,9 +1,10 @@
11
22<!DOCTYPE html>
33
4−<html xmlns="http://www.w3.org/1999/xhtml">
4+<html>
55 <head>
66 <meta charset="utf-8" />
7+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
78 <meta name="viewport" content="width=device-width, initial-scale=1">
89 <title>Development Quickstart &#8212; Searx Documentation (Searx-0.16.0.tex)</title>
910 <link rel="stylesheet" href="../_static/searx.css" type="text/css" />
@@ -33,7 +34,8 @@
3334 <a href="index.html" title="Developer documentation"
3435 accesskey="P">previous</a> |</li>
3536 <li class="nav-item nav-item-0"><a href="../index.html">Searx Documentation (Searx-0.16.0.tex)</a> &#187;</li>
36− <li class="nav-item nav-item-1"><a href="index.html" accesskey="U">Developer documentation</a> &#187;</li>
37+ <li class="nav-item nav-item-1"><a href="index.html" accesskey="U">Developer documentation</a> &#187;</li>
38+ <li class="nav-item nav-item-this"><a href="">Development Quickstart</a></li>
3739 </ul>
3840 </div>
3941
@@ -62,7 +64,7 @@ searx-ve virtualenv and install the required packages using <code class="docutil
6264<div class="highlight-sh notranslate"><div class="highlight"><pre><span></span><span class="nb">cd</span> ~/myprojects
6365git clone https://github.com/asciimoo/searx.git
6466<span class="nb">cd</span> searx
65−virtualenv searx-ve
67+python3 -m venv searx-ve
6668. ./searx-ve/bin/activate
6769./manage.sh update_dev_packages
6870</pre></div>
@@ -109,16 +111,16 @@ sudo -H npm install -g less
109111</div>
110112</div>
111113</div>
112−<div class="section" id="how-to-build-the-source-of-the-oscar-theme">
113−<h2>How to build the source of the oscar theme<a class="headerlink" href="#how-to-build-the-source-of-the-oscar-theme" title="Permalink to this headline">¶</a></h2>
114+<div class="section" id="how-to-build-the-source-of-the-themes">
115+<h2>How to build the source of the themes<a class="headerlink" href="#how-to-build-the-source-of-the-themes" title="Permalink to this headline">¶</a></h2>
114116<p><a class="reference external" href="https://gruntjs.com/">Grunt</a> must be installed in order to build the javascript sources. It depends on
115117NodeJS, so first Node has to be installed.</p>
116118<div class="highlight-sh notranslate"><div class="highlight"><pre><span></span>sudo -H apt-get install nodejs
117−sudo -H npm install -g grunt-cli
119+make node.env
118120</pre></div>
119121</div>
120122<p>After installing grunt, the files can be built using the following command:</p>
121−<div class="highlight-sh notranslate"><div class="highlight"><pre><span></span>./manage.sh grunt_build
123+<div class="highlight-sh notranslate"><div class="highlight"><pre><span></span>make themes
122124</pre></div>
123125</div>
124126</div>
@@ -151,6 +153,7 @@ must be created containing these format fixes. This phase can be skipped if
151153</div>
152154
153155
156+ <div class="clearer"></div>
154157 </div>
155158 </div>
156159 </div>
@@ -202,7 +205,7 @@ must be created containing these format fixes. This phase can be skipped if
202205
203206 <div class="footer" role="contentinfo">
204207 &#169; Copyright 2015-2020, Adam Tauber, Noémi Ványi.
205− Created using <a href="http://sphinx-doc.org/">Sphinx</a> 2.4.4.
208+ Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 3.1.1.
206209 </div>
207210 <script src="../_static/version_warning_offset.js"></script>
208211
dev/reST.html+39−58
@@ -1,9 +1,10 @@
11
22<!DOCTYPE html>
33
4−<html xmlns="http://www.w3.org/1999/xhtml">
4+<html>
55 <head>
66 <meta charset="utf-8" />
7+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
78 <meta name="viewport" content="width=device-width, initial-scale=1">
89 <title>reST primer &#8212; Searx Documentation (Searx-0.16.0.tex)</title>
910 <link rel="stylesheet" href="../_static/searx.css" type="text/css" />
@@ -15,7 +16,7 @@
1516 <script src="../_static/language_data.js"></script>
1617 <link rel="index" title="Index" href="../genindex.html" />
1718 <link rel="search" title="Search" href="../search.html" />
18− <link rel="next" title="Blog" href="../blog/index.html" />
19+ <link rel="next" title="Tooling box utils/*" href="../utils/index.html" />
1920 <link rel="prev" title="Makefile Targets" href="makefile.html" />
2021 <script>DOCUMENTATION_OPTIONS.URL_ROOT = '../';</script>
2122
@@ -27,13 +28,14 @@
2728 <a href="../genindex.html" title="General Index"
2829 accesskey="I">index</a></li>
2930 <li class="right" >
30− <a href="../blog/index.html" title="Blog"
31+ <a href="../utils/index.html" title="Tooling box utils/*"
3132 accesskey="N">next</a> |</li>
3233 <li class="right" >
3334 <a href="makefile.html" title="Makefile Targets"
3435 accesskey="P">previous</a> |</li>
3536 <li class="nav-item nav-item-0"><a href="../index.html">Searx Documentation (Searx-0.16.0.tex)</a> &#187;</li>
36− <li class="nav-item nav-item-1"><a href="index.html" accesskey="U">Developer documentation</a> &#187;</li>
37+ <li class="nav-item nav-item-1"><a href="index.html" accesskey="U">Developer documentation</a> &#187;</li>
38+ <li class="nav-item nav-item-this"><a href="">reST primer</a></li>
3739 </ul>
3840 </div>
3941
@@ -365,11 +367,11 @@ content becomes smart.</p>
365367</tr>
366368</thead>
367369<tbody>
368−<tr class="row-even"><td><p><a class="reference external" href="https://www.sphinx-doc.org/en/master/usage/restructuredtext/roles.html#role-rfc" title="(in Sphinx v4.0.0+/b1400ac42)"><code class="xref rst rst-role docutils literal notranslate"><span class="pre">rfc</span></code></a></p></td>
370+<tr class="row-even"><td><p><a class="reference external" href="https://www.sphinx-doc.org/en/master/usage/restructuredtext/roles.html#role-rfc" title="(in Sphinx v4.0.0+)"><code class="xref rst rst-role docutils literal notranslate"><span class="pre">rfc</span></code></a></p></td>
369371<td><p><span class="target" id="index-0"></span><a class="rfc reference external" href="https://tools.ietf.org/html/rfc822.html"><strong>RFC 822</strong></a></p></td>
370372<td><p><code class="docutils literal notranslate"><span class="pre">:rfc:`822`</span></code></p></td>
371373</tr>
372−<tr class="row-odd"><td><p><a class="reference external" href="https://www.sphinx-doc.org/en/master/usage/restructuredtext/roles.html#role-pep" title="(in Sphinx v4.0.0+/b1400ac42)"><code class="xref rst rst-role docutils literal notranslate"><span class="pre">pep</span></code></a></p></td>
374+<tr class="row-odd"><td><p><a class="reference external" href="https://www.sphinx-doc.org/en/master/usage/restructuredtext/roles.html#role-pep" title="(in Sphinx v4.0.0+)"><code class="xref rst rst-role docutils literal notranslate"><span class="pre">pep</span></code></a></p></td>
373375<td><p><span class="target" id="index-1"></span><a class="pep reference external" href="https://www.python.org/dev/peps/pep-0008"><strong>PEP 8</strong></a></p></td>
374376<td><p><code class="docutils literal notranslate"><span class="pre">:pep:`8`</span></code></p></td>
375377</tr>
@@ -442,8 +444,9 @@ content becomes smart.</p>
442444<div class="section" id="literal-blocks">
443445<h2><a class="toc-backref" href="#id24">Literal blocks</a><a class="headerlink" href="#literal-blocks" title="Permalink to this headline">¶</a></h2>
444446<p>The simplest form of <a class="reference external" href="http://docutils.sourceforge.net/docs/ref/rst/restructuredtext.html#literal-blocks">literal-blocks</a> is a indented block introduced by
445−two colons (<code class="docutils literal notranslate"><span class="pre">::</span></code>). For highlighting use <a class="reference external" href="http://docutils.sourceforge.net/docs/ref/rst/directives.html#highlight">highlight</a> or <a class="reference internal" href="#rest-code"><span class="std std-ref">code-block</span></a> directive. To include literals from external files use directive
446−<a class="reference external" href="http://docutils.sourceforge.net/docs/ref/rst/directives.html#literalinclude">literalinclude</a>.</p>
447+two colons (<code class="docutils literal notranslate"><span class="pre">::</span></code>). For highlighting use <a class="reference external" href="http://docutils.sourceforge.net/docs/ref/rst/directives.html#highlight">highlight</a> or <a class="reference internal" href="#rest-code"><span class="std std-ref">code-block</span></a> directive. To include literals from external files use
448+<a class="reference external" href="https://www.sphinx-doc.org/en/master/usage/restructuredtext/directives.html#directive-literalinclude" title="(in Sphinx v4.0.0+)"><code class="xref rst rst-dir docutils literal notranslate"><span class="pre">literalinclude</span></code></a> or <a class="reference external" href="https://return42.github.io/linuxdoc/linuxdoc-howto/kernel-include-directive.html#kernel-include-directive" title="(in LinuxDoc v20181010)"><span class="xref std std-ref">kernel-include</span></a>
449+directive (latter one expands environment variables in the path name).</p>
447450<div class="section" id="rest-literal">
448451<span id="id3"></span><h3><a class="toc-backref" href="#id25"><code class="docutils literal notranslate"><span class="pre">::</span></code></a><a class="headerlink" href="#rest-literal" title="Permalink to this headline">¶</a></h3>
449452<div class="highlight-reST notranslate"><div class="highlight"><pre><span></span><span class="se">::</span>
@@ -482,9 +485,9 @@ eirmod tempor invidunt ut labore</p>
482485<p class="sidebar-title">Syntax highlighting</p>
483486<p>is handled by <a class="reference external" href="https://pygments.org/languages/">pygments</a>.</p>
484487</div>
485−<p>The <a class="reference external" href="https://www.sphinx-doc.org/en/master/usage/restructuredtext/directives.html#directive-code-block" title="(in Sphinx v4.0.0+/b1400ac42)"><code class="xref rst rst-dir docutils literal notranslate"><span class="pre">code-block</span></code></a> directive is a variant of the <a class="reference external" href="http://docutils.sourceforge.net/docs/ref/rst/directives.html#code">code</a> directive
488+<p>The <a class="reference external" href="https://www.sphinx-doc.org/en/master/usage/restructuredtext/directives.html#directive-code-block" title="(in Sphinx v4.0.0+)"><code class="xref rst rst-dir docutils literal notranslate"><span class="pre">code-block</span></code></a> directive is a variant of the <a class="reference external" href="http://docutils.sourceforge.net/docs/ref/rst/directives.html#code">code</a> directive
486489with additional options. To learn more about code literals visit
487−<a class="reference external" href="https://www.sphinx-doc.org/en/master/usage/restructuredtext/directives.html#code-examples" title="(in Sphinx v4.0.0+/b1400ac42)"><span>Showing code examples</span></a>.</p>
490+<a class="reference external" href="https://www.sphinx-doc.org/en/master/usage/restructuredtext/directives.html#code-examples" title="(in Sphinx v4.0.0+)"><span>Showing code examples</span></a>.</p>
488491<div class="highlight-reST notranslate"><div class="highlight"><pre><span></span>The URL <span class="s">``/stats``</span> handle is shown in <span class="na">:ref:</span><span class="nv">`stats-handle`</span>
489492
490493<span class="p">..</span> <span class="ow">code-block</span><span class="p">::</span> Python
@@ -507,7 +510,7 @@ with additional options. To learn more about code literals visit
507510<p class="admonition-title">Code block</p>
508511<p>The URL <code class="docutils literal notranslate"><span class="pre">/stats</span></code> handle is shown in <a class="reference internal" href="#stats-handle"><span class="std std-ref">python code block</span></a></p>
509512<div class="literal-block-wrapper docutils container" id="stats-handle">
510−<div class="code-block-caption"><span class="caption-number">Listing 2 </span><span class="caption-text">python code block</span><a class="headerlink" href="#stats-handle" title="Permalink to this code">¶</a></div>
513+<div class="code-block-caption"><span class="caption-number">Listing 1 </span><span class="caption-text">python code block</span><a class="headerlink" href="#stats-handle" title="Permalink to this code">¶</a></div>
511514<div class="highlight-Python notranslate"><div class="highlight"><pre><span></span><span class="nd">@app.route</span><span class="p">(</span><span class="s1">&#39;/stats&#39;</span><span class="p">,</span> <span class="n">methods</span><span class="o">=</span><span class="p">[</span><span class="s1">&#39;GET&#39;</span><span class="p">])</span>
512515<span class="k">def</span> <span class="nf">stats</span><span class="p">():</span>
513516 <span class="sd">&quot;&quot;&quot;Render engine statistics page.&quot;&quot;&quot;</span>
@@ -543,7 +546,7 @@ Trademark |(TM)| and copyright |copy| glyphs.
543546<p class="sidebar-title">Further reading</p>
544547<ul class="simple">
545548<li><p><a class="reference external" href="https://www.sphinx-doc.org/en/master/usage/restructuredtext/roles.html">Sphinx Roles</a></p></li>
546−<li><p><a class="reference external" href="https://www.sphinx-doc.org/en/master/usage/restructuredtext/domains.html" title="(in Sphinx v4.0.0+/b1400ac42)"><span>Domains</span></a></p></li>
549+<li><p><a class="reference external" href="https://www.sphinx-doc.org/en/master/usage/restructuredtext/domains.html" title="(in Sphinx v4.0.0+)"><span>Domains</span></a></p></li>
547550</ul>
548551</div>
549552<p>A <em>custom interpreted text role</em> (<a class="reference external" href="http://docutils.sourceforge.net/docs/ref/rst/restructuredtext.html#roles">ref</a>) is an inline piece of
@@ -568,31 +571,31 @@ in a specific way.</p>
568571</tr>
569572</thead>
570573<tbody>
571−<tr class="row-even"><td><p><a class="reference external" href="https://www.sphinx-doc.org/en/master/usage/restructuredtext/roles.html#role-guilabel" title="(in Sphinx v4.0.0+/b1400ac42)"><code class="xref rst rst-role docutils literal notranslate"><span class="pre">guilabel</span></code></a></p></td>
574+<tr class="row-even"><td><p><a class="reference external" href="https://www.sphinx-doc.org/en/master/usage/restructuredtext/roles.html#role-guilabel" title="(in Sphinx v4.0.0+)"><code class="xref rst rst-role docutils literal notranslate"><span class="pre">guilabel</span></code></a></p></td>
572575<td><p><span class="guilabel"><span class="accelerator">C</span>ancel</span></p></td>
573576<td><p><code class="docutils literal notranslate"><span class="pre">:guilabel:`&amp;Cancel`</span></code></p></td>
574577</tr>
575−<tr class="row-odd"><td><p><a class="reference external" href="https://www.sphinx-doc.org/en/master/usage/restructuredtext/roles.html#role-kbd" title="(in Sphinx v4.0.0+/b1400ac42)"><code class="xref rst rst-role docutils literal notranslate"><span class="pre">kbd</span></code></a></p></td>
576−<td><p><kbd class="kbd docutils literal notranslate">C-x C-f</kbd></p></td>
578+<tr class="row-odd"><td><p><a class="reference external" href="https://www.sphinx-doc.org/en/master/usage/restructuredtext/roles.html#role-kbd" title="(in Sphinx v4.0.0+)"><code class="xref rst rst-role docutils literal notranslate"><span class="pre">kbd</span></code></a></p></td>
579+<td><p><kbd class="kbd docutils literal notranslate"><kbd class="kbd docutils literal notranslate">C</kbd>-<kbd class="kbd docutils literal notranslate">x</kbd> <kbd class="kbd docutils literal notranslate">C</kbd>-<kbd class="kbd docutils literal notranslate">f</kbd></kbd></p></td>
577580<td><p><code class="docutils literal notranslate"><span class="pre">:kbd:`C-x</span> <span class="pre">C-f`</span></code></p></td>
578581</tr>
579−<tr class="row-even"><td><p><a class="reference external" href="https://www.sphinx-doc.org/en/master/usage/restructuredtext/roles.html#role-menuselection" title="(in Sphinx v4.0.0+/b1400ac42)"><code class="xref rst rst-role docutils literal notranslate"><span class="pre">menuselection</span></code></a></p></td>
582+<tr class="row-even"><td><p><a class="reference external" href="https://www.sphinx-doc.org/en/master/usage/restructuredtext/roles.html#role-menuselection" title="(in Sphinx v4.0.0+)"><code class="xref rst rst-role docutils literal notranslate"><span class="pre">menuselection</span></code></a></p></td>
580583<td><p><span class="menuselection">Open ‣ File</span></p></td>
581584<td><p><code class="docutils literal notranslate"><span class="pre">:menuselection:`Open</span> <span class="pre">--&gt;</span> <span class="pre">File`</span></code></p></td>
582585</tr>
583−<tr class="row-odd"><td><p><a class="reference external" href="https://www.sphinx-doc.org/en/master/usage/restructuredtext/roles.html#role-download" title="(in Sphinx v4.0.0+/b1400ac42)"><code class="xref rst rst-role docutils literal notranslate"><span class="pre">download</span></code></a></p></td>
586+<tr class="row-odd"><td><p><a class="reference external" href="https://www.sphinx-doc.org/en/master/usage/restructuredtext/roles.html#role-download" title="(in Sphinx v4.0.0+)"><code class="xref rst rst-role docutils literal notranslate"><span class="pre">download</span></code></a></p></td>
584587<td><p><a class="reference download internal" download="" href="../_downloads/ad0ebe55d6b53b1559e0ca8dee6f30b9/reST.rst"><code class="xref download docutils literal notranslate"><span class="pre">this</span> <span class="pre">file</span></code></a></p></td>
585588<td><p><code class="docutils literal notranslate"><span class="pre">:download:`this</span> <span class="pre">file</span> <span class="pre">&lt;reST.rst&gt;`</span></code></p></td>
586589</tr>
587590<tr class="row-even"><td><p><a class="reference internal" href="#math">math</a></p></td>
588−<td><p><span class="math">a^2 + b^2 = c^2</span></p></td>
591+<td><p><img class="math" src="../_images/math/6673b43f9fe29455c1fcd1164e5844698cc64d38.svg" alt="a^2 + b^2 = c^2"/></p></td>
589592<td><p><code class="docutils literal notranslate"><span class="pre">:math:`a^2</span> <span class="pre">+</span> <span class="pre">b^2</span> <span class="pre">=</span> <span class="pre">c^2`</span></code></p></td>
590593</tr>
591−<tr class="row-odd"><td><p><a class="reference external" href="https://www.sphinx-doc.org/en/master/usage/restructuredtext/roles.html#role-ref" title="(in Sphinx v4.0.0+/b1400ac42)"><code class="xref rst rst-role docutils literal notranslate"><span class="pre">ref</span></code></a></p></td>
594+<tr class="row-odd"><td><p><a class="reference external" href="https://www.sphinx-doc.org/en/master/usage/restructuredtext/roles.html#role-ref" title="(in Sphinx v4.0.0+)"><code class="xref rst rst-role docutils literal notranslate"><span class="pre">ref</span></code></a></p></td>
592595<td><p><a class="reference internal" href="#svg-image-example"><span class="std std-ref">Simple SVG image.</span></a></p></td>
593596<td><p><code class="docutils literal notranslate"><span class="pre">:ref:`svg</span> <span class="pre">image</span> <span class="pre">example`</span></code></p></td>
594597</tr>
595−<tr class="row-even"><td><p><a class="reference external" href="https://www.sphinx-doc.org/en/master/usage/restructuredtext/roles.html#role-command" title="(in Sphinx v4.0.0+/b1400ac42)"><code class="xref rst rst-role docutils literal notranslate"><span class="pre">command</span></code></a></p></td>
598+<tr class="row-even"><td><p><a class="reference external" href="https://www.sphinx-doc.org/en/master/usage/restructuredtext/roles.html#role-command" title="(in Sphinx v4.0.0+)"><code class="xref rst rst-role docutils literal notranslate"><span class="pre">command</span></code></a></p></td>
596599<td><p><strong class="command">ls -la</strong></p></td>
597600<td><p><code class="docutils literal notranslate"><span class="pre">:command:`ls</span> <span class="pre">-la`</span></code></p></td>
598601</tr>
@@ -784,7 +787,7 @@ item uses two lines.</p></li>
784787</div>
785788<div class="section" id="horizontal-list">
786789<h3><a class="toc-backref" href="#id35">Horizontal list</a><a class="headerlink" href="#horizontal-list" title="Permalink to this headline">¶</a></h3>
787−<p>The <a class="reference external" href="https://www.sphinx-doc.org/en/master/usage/restructuredtext/directives.html#directive-hlist" title="(in Sphinx v4.0.0+/b1400ac42)"><code class="xref rst rst-dir docutils literal notranslate"><span class="pre">..</span> <span class="pre">hlist::</span></code></a> transforms a bullet list into a more compact
790+<p>The <a class="reference external" href="https://www.sphinx-doc.org/en/master/usage/restructuredtext/directives.html#directive-hlist" title="(in Sphinx v4.0.0+)"><code class="xref rst rst-dir docutils literal notranslate"><span class="pre">..</span> <span class="pre">hlist::</span></code></a> transforms a bullet list into a more compact
788791list.</p>
789792<div class="highlight-reST notranslate"><div class="highlight"><pre><span></span><span class="p">..</span> <span class="ow">hlist</span><span class="p">::</span>
790793
@@ -1423,6 +1426,7 @@ build chapter: <a class="reference internal" href="../admin/engines.html#engines
14231426 <span class="m">-</span> O
14241427 <span class="m">-</span> W
14251428 <span class="m">-</span> D
1429+ <span class="m">-</span> DE
14261430
14271431 {% for name, mod in engines.items() %}
14281432
@@ -1439,6 +1443,7 @@ build chapter: <a class="reference internal" href="../admin/engines.html#engines
14391443 <span class="m">-</span> {{(mod.offline and &quot;y&quot;) or &quot;&quot;}}
14401444 <span class="m">-</span> {{mod.weight or 1 }}
14411445 <span class="m">-</span> {{(mod.disabled and &quot;y&quot;) or &quot;&quot;}}
1446+ <span class="m">-</span> {{(mod.display_error_messages and &quot;y&quot;) or &quot;&quot;}}
14421447
14431448 {% endfor %}
14441449</pre></div>
@@ -1465,44 +1470,19 @@ others are <a class="reference external" href="https://github.com/djungelorm/sph
14651470
14661471<span class="p"> ..</span> <span class="ow">code-block</span><span class="p">::</span> <span class="k">sh</span>
14671472
1468− $ sudo apt install graphviz imagemagick texlive-xetex librsvg2-bin
1473+ $ sudo apt install shellcheck
14691474
14701475<span class="p"> ..</span> <span class="ow">group-tab</span><span class="p">::</span> Arch Linux
14711476
14721477<span class="p"> ..</span> <span class="ow">code-block</span><span class="p">::</span> <span class="k">sh</span>
14731478
1474− $ sudo pacman -S graphviz imagemagick texlive-bin extra/librsvg
1479+ $ sudo pacman -S shellcheck
14751480
14761481<span class="p"> ..</span> <span class="ow">group-tab</span><span class="p">::</span> Fedora / RHEL
14771482
1478−<span class="p"> ..</span> <span class="ow">code-block</span><span class="p">::</span> <span class="k">sh</span>
1479−
1480− $ sudo dnf install graphviz graphviz-gd texlive-xetex-bin librsvg2-tools
1481−
1482−
1483−For PDF output you also need:
1484−
1485−<span class="p">..</span> <span class="ow">tabs</span><span class="p">::</span>
1486−
1487−<span class="p"> ..</span> <span class="ow">group-tab</span><span class="p">::</span> Ubuntu / debian
1488−
1489−<span class="p"> ..</span> <span class="ow">code</span><span class="p">::</span> <span class="k">sh</span>
1490−
1491− $ sudo apt texlive-latex-recommended texlive-extra-utils ttf-dejavu
1492−
1493−<span class="p"> ..</span> <span class="ow">group-tab</span><span class="p">::</span> Arch Linux
1494−
1495−<span class="p"> ..</span> <span class="ow">code</span><span class="p">::</span> <span class="k">sh</span>
1496−
1497− $ sudo pacman -S texlive-core texlive-latexextra ttf-dejavu
1498−
1499−<span class="p"> ..</span> <span class="ow">group-tab</span><span class="p">::</span> Fedora / RHEL
1500−
1501−<span class="p"> ..</span> <span class="ow">code</span><span class="p">::</span> sh
1483+<span class="p"> ..</span> <span class="ow">code-block</span><span class="p">::</span> sh
15021484
1503− $ sudo dnf install \
1504− texlive-collection-fontsrecommended texlive-collection-latex \
1505− dejavu-sans-fonts dejavu-serif-fonts dejavu-sans-mono-fonts
1485+ $ sudo dnf install ShellCheck
15061486</pre></div>
15071487</div>
15081488</div>
@@ -1518,8 +1498,8 @@ For PDF output you also need:
15181498</div>
15191499<p>The input language for mathematics is LaTeX markup using the <a class="reference external" href="https://ctan.org/pkg/amsmath">CTAN: amsmath</a>
15201500package.</p>
1521−<p>To embed LaTeX markup in reST documents, use role <a class="reference external" href="https://www.sphinx-doc.org/en/master/usage/restructuredtext/roles.html#role-math" title="(in Sphinx v4.0.0+/b1400ac42)"><code class="xref rst rst-role docutils literal notranslate"><span class="pre">:math:</span></code></a> for
1522−inline and directive <a class="reference external" href="https://www.sphinx-doc.org/en/master/usage/restructuredtext/directives.html#directive-math" title="(in Sphinx v4.0.0+/b1400ac42)"><code class="xref rst rst-dir docutils literal notranslate"><span class="pre">..</span> <span class="pre">math::</span></code></a> for block markup.</p>
1501+<p>To embed LaTeX markup in reST documents, use role <a class="reference external" href="https://www.sphinx-doc.org/en/master/usage/restructuredtext/roles.html#role-math" title="(in Sphinx v4.0.0+)"><code class="xref rst rst-role docutils literal notranslate"><span class="pre">:math:</span></code></a> for
1502+inline and directive <a class="reference external" href="https://www.sphinx-doc.org/en/master/usage/restructuredtext/directives.html#directive-math" title="(in Sphinx v4.0.0+)"><code class="xref rst rst-dir docutils literal notranslate"><span class="pre">..</span> <span class="pre">math::</span></code></a> for block markup.</p>
15231503<div class="highlight-reST notranslate"><div class="highlight"><pre><span></span>In <span class="na">:math:numref:</span><span class="nv">`schroedinger general`</span> the time-dependent Schrödinger equation
15241504is shown.
15251505
@@ -1535,8 +1515,8 @@ is shown.
15351515<p>In <a class="reference internal" href="#equation-schroedinger-general">(1)</a> the time-dependent Schrödinger equation
15361516is shown.</p>
15371517<div class="math" id="equation-schroedinger-general">
1538−<p><span class="eqno">(1)<a class="headerlink" href="#equation-schroedinger-general" title="Permalink to this equation">¶</a></span><span class="math">\mathrm{i}\hbar\dfrac{\partial}{\partial t} |\,\psi (t) \rangle =
1539− \hat{H} |\,\psi (t) \rangle.</span></p>
1518+<p><span class="eqno">(1)<a class="headerlink" href="#equation-schroedinger-general" title="Permalink to this equation">¶</a></span><img src="../_images/math/a6a994cb6e7278ec30eaebe7e636046d3deccb5b.svg" alt="\mathrm{i}\hbar\dfrac{\partial}{\partial t} |\,\psi (t) \rangle =
1519+ \hat{H} |\,\psi (t) \rangle."/></p>
15401520</div></div>
15411521<p>The next example shows the difference of <code class="docutils literal notranslate"><span class="pre">\tfrac</span></code> (<em>textstyle</em>) and <code class="docutils literal notranslate"><span class="pre">\dfrac</span></code>
15421522(<em>displaystyle</em>) used in a inline markup or another fraction.</p>
@@ -1549,13 +1529,13 @@ is shown.</p>
15491529<p>Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy
15501530eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam
15511531voluptua. …
1552−<code class="docutils literal notranslate"><span class="pre">\tfrac</span></code> <strong>inline example</strong> <span class="math">\tfrac{\tfrac{1}{x}+\tfrac{1}{y}}{y-z}</span>
1532+<code class="docutils literal notranslate"><span class="pre">\tfrac</span></code> <strong>inline example</strong> <img class="math" src="../_images/math/3b8127a8eed95247f9249ea6c85e8e86df1baa82.svg" alt="\tfrac{\tfrac{1}{x}+\tfrac{1}{y}}{y-z}"/>
15531533At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd
15541534gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.</p>
15551535<p>Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy
15561536eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam
15571537voluptua. …
1558−<code class="docutils literal notranslate"><span class="pre">\tfrac</span></code> <strong>inline example</strong> <span class="math">\dfrac{\dfrac{1}{x}+\dfrac{1}{y}}{y-z}</span>
1538+<code class="docutils literal notranslate"><span class="pre">\tfrac</span></code> <strong>inline example</strong> <img class="math" src="../_images/math/07c9ff4251510b06013159f4e45ec9ab97044096.svg" alt="\dfrac{\dfrac{1}{x}+\dfrac{1}{y}}{y-z}"/>
15591539At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd
15601540gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.</p>
15611541</div>
@@ -1563,6 +1543,7 @@ gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.</p>
15631543</div>
15641544
15651545
1546+ <div class="clearer"></div>
15661547 </div>
15671548 </div>
15681549 </div>
@@ -1592,7 +1573,7 @@ gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.</p>
15921573 <li><a href="index.html">Developer documentation</a>
15931574 <ul>
15941575 <li>Previous: <a href="makefile.html" title="previous chapter">Makefile Targets</a>
1595− <li>Next: <a href="../blog/index.html" title="next chapter">Blog</a></ul>
1576+ <li>Next: <a href="../utils/index.html" title="next chapter">Tooling box <code class="docutils literal notranslate"><span class="pre">utils/*</span></code></a></ul>
15961577 </li>
15971578 </ul>
15981579 </li>
@@ -1614,7 +1595,7 @@ gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.</p>
16141595
16151596 <div class="footer" role="contentinfo">
16161597 &#169; Copyright 2015-2020, Adam Tauber, Noémi Ványi.
1617− Created using <a href="http://sphinx-doc.org/">Sphinx</a> 2.4.4.
1598+ Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 3.1.1.
16181599 </div>
16191600 <script src="../_static/version_warning_offset.js"></script>
16201601
dev/search_api.html+6−3
@@ -1,9 +1,10 @@
11
22<!DOCTYPE html>
33
4−<html xmlns="http://www.w3.org/1999/xhtml">
4+<html>
55 <head>
66 <meta charset="utf-8" />
7+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
78 <meta name="viewport" content="width=device-width, initial-scale=1">
89 <title>Search API &#8212; Searx Documentation (Searx-0.16.0.tex)</title>
910 <link rel="stylesheet" href="../_static/searx.css" type="text/css" />
@@ -33,7 +34,8 @@
3334 <a href="engine_overview.html" title="Engine overview"
3435 accesskey="P">previous</a> |</li>
3536 <li class="nav-item nav-item-0"><a href="../index.html">Searx Documentation (Searx-0.16.0.tex)</a> &#187;</li>
36− <li class="nav-item nav-item-1"><a href="index.html" accesskey="U">Developer documentation</a> &#187;</li>
37+ <li class="nav-item nav-item-1"><a href="index.html" accesskey="U">Developer documentation</a> &#187;</li>
38+ <li class="nav-item nav-item-this"><a href="">Search API</a></li>
3739 </ul>
3840 </div>
3941
@@ -141,6 +143,7 @@ instance. See the available options in the preferences page of the instance.</p>
141143</div>
142144
143145
146+ <div class="clearer"></div>
144147 </div>
145148 </div>
146149 </div>
@@ -192,7 +195,7 @@ instance. See the available options in the preferences page of the instance.</p>
192195
193196 <div class="footer" role="contentinfo">
194197 &#169; Copyright 2015-2020, Adam Tauber, Noémi Ványi.
195− Created using <a href="http://sphinx-doc.org/">Sphinx</a> 2.4.4.
198+ Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 3.1.1.
196199 </div>
197200 <script src="../_static/version_warning_offset.js"></script>
198201
dev/translation.html+6−3
@@ -1,9 +1,10 @@
11
22<!DOCTYPE html>
33
4−<html xmlns="http://www.w3.org/1999/xhtml">
4+<html>
55 <head>
66 <meta charset="utf-8" />
7+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
78 <meta name="viewport" content="width=device-width, initial-scale=1">
89 <title>Translation &#8212; Searx Documentation (Searx-0.16.0.tex)</title>
910 <link rel="stylesheet" href="../_static/searx.css" type="text/css" />
@@ -33,7 +34,8 @@
3334 <a href="plugins.html" title="Plugins"
3435 accesskey="P">previous</a> |</li>
3536 <li class="nav-item nav-item-0"><a href="../index.html">Searx Documentation (Searx-0.16.0.tex)</a> &#187;</li>
36− <li class="nav-item nav-item-1"><a href="index.html" accesskey="U">Developer documentation</a> &#187;</li>
37+ <li class="nav-item nav-item-1"><a href="index.html" accesskey="U">Developer documentation</a> &#187;</li>
38+ <li class="nav-item nav-item-this"><a href="">Translation</a></li>
3739 </ul>
3840 </div>
3941
@@ -95,6 +97,7 @@ create a PR.</p>
9597</div>
9698
9799
100+ <div class="clearer"></div>
98101 </div>
99102 </div>
100103 </div>
@@ -146,7 +149,7 @@ create a PR.</p>
146149
147150 <div class="footer" role="contentinfo">
148151 &#169; Copyright 2015-2020, Adam Tauber, Noémi Ványi.
149− Created using <a href="http://sphinx-doc.org/">Sphinx</a> 2.4.4.
152+ Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 3.1.1.
150153 </div>
151154 <script src="../_static/version_warning_offset.js"></script>
152155
genindex.html+6−4
@@ -1,10 +1,10 @@
11
2−
32<!DOCTYPE html>
43
5−<html xmlns="http://www.w3.org/1999/xhtml">
4+<html>
65 <head>
76 <meta charset="utf-8" />
7+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
88 <meta name="viewport" content="width=device-width, initial-scale=1">
99 <title>Index &#8212; Searx Documentation (Searx-0.16.0.tex)</title>
1010 <link rel="stylesheet" href="_static/searx.css" type="text/css" />
@@ -31,7 +31,8 @@
3131 <li class="right" style="margin-right: 10px">
3232 <a href="#" title="General Index"
3333 accesskey="I">index</a></li>
34− <li class="nav-item nav-item-0"><a href="index.html">Searx Documentation (Searx-0.16.0.tex)</a> &#187;</li>
34+ <li class="nav-item nav-item-0"><a href="index.html">Searx Documentation (Searx-0.16.0.tex)</a> &#187;</li>
35+ <li class="nav-item nav-item-this"><a href="">Index</a></li>
3536 </ul>
3637 </div>
3738
@@ -76,6 +77,7 @@
7677
7778
7879
80+ <div class="clearer"></div>
7981 </div>
8082 </div>
8183 </div>
@@ -121,7 +123,7 @@
121123
122124 <div class="footer" role="contentinfo">
123125 &#169; Copyright 2015-2020, Adam Tauber, Noémi Ványi.
124− Created using <a href="http://sphinx-doc.org/">Sphinx</a> 2.4.4.
126+ Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 3.1.1.
125127 </div>
126128 <script src="_static/version_warning_offset.js"></script>
127129
index.html+30−9
@@ -1,9 +1,10 @@
11
22<!DOCTYPE html>
33
4−<html xmlns="http://www.w3.org/1999/xhtml">
4+<html>
55 <head>
66 <meta charset="utf-8" />
7+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
78 <meta name="viewport" content="width=device-width, initial-scale=1">
89 <title>Welcome to searx &#8212; Searx Documentation (Searx-0.16.0.tex)</title>
910 <link rel="stylesheet" href="_static/searx.css" type="text/css" />
@@ -28,7 +29,8 @@
2829 <li class="right" >
2930 <a href="user/index.html" title="User documentation"
3031 accesskey="N">next</a> |</li>
31− <li class="nav-item nav-item-0"><a href="#">Searx Documentation (Searx-0.16.0.tex)</a> &#187;</li>
32+ <li class="nav-item nav-item-0"><a href="#">Searx Documentation (Searx-0.16.0.tex)</a> &#187;</li>
33+ <li class="nav-item nav-item-this"><a href="">Welcome to searx</a></li>
3234 </ul>
3335 </div>
3436
@@ -39,7 +41,14 @@
3941
4042 <div class="section" id="welcome-to-searx">
4143<h1>Welcome to searx<a class="headerlink" href="#welcome-to-searx" title="Permalink to this headline">¶</a></h1>
42−<p>Search without being tracked.</p>
44+<blockquote>
45+<div><p><em>Search without being tracked.</em></p>
46+</div></blockquote>
47+<p>Searx is a free internet metasearch engine which aggregates results from more
48+than 70 search services. Users are neither tracked nor profiled. Additionally,
49+searx can be used over Tor for online anonymity.</p>
50+<p>Get started with searx by using one of the <a class="reference external" href="https://searx.space">Searx-instances</a>. If you don’t trust
51+anyone, you can set up your own, see <a class="reference internal" href="admin/installation.html#installation"><span class="std std-ref">Installation</span></a>.</p>
4352<div class="sidebar">
4453<p class="sidebar-title">Features</p>
4554<ul class="simple">
@@ -54,12 +63,8 @@
5463digital rights</p></li>
5564</ul>
5665</div>
57−<p>Searx is a free internet metasearch engine which aggregates results from more
58−than 70 search services. Users are neither tracked nor profiled. Additionally,
59−searx can be used over Tor for online anonymity.</p>
60−<p>Get started with searx by using one of the <a class="reference external" href="https://searx.space">Searx-instances</a>. If you don’t trust
61−anyone, you can set up your own, see <a class="reference internal" href="admin/installation.html#installation"><span class="std std-ref">Installation</span></a>.</p>
6266<div class="toctree-wrapper compound">
67+<p class="caption"><span class="caption-text">Contents</span></p>
6368<ul>
6469<li class="toctree-l1"><a class="reference internal" href="user/index.html">User documentation</a><ul>
6570<li class="toctree-l2"><a class="reference internal" href="user/search_syntax.html">Search syntax</a></li>
@@ -68,6 +73,12 @@ anyone, you can set up your own, see <a class="reference internal" href="admin/i
6873</li>
6974<li class="toctree-l1"><a class="reference internal" href="admin/index.html">Administrator documentation</a><ul>
7075<li class="toctree-l2"><a class="reference internal" href="admin/installation.html">Installation</a></li>
76+<li class="toctree-l2"><a class="reference internal" href="admin/installation-searx.html">Step by step installation</a></li>
77+<li class="toctree-l2"><a class="reference internal" href="admin/installation-uwsgi.html">uwsgi</a></li>
78+<li class="toctree-l2"><a class="reference internal" href="admin/installation-nginx.html">Install with nginx</a></li>
79+<li class="toctree-l2"><a class="reference internal" href="admin/installation-apache.html">Install with apache</a></li>
80+<li class="toctree-l2"><a class="reference internal" href="admin/installation-docker.html">Docker installation</a></li>
81+<li class="toctree-l2"><a class="reference internal" href="admin/update-searx.html">How to update</a></li>
7182<li class="toctree-l2"><a class="reference internal" href="admin/settings.html"><code class="docutils literal notranslate"><span class="pre">settings.yml</span></code></a></li>
7283<li class="toctree-l2"><a class="reference internal" href="admin/api.html">Administration API</a></li>
7384<li class="toctree-l2"><a class="reference internal" href="admin/architecture.html">Architecture</a></li>
@@ -89,6 +100,15 @@ anyone, you can set up your own, see <a class="reference internal" href="admin/i
89100<li class="toctree-l2"><a class="reference internal" href="dev/reST.html">reST primer</a></li>
90101</ul>
91102</li>
103+<li class="toctree-l1"><a class="reference internal" href="utils/index.html">Tooling box <code class="docutils literal notranslate"><span class="pre">utils/*</span></code></a><ul>
104+<li class="toctree-l2"><a class="reference internal" href="utils/searx.sh.html"><code class="docutils literal notranslate"><span class="pre">utils/searx.sh</span></code></a></li>
105+<li class="toctree-l2"><a class="reference internal" href="utils/filtron.sh.html"><code class="docutils literal notranslate"><span class="pre">utils/filtron.sh</span></code></a></li>
106+<li class="toctree-l2"><a class="reference internal" href="utils/morty.sh.html"><code class="docutils literal notranslate"><span class="pre">utils/morty.sh</span></code></a></li>
107+<li class="toctree-l2"><a class="reference internal" href="utils/lxc.sh.html"><code class="docutils literal notranslate"><span class="pre">utils/lxc.sh</span></code></a></li>
108+<li class="toctree-l2"><a class="reference internal" href="utils/index.html#common-commands-environment">Common commands &amp; environment</a></li>
109+<li class="toctree-l2"><a class="reference internal" href="utils/index.html#tooling-box-setup">Tooling box setup</a></li>
110+</ul>
111+</li>
92112<li class="toctree-l1"><a class="reference internal" href="blog/index.html">Blog</a><ul>
93113<li class="toctree-l2"><a class="reference internal" href="blog/python3.html">Introducing Python 3 support</a></li>
94114<li class="toctree-l2"><a class="reference internal" href="blog/admin.html">Searx admin interface</a></li>
@@ -101,6 +121,7 @@ anyone, you can set up your own, see <a class="reference internal" href="admin/i
101121</div>
102122
103123
124+ <div class="clearer"></div>
104125 </div>
105126 </div>
106127 </div>
@@ -149,7 +170,7 @@ anyone, you can set up your own, see <a class="reference internal" href="admin/i
149170
150171 <div class="footer" role="contentinfo">
151172 &#169; Copyright 2015-2020, Adam Tauber, Noémi Ványi.
152− Created using <a href="http://sphinx-doc.org/">Sphinx</a> 2.4.4.
173+ Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 3.1.1.
153174 </div>
154175 <script src="_static/version_warning_offset.js"></script>
155176
objects.inv

Binary file not shown.

search.html+8−7
@@ -1,9 +1,10 @@
11
22<!DOCTYPE html>
33
4−<html xmlns="http://www.w3.org/1999/xhtml">
4+<html>
55 <head>
66 <meta charset="utf-8" />
7+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
78 <meta name="viewport" content="width=device-width, initial-scale=1">
89 <title>Search &#8212; Searx Documentation (Searx-0.16.0.tex)</title>
910 <link rel="stylesheet" href="_static/searx.css" type="text/css" />
@@ -35,7 +36,8 @@
3536 <li class="right" style="margin-right: 10px">
3637 <a href="genindex.html" title="General Index"
3738 accesskey="I">index</a></li>
38− <li class="nav-item nav-item-0"><a href="index.html">Searx Documentation (Searx-0.16.0.tex)</a> &#187;</li>
39+ <li class="nav-item nav-item-0"><a href="index.html">Searx Documentation (Searx-0.16.0.tex)</a> &#187;</li>
40+ <li class="nav-item nav-item-this"><a href="">Search</a></li>
3941 </ul>
4042 </div>
4143
@@ -53,10 +55,8 @@
5355 </p>
5456 </div>
5557 <p>
56− From here you can search these documents. Enter your search
57− words into the box below and click "search". Note that the search
58− function will automatically search for all of the words. Pages
59− containing fewer words won't appear in the result list.
58+ Searching for multiple words only shows matches that contain
59+ all words.
6060 </p>
6161 <form action="" method="get">
6262 <input type="text" name="q" aria-labelledby="search-documentation" value="" />
@@ -68,6 +68,7 @@
6868
6969 </div>
7070
71+ <div class="clearer"></div>
7172 </div>
7273 </div>
7374 </div>
@@ -103,7 +104,7 @@
103104
104105 <div class="footer" role="contentinfo">
105106 &#169; Copyright 2015-2020, Adam Tauber, Noémi Ványi.
106− Created using <a href="http://sphinx-doc.org/">Sphinx</a> 2.4.4.
107+ Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 3.1.1.
107108 </div>
108109 <script src="_static/version_warning_offset.js"></script>
109110
searchindex.js+1−1
@@ -1 +1 @@
1−Search.setIndex({docnames:["admin/api","admin/architecture","admin/buildhosts","admin/engines","admin/filtron","admin/index","admin/installation","admin/morty","admin/plugins","admin/settings","blog/admin","blog/index","blog/intro-offline","blog/private-engines","blog/python3","dev/contribution_guide","dev/engine_overview","dev/index","dev/makefile","dev/plugins","dev/quickstart","dev/reST","dev/search_api","dev/translation","index","user/index","user/own-instance","user/public_instances","user/search_syntax"],envversion:{"sphinx.domains.c":1,"sphinx.domains.changeset":1,"sphinx.domains.citation":1,"sphinx.domains.cpp":1,"sphinx.domains.index":1,"sphinx.domains.javascript":1,"sphinx.domains.math":2,"sphinx.domains.python":1,"sphinx.domains.rst":1,"sphinx.domains.std":1,"sphinx.ext.intersphinx":1,"sphinx.ext.viewcode":1,sphinx:56},filenames:["admin/api.rst","admin/architecture.rst","admin/buildhosts.rst","admin/engines.rst","admin/filtron.rst","admin/index.rst","admin/installation.rst","admin/morty.rst","admin/plugins.rst","admin/settings.rst","blog/admin.rst","blog/index.rst","blog/intro-offline.rst","blog/private-engines.rst","blog/python3.rst","dev/contribution_guide.rst","dev/engine_overview.rst","dev/index.rst","dev/makefile.rst","dev/plugins.rst","dev/quickstart.rst","dev/reST.rst","dev/search_api.rst","dev/translation.rst","index.rst","user/index.rst","user/own-instance.rst","user/public_instances.rst","user/search_syntax.rst"],objects:{},objnames:{},objtypes:{},terms:{"0xa9":21,"1337x":3,"15px":21,"40px":21,"70px":21,"\u65e5\u672c\u8a9e":9,"boolean":[16,21],"break":[15,21],"byte":16,"case":[6,9,13,20,26],"default":[4,6,7,9,14,15,19,21,22,24,26,28],"espa\u00f1ol":9,"export":18,"fran\u00e7ai":9,"function":[12,16,19,21],"import":[6,12,21],"int":[4,16,21],"long":26,"new":[3,8,10,12,13,15,18,19,20,22,23],"null":[6,15],"public":[1,8,21],"return":[8,12,19,21,26],"schr\u00f6dinger":21,"short":20,"static":[6,19],"switch":15,"t\u00fcrk\u00e7e":9,"true":[0,4,6,9,12,16,19,20,21,22],"try":[18,20,26],"while":[12,18,21],And:21,But:[10,14,16,26],For:[2,4,6,13,15,18,20,21,22],IPs:4,Not:21,One:10,That:21,The:[0,2,6,9,13,16,18,21,22,26],Then:[12,14,20,23],There:[15,21],These:[16,21],Use:4,Used:9,Uses:9,With:[18,21],__dict__:21,__name__:21,_anchor:21,_chapter:21,_doc:21,_dot:21,_rest:21,_section:21,_sphinx:21,_subsect:21,_svg:21,a2enmod:6,abbrev:28,abl:[2,9,12,13,15,16,21],about:[1,6,13,15,18,24],abov:[6,15,21,22],absenc:21,abus:[4,26],academ:3,accept:[12,28],access:[4,8,10,11,12,21,24,26],access_log:6,account:23,accross:9,accusam:21,acg:3,acgsou:3,act:[7,10],action:[0,4],activ:[6,7,9,14,15,20,22],adapt:16,add:[6,7,13,15,18,19,21,28],added:[13,18,19],adding:[12,21],addit:[2,6,16,18,20,21],addition:[24,26],address:[7,9,16,26],adipisici:21,adjust:18,admin:[9,11,13,21,24],administr:[10,12,13,22,24,26],adopt:15,adorn:21,ads:26,advantag:[10,21],advertis:26,advis:[4,6],aearx:9,af2cae6:21,affect:10,after:[14,19,20,21,23],again:18,agent:[4,8,9,16],aggreg:[4,24,26],ahrefsbot:4,aim:[10,18,21],aka:18,alia:6,align:21,aliquid:21,aliquyam:21,all:[0,7,14,15,16,18,21,22],allow:[6,9,21,28],along:4,alreadi:[15,20],also:[2,6,15,18,21,26,28],alt:21,alter:15,altern:[20,21],alwai:[16,20,26],amet:21,among:[15,26],amsmath:21,ancel:21,ani:[1,2,18,21,22,24],annoi:21,anonym:[24,26],anoth:[9,10,16,21],answer:[9,21,26],anyon:24,anyth:[9,14,26],anywai:[18,21],apach:9,apache2:6,api:[5,9,13,16,17,23,24],api_kei:[9,16],apikei:9,apk:3,apkm:3,apkmirror:3,app:[3,6,21],appear:[20,21],append:12,appli:[6,9,15],applic:[4,6,9,10],apt:[2,6,20,21],arbitrari:[12,16],arch:[0,2,3,13,21],architectur:[5,24],archiv:[3,4],archlinux:[3,13],argument:[7,8,21],arrai:16,arrow:21,art:[21,22],articl:1,arx:3,arxiv:3,asciimoo:[6,15,18,20,23],ascrib:21,aspect:15,assert:15,assign:16,assum:21,asterisk:21,attach:19,attent:21,attribut:21,audienc:21,author:[15,21],auto:[21,23],autobuild:18,autocomplet:[0,22],autodoc:21,automat:[8,21],avail:[6,8,9,12,15,20,22,26],avoid:[4,8,9],awar:21,babel:6,back:6,backquot:21,backslash:21,baiduspid:4,balanc:18,ban:26,bang:9,bar:21,barrier:10,base:[9,12,16,18,22],base_url:[6,9,16],baseprofil:21,bash:[6,21],baz:21,becaus:[10,13,15,16,20,23,26],becom:21,been:[12,15,27],befor:[14,15,18,19,20,21,26],behavior:21,behaviour:[8,15,19],being:[4,9,10,14,24],below:[4,6,9,15,20,21,23],benefit:13,besid:26,best:[2,18,21,26],better:[2,6,16,18,26],between:[16,21],big:21,bigger:9,biggest:10,bii:3,bin:[2,3,6,14,18,20,21],bing:[3,9],bing_imag:3,bing_new:3,bing_video:3,bingbot:4,bit:21,bitbucket:[0,3],biv:3,black:21,blank:[9,21],block:[4,9],blog:[21,24],bodi:[15,21],boilerpl:18,bold:21,boldfac:21,born:15,bot:4,both:[13,14,15,22,26],botlimit:4,bottom:8,boundingbox:16,branch:[15,18],brand:18,bring:[18,21],broken:21,browser:[8,9,10,14,15,18,26],btdigg:3,bug:[18,20],bugreport:15,build:6,builder:21,buildhost:[5,24],built:[15,16,20,21],builtin:[5,19,24],c3tv:3,call:[10,13,18,23],callback:19,can:[0,2,4,6,7,9,10,12,13,14,15,16,18,19,20,21,24,26],cancel:21,cannot:[2,21,26],capabl:[10,15],caplabl:12,captcha:26,caption:21,cardin:15,care:[9,21],carv:13,catcher:21,categori:[0,3,8,9,12,16,21,22,28],caution:21,caveat:21,ccc:3,cdn:2,cell:21,certif:6,cfg:[3,21],chain:18,chainabl:28,chang:[6,9,14,15,18,21],chapter:[14,15,21],charact:[15,21],chdir:6,check:[2,12,15,16,18,20,23],checker:18,checkout:15,chmod:6,choic:[21,26],choos:[15,16],chown:6,chronolog:21,citi:16,classifi:21,clear:26,cli:[20,23],client:4,clita:21,clock:14,clone:[6,15,18,20],code:[3,6,9,12,18,20,22,26],codebas:10,col:21,collabor:1,colleagu:13,collect:[2,21],colon:21,colspan:21,column:21,com:[6,16,18,20,21,22,23],combin:6,come:[4,13,14,15,18,26],comfort:21,comma:[13,22],command:[2,4,6,14,20,21,23],comment:21,commit:[18,20,23],commodi:21,common:[20,26],commonli:21,commun:12,compact:21,compani:26,compat:14,compil:23,complet:[15,22],compon:19,compromis:26,comput:26,con:21,concern:15,concret:[13,21],condit:21,conf:[6,21],config:[0,6,13,16,21,23],configur:[10,12,13,21,23,26],confus:21,connect:[12,24],consectetur:21,consequ:[9,15],consequat:21,consetetur:21,construct:[16,21],consult:20,contact:9,contain:[8,9,20,21],content:26,context:[19,21],continu:21,contribut:[1,2,17,18,24],contributor:21,control:26,convent:15,convert:21,cooki:[16,24,26],copi:[15,21],copyright:21,core:[2,12,21],corner:15,correct:9,could:[9,16,21],count:[6,21],countri:[9,16],coupl:6,courgett:22,cours:21,coverag:20,cpu:6,crawler:21,creat:[6,9,12,14,20,21,22,23],creation:[2,21],creativ:13,cross:21,crossref:3,cryptic:20,cryptographi:9,cspan:21,css:[8,19],css_depend:19,csv:[4,22],csv_tabl:21,ctan:21,cthulhu:28,ctrl:18,ctx:19,curl:4,currenc:3,currency_convert:3,current:[8,9,12,15,16,23,28],custom:[9,15,21,28],customiz:[0,10],customlog:6,cycl:18,dai:[18,22],dailymot:3,dalf:1,danger:21,data:[16,21,26],databas:[13,21],date:[0,16],datetim:[16,21],daunt:10,dbpedia:22,ddd:3,ddg:[3,28],ddi:3,de_d:9,deactiv:9,debian:[2,6,21],debug:[6,9,18],decid:[10,18],decim:16,dedic:21,deeper:[18,21],deezer:3,def:[12,16,19,21],defaul:21,default_local:[0,9],default_on:19,default_them:[0,9],defin:[9,19,21],definit:3,dejavu:[2,21],delet:[9,22,23],delimit:21,demon:6,depen:4,depend:[6,8,10,12,14,16,20,21,22],deploi:[6,9,18,21],describ:[9,18,21],descript:[8,15,19,21],deserv:15,design:[12,21],desir:[16,20],detail:[9,12,21],detect:9,deutsch:[0,9],dev:[6,15,18,21],develop:[9,10,13,14,15,18,21,24],deviantart:3,dfrac:21,diam:21,dict:21,dictzon:3,didn:9,diff:21,differ:[14,15,16,21],digg:3,digit:24,digraph:21,direct:21,directli:9,directori:3,disabl:[3,8,9,18,19,21,22],disabled_engin:22,disabled_plugin:22,disadvantag:21,discoveri:[12,13],displai:[2,8,9],displaystyl:21,disrespect:15,dist:[15,18],distinguish:21,distribut:[13,21],dive:26,dnf:[2,21],doai_rewrit:22,doc:[3,21],dockerfil:6,docs_url:18,doctest:21,doctre:21,document:[12,13,18,21,24],docutil:21,doe:[10,12,16,18,21,22],doesn:9,doi:8,dolor:21,domain:[6,21],domin:15,don:[14,18,21,24],done:[18,21],dot:2,doubl:21,download:21,drop:14,duckduckgo:[3,22,28],duckduckgo_definit:3,duckduckgo_imag:3,duden:3,duo:21,duref:21,dvisvgm:2,each:[21,22],easi:24,easier:15,easili:15,ecosystem:21,edit:[6,10,15,18,21,26],effect:[15,21],effort:1,egg_info:18,eirmod:21,either:20,element:21,elimin:20,elit:21,elitr:21,emac:21,email:9,emb:21,embed:[0,6,21],emphasi:21,empti:[21,22],en_u:[9,16],enabl:[0,6,13,15,18,20,22],enabled_engin:22,enabled_plugin:22,enclos:21,encod:21,encourag:21,encrypt:24,end:[14,21],endfor:21,engin:[0,5,10,11,15,17,20,21,22,24,26,28],english:[0,9],enim:21,enough:23,enpoint:22,ensur:15,enter:[6,14],eos:21,equat:2,erat:21,erowid:3,error:[9,20,21],error_log:6,escap:21,especi:21,esperanto:0,essenti:6,est:21,etc:[4,6,15],eto:3,etool:3,etymonlin:3,evalu:21,everi:[9,15,16,26],everyon:[12,26],everyth:[6,21,26],exactli:[4,21],exampl:[0,4,6,12,13,15,20,22,26],exceed:4,except:[14,15,21],exchang:26,execut:[9,23],exercit:21,exist:[10,14,15,18],exit:6,expect:[13,15],experienc:10,explain:15,explicit:21,expos:13,ext:2,extend:[12,15,19,21],extens:[2,21],extern:[4,7,16,21,22,26],extra:[2,21],extrem:10,eye:21,face:21,fail:20,fals:[0,6,9,19,20,21,22],familiar:18,fanci:15,faq:21,faroo:3,favorit:[15,18],fdroid:3,featur:[7,10,13,15,21,26],fedora:[2,21],feedback:[15,21],feedfetch:4,feel:[1,19,21],few:[9,15,16],fieldnam:21,file:[3,6,9,10,12,13,14,15,18,19,20,23],file_filt:23,filenam:16,files:16,fill:21,filter:[0,4,22],find:[1,4,12,13],fine:6,finish:23,firewal:4,first:[10,12,14,18,20,21,26],fit:[13,19],fix:[15,18,20],fixpathinfo:6,flask:[19,21],flexibl:21,flickr:3,flickr_noapi:3,folder:[15,16,18,20,21,23],follow:[4,7,15,16,20,21,23],followsymlink:6,font:[2,21],fontsrecommend:[2,21],footer:15,fork:15,form:[0,21,26],format:[4,16,20,21,22],forward:[4,6,26],found:[2,4,10,18],foundat:[10,12,13,14],fr_fr:9,fraction:21,framalibr:3,free:[3,6,19,24],friend:[13,18,26],frinkiac:3,frk:3,frl:3,from:[1,2,4,8,9,10,12,13,14,15,18,21,23,24,26],front:21,fsd:3,full:[9,15,21],fulli:10,fund:[12,13],further:[18,20],furthermor:[16,20,22,26],gain:26,gate:18,geektim:3,gen:3,gener:[0,3,9,12,15,26],genesi:3,geniu:3,gentoo:3,geojson:16,german:0,get:[2,6,8,15,16,18,20,21,22,23,24],get_engines_stat:21,gid:6,gigablast:3,git:[2,6,15,16,18,20,21],git_url:18,github:[3,6,12,14,18,20,21,22],gitlab:3,gitmoji:15,give:[18,20],given:21,glyph:21,gnu:18,goe:18,goi:[0,3],going:[4,12,13,21,26],gon:3,good:20,googl:[0,3,22],google_imag:3,google_new:3,google_video:3,googlebot:4,gos:3,gov:3,gpa:3,gpm:3,gps:3,grant:6,graphic:10,graphviz:2,group:[21,26],grow:10,grumpi:21,grunt:20,grunt_build:20,gubergren:21,guid:[10,18,20,21],guidelin:13,guilabel:21,habr:3,habrahabr:3,hack:[10,12,13,14,15],hackerspac:28,handl:[9,21,26],handler:6,happi:[10,12,13,14,15],hard:[10,21],has:[7,12,13,15,16,20,21,26,27],hat:21,have:[1,2,6,9,10,14,15,16,18,21,26],hbar:21,header:[4,16,21],heard:21,hebrew:9,height:21,help:[8,15,18,20],helper:21,her:[13,22,26],here:[9,12,15,21],herein:1,hex:6,hidden:[0,13,26],him:13,hint:[1,21],his:[22,26],histor:14,home:23,hoogl:3,host:[2,4,10,13,18,23,24],hotkei:[0,8],hour:6,hous:16,house_numb:16,how:[1,2,5,9,17,18,21,24],howev:[12,16,22],html:[0,2,15,16,18,21],html_math_render:2,http:[0,2,4,6,7,8,9,12,15,16,18,20,21,23,24],http_host:4,https_rewrit:22,hub:6,huge:21,idea:20,imag:[0,2,3,7,9,22,28],image_proxi:[9,22],imagemagick:[2,21],img_src:16,imgmath:2,imgmath_font_s:2,imgmath_image_format:2,imgmath_latex:2,immedi:8,implement:[10,14,15,16,19],impli:13,improv:18,ina:3,inbound:9,includ:[6,13,18,21],inclus:28,increment:18,indent:21,index:6,infinit:8,infinite_scrol:[8,22],info:[9,18],inform:[4,6,7,8,9,13,15,16],infrastructur:1,inherit:21,ini:6,init:[6,12],initi:23,input:[0,13,21],insert:[21,23],insid:16,insight:26,instal:[2,4,5,7,14,15,18,20,21,23,24],instanc:[0,1,5,6,9,10,12,13,18,22,23,24,25],instance_nam:0,instead:[10,13,14,20,21],instruct:21,insuffici:12,integr:24,intent:15,interfac:[9,11,24],interfer:15,intermedi:18,intern:20,internet:[12,24],interpret:[6,21],interpretor:6,intersphinx_map:21,interv:4,introduc:[10,11,12,13,21,24],introduct:[18,20],intuit:21,inv:21,inventori:21,investig:14,invidi:3,invidunt:21,ipsum:21,iso:[9,16],issu:[12,13,14],ital:21,italiano:9,item:21,its:[2,10,15,18,21,22,26],itself:15,jame:4,japanes:9,javascript:8,jinja:21,jinja_context:21,join:21,js_depend:19,json:[4,22],json_engin:3,jump:18,just:[0,18,21,26],justo:21,kasd:21,kbd:21,keep:18,kei:[7,8,9,12,16,23],kickass:3,kind:[21,26],kiss_:21,know:[12,13,21,26],knowledg:21,known:18,kvch:[10,12,13,14],label:21,labor:21,labori:21,lack:15,lang:[0,22,23],languag:[0,3,9,16,18,21,22,23,28],language_support:[16,21],laptop:26,last:21,lat:16,latest:23,latex:2,latexextra:[2,21],latitud:16,latter:18,lazi:6,lc_messag:23,learn:21,least:14,leav:9,leech:16,leecher:16,left:21,legaci:22,length:15,less:[10,20,21,26],let:[21,26],level:[15,21],libapache2:6,libffi:6,librari:3,librsvg2:[2,21],librsvg:[2,21],libssl:6,libxslt:6,light:6,like:[0,2,6,8,9,13,15,16,18,21],like_hotkei:22,limit:[4,11,12,21,24],line:[12,15,18],link:[8,9],linkdexbot:4,lint:18,linux:[0,2,3,13,21],linuxdoc:21,list:[12,13,16,18,19,22,28],listen:[4,6],literalinclud:21,live:21,load:[8,9],lobst:3,local:[0,6,9,13,14,16,18,19,20,23],localhost:6,locat:[4,6,9,21],log:[9,20,26],logic:15,logicodev:22,lon:16,longer:18,longitud:16,look:18,lorem:21,loremlorem:21,low:6,made:9,magna:21,magnetlink:16,magyar:9,mai:[9,21],main:[8,18,23],maintain:21,make:[2,6,10,13,14,15,21,26],makefil:[15,17,24],man:21,manag:[6,10,18,20],mani:4,manipul:10,manual:[9,18,21],manuali:21,map:[0,3,21],mark:21,mass:15,master:[6,15,21],math:2,mathemat:21,mathrm:21,matter:[16,26],max:[4,16],maxim:15,maximum:[15,16],mean:[15,21,26],meaning:21,meant:21,media:[0,3,16],mediawiki:3,memori:9,mention:14,menuselect:21,messag:[4,9,15,18,20,21,23],messagespo:23,meta:21,metadata:21,metasearch:[16,24],method:[0,16,21],microsoft:3,microsoft_academ:3,might:[13,15,18,21,22,26],migrat:14,min:16,minim:21,mirror:3,misbehav:15,miss:21,mixcloud:3,mj12bot:4,mjk:3,mod:[6,21],mode:[9,21],modifi:[9,21,28],modul:[6,21],mojeek:3,monet:26,mono:[2,21],month:[0,22],more:[6,7,9,10,12,15,18,21,22,24,26],morecol:21,morerow:21,morti:7,most:[2,9,14,26],mostli:21,move:[12,15,27],movi:3,msnbot:4,much:[15,21],multibl:16,multipl:[8,9,21,26],music:3,must:[9,14,15,16,20,21],my_arg:21,my_funct:21,my_other_arg:21,mymemori:3,myproject:20,name:[0,3,4,6,8,9,13,16,18,19,23],navig:8,necessari:[6,13],nederland:9,need:[9,12,15,18,21,26],neither:24,net:24,netvib:4,network:9,never:18,newcom:10,nework:9,next:[8,21],nginx:[4,9],nightmar:21,nisi:21,nlnet:[10,12,13,14],node:20,nodej:20,non:12,none:[16,18,21,22],nonumi:21,nor:24,normal:[16,21],nostrud:21,note:[6,15,22],now:[13,14,19],npm:[3,20],number:[4,6,9,16,21,22],number_of_result:16,numer:21,numref:21,nyaa:3,oad:3,oap:3,obj:21,object:[16,19,21],obtain:9,off:[6,15],offlin:[3,11,13,16,21,24],often:[16,21],okhin:6,on_result:19,one:[9,13,15,18,21,24,26],ones:16,ongo:18,onli:[2,6,7,9,13,15,19,21,22],onlin:[12,21,24],open:[8,14,15,18,21,22,26],open_results_on_new_tab:8,openairedataset:3,openairepubl:3,openrepo:3,openssl:6,openstreetmap:[0,3],oper:[14,21,26],option:[6,7,9,10,13,15,16,18,19,20,21,22,26],order:[15,20,21],org:[2,9,16,21],org_bot:4,organ:24,origin:[6,21],oscar:[0,9,22],osm:[0,3,16],other:[9,15,16,21,26],otherwis:16,our:[10,15,18,21],out:[12,15,18,21],outgo:9,outgoing_proxi:9,output:[2,13,21,22],outstand:21,over:[21,24],overlin:21,overview:[9,17,18,22,24],overwrit:8,overwritten:16,own:[18,24,26],owner:18,packag:[2,6,18,20,21],pacman:[2,21],page:[3,4,8,9,10,13,15,16,21,22,26,27,28],pageno:[16,22],pagenumb:16,pair:12,palletsproject:21,param:[4,12,16,21],paramet:16,paramt:16,parent:21,pars:22,parse_lin:12,part:[9,10,21],parti:26,partial:21,partli:16,pass:[12,22],past:0,patch:[15,21],path:[4,6,9],paywal:8,pdb:3,pdbe:3,pdf:[2,21],peopl:[10,26],pep8:[15,18,20],pep8_check:18,pep:21,per:[15,16,21],perform:[8,12,16],phase:20,photon:3,phrase:21,piec:21,pip3:14,pip:23,pipe:12,piratebai:3,pix:22,place:[15,16,21,23,26],plai:3,plaintext:21,pleas:[6,14,15,20,21,22],plenti:15,plugin:[0,5,6,15,17,22,24],point:[6,18,21,26],pointer:21,pointhi:22,polygon:21,popen:12,popular:21,port:[4,6,9],possibl:[6,7,8,9,12,13,21,22],post:[0,6,15,22],post_search:19,postcod:16,pot:23,pov:21,power:21,practic:15,pre_search:19,prefer:[10,13,21,22,26,28],prefix:28,prepar:[11,24],prerequisit:21,present:[12,13],preserv:[15,21],press:[8,18],pretti:9,preview:16,primer:[17,24],principl:21,privaci:[6,21],privat:[12,24,25],pro:21,problem:4,proce:6,process:[2,4,12,13,18],processor:21,produc:21,product:9,profil:[18,24,26],program:18,project:[4,18,21],promot:24,proper:26,properli:14,propos:12,protect:[5,15,24],provid:[13,15,16,21],proxi:[5,6,9,22,24,26],proxifi:7,proxy_add_x_forwarded_for:[4,6],proxy_buff:6,proxy_pass:[4,6],proxy_set_head:[4,6],psi:21,pub:3,publicli:12,publish:16,publishedd:16,pubm:3,pull:[6,12,15,21,23],purpos:[9,16,20],push:[15,18],py3:18,pybabel:23,pyclean:18,pyenv:18,pygment:21,pylintrc:18,pypi:[18,21],python2:14,python3:14,python:[4,6,9,11,20,21,24],pythonpath:6,quadratur:24,qualiti:[2,18,21],queri:[8,12,13,16,22,26,28],question:[21,26],qui:21,quickstart:[15,17,18,24],quit:[15,18],qwant:3,qwer:28,qwi:3,qwn:3,qws:3,rais:12,rand:6,random:[16,26],rang:[3,16,22],rangl:21,rate:4,rather:13,raw:21,reach:21,reactiv:9,read:[12,15,18,20],readability_:21,reader:21,readlin:12,readm:7,real:4,reason:[10,14,21],rebuild:15,rebum:21,recommend:[2,15,16,18,21],reconsid:15,record:21,reddit:3,redefin:16,redirect:8,reduc:15,refer:[1,21,26],referenc:21,refnam:21,regardless:26,regular:12,rel:21,releas:[14,18],rememb:15,remote_addr:4,remov:[8,26],renam:22,render:2,replac:[10,19],repo:15,repositori:[6,10],request:[9,12,13,15,19,21,26],request_timeout:9,requir:[2,8,14,15,16,18,20,21,22],requisit:18,reset:26,respect:[15,26],respons:9,rest:[13,17,24],restart:[6,7],restrict:13,restructuredtext:21,result:[2,5,8,9,12,21,22,24,26],result_proxi:7,results_on_new_tab:22,retriev:23,return42:21,return_cod:12,revers:6,rewrit:[0,8],rfc:21,rhel:[2,21],rid:18,right:[6,13,19,21,24],rightmost:21,rigth:21,road:16,roboag:4,robot:[18,20],robotframework:14,rolenam:21,romanian:9,root:[6,18],rotat:21,round:15,rout:[6,21],row:21,rowspan:21,rspan:21,rss:[4,22],rst:[15,21],rule:[4,15],run:[2,4,6,7,9,12,13,15,16,19,21,23,26],runtimeerror:12,russian:9,sadipsc:21,safe:[3,22],safe_search:0,safesearch:[21,22],same:[4,8,9,16,21],sampl:21,san:[2,21],sanctu:21,satisfi:20,scalabl:21,scale:21,scaleabl:21,scc:3,scd:3,schedul:[12,14],scheme:[4,6],scholar:3,schroeding:21,scienc:3,scope:15,scrapi:4,scratch:2,script:[4,6,20],script_nam:6,scroll:8,sdist:18,sea:21,search:[3,4,8,9,12,13,15,16,17,21,24,25,26],search_on_category_select:[8,22],search_path:16,search_str:16,searchcod:3,searchcode_cod:3,searchcode_doc:3,searx:[0,1,4,7,9,11,12,15,16,18,19,20,21,22,23,27,28],searx_url:18,searx_userag:9,sec:4,second:[9,21],secret:[9,13],secret_kei:9,section:[9,18,21],secur:24,sed:[6,21],see:[1,2,6,7,9,12,13,15,20,21,22,24,28],seed:16,seeder:16,seedpeer:3,select:[8,18,21,26,28],selenium:20,self:[8,10,24],self_inform:22,semant:[3,15],send:[1,2,4,9,26],sens:21,sent:26,separ:[13,15,21,22],seri:18,serif:[2,21],serv:[15,26],server:[9,20],server_nam:6,servic:[4,6,7,21,22,24,26],session:20,set:[2,3,5,6,7,10,12,18,20,21,22,23,24,26,28],sethandl:6,setup:[1,2,5,6,21,24],seznam:3,seznambot:4,share:13,she:[13,26],shortcut:[0,3,9,13,16,21],should:[6,9,10,14,15,21,23],show:[1,2,21],shown:21,side:21,sign:21,signifi:21,similar:21,simpl:[18,22],simplest:21,simpli:[15,18,22],simplifi:18,sinc:[10,18,21],singl:[6,26],sit:21,site:[0,6,9,16,21,22],size:16,skeleton:12,skip:20,slow:9,slurp:4,small:16,smtbot:4,snippet:7,social:[0,3],sock:9,socket:6,softwar:3,sold:26,solut:13,solv:[4,13],some:[1,6,9,13,15,18,21],someon:26,someth:[15,18],sometim:10,soundcloud:3,sourc:[9,14,18,21,23,26],source_fil:23,source_ip:9,source_lang:23,space:[9,27],span:21,spars:21,special:16,specif:[6,9,16],specifi:[9,16,22],speu:3,sphinx:15,splinter:14,split:15,sponsor:[10,12,13,14],ssl:[6,16,24],stabl:9,stack:20,stackoverflow:3,stage:21,standalon:10,standard:[15,16],start:[1,4,6,15,16,18,24],startpag:[3,22],stash:[6,18],stat:21,statist:21,stdout:12,step:[6,15],stet:21,stone:13,stop:[4,18],store:[16,26],street:16,strict:13,string:[13,16,22,23],stroke:21,strong:21,structur:15,stub:21,stuff:21,style:22,sub:[15,21],subject:21,submit:15,subprocess:12,subrul:4,subscript:21,subsect:21,sudo:[2,6,20,21],suffix:9,suggest:[1,19],suitabl:21,sup:21,superscript:21,supervisor:10,support:[2,3,6,9,11,13,15,16,21,22,24,26],sure:[6,14],surround:21,svg:2,svg_imag:21,symlink:6,syntax:[22,24,25],system:[13,14,15,21],szn:3,tab:[8,22],tabl:12,tailor:26,take:[9,10,15,23],taken:21,takimata:21,tar:18,target:[15,17,21,24],task:21,tell:16,templat:[12,16],tempor:21,term:21,test:[8,14,15],texliv:[2,21],text:[0,16,21],textstyl:21,tfrac:21,than:[9,21,24],thei:[9,13,21,26],them:[9,18,21],theme:[9,22],themes_path:9,themselv:13,therefor:21,thi:[1,4,6,7,8,9,10,12,13,14,16,18,19,20,21,22,26,27],thing:21,think:[15,18,21],third:[21,26],those:[12,23,26],thread:6,three:[15,19,21,26],through:[9,13,21,22,26],thu:[12,14,22,26],thumbnail:16,thumbnail_src:16,time:[4,9,14,15,16,21,22,26],time_rang:[0,22],time_range_support:[16,21],timeout:[3,9,16,21],tip:21,titl:16,tld:6,todai:12,togeth:12,token:[12,13],tokyotoshokan:3,too:[4,9,21,26],tool:[2,10,15,21,23],top:21,tor:[3,24,26],torrentfil:16,torrentz:3,touch:9,tpb:3,trace:20,track:[24,26],tracker:8,tracker_url_remov:22,trademark:21,traffic:6,train:21,transform:21,transifex:15,transifexrc:23,translat:[3,9,17,24],travi:[14,20],tree:18,trust:[13,24,26],ttf:[2,21],tupl:19,turn:[15,20],twice:6,twine:18,twitter:3,two:[15,21,22],txt:[14,18,21],type:[0,15,16,18,22,23,26],typic:[1,21],typo:21,ubuntu:[2,6,21],ugli:[10,21],uid:6,ullamco:21,ultrasecretkei:[6,9],uncom:9,uncommon:15,under:[13,16],understand:[10,21],unfortun:15,uninstal:18,unit:[15,18],unit_test:[18,20],univers:6,unix:6,unknown:26,unless:13,unlik:26,unspecifi:16,unsplash:3,untouch:18,updat:[9,15],update_dev_packag:20,update_packag:6,upload:18,url:[0,7,8,9,15,16,18,26],urlencod:16,usag:[18,21],use:[6,7,9,12,13,15,16,18,20,21,24,25],used:[6,9,14,15,16,21,24,26],useful:9,user:[4,6,8,9,13,15,16,21,24,26],useradd:6,userag:4,useragent_suffix:9,uses:[9,16,21,26],using:[4,6,9,15,18,20,21,23,24],usr:6,usual:[6,14,26],utf:21,util:[2,21],uwsgi_param:6,uwsgi_pass:6,uwsgisocket:6,valid:[16,20,22],valu:[0,12,16,21,22],variabl:16,variant:21,variou:[15,19],vector:21,vendor:15,veniam:21,venv3:14,verifi:16,vero:21,version:[8,14,21],via:[10,28],video:3,view:26,viewbox:21,vim:[0,8,22],vim_hotkei:8,vimeo:3,virtual:6,virtualenv:[6,14,18,20],virualenv:18,visist:21,visit:[21,26],voat:3,voluptua:21,vpn:26,vulner:26,wai:[12,15,16,21,26],wait:[9,12],want:[9,13,14,15,18,21,22,26],warn:[2,21],watch:15,web:[9,10,18],webapp:[6,9,14,18,21],webcrawl:4,webserv:6,websit:0,weight:[9,21],weigth:[3,9],weird:15,welcom:1,well:21,were:[12,13,14],werkzeug:18,wget:4,what:21,whatev:[6,18],when:[2,8,9,14,19,20,21,26],where:[4,9,21],whether:[20,26],which:[4,9,10,12,13,15,16,18,21,22,24,26],whl:18,who:[6,10,12,26],whole:[6,19],why:[21,24,25],wide:15,widen:21,width:21,wiki:[0,3,12,13,21],wikidata:3,wikipedia:[3,9,22,28],window:8,wish:9,within:[18,21],without:[2,9,16,24,26],wolframalpha:3,wolframalpha_noapi:3,won:[9,14],wonderfal:6,word:[19,21,22],work:[6,9,15,16,18,20,26],worker:6,world:[15,21,26],worri:14,worth:26,would:13,wrong:18,wsgi:6,www1x:3,www:[2,21,23],wysiwyg:15,xdg:18,xetex:[2,21],xml:21,xmln:21,xpath:3,xxxx:21,yacybot:4,yahoo:[3,4],yahoo_new:3,yandex:3,yandexbot:4,yandexmobilebot:4,year:[14,22],yet:[15,16,18],yhn:3,yml:[3,5,6,7,10,12,18,20,22,24],you:[1,2,6,9,12,15,18,20,21,22,24,26,28],your:[1,2,6,7,8,9,10,11,14,15,18,19,21,24],your_morty_proxy_kei:7,yourself:15,youtub:3,youtube_noapi:3,yyyi:21,zero:12,zgrab:4,zlib1g:6,zzzz:21},titles:["Administration API","Architecture","Buildhosts","Engines","How to protect an instance","Administrator documentation","Installation","How to setup result proxy","Plugins builtin","<code class=\"docutils literal notranslate\"><span class=\"pre\">settings.yml</span></code>","Searx admin interface","Blog","Preparation for offline engines","Limit access to your searx engines","Introducing Python 3 support","How to contribute","Engine overview","Developer documentation","Makefile Targets","Plugins","Development Quickstart","reST primer","Search API","Translation","Welcome to searx","User documentation","Why use a private instance?","&lt;no title&gt;","Search syntax"],titleterms:{"default":[3,8,16],"public":26,"return":16,The:15,about:[21,26],access:13,acknowledg:[10,12,13,14],activ:18,admin:10,administr:[0,5],admonit:21,aka:21,anchor:21,apach:6,api:[0,22],architectur:1,argument:16,articl:[2,21],ascii:21,bar:0,basic:[6,21],bibliograph:21,block:21,blog:11,bug:14,build:[2,15,18,20,21],buildhost:2,built:[3,8],builtin:8,bullet:21,check:6,clean:[15,18],code:[15,16,21],commit:15,compil:20,conclus:26,configur:[0,3,4,6,8,16],consequ:26,content:[6,16,18,21],contribut:15,creat:15,csv:21,data:0,debug:20,definit:21,deploi:15,design:15,develop:[12,17,20],direct:15,disabl:6,doc:[2,15,18],docker:6,document:[5,15,17,25],doe:26,dot:21,drop:18,emb:0,engin:[3,9,12,13,16],entri:19,environ:[18,20,21],equat:21,exampl:[16,19,21,28],ext:21,extlink:21,fact:14,featur:24,field:21,figur:21,file:[16,21],filtron:4,flat:21,foo:21,fork:18,found:14,from:6,fun:14,further:[3,8,9,19,21,22],gate:21,gener:[16,21],get:0,github:15,global:9,good:15,graphviz:21,grid:21,hackabl:15,head:21,hello:21,highlight:21,hlist:21,hook:19,horizont:21,host:6,how:[4,6,7,14,15,20,26],hyperlink:21,imag:[16,21],init:23,inlin:21,instal:[6,10],instanc:[4,26],interfac:10,intersphinx:21,introduc:14,javascript:20,kernel:21,kiss:21,latex:21,limit:13,line:21,link:21,list:21,liter:21,live:[15,18],log:6,make:[16,18,20],makefil:[18,20],map:16,markup:21,math:21,matter:21,name:21,need:[1,2],nest:21,next:[12,13],nginx:6,note:21,offlin:12,ordinari:21,oscar:20,overrid:16,overview:16,page:18,paragraph:21,paramet:22,pars:16,pass:16,plugin:[8,19],point:19,post:19,pre:19,prepar:12,prime:15,primer:21,privaci:[15,26],privat:[13,26],process:21,progress:12,project:23,protect:[4,26],proxi:7,pybuild:18,pyenv:20,pylint:18,python:[14,18],quickstart:20,quot:21,read:[3,8,9,19,21,22],readabl:21,ref:21,refer:6,render:21,request:[4,16],requir:23,respons:0,rest:[15,21],result:[7,16,19],role:21,rout:4,run:[14,18,20],sampl:[0,4],search:[0,19,22,28],searx:[6,10,13,14,24,26],see:26,server:6,set:[9,16],setup:[7,18,20],sidebar:21,simpl:21,skill:21,smart:21,soft:21,some:2,sourc:[15,20],space:21,specif:21,sphinx:[2,21],step:[12,13],structur:21,style:20,subdirectori:6,substitut:21,support:14,svg:21,syntax:[21,28],tab:21,tabl:21,target:[18,20],templat:21,test:[18,20],theme:20,thi:2,through:4,time:[3,8],tip:20,titl:21,torrent:16,transifex:23,translat:[15,23],truth:21,unicod:21,unit:20,updat:[6,23],upgrad:14,upstream:18,url:[6,21],use:26,user:25,using:[14,26],uwsgi:6,video:16,view:21,web:6,welcom:24,what:26,why:26,work:[1,2],yml:[9,16],you:14,your:[13,20]}})
1+Search.setIndex({docnames:["admin/api","admin/architecture","admin/buildhosts","admin/engines","admin/filtron","admin/index","admin/installation","admin/installation-apache","admin/installation-docker","admin/installation-nginx","admin/installation-searx","admin/installation-uwsgi","admin/morty","admin/plugins","admin/settings","admin/update-searx","blog/admin","blog/index","blog/intro-offline","blog/private-engines","blog/python3","dev/contribution_guide","dev/engine_overview","dev/index","dev/makefile","dev/plugins","dev/quickstart","dev/reST","dev/search_api","dev/translation","index","user/index","user/own-instance","user/search_syntax","utils/filtron.sh","utils/index","utils/lxc.sh","utils/morty.sh","utils/searx.sh"],envversion:{"sphinx.domains.c":2,"sphinx.domains.changeset":1,"sphinx.domains.citation":1,"sphinx.domains.cpp":3,"sphinx.domains.index":1,"sphinx.domains.javascript":2,"sphinx.domains.math":2,"sphinx.domains.python":2,"sphinx.domains.rst":2,"sphinx.domains.std":1,"sphinx.ext.intersphinx":1,"sphinx.ext.viewcode":1,sphinx:56},filenames:["admin/api.rst","admin/architecture.rst","admin/buildhosts.rst","admin/engines.rst","admin/filtron.rst","admin/index.rst","admin/installation.rst","admin/installation-apache.rst","admin/installation-docker.rst","admin/installation-nginx.rst","admin/installation-searx.rst","admin/installation-uwsgi.rst","admin/morty.rst","admin/plugins.rst","admin/settings.rst","admin/update-searx.rst","blog/admin.rst","blog/index.rst","blog/intro-offline.rst","blog/private-engines.rst","blog/python3.rst","dev/contribution_guide.rst","dev/engine_overview.rst","dev/index.rst","dev/makefile.rst","dev/plugins.rst","dev/quickstart.rst","dev/reST.rst","dev/search_api.rst","dev/translation.rst","index.rst","user/index.rst","user/own-instance.rst","user/search_syntax.rst","utils/filtron.sh.rst","utils/index.rst","utils/lxc.sh.rst","utils/morty.sh.rst","utils/searx.sh.rst"],objects:{},objnames:{},objtypes:{},terms:{"0pointer":11,"0xa9":27,"10f5827a1c699bdc92caa3c0e921a6cd":10,"1337x":3,"15px":27,"40px":27,"70px":27,"800gbpciex4":38,"\u65e5\u672c\u8a9e":14,"boolean":[22,27],"break":[21,27],"byte":22,"case":[7,9,14,19,26,32,34,37,38],"class":7,"default":[4,7,9,11,12,14,20,21,24,25,27,28,30,32,33,34,35,36,37,38],"espa\u00f1ol":14,"export":[9,10,24,34,36,37],"fran\u00e7ai":14,"function":[18,22,25,27,36],"import":[9,18,27],"int":[4,22,27],"long":32,"new":[3,7,9,10,11,13,16,18,19,21,24,25,26,28,29,37],"null":[7,9,21],"public":[1,6,13,27,35,36],"return":[13,14,18,23,25,27,32],"schr\u00f6dinger":27,"short":26,"static":[2,4,9,25],"switch":[7,21],"t\u00fcrk\u00e7e":14,"true":[0,4,7,9,10,11,14,18,22,25,26,27,28,34,37],"try":[10,24,26,32],"var":7,"while":[11,18,24,27],And:[7,27],But:[16,20,22,32,36],DNS:[35,36],For:[2,4,7,8,9,10,11,19,21,24,26,27,28],IPs:[4,35],Not:27,One:[11,16],That:27,The:[0,2,5,6,11,14,19,22,24,27,28,32,34,35,36,37,38],Then:[18,20,26,29],There:[7,11,21,27],These:[22,27],USE:7,Use:[4,7,9],Used:[7,14],Uses:14,With:[7,24,27,36],__dict__:27,__name__:27,_anchor:27,_chapter:27,_doc:27,_dot:27,_rest:27,_section:27,_sphinx:27,_subsect:27,_svg:27,a2disconf:7,a2dismod:7,a2dissit:7,a2enconf:7,a2enmod:7,a2ensit:7,abbrev:33,abl:[2,14,18,19,21,22,27],about:[1,19,21,24,30,36],abov:[7,10,21,27,28,36],absenc:27,abus:[4,32],academ:3,accept:[4,10,18,33],access:[4,7,13,16,17,18,27,30,32],access_log:9,accord:11,account:[7,9,29,34,35,37,38],accross:14,accusam:27,acg:3,acgsou:3,acknowledg:17,act:[12,16],action:[0,4,11],activ:[7,9,10,11,12,14,20,21,26,28,34,37,38],adapt:22,add:[6,7,9,11,12,19,21,24,25,27,33,34,35,37,38],added:[11,19,24,25],adding:[18,27,35],addit:[2,22,24,26,27],addition:[30,32],address:[12,14,22,32,35],adipisici:27,adjust:24,admin:[14,17,19,27,30,35,37],administr:[16,18,19,28,30,32],admonit:23,adopt:21,adorn:27,ads:32,advantag:[16,27],advertis:32,advis:[4,7,9],aearx:14,af2cae6:27,affect:16,after:[10,20,25,26,27,29,34,37],again:24,agent:[4,10,13,14,22],aggreg:[4,30,32],agpl:[35,36],aim:[16,24,27],aka:24,alia:9,align:27,aliquid:27,aliquyam:27,all:[0,6,7,12,20,21,22,24,27,28,34,35,36,37,38],allow:[7,10,14,27,33],allowoverrid:7,alltogeth:5,along:4,alreadi:[7,9,21,26],also:[2,7,8,10,11,21,24,27,32,33,35],alt:27,alter:21,altern:[6,9,26,27,36],alwai:[9,22,26,32,34,37],amd64:[34,37],amet:27,among:[21,32],amsmath:27,analysi:2,ancel:27,anchor:23,ani:[2,6,7,11,24,27,28,30,35],annoi:27,anonym:[30,32],anoth:[11,14,16,22,27,36],answer:[14,27,32],anymor:7,anyon:30,anyth:[14,20,32],anywai:[24,27],apach:[1,4,5,6,11,14,30,34,35,36,37,38],apache2:7,apache2ctl:7,api:[5,14,19,22,23,29,30,34],api_kei:[14,22],apikei:14,apk:3,apkm:3,apkmirror:3,app:[3,7,9,11,27,34,37,38],appear:[26,27],append:18,appli:[14,15,21],applic:[4,9,11,14,16,38],approach:11,april:36,apt:[2,7,9,10,26,27],arbitrari:[18,22],arch:[0,2,3,7,9,10,11,19,27],architectur:[4,5,6,7,9,30,34,37,38],archiv:3,archlinux:[3,11,19,36],argument:[12,13,27],arrai:22,arrow:27,art:[27,28],articl:23,arx:3,arxiv:3,asciimoo:[6,8,10,21,24,26,29,34,37,38],ascrib:27,aspect:21,assert:21,assign:22,assum:[10,27],asterisk:27,attach:25,attent:27,attribut:27,audienc:27,author:[21,27],auto:[27,29,36],autobuild:24,autocomplet:[0,28],autodoc:27,autoindex:7,autoindex_modul:7,automat:[11,13,27],avail:[7,9,11,13,14,18,21,26,28,32,34,37,38],avoid:[4,6,13,14],awar:[7,27,35],babel:[2,10],backquot:27,backslash:27,backup:35,balanc:24,ban:32,bang:14,bar:[5,27,34,37],barrier:16,base:[2,10,14,18,22,24,28,36],base_url:[9,14,22],baseprofil:27,bash:[10,27,34,35,36,37],basic:[23,36],batch:35,baz:27,becaus:[16,19,21,22,26,29,32],becom:27,been:[18,21],befor:[6,10,11,20,21,24,25,26,27,32,35,36],beginn:9,behavior:27,behaviour:[11,13,21,25],being:[4,14,16,20,30],below:[4,6,10,11,14,21,26,27,29],benefit:19,besid:32,best:[2,24,27,32,35],better:[2,7,9,22,24,32],between:[4,22,27],big:27,bigger:14,biggest:16,bii:3,bin:[2,3,10,11,20,24,26,34,37],binari:[34,37],bing:[3,14],bing_imag:3,bing_new:3,bing_video:3,bit:[11,27],bitbucket:[0,3],biv:3,black:27,blank:[14,27],block:[4,14,23],blog:[11,27,30],bodi:[10,21,27],boilerpl:[10,24],bold:27,boldfac:27,born:21,both:[11,19,20,21,28,32],botlimit:4,bottom:13,boundingbox:22,box:[1,6,30,36],branch:[21,24,35],brand:[24,35],bring:[24,27],broken:27,browser:[10,13,14,16,20,21,24,32,36],btdigg:3,bug:[11,17,24,26],buggi:11,bugreport:[11,21],build:[1,5,6,8,10,23,36],buildenv:24,builder:27,buildhost:[5,24,30,35,38],built:[21,22,26,27],builtin:[5,25,30],bundl:10,c3tv:3,calcul:9,call:[16,19,24,29,36],callback:25,can:[0,1,2,4,6,7,8,9,10,11,12,14,16,18,19,20,21,22,24,25,26,27,30,32,34,36,37,38],cancel:27,cannot:[2,27,32,34,37],capabl:[16,21],caplabl:18,captcha:32,caption:27,cardin:21,care:[14,27,35,36],carv:19,cat:[34,36,37],catcher:27,categori:[0,3,13,14,18,22,27,28,33],caution:27,caveat:27,ccc:3,cdn:2,cell:27,cfg:[3,27],cgi:11,chain:24,chainabl:33,chang:[11,14,20,21,24,27,35],chapter:[4,20,21,27,37,38],charact:[21,27],chdir:11,check:[2,5,18,21,22,24,26,29],checker:24,checkout:21,chmod:11,choic:[6,10,27,32,35],choos:[6,21,22],chown:[7,9,10,11,34,37],chronolog:27,citi:22,classifi:27,clean:[23,36],clear:32,cli:29,clita:27,clock:20,clone:[6,8,9,10,21,24,26,38],close:[4,10],cmd:[35,36],code:[3,11,14,18,23,24,26,28,32,35,36],codebas:16,coffe:36,col:27,colleagu:19,collect:2,colon:27,colspan:27,column:27,com:[6,8,10,22,24,26,27,28,29,34,36,37,38],combin:7,come:[4,9,19,20,21,24,32,36],comfort:[11,27],comma:[19,28],command:[2,4,7,10,11,20,26,27,29,30,34,37,38],comment:[7,9,10,27,34,36,37],commit:[24,26,29],commodi:27,common:[11,26,30,32,34,37,38],commonli:27,commun:[7,9,18],compact:27,compani:32,compar:[7,9,11,36],compat:20,compil:[7,23,29],complet:[4,11,21,28,34,36,37,38],compon:[7,25,35],compromis:32,comput:32,con:27,concern:21,conclus:31,concret:[19,27],condit:27,conf:[2,7,9,27,34,37],config:[0,11,19,22,27,29,34,35,36,37,38],configur:[5,7,9,11,16,18,19,23,27,29,32,34],conflict:35,confnam:11,confus:27,connect:[4,9,10,18,30],consectetur:27,consequ:[14,21],consequat:27,consetetur:27,consid:6,construct:[22,27],consult:26,contact:14,contain:[10,13,14,26,27,35,36],content:[5,17,23,30,31,32,35],context:[25,27,36],continu:27,contribut:[1,2,23,24,30],contributor:27,control:[7,11,32],convent:21,convert:27,cooki:[22,30,32],copi:[10,21,27,36],copyright:27,core:[2,11,18],corner:21,correct:[9,14],correctli:9,correspond:11,could:[11,14,22,27],count:27,countri:[14,22],courgett:28,cours:27,coverag:26,crawler:27,creat:[5,6,7,9,11,14,18,20,26,27,28,29,35,38],creation:[2,27],creativ:19,cross:27,crossref:3,cryptic:26,cryptographi:14,cspan:27,css:[13,25],css_depend:25,csv:[4,28],csv_tabl:27,ctan:27,cthulhu:33,ctrl:[10,24],ctx:25,cup:36,curl:10,currenc:3,currency_convert:3,current:[13,14,18,21,22,29,33],custom:[14,21,27,33],customiz:[0,16],customlog:7,cycl:24,daemon:[34,37,38],dai:[11,24,28],dailymot:3,dalf:1,danger:27,data:[5,22,27,32],databas:[19,27],date:[0,22],datetim:[22,27],daunt:16,dbpedia:28,ddd:3,ddg:[3,33],ddi:3,de_d:14,deactiv:[14,34,37,38],debian:[2,5,9,10,11,15,27],debug:[10,14,23,24,34,35,37,38],decid:[16,24],decim:22,dedic:[11,27],deeper:[24,27],deezer:3,def:[18,22,25,27],defaul:27,default_local:[0,14],default_on:25,default_them:[0,14],defin:[14,25,27],definit:3,dejavu:2,delet:[14,28,29,36],delimit:27,demon:10,demonstr:9,deni:7,depend:[4,5,7,9,13,16,18,20,22,24,26,27,28],deploi:[8,14,24,27],describ:[4,6,7,11,14,24,27,38],descript:[13,21,25,27,34,37],deserv:21,design:[18,27],desir:[22,26],detail:[7,14,18,27],detect:14,deutsch:[0,14],dev:[2,7,9,10,21,24,27],devel:[2,10],develop:[2,10,14,16,17,19,20,21,24,27,30,35],deviantart:3,dfrac:27,diam:27,dict:27,dictzon:3,didn:14,diff:27,differ:[7,9,11,20,21,22,27,36],digg:3,digit:30,digraph:27,dir:[10,34,37],direct:[7,23,27,34,37],directli:[9,14,36],directori:[3,7,11],disabl:[3,5,10,11,13,14,24,25,27,28,35,36],disabled_engin:28,disabled_plugin:28,disadvantag:27,discoveri:[18,19],discret:35,displai:[2,13,14,22],display_error_messag:[14,22,27],displaystyl:27,dispos:35,disrespect:21,dist:[21,24],distinguish:27,distribut:[7,9,11,19,27,34,37],distributor:5,dive:32,dnf:[2,7,9,10,27],doai_rewrit:28,doc:[3,5,7,11,23,27,36],docker:[5,6,24,30],dockerfil:8,docs_url:24,doctest:27,doctre:27,docuemt:2,document:[7,11,18,19,24,27,30,36],documentroot:7,docutil:27,doe:[7,11,16,18,22,24,27,28,31],doesn:14,doi:13,dolor:27,domain:27,domin:21,don:[7,20,24,27,30],done:[7,9,24,27,35,36],dontlog:7,dot:2,doubl:27,download:[6,24,27,34,37],drop:20,duckduckgo:[3,28,33],duckduckgo_definit:3,duckduckgo_imag:3,duden:3,due:[34,37],duo:27,duref:27,dvisvgm:2,each:[11,27,28],easi:30,easier:21,easili:21,echo:[10,34,36,37],ecosystem:27,edit:[10,11,16,21,24,27,32,37],eeach:36,effect:[6,21,27],egg_info:24,eirmod:27,either:26,element:27,elimin:26,elit:27,elitr:27,els:36,emac:27,email:14,emb:[5,27],embed:[0,8,27],emperor:11,emphasi:27,empti:[7,27,28],en_u:[14,22],enabl:[0,7,9,10,11,19,21,24,26,28,35],enabled_engin:28,enabled_plugin:28,enclos:27,encod:27,encourag:27,encrypt:30,end:[20,27,36],endfor:27,engin:[0,5,10,16,17,21,23,26,27,28,30,32,33,34,37],english:[0,14],enim:27,enough:[6,7,9,29],enpoint:28,ensur:21,enter:[10,20],entri:[23,35,36],env:[7,11,24,26,35,36],environ:[9,10,23,30,34,36,37,38],eof:[34,36,37],eol:36,eos:27,equat:[2,23],erat:27,erowid:3,error:[3,14,22,26,27],error_log:9,escap:27,especi:27,esperanto:0,essenti:[2,10],est:27,etc:[4,7,9,10,11,21,34,38],eth0:36,eto:3,etool:3,etymonlin:3,evalu:[27,36],even:[11,36],event:11,ever:36,everi:[14,21,22,32,36],everyon:[18,32],everyth:[10,27,32],exactli:[4,27],exampl:[0,4,7,9,11,18,19,21,23,26,28,31,32,35,36],exceed:4,excel:[6,9],except:[7,20,21,27,35],exchang:32,execstart:[34,37],execut:[14,29],exercit:27,exist:[7,9,16,20,21,24],exit:10,expand:27,expect:[19,21],experi:11,experienc:16,experiment:35,explain:21,explanatori:[34,36,37,38],explicit:27,expos:19,ext:2,extend:[18,21,25,27],extens:[2,27],extern:[4,12,22,27,28,32],extra:[2,7],extract:2,extrem:16,eye:27,face:27,fact:17,fail:26,fals:[0,10,14,25,26,27,28,37],familiar:[11,24],fanci:21,faq:27,favorit:[21,24],fd00:7,fdroid:3,fe80:7,featur:[12,16,19,21,27,32],fedora31:36,fedora:[2,7,9,10,11,27,36],fedoraproject:36,feedback:[21,27],feel:[25,27],few:[14,21,22],fieldnam:27,figur:[7,9,23],file:[2,3,7,9,10,11,14,16,18,19,20,21,24,25,26,29,34,36,37,38],file_filt:29,filenam:22,files:22,fill:27,filter:[0,4,28],filtron:[1,5,6,7,9,11,30,35,36],filtron_api:[34,35,36],filtron_listen:[34,35,36],filtron_target:[34,35],find:[1,4,18,19],fine:[6,10],finish:[29,36],firefox:2,firewal:4,first:[7,9,10,16,18,20,24,26,27,32],fit:[11,19,25],fix:[21,24,26],fixm:7,flask:[25,27],flexibl:[27,35],flickr:3,flickr_noapi:3,fmt:36,folder:[7,9,10,11,21,22,24,26,27,29,35,36],follow:[4,6,7,9,11,12,21,22,24,26,27,29],followsymlink:7,font:2,fontsrecommend:2,footer:21,force_timeout:[35,36],fork:[6,21,35],form:[0,27,32],format:[4,22,26,27,28],forward:[4,9,32],found:[2,16,17,24],foundat:[16,18,19,20],fr_fr:14,fraction:27,framalibr:3,free:[3,25,30],fresh:7,friend:[19,24,32],frinkiac:3,frk:3,frl:3,from:[1,2,4,6,7,8,9,10,11,13,14,16,18,19,20,21,24,27,29,30,32,34,35,36,37,38],front:27,fsd:3,full:[14,21,27,34,37],fulli:[7,9,16],fun:17,fund:[18,19],further:[24,26,35],furthermor:[22,26,28,32],futur:36,gain:32,gate:24,geektim:3,gen:3,gener:[0,3,7,11,14,18,21,23,24,32],genesi:3,geniu:3,gentoo:3,geojson:22,german:0,get:[2,4,5,6,7,9,10,13,21,22,24,26,27,28,29,30,34,36,37],get_engines_stat:27,gid:11,gigablast:3,gil:11,git:[2,6,7,8,9,10,14,15,21,22,24,26,27,34,35,37,38],git_branch:[24,35],git_url:24,github:[3,6,8,10,18,20,24,26,27,28,34,36,37,38],gitlab:3,gitmoji:21,give:[7,24,26],given:27,glob:11,global:5,global_ip:36,glyph:27,gnu:24,go1:[34,37],go_env:[34,37],goe:24,goi:[0,3],going:[4,18,19,27,32],gon:3,good:[6,7,9,26,36],googl:[0,3,28,34,37],google_imag:3,google_new:3,google_video:3,gopath:[34,37],gos:3,gov:3,gpa:3,gpm:3,gps:3,grant:[7,11],graphic:16,graphviz:2,grep:36,group:[27,32,34,37],grow:16,grumpi:27,grunt:26,gubergren:27,guest:36,guid:[9,16,24,26,27],guidelin:19,guilabel:27,habr:3,habrahabr:3,hack:[16,18,19,20,21],hackabl:23,hackerspac:33,handl:[14,27,32,36],handler:7,happi:[16,18,19,20,21],hard:[16,27],harden:[34,37],has:[12,18,19,21,22,26,27,32],hat:27,have:[2,6,7,8,9,10,14,16,20,21,22,24,27,32,35,36],hbar:27,head:10,header:[4,7,9,22,27],headers_modul:7,heard:27,hebrew:14,height:27,help:[13,21,24,26,34,35,36,37,38],helper:27,her:[19,28,32],here:[2,7,9,11,14,18,21,27,35],herein:1,hidden:[0,19,32],him:19,hint:[1,27,35],his:[28,32],histor:[7,20],hit:10,home:[10,29,34,35,37],hoogl:3,host:[2,4,7,9,10,16,19,24,29,30,36],hostnam:[9,36],hotkei:[0,13],hous:22,house_numb:22,how:[1,2,5,6,7,9,11,14,17,23,24,27,30,31,34,37],howev:[18,22,28],html:[0,2,7,11,21,22,24,27,37],html_math_render:2,http:[0,2,4,5,6,8,10,11,12,13,14,18,21,22,24,26,27,29,30,34,35,36,37,38],http_connect:[4,9],http_host:[4,9],httpd:7,https_rewrit:28,hub:8,huge:27,idea:26,identifi:[35,36],ifmodul:7,illustr:6,imag:[0,2,3,12,14,23,24,28,33,36,37,38],image_proxi:[7,9,14,28,37],imagemagick:[2,27],img_src:22,imgmath:2,imgmath_font_s:2,imgmath_image_format:2,imgmath_latex:2,immedi:13,implement:[9,11,16,20,21,22,25,36],impli:19,improv:24,in_contain:36,ina:3,inbound:14,includ:[7,9,19,24,27,36],inclus:33,incom:7,increment:24,indent:[27,36],index:7,infinit:13,infinite_scrol:[13,28],info:[14,24,36,37],info_msg:36,inform:[8,12,13,14,19,21,22,36],infrastructur:[1,11],infratructur:4,inherit:27,ini:[7,9,11],init:[11,18,23,36],initi:[11,29,36],inlin:23,input:[0,19,27],insecur:10,insert:[27,29],insid:[10,22,36],insight:32,inspect:[34,35,37,38],instal:[1,2,4,5,11,12,20,21,24,26,27,29,30,35],instanc:[0,1,5,6,7,8,9,11,14,16,18,19,24,28,29,30,31,34,35,36,37,38],instance_nam:[0,10],instead:[11,16,19,20,26,27],instruct:27,insuffici:18,integr:30,intent:21,interact:[10,34,35,37,38],interfac:[7,14,17,30],interfer:21,intermedi:24,intern:26,internet:[6,18,30],interpret:[11,27],interpretor:11,intersphinx_map:27,interv:4,intranet:[6,7,9],intro:[7,9],introduc:[16,17,18,19,27,30],introduct:[24,26],intuit:27,inv:27,inventori:27,investig:20,invidi:3,invidunt:27,ipsum:27,ipv4:[9,36],ipv6:[9,36],isn:[7,9],iso:[14,22],isol:4,issu:[11,18,19,20],ital:27,italiano:14,item:27,its:[2,6,16,21,24,27,28,32,36],itself:[11,21],japanes:14,javascript:[13,23],jinja:27,jinja_context:27,job:35,join:27,js_depend:25,json:[4,28,34],json_engin:3,juli:36,jump:[10,24],just:[0,4,9,24,27,32,36],justo:27,kasd:27,kbd:27,keep:[7,9,24],kei:[12,13,14,18,22,29,37,38],kickass:3,kind:[7,27,32],kiss_:27,know:[7,11,18,19,27,32,36],knowledg:27,known:24,kvch:[16,18,19,20],label:27,labor:27,labori:27,lack:21,lang:[0,28,29],languag:[0,3,4,14,22,24,27,28,29,33],language_support:[22,27],laptop:32,larg:[11,34,36,37,38],last:27,lat:22,later:[35,36],latest:[11,29],latex:2,latexextra:2,latexmk:2,latitud:22,latter:[24,27],launch:36,layout:5,lazi:11,lc_messag:29,learn:27,least:20,leav:14,leech:22,leecher:22,left:[10,27],legaci:28,length:21,less:[7,9,11,16,26,27,32],let:[27,32,35],level:[21,27],lib:[7,11,34,37],libapache2:7,libffi:[2,10],librari:3,librsvg2:2,librsvg:2,libssl:[2,10],libxml2:[2,10],libxslt:[2,10],licens:[35,36],light:9,like:[0,2,8,10,13,14,19,21,22,24,27,35],like_hotkei:28,limit:[4,7,17,18,27,30],line:[7,9,18,21,24,36],link:[11,13,14,23],lint:[5,24],linux:[0,2,3,7,9,10,11,19,27,34,35,36,37],linuxcontain:36,linuxcontainers_org_nam:36,linuxdoc:27,list:[7,18,19,22,23,24,25,28,33],listen:[4,7,9,34,35,36,37],liter:23,literalinclud:27,live:[23,27,36],load:[11,13,14,36],loadmodul:7,lobst:3,local:[0,4,9,10,11,14,19,20,22,24,25,26,29,34,35,36,37,38],local_imag:36,localhost:[7,8,9],locat:[4,7,9,10,11,14,27],log:[4,5,11,14,26,32,34,35,37,38],logger:11,logic:21,logicodev:28,login:10,lon:22,longer:24,longitud:22,look:[7,10,24],lorem:27,loremlorem:27,low:[7,9],lsb:11,lxc:[30,35],lxc_host_prefix:36,lxc_repo_root:36,lxc_set_suite_env:36,lxc_suit:36,lxc_suite_info:36,lxc_suite_instal:36,lxc_suite_install_info:36,lxc_suite_nam:36,lxd:36,lxml:[2,10],made:14,magna:27,magnetlink:22,magyar:14,mai:[14,27,34,37],main:[7,13,24,29,35],mainlin:9,maintain:[1,11,27,35],mainten:[4,6,34,37,38],make:[2,8,16,19,20,21,23,27,32,36],makefil:[21,23,30,35,36],man:27,manag:[4,15,16,24,26,34,37,38],mandatori:6,mani:4,manipul:[16,36],manual:[14,24,27],manuali:27,map:[0,3,27],mark:[10,27],markup:23,mass:21,master:[11,15,21,24,27,35],math:[2,23],mathemat:27,mathrm:27,matter:[22,32],max:[4,22],maxim:21,maximum:[21,22],mean:[11,21,27,32],meaning:27,meant:27,media:[0,3,22],mediawiki:3,memori:14,mention:20,menuselect:27,messag:[4,14,21,22,24,26,27,29],messagespo:29,meta:27,metadata:27,metasearch:[10,22,30,34,37],method:[0,6,11,22,27],microsoft:3,microsoft_academ:3,middlewar:4,might:[11,19,21,24,27,28,32,35,36],migrat:20,min:22,minim:27,mirror:3,misbehav:21,miss:[4,27],mixcloud:3,mjk:3,mkdir:[7,9,10,11,34,37],mod:[7,27],mod_autoindex:7,mod_head:7,mod_proxi:7,mod_proxy_http:7,mod_proxy_uwsgi:7,mod_uwsgi:7,mod_wsgi:7,mode:[11,14,27,35,36],modern:7,modifi:[11,14,27,33],modul:[7,11,27],mojeek:3,monet:32,monitor:11,mono:2,month:[0,28],more:[4,8,12,14,16,18,21,24,27,28,30,32,35,36],morecol:27,morerow:27,morti:[1,6,7,9,12,30,35,36],morty_listen:[35,36,37],most:[2,7,14,20,32,34,35,37,38],mostli:[11,27],move:[18,21],movi:3,much:[21,27],multi:[34,37],multibl:22,multipl:[13,14,27,32],multithread:11,multius:10,music:3,must:[9,14,20,21,22,26,27],my_arg:27,my_funct:27,my_other_arg:27,mydomain:35,mymemori:3,myproject:26,name:[0,3,4,7,8,9,10,13,14,19,22,24,25,29,36],nativ:11,navig:13,necessari:[10,19],nederland:14,need:[4,6,7,9,10,11,14,18,21,24,27,32,34,35,36,37,38],neither:30,net:30,network:[14,34,37],never:24,nevertheless:[7,9],newcom:16,nework:14,next:[7,9,13,17,27],nginx:[1,4,5,6,14,30,34,36,37,38],nightmar:27,nil:36,nisi:27,nlnet:[16,18,19,20],noconfirm:[2,10],node:[24,26],nodej:26,non:18,none:[7,22,24,27,28],nonewprivileg:[34,37],nonumi:27,nor:30,normal:[7,22,27,35],nostrud:27,note:[7,9,21,28],now:[7,9,10,19,20,25],npm:[3,24,26],number:[4,14,22,27,28,36],number_of_result:22,numer:27,numref:27,nyaa:3,oad:3,oap:3,obj:27,object:[22,25,27],obtain:14,off:[7,9,21,34,36,37,38],offer:11,offlin:[3,17,19,22,27,30],often:[22,27,35],old:7,on_result:25,onc:36,one:[7,11,14,19,21,24,27,30,32,34,35,36,37,38],ones:[22,34,37],ongo:24,onli:[2,6,7,12,14,19,21,25,27,28,35,36],onlin:[18,27,30],open:[7,10,13,20,21,24,27,28,32,35,36],open_results_on_new_tab:13,openairedataset:3,openairepubl:3,openrepo:3,openstreetmap:[0,3],oper:[20,27,32],option:[7,10,11,12,14,16,19,21,22,24,25,26,27,28,32,34,35,37,38],order:[7,21,26,27],org:[2,4,7,9,11,14,22,27,36],organ:30,orient:7,origin:[5,15,27],oscar:[0,14,28],osm:[0,3,22],other:[14,21,22,27,32],otherwis:22,our:[1,4,6,16,21,24,27,36],out:[7,9,18,21,24,27,34,36,37],outgo:14,outgoing_proxi:14,output:[2,19,27,28,34,36,37,38],outstand:27,over:[27,30,36],overlin:27,overview:[4,14,23,24,28,30,35],overwrit:13,overwritten:22,own:[6,24,30,32],owner:24,packag:[2,4,5,7,9,11,24,26,27,34,36,37,38],pacman:[2,7,9,10,27],page:[3,7,9,13,14,16,19,21,22,23,27,28,32,33],pageno:[22,28],pagenumb:22,pair:18,palletsproject:27,param:[4,18,22,27],paramet:[22,23],paramt:22,parent:27,pars:28,parse_lin:18,part:[14,16,27,36],parti:32,partial:27,partli:22,pass:[7,9,18,28],past:0,patch:[21,27],path:[4,7,14,27,34,36,37],paywal:13,pdb:3,pdbe:3,pdf:2,peopl:[16,32],pep8:[21,24,26],pep8_check:24,pep:27,per:[11,21,22,27],perform:[11,13,18,22],phase:26,photon:3,phrase:27,piec:27,pip3:20,pip:[2,10,29],pipe:18,piratebai:3,pix:28,place:[6,9,11,21,22,27,29,32],plai:3,plaintext:27,pleas:[20,21,26,27,28],plenti:21,plu:[7,9],plugin:[0,2,5,10,11,21,23,28,30],pocket:[7,9],point:[9,10,11,23,24,27,32],pointer:27,pointhi:28,polygon:27,popen:18,popular:27,port:[4,8,9,10,14,36],possibl:[8,12,13,14,18,19,27,28],post:[0,21,28],post_search:25,postcod:22,pot:29,pov:27,power:27,practic:21,pre_search:25,prefer:[6,16,19,27,28,32,33],prefix:33,preinstal:4,prepar:[17,30,36],prerequisit:27,present:[18,19],preserv:[21,27],press:[13,24],pretti:14,preview:22,previou:35,primari:36,primary_ip:[35,36],prime:23,primer:[23,30],principl:27,privaci:[6,7,9,10,11,23,27,31,34,37],privat:[17,18,30,31],privatedevic:[34,37],privatetmp:[34,37],pro:27,problem:4,procedur:[6,36],process:[2,4,11,18,19,24],processor:27,produc:27,product:[14,35],profil:[10,24,30,32,34,37],program:24,progress:[17,34,37],project:[11,23,24,27],promot:30,prompt:35,proper:[32,34],properli:20,propos:18,protect:[1,5,7,9,21,30,31,34],protectsystem:[34,37],protocol:[9,11],provid:[19,21,22,27],proxi:[1,5,6,9,14,28,30,32,34,35,36,37,38],proxif:[7,9],proxifi:12,proxy_add_x_forwarded_for:[4,9],proxy_buff:9,proxy_http:7,proxy_http_modul:7,proxy_modul:7,proxy_pass:[4,9],proxy_set_head:[4,9],proxy_uwsgi_modul:7,proxypass:[7,34,37],proxypreservehost:7,psi:27,pub:3,public_host:34,public_url:[34,35,36,38],public_url_morti:[36,37],public_url_path_morti:35,publicli:18,publish:22,publishedd:22,pubm:3,pull:[8,15,18,21,27,29],purpos:[14,22,26],push:[21,24],py3:24,pybabel:29,pybuild:23,pyclean:24,pyenv:[10,11,24,38],pygment:27,pylint:23,pylintrc:24,pypi:[24,27],python2:[11,20],python3:[2,10,11,20,26],python:[2,10,11,14,17,23,26,27,30,38],pythonhom:11,pythonpath:11,qout:36,quadratur:30,qualiti:[2,24,27],queri:[13,18,19,22,28,32,33],question:[27,32],qui:27,quickstart:[21,23,24,30],quiet:24,quit:[7,21,24],qwant:3,qwer:33,qwi:3,qwn:3,qws:3,rais:18,random:[22,32],rang:[3,11,22,28],rangl:27,rate:4,rather:19,raw:27,rbg:3,reach:27,reactiv:14,read:[18,21,24,26,35],readability_:27,reader:27,readlin:18,readm:[4,7,11,12],readthedoc:11,real:[4,9],realli:6,reason:[7,11,16,20,24,27],rebuild:[21,24],rebum:27,recommend:[2,4,6,11,21,22,24,27,35],reconsid:21,record:27,reddit:3,redefin:22,redirect:13,reduc:21,ref:[34,37],refer:[1,27,32],referenc:27,refnam:27,regardless:32,regular:18,reinstal:[34,38],rel:[9,27,36],releas:[20,24,36],releng:36,reload:11,rememb:[11,21],remot:36,remote_addr:[4,9],remov:[11,13,32,34,35,36,37,38],renam:28,render:2,replac:[7,9,10,16,25],repo:21,repositori:[10,16,36],request:[5,7,9,14,18,19,21,23,25,27,32],request_timeout:14,request_uri:7,requesthead:7,requir:[2,7,13,20,21,22,23,24,26,27,28],requisit:24,reset:32,resourc:9,respect:[10,21,32,34,37],respons:14,rest:[19,23,30],restart:[5,9,10,11,12,15,34,37],restrict:19,restructuredtext:27,result:[1,2,5,6,7,9,13,14,18,23,27,28,30,32,37,38],result_proxi:[7,9,12,37],results_on_new_tab:28,retriev:29,return42:27,return_cod:18,rever:7,revers:[1,5,6,9,34,35,36,37],rewrit:[0,13],rfc:27,rhel:[2,7,9,10,11,27],rid:[24,36],right:[11,19,25,27,30],rightmost:27,rigth:27,road:22,roboag:4,robot:[24,26],robotframework:20,role:23,rolenam:27,roll:36,romanian:14,root:[7,9,24,36],rotat:27,round:21,rout:[5,7,9,27],row:27,rowspan:27,rspan:27,rss:[4,28],rst:[21,27],rst_titl:36,rubygem:3,rule:[4,21,34],run:[2,4,6,7,8,9,11,12,14,17,18,19,21,22,23,25,27,29,32,34,35,37,38],runtimeerror:18,russian:14,ryzen:10,sadipsc:27,safe:[3,28],safe_search:0,safesearch:[27,28],same:[4,10,13,14,22,27],sampl:[5,27,34],san:2,sanctu:27,satisfi:26,save:7,sc2031:36,sc2034:[35,36],scalabl:27,scale:[27,36],scaleabl:27,scan:11,scc:3,scd:3,schedul:[18,20],scheme:[4,9],scholar:3,schroeding:27,scienc:3,scope:21,scratch:2,script:[1,4,5,7,9,10,26,34,35,36,37,38],script_nam:9,scroll:13,sdist:24,sea:27,search:[3,4,5,13,14,18,19,21,22,23,27,30,31,32],search_on_category_select:[13,28],search_path:22,search_str:22,searchcod:3,searchcode_cod:3,searchcode_doc:3,searx:[0,1,2,4,5,6,7,8,11,12,14,15,17,18,21,22,24,25,26,27,28,29,31,33,34,35,37],searx_instance_nam:38,searx_internal_http:38,searx_internal_url:35,searx_settings_path:[10,11],searx_url:[24,35],searx_userag:14,sec:4,second:[10,14,27],secret:[14,19],secret_kei:14,section:[9,14,24,27],secur:30,sed:[10,27],see:[2,4,7,8,9,11,12,14,18,19,21,26,27,28,30,33,34,36],seed:22,seeder:22,seedpeer:3,select:[13,24,27,32,33,36],selenium:26,self:[13,16,30,34,36,37,38],self_inform:28,semant:[3,21],send:[2,4,14,32],sens:27,sent:32,separ:[19,21,27,28,34,37],seri:24,serif:2,serv:[21,32,36],server:[4,5,6,11,14,26,36,37],server_nam:9,servic:[4,5,6,9,11,12,27,28,30,32,34,35,36,37,38],service_home_bas:35,service_us:[34,35,37,38],service_ussr:35,session:[10,26],set:[2,3,5,7,9,10,11,12,16,18,24,26,27,28,29,30,32,33,34,35,36,37,38],setenvif:7,sethandl:7,setup:[1,2,4,5,6,7,9,10,11,23,27,30,34,37],setuptool:10,seznam:3,share:[7,11,19,36,38],she:[19,32],shell:[5,10,34,35,36,37,38],shellcheck:[2,10,27,35,36],ship:9,shortcut:[0,3,14,19,22,27],should:[6,7,9,14,16,20,21,27,29],show:[1,2,3,7,9,27,34,35,36,37],shown:[6,7,10,27],side:[6,27],sign:27,signifi:27,similar:[11,27],simpl:[24,28,34,37],simplest:27,simpli:[4,21,24,28,34,35,37,38],simplifi:[4,24,34,37,38],sinc:[9,16,24,27],singl:[7,9,11,32,36],sit:27,site:[0,4,5,7,14,22,27,28,34,37,38],size:22,skeleton:18,skill:23,skip:26,slow:14,small:[22,38],snap:36,snapcraft:36,snippet:12,social:[0,3],sock:14,socket:[7,9,11],soft:23,softwar:[3,34,37],sold:32,solut:19,solv:[4,19],some:[1,6,7,11,14,19,21,24,27,34,35,36,37,38],someon:32,someth:[21,24],sometim:16,soundcloud:3,sourc:[10,14,20,23,24,27,29,32,34,36,37],source_fil:29,source_ip:14,source_lang:29,space:14,span:27,spars:27,spdx:[35,36],speak:11,special:[6,11,22],specif:[11,14,22,36],specifi:[11,14,22,28],speu:3,sphinx:21,splinter:20,split:21,spoilt:6,sponsor:[16,18,19,20],src:[4,9,10,11,38],srv:7,ssl:[22,30],stabl:14,stack:[26,36],stackoverflow:3,stage:27,standalon:16,standard:[7,21,22,36],start:[1,4,7,9,10,11,21,22,24,30,34,36,37,38],startpag:[3,28],stash:[15,24],stat:27,statist:27,statu:[34,35,37,38],stdout:18,step:[1,5,6,17,21,30,38],stet:27,stone:19,stop:[4,7,9,10,11,24,34,36,37,38],storag:36,store:[22,32],strang:11,street:22,strict:19,string:[19,22,28,29],stroke:27,strong:27,structur:[21,23],stub:27,stuff:27,style:[23,28],sub:[21,27],subdir:9,subdirectori:9,subject:27,submit:21,subnet:7,subprocess:18,subrul:4,subscript:27,subsect:27,subshel:36,substitut:23,sudo:[2,6,7,9,10,11,15,26,27,34,35,36,37,38],suffix:14,suggest:[1,25],suit:35,suitabl:27,sup:27,superscript:27,supervisor:16,support:[2,3,5,9,10,11,14,17,19,21,22,27,28,30,32,34,36,37],sure:[8,10,20],surround:27,suspici:4,svg:2,svg_imag:27,symbol:11,symlink:9,syntax:[28,30,31],syslog:[34,37],system:[10,11,19,20,21,24,27,34,35,37],systemctl:[7,9,11,15],systemd:[11,34,37,38],szn:3,tab:[13,23,28,36],tabl:[18,23],tailor:32,take:[11,14,16,21,29,36],taken:[27,35],takimata:27,tar:[24,34,37],target:[21,23,27,30,34,36,37],task:[6,10,27,36],tcp_nodelai:10,tell:22,templat:[11,18,22,23],tempor:27,term:[7,27],termin:10,test123:38,test:[2,7,9,10,20,21,23,36,38],texliv:2,text:[0,22,27],textstyl:27,tfrac:27,than:[14,27,30],thei:[11,14,19,27,32],them:[11,14,24,27,35],theme:[14,23,24,28],themes_path:14,themselv:19,therefor:[6,27],thi:[4,6,7,8,9,10,11,12,13,14,16,18,19,20,22,24,25,26,27,28,32,34,35,36,37,38],thing:27,think:[21,24,27],third:[27,32],those:[18,29,32],thread:11,three:[21,25,27,32],through:[5,7,9,14,19,27,28,32],thu:[18,20,28,32],thumbnail:22,thumbnail_src:22,time:[4,14,20,21,22,27,28,32,36],time_rang:[0,28],time_range_support:[22,27],timeout:[3,14,22,27,35,37],timestamp:11,tip:[23,27],titl:22,todai:18,togeth:18,token:[18,19],tokyotoshokan:3,too:[4,14,27,32],tool:[1,2,6,10,16,21,27,29,30,36],top:27,tor:[3,30,32],torrentfil:22,torrentz:3,touch:[7,9,11,14],tpb:3,trace:26,track:[30,32],tracker:13,tracker_url_remov:28,trademark:27,traffic:[7,9],train:27,transform:27,transifex:[21,23],transifexrc:29,translat:[3,14,23,30],transpar:36,travi:[20,26],tree:[10,24],troubleshoot:35,trust:[19,30,32],ttf:2,tupl:25,turn:[21,26],twice:10,twine:24,twitter:3,two:[11,21,27,28],txt:[20,24,27],type:[0,21,22,24,28,29,32,34,36,37],typic:[1,27],typo:27,ubu1604:36,ubu1804:36,ubu1910:36,ubu2004:36,ubuntu:[2,7,9,10,11,15,27,36],uds:7,ugli:[16,27],uid:11,ullamco:27,ultrasecretkei:[10,14],unam:[10,36],uncom:14,uncommon:21,under:[19,22],understand:[16,27],unfortun:21,unicod:23,uninstal:[24,35],unit:[11,21,24,34,37,38],unit_test:[24,26],univers:10,unix:[7,9,11],unknown:[32,34,37],unless:19,unlik:32,unspecifi:22,unsplash:3,untouch:24,unwant:6,updat:[5,10,14,21,23,30,34,37,38],update_dev_packag:26,update_packag:15,upload:24,upstream:11,url:[0,7,9,12,13,14,21,22,24,32,35,36,37,38],urlencod:22,usag:[6,7,9,24,27,34,36,37,38],use:[2,4,6,7,9,11,12,14,18,19,21,22,24,26,27,30,31,34,35,36,37,38],used:[7,9,14,20,21,22,27,30,32,35],useful:[14,35],user:[4,5,7,9,11,13,14,19,21,22,27,30,32,35,38],useradd:[10,34,37],userag:4,useragent_suffix:14,uses:[11,14,22,27,32],using:[4,7,9,11,14,17,21,24,26,27,29,30],usr:[4,7,9,10,11,34,35,37,38],usual:[20,32],utf:[27,35,36],util:[1,2,4,6,7,9,12,24,30],uwsgi:[1,2,5,9,10,15,30,38],uwsgi_param:9,uwsgi_pass:9,uwsgisocket:7,valid:[22,26,28],valu:[0,9,18,22,27,28,35],variabl:[22,24,27,37],variant:27,variou:[21,25],vassal:11,vector:27,vendor:21,veniam:27,venv3:20,venv:[2,10,26],verbos:[10,24,35],veri:35,verifi:22,vero:27,version:[10,13,20,27,34,37],via:[7,9,11,16,33],video:3,view:[23,32],viewbox:27,vim:[0,13,28],vim_hotkei:13,vimeo:3,virtual:[7,9],virtualenv:[2,10,11,20,24,26,38],virualenv:[10,24],visist:27,visit:[10,27,32],voat:3,voluptua:27,vpn:32,vulner:32,wai:[11,18,21,22,27,32],wait:[14,18],want:[14,19,20,21,24,27,28,32,35,36],wantedbi:[34,37],warn:[2,7,9,27,36],watch:21,web:[4,10,14,16,22,24,34,36,38],webapp:[10,11,14,20,24,27],webcrawl:4,webserv:9,websit:0,weight:[14,27],weigth:[3,14],weird:21,welcom:[7,9],well:27,were:[18,19,20],werkzeug:24,wget:[34,37],what:[11,27,36],whatev:[8,24,36],wheel:10,when:[2,7,13,14,20,25,26,27,32],where:[4,14,27],whether:[26,32],which:[1,4,7,9,11,14,16,18,19,21,22,24,27,28,30,32,34,37],whl:24,who:[11,16,18,32],whole:[7,25],why:[27,30,31],wide:21,widen:27,width:27,wiki:[0,3,9,18,19,27,36],wikibook:3,wikidata:3,wikinew:3,wikipedia:[3,14,28,33],wikiquot:3,wikisourc:3,wikivers:3,wikivoyag:3,wiktionari:3,window:13,wish:14,within:[24,27],without:[2,14,22,30,32],wolframalpha:3,wolframalpha_noapi:3,won:[14,20],wonderfal:8,word:[25,27,28],work:[9,10,14,21,22,24,26,32],worker:11,workingdirectori:[34,37],world:[21,27,32],worri:20,worth:[11,32],would:19,wrap:9,wrong:24,wsgi:[9,11],www1x:3,www:[2,7,27,29,36],wysiwyg:21,xdg:24,xetex:2,xgd:10,xml:27,xmln:27,xpath:3,xxxx:27,xzf:[34,37],yahoo:3,yahoo_new:3,yandex:3,year:[20,28],yes:[34,37],yet:[21,22,24],yhn:3,yml:[3,5,7,9,10,11,12,16,18,24,26,28,30,37,38],you:[1,2,4,6,7,8,9,10,11,14,17,18,21,24,26,27,28,30,32,33,34,35,36,37,38],your:[2,4,6,7,9,10,11,12,13,14,16,17,20,21,23,24,25,27,30,34,35,36,37,38],your_morty_proxy_kei:12,yourself:21,youtub:3,youtube_noapi:3,yyyi:27,zero:18,zlib1g:[2,10],zzzz:27},titles:["Administration API","Architecture","Buildhosts","Engines","How to protect an instance","Administrator documentation","Installation","Install with apache","Docker installation","Install with nginx","Step by step installation","uwsgi","How to setup result proxy","Plugins builtin","<code class=\"docutils literal notranslate\"><span class=\"pre\">settings.yml</span></code>","How to update","Searx admin interface","Blog","Preparation for offline engines","Limit access to your searx engines","Introducing Python 3 support","How to contribute","Engine overview","Developer documentation","Makefile Targets","Plugins","Development Quickstart","reST primer","Search API","Translation","Welcome to searx","User documentation","Why use a private instance?","Search syntax","<code class=\"docutils literal notranslate\"><span class=\"pre\">utils/filtron.sh</span></code>","Tooling box <code class=\"docutils literal notranslate\"><span class=\"pre\">utils/*</span></code>","<code class=\"docutils literal notranslate\"><span class=\"pre\">utils/lxc.sh</span></code>","<code class=\"docutils literal notranslate\"><span class=\"pre\">utils/morty.sh</span></code>","<code class=\"docutils literal notranslate\"><span class=\"pre\">utils/searx.sh</span></code>"],titleterms:{"default":[3,13,22],"public":[7,9,32],"return":22,The:[7,9,21],about:[27,32],access:19,acknowledg:[16,18,19,20],activ:24,admin:16,administr:[0,5],admonit:27,aka:27,alltogeth:11,anchor:27,apach:7,api:[0,28],architectur:1,argument:22,articl:[2,27],ascii:27,bar:0,basic:27,bibliograph:27,block:27,blog:17,box:[4,35],bug:20,build:[2,21,24,26,27],buildhost:[2,36],built:[3,13],builtin:13,bullet:27,check:10,clean:[21,24],code:[21,22,27],command:[35,36],commit:21,common:35,compil:26,conclus:32,configur:[0,3,4,10,13,22],consequ:32,content:[2,4,7,9,10,11,14,21,22,24,27],contribut:21,creat:[10,21,34,37],csv:27,data:0,debian:7,debug:26,definit:27,depend:10,deploi:21,design:21,develop:[18,23,26],direct:21,disabl:[7,9],distributor:11,doc:[2,21,24],docker:8,document:[5,21,23,31],doe:32,dot:27,drop:24,emb:0,engin:[3,14,18,19,22],entri:25,environ:[24,26,27,35],equat:27,exampl:[22,25,27,33],ext:27,extlink:27,fact:20,featur:30,field:27,figur:27,file:[22,27],filtron:[4,34],first:6,flat:27,foo:27,fork:24,found:20,fun:20,further:[1,3,4,7,9,11,12,13,14,25,27,28,34,36,37,38],gate:27,gener:[22,27],get:0,github:21,global:14,good:21,graphviz:27,grid:27,hackabl:21,head:27,hello:27,highlight:27,hlist:27,hook:25,horizont:27,how:[4,12,15,20,21,26,32],http:[7,9],hyperlink:27,imag:[22,27],init:29,inlin:27,instal:[6,7,8,9,10,16,34,36,37,38],instanc:[4,32],interfac:16,internet:[7,9],intersphinx:27,introduc:20,javascript:26,kernel:27,kiss:27,latex:27,layout:7,limit:19,line:27,link:27,lint:2,list:27,liter:27,live:[21,24],log:[7,9],lxc:36,make:[22,24,26],makefil:[24,26],map:22,markup:27,math:27,matter:27,morti:37,name:27,need:2,nest:27,next:[18,19],nginx:9,note:27,offlin:18,ordinari:27,origin:11,overrid:22,overview:[22,34,36,37,38],packag:10,page:24,paragraph:27,paramet:28,pars:22,pass:22,plugin:[13,25],point:25,post:25,pre:25,prepar:18,prime:21,primer:27,privaci:[21,32],privat:[19,32],process:27,progress:18,project:29,protect:[4,32],proxi:[7,12],pybuild:24,pyenv:26,pylint:24,python:[20,24],quickstart:26,quot:27,read:[1,3,4,7,9,11,12,13,14,25,27,28,34,36,37,38],readabl:27,ref:27,render:27,request:[4,22],requir:29,respons:0,rest:[21,27],restart:7,result:[12,22,25],revers:7,role:27,rout:4,run:[20,24,26,36],sampl:[0,4],script:[2,6],search:[0,25,28,33],searx:[9,10,16,19,20,30,32,36,38],see:32,server:[7,9],servic:7,set:[14,22],setup:[12,24,26,35,36],shell:2,sidebar:27,simpl:27,site:9,skill:27,smart:27,soft:27,some:2,sourc:[21,26],space:27,specif:27,sphinx:[2,27],step:[10,18,19],structur:27,style:26,substitut:27,suit:36,support:[7,20],svg:27,syntax:[27,33],tab:27,tabl:27,target:[24,26],templat:27,test:[24,26],theme:26,thi:2,through:4,time:[3,13],tip:26,titl:27,tool:[4,35],torrent:22,transifex:29,translat:[21,29],truth:27,unicod:27,unit:26,updat:[6,15,29],upgrad:20,upstream:24,url:27,use:32,user:[10,31,34,37],using:[20,32],util:[34,35,36,37,38],uwsgi:[7,11],video:22,view:27,welcom:30,what:32,why:32,work:2,yml:[14,22],you:20,your:[19,26]}})
user/index.html+16−5
@@ -1,9 +1,10 @@
11
22<!DOCTYPE html>
33
4−<html xmlns="http://www.w3.org/1999/xhtml">
4+<html>
55 <head>
66 <meta charset="utf-8" />
7+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
78 <meta name="viewport" content="width=device-width, initial-scale=1">
89 <title>User documentation &#8212; Searx Documentation (Searx-0.16.0.tex)</title>
910 <link rel="stylesheet" href="../_static/searx.css" type="text/css" />
@@ -32,7 +33,8 @@
3233 <li class="right" >
3334 <a href="../index.html" title="Welcome to searx"
3435 accesskey="P">previous</a> |</li>
35− <li class="nav-item nav-item-0"><a href="../index.html">Searx Documentation (Searx-0.16.0.tex)</a> &#187;</li>
36+ <li class="nav-item nav-item-0"><a href="../index.html">Searx Documentation (Searx-0.16.0.tex)</a> &#187;</li>
37+ <li class="nav-item nav-item-this"><a href="">User documentation</a></li>
3638 </ul>
3739 </div>
3840
@@ -44,14 +46,23 @@
4446 <div class="section" id="user-documentation">
4547<h1>User documentation<a class="headerlink" href="#user-documentation" title="Permalink to this headline">¶</a></h1>
4648<div class="toctree-wrapper compound">
49+<p class="caption"><span class="caption-text">Contents</span></p>
4750<ul>
48−<li class="toctree-l1"><a class="reference internal" href="search_syntax.html">Search syntax</a></li>
49−<li class="toctree-l1"><a class="reference internal" href="own-instance.html">Why use a private instance?</a></li>
51+<li class="toctree-l1"><a class="reference internal" href="search_syntax.html">Search syntax</a><ul>
52+<li class="toctree-l2"><a class="reference internal" href="search_syntax.html#examples">Examples</a></li>
53+</ul>
54+</li>
55+<li class="toctree-l1"><a class="reference internal" href="own-instance.html">Why use a private instance?</a><ul>
56+<li class="toctree-l2"><a class="reference internal" href="own-instance.html#how-does-searx-protect-privacy">How does searx protect privacy?</a></li>
57+<li class="toctree-l2"><a class="reference internal" href="own-instance.html#conclusion">Conclusion</a></li>
58+</ul>
59+</li>
5060</ul>
5161</div>
5262</div>
5363
5464
65+ <div class="clearer"></div>
5566 </div>
5667 </div>
5768 </div>
@@ -100,7 +111,7 @@
100111
101112 <div class="footer" role="contentinfo">
102113 &#169; Copyright 2015-2020, Adam Tauber, Noémi Ványi.
103− Created using <a href="http://sphinx-doc.org/">Sphinx</a> 2.4.4.
114+ Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 3.1.1.
104115 </div>
105116 <script src="../_static/version_warning_offset.js"></script>
106117
user/own-instance.html+11−5
@@ -1,9 +1,10 @@
11
22<!DOCTYPE html>
33
4−<html xmlns="http://www.w3.org/1999/xhtml">
4+<html>
55 <head>
66 <meta charset="utf-8" />
7+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
78 <meta name="viewport" content="width=device-width, initial-scale=1">
89 <title>Why use a private instance? &#8212; Searx Documentation (Searx-0.16.0.tex)</title>
910 <link rel="stylesheet" href="../_static/searx.css" type="text/css" />
@@ -33,7 +34,8 @@
3334 <a href="search_syntax.html" title="Search syntax"
3435 accesskey="P">previous</a> |</li>
3536 <li class="nav-item nav-item-0"><a href="../index.html">Searx Documentation (Searx-0.16.0.tex)</a> &#187;</li>
36− <li class="nav-item nav-item-1"><a href="index.html" accesskey="U">User documentation</a> &#187;</li>
37+ <li class="nav-item nav-item-1"><a href="index.html" accesskey="U">User documentation</a> &#187;</li>
38+ <li class="nav-item nav-item-this"><a href="">Why use a private instance?</a></li>
3739 </ul>
3840 </div>
3941
@@ -44,8 +46,11 @@
4446
4547 <div class="section" id="why-use-a-private-instance">
4648<h1>Why use a private instance?<a class="headerlink" href="#why-use-a-private-instance" title="Permalink to this headline">¶</a></h1>
47−<p>“Is it worth to run my own instance?” is a common question among searx users.
48−Before answering this question, see what options a searx user has.</p>
49+<blockquote>
50+<div><p><em>“Is it worth to run my own instance?”</em></p>
51+</div></blockquote>
52+<p>.. is a common question among searx users. Before answering this question,
53+see what options a searx user has.</p>
4954<p>Public instances are open to everyone who has access to its URL. Usually, these
5055are operated by unknown parties (from the users’ point of view). Private
5156instances can be used by a select group of people. It is for example a searx of
@@ -110,6 +115,7 @@ instance, have access to a privacy respecting search service.</p>
110115</div>
111116
112117
118+ <div class="clearer"></div>
113119 </div>
114120 </div>
115121 </div>
@@ -161,7 +167,7 @@ instance, have access to a privacy respecting search service.</p>
161167
162168 <div class="footer" role="contentinfo">
163169 &#169; Copyright 2015-2020, Adam Tauber, Noémi Ványi.
164− Created using <a href="http://sphinx-doc.org/">Sphinx</a> 2.4.4.
170+ Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 3.1.1.
165171 </div>
166172 <script src="../_static/version_warning_offset.js"></script>
167173
user/search_syntax.html+6−3
@@ -1,9 +1,10 @@
11
22<!DOCTYPE html>
33
4−<html xmlns="http://www.w3.org/1999/xhtml">
4+<html>
55 <head>
66 <meta charset="utf-8" />
7+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
78 <meta name="viewport" content="width=device-width, initial-scale=1">
89 <title>Search syntax &#8212; Searx Documentation (Searx-0.16.0.tex)</title>
910 <link rel="stylesheet" href="../_static/searx.css" type="text/css" />
@@ -33,7 +34,8 @@
3334 <a href="index.html" title="User documentation"
3435 accesskey="P">previous</a> |</li>
3536 <li class="nav-item nav-item-0"><a href="../index.html">Searx Documentation (Searx-0.16.0.tex)</a> &#187;</li>
36− <li class="nav-item nav-item-1"><a href="index.html" accesskey="U">User documentation</a> &#187;</li>
37+ <li class="nav-item nav-item-1"><a href="index.html" accesskey="U">User documentation</a> &#187;</li>
38+ <li class="nav-item nav-item-this"><a href="">Search syntax</a></li>
3739 </ul>
3840 </div>
3941
@@ -78,6 +80,7 @@ categories and languages.</p>
7880</div>
7981
8082
83+ <div class="clearer"></div>
8184 </div>
8285 </div>
8386 </div>
@@ -129,7 +132,7 @@ categories and languages.</p>
129132
130133 <div class="footer" role="contentinfo">
131134 &#169; Copyright 2015-2020, Adam Tauber, Noémi Ványi.
132− Created using <a href="http://sphinx-doc.org/">Sphinx</a> 2.4.4.
135+ Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 3.1.1.
133136 </div>
134137 <script src="../_static/version_warning_offset.js"></script>
135138
utils/filtron.sh.htmlnew file+304
@@ -0,0 +1,304 @@
1+
2+<!DOCTYPE html>
3+
4+<html>
5+ <head>
6+ <meta charset="utf-8" />
7+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
8+ <meta name="viewport" content="width=device-width, initial-scale=1">
9+ <title>utils/filtron.sh &#8212; Searx Documentation (Searx-0.16.0.tex)</title>
10+ <link rel="stylesheet" href="../_static/searx.css" type="text/css" />
11+ <link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
12+ <link rel="stylesheet" type="text/css" href="../_static/sphinx_tabs/semantic-ui-2.4.1/segment.min.css" />
13+ <link rel="stylesheet" type="text/css" href="../_static/sphinx_tabs/semantic-ui-2.4.1/menu.min.css" />
14+ <link rel="stylesheet" type="text/css" href="../_static/sphinx_tabs/semantic-ui-2.4.1/tab.min.css" />
15+ <link rel="stylesheet" type="text/css" href="../_static/sphinx_tabs/tabs.css" />
16+ <script id="documentation_options" data-url_root="../" src="../_static/documentation_options.js"></script>
17+ <script src="../_static/jquery.js"></script>
18+ <script src="../_static/underscore.js"></script>
19+ <script src="../_static/doctools.js"></script>
20+ <script src="../_static/language_data.js"></script>
21+ <script src="../_static/sphinx_tabs/semantic-ui-2.4.1/tab.min.js"></script>
22+ <script src="../_static/sphinx_tabs/tabs.js"></script>
23+ <link rel="index" title="Index" href="../genindex.html" />
24+ <link rel="search" title="Search" href="../search.html" />
25+ <link rel="next" title="utils/morty.sh" href="morty.sh.html" />
26+ <link rel="prev" title="utils/searx.sh" href="searx.sh.html" />
27+ <script>DOCUMENTATION_OPTIONS.URL_ROOT = '../';</script>
28+
29+ </head><body>
30+ <div class="related" role="navigation" aria-label="related navigation">
31+ <h3>Navigation</h3>
32+ <ul>
33+ <li class="right" style="margin-right: 10px">
34+ <a href="../genindex.html" title="General Index"
35+ accesskey="I">index</a></li>
36+ <li class="right" >
37+ <a href="morty.sh.html" title="utils/morty.sh"
38+ accesskey="N">next</a> |</li>
39+ <li class="right" >
40+ <a href="searx.sh.html" title="utils/searx.sh"
41+ accesskey="P">previous</a> |</li>
42+ <li class="nav-item nav-item-0"><a href="../index.html">Searx Documentation (Searx-0.16.0.tex)</a> &#187;</li>
43+ <li class="nav-item nav-item-1"><a href="index.html" accesskey="U">Tooling box <code class="docutils literal notranslate"><span class="pre">utils/*</span></code></a> &#187;</li>
44+ <li class="nav-item nav-item-this"><a href=""><code class="docutils literal notranslate"><span class="pre">utils/filtron.sh</span></code></a></li>
45+ </ul>
46+ </div>
47+
48+ <div class="document">
49+ <div class="documentwrapper">
50+ <div class="bodywrapper">
51+ <div class="body" role="main">
52+
53+ <div class="section" id="utils-filtron-sh">
54+<span id="filtron-sh"></span><h1><code class="docutils literal notranslate"><span class="pre">utils/filtron.sh</span></code><a class="headerlink" href="#utils-filtron-sh" title="Permalink to this headline">¶</a></h1>
55+<div class="sidebar">
56+<p class="sidebar-title">further reading</p>
57+<ul class="simple">
58+<li><p><a class="reference internal" href="../admin/filtron.html#searx-filtron"><span class="std std-ref">How to protect an instance</span></a></p></li>
59+<li><p><a class="reference internal" href="../admin/architecture.html#architecture"><span class="std std-ref">Architecture</span></a></p></li>
60+<li><p><a class="reference internal" href="../admin/installation.html#installation"><span class="std std-ref">Installation</span></a> (<a class="reference internal" href="../admin/installation-nginx.html#installation-nginx"><span class="std std-ref">nginx</span></a> &amp; <a class="reference internal" href="../admin/installation-apache.html#installation-apache"><span class="std std-ref">apache</span></a>)</p></li>
61+</ul>
62+</div>
63+<p>To simplify installation and maintenance of a filtron instance you can use the
64+script <a class="reference external" href="https://github.com/asciimoo/searx/blob/master/utils/filtron.sh">git://utils/filtron.sh</a>. In most cases you will install <a class="reference external" href="https://github.com/asciimoo/filtron">filtron</a>
65+simply by running the command:</p>
66+<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>sudo -H ./utils/filtron.sh install all
67+</pre></div>
68+</div>
69+<p>The script adds a <code class="docutils literal notranslate"><span class="pre">${SERVICE_USER}</span></code> (default:<code class="docutils literal notranslate"><span class="pre">filtron</span></code>) and installs <a class="reference external" href="https://github.com/asciimoo/filtron">filtron</a>
70+into this user account:</p>
71+<ol class="arabic simple">
72+<li><p>Create a separated user account (<code class="docutils literal notranslate"><span class="pre">filtron</span></code>).</p></li>
73+<li><p>Download and install <a class="reference external" href="https://golang.org/">Go</a> binary in user’s $HOME (<code class="docutils literal notranslate"><span class="pre">~filtron</span></code>).</p></li>
74+<li><p>Install filtron with the package management from <a class="reference external" href="https://golang.org/">Go</a> (<code class="docutils literal notranslate"><span class="pre">go</span> <span class="pre">get</span> <span class="pre">-v</span> <span class="pre">-u</span>
75+<span class="pre">github.com/asciimoo/filtron</span></code>)</p></li>
76+<li><p>Setup a proper rule configuration <a class="reference external" href="https://github.com/asciimoo/searx/blob/master/utils/templates/etc/filtron/rules.json">[ref]</a> (<code class="docutils literal notranslate"><span class="pre">/etc/filtron/rules.json</span></code>).</p></li>
77+<li><p>Setup a systemd service unit <a class="reference external" href="https://github.com/asciimoo/searx/blob/master/utils/templates/lib/systemd/system/filtron.service">[ref]</a>
78+(<code class="docutils literal notranslate"><span class="pre">/lib/systemd/system/filtron.service</span></code>).</p></li>
79+</ol>
80+<div class="section" id="create-user">
81+<h2>Create user<a class="headerlink" href="#create-user" title="Permalink to this headline">¶</a></h2>
82+<div class="sphinx-tabs docutils container">
83+<div class="ui top attached tabular menu sphinx-menu docutils container">
84+<div class="active item sphinx-data-tab-YmFzaA== docutils container">
85+<div class="docutils container">
86+<p>bash</p>
87+</div>
88+</div>
89+</div>
90+<div class="ui bottom attached sphinx-tab tab segment sphinx-data-tab-YmFzaA== active docutils container">
91+<div class="highlight-sh notranslate"><div class="highlight"><pre><span></span>$ sudo -H useradd --shell /bin/bash --system <span class="se">\</span>
92+ --home-dir /usr/local/filtron <span class="se">\</span>
93+ --comment Privacy-respecting metasearch engine filtron
94+
95+$ sudo -H mkdir /usr/local/filtron
96+$ sudo -H chown -R filtron:filtron /usr/local/filtron
97+</pre></div>
98+</div>
99+</div>
100+</div>
101+</div>
102+<div class="section" id="install-go">
103+<h2>Install go<a class="headerlink" href="#install-go" title="Permalink to this headline">¶</a></h2>
104+<div class="sphinx-tabs docutils container">
105+<div class="ui top attached tabular menu sphinx-menu docutils container">
106+<div class="active item sphinx-data-tab-YmFzaA== docutils container">
107+<div class="docutils container">
108+<p>bash</p>
109+</div>
110+</div>
111+</div>
112+<div class="ui bottom attached sphinx-tab tab segment sphinx-data-tab-YmFzaA== active docutils container">
113+<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$ cat &gt; /usr/local/filtron/.go_env <span class="s">&lt;&lt;EOF</span>
114+<span class="s">export GOPATH=/usr/local/filtron/go-apps</span>
115+<span class="s">export PATH=$PATH:/usr/local/filtron/local/go/bin:$GOPATH/bin</span>
116+<span class="s">EOF</span>
117+$ sudo -i -u filtron
118+<span class="o">(</span>filtron<span class="o">)</span> $ <span class="nb">echo</span> <span class="s1">&#39;source /usr/local/filtron/.go_env&#39;</span> &gt;&gt; ~/.profile
119+<span class="o">(</span>filtron<span class="o">)</span> $ mkdir /usr/local/filtron/local
120+<span class="o">(</span>filtron<span class="o">)</span> $ wget --progress<span class="o">=</span>bar -O go1.13.5.linux-amd64.tar.gz <span class="se">\</span>
121+ https://dl.google.com/go/go1.13.5.linux-amd64.tar.gz
122+<span class="o">(</span>filtron<span class="o">)</span> $ tar -C /usr/local/filtron/local/go -xzf go1.13.5.linux-amd64.tar.gz
123+<span class="o">(</span>filtron<span class="o">)</span> $ which go
124+/usr/local/filtron/local/go/bin/go
125+</pre></div>
126+</div>
127+</div>
128+</div>
129+</div>
130+<div class="section" id="install-filtron">
131+<h2>Install filtron<a class="headerlink" href="#install-filtron" title="Permalink to this headline">¶</a></h2>
132+<p>Install <a class="reference external" href="https://github.com/asciimoo/searx/blob/master/utils/templates/etc/filtron/rules.json">rules.json</a> at
133+<code class="docutils literal notranslate"><span class="pre">/etc/filtron/rules.json</span></code> (see <a class="reference internal" href="../admin/filtron.html#sample-configuration-of-filtron"><span class="std std-ref">Sample configuration of filtron</span></a>) and
134+install filtron software and systemd unit:</p>
135+<div class="sphinx-tabs docutils container">
136+<div class="ui top attached tabular menu sphinx-menu docutils container">
137+<div class="active item sphinx-data-tab-YmFzaA== docutils container">
138+<div class="docutils container">
139+<p>bash</p>
140+</div>
141+</div>
142+</div>
143+<div class="ui bottom attached sphinx-tab tab segment sphinx-data-tab-YmFzaA== active docutils container">
144+<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$ sudo -i -u filtron
145+<span class="o">(</span>filtron<span class="o">)</span> $ go get -v -u github.com/asciimoo/filtron
146+</pre></div>
147+</div>
148+</div>
149+</div>
150+<div class="sphinx-tabs docutils container">
151+<div class="ui top attached tabular menu sphinx-menu docutils container">
152+<div class="active item sphinx-data-tab-c3lzdGVtZA== docutils container">
153+<div class="docutils container">
154+<p>systemd</p>
155+</div>
156+</div>
157+</div>
158+<div class="ui bottom attached sphinx-tab tab segment sphinx-data-tab-c3lzdGVtZA== active docutils container">
159+<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span><span class="o">[</span>Unit<span class="o">]</span>
160+
161+<span class="nv">Description</span><span class="o">=</span>filtron
162+<span class="nv">After</span><span class="o">=</span>syslog.target
163+<span class="nv">After</span><span class="o">=</span>network.target
164+
165+<span class="o">[</span>Service<span class="o">]</span>
166+
167+<span class="nv">Type</span><span class="o">=</span>simple
168+<span class="nv">User</span><span class="o">=</span>filtron
169+<span class="nv">Group</span><span class="o">=</span>filtron
170+<span class="nv">WorkingDirectory</span><span class="o">=</span>/usr/local/filtron
171+<span class="nv">ExecStart</span><span class="o">=</span>/usr/local/filtron/go-apps/bin/filtron -api <span class="s1">&#39;127.0.0.1:4005&#39;</span> -listen <span class="s1">&#39;127.0.0.1:4004&#39;</span> -rules <span class="s1">&#39;/etc/filtron/rules.json&#39;</span> -target <span class="s1">&#39;127.0.0.1:8888&#39;</span>
172+
173+<span class="nv">Restart</span><span class="o">=</span>always
174+<span class="nv">Environment</span><span class="o">=</span><span class="nv">USER</span><span class="o">=</span>filtron <span class="nv">HOME</span><span class="o">=</span>/usr/local/filtron
175+
176+<span class="c1"># Some distributions may not support these hardening directives. If you cannot</span>
177+<span class="c1"># start the service due to an unknown option, comment out the ones not supported</span>
178+<span class="c1"># by your version of systemd.</span>
179+
180+<span class="nv">ProtectSystem</span><span class="o">=</span>full
181+<span class="nv">PrivateDevices</span><span class="o">=</span>yes
182+<span class="nv">PrivateTmp</span><span class="o">=</span>yes
183+<span class="nv">NoNewPrivileges</span><span class="o">=</span><span class="nb">true</span>
184+
185+<span class="o">[</span>Install<span class="o">]</span>
186+
187+<span class="nv">WantedBy</span><span class="o">=</span>multi-user.target
188+</pre></div>
189+</div>
190+</div>
191+</div>
192+</div>
193+<div class="section" id="overview">
194+<span id="filtron-sh-overview"></span><h2>Overview<a class="headerlink" href="#overview" title="Permalink to this headline">¶</a></h2>
195+<p>The <code class="docutils literal notranslate"><span class="pre">--help</span></code> output of the script is largely self-explanatory
196+(<a class="reference internal" href="index.html#toolboxing-common"><span class="std std-ref">Common commands &amp; environment</span></a>):</p>
197+<div class="highlight-text notranslate"><div class="highlight"><pre><span></span>usage::
198+ filtron.sh shell
199+ filtron.sh install [all|user|rules]
200+ filtron.sh update [filtron]
201+ filtron.sh remove [all]
202+ filtron.sh activate [service]
203+ filtron.sh deactivate [service]
204+ filtron.sh inspect [service]
205+ filtron.sh option [debug-on|debug-off]
206+ filtron.sh apache [install|remove]
207+ filtron.sh nginx [install|remove]
208+
209+shell
210+ start interactive shell from user filtron
211+install / remove
212+ :all: complete setup of filtron service
213+ :user: add/remove service user &#39;filtron&#39; (/usr/local/filtron)
214+ :rules: reinstall filtron rules /etc/filtron/rules.json
215+update filtron
216+ Update filtron installation (/usr/local/filtron)
217+activate service
218+ activate and start service daemon (systemd unit)
219+deactivate service
220+ stop and deactivate service daemon (systemd unit)
221+inspect service
222+ show service status and log
223+option
224+ set one of the available options
225+apache (http://192.168.1.127/searx)
226+ :install: apache site with a reverse proxy (ProxyPass)
227+ :remove: apache site searx.conf
228+nginx (http://192.168.1.127/searx)
229+ :install: nginx site with a reverse proxy (ProxyPass)
230+ :remove: nginx site searx.conf
231+
232+filtron rules: /etc/filtron/rules.json
233+
234+If needed, set PUBLIC_URL of your WEB service in the &#39;.config.sh&#39; file::
235+ PUBLIC_URL : http://192.168.1.127/searx
236+ PUBLIC_HOST : 192.168.1.127
237+ SERVICE_USER : filtron
238+ FILTRON_TARGET : 127.0.0.1:8888
239+ FILTRON_API : 127.0.0.1:4005
240+ FILTRON_LISTEN : 127.0.0.1:4004
241+</pre></div>
242+</div>
243+</div>
244+</div>
245+
246+
247+ <div class="clearer"></div>
248+ </div>
249+ </div>
250+ </div>
251+ <span id="sidebar-top"></span>
252+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
253+ <div class="sphinxsidebarwrapper">
254+
255+
256+ <p class="logo"><a href="../index.html">
257+ <img class="logo" src="../_static/searx_logo_small.png" alt="Logo"/>
258+ </a></p>
259+
260+
261+ <h3>Project Links</h3>
262+ <ul>
263+ <li><a href="https://github.com/asciimoo/searx">Source</a>
264+
265+ <li><a href="https://github.com/asciimoo/searx/wiki">Wiki</a>
266+
267+ <li><a href="https://searx.space/">Public instances</a>
268+
269+ <li><a href="https://twitter.com/Searx_engine">Twitter</a>
270+ </ul><h3>Navigation</h3>
271+<ul>
272+ <li><a href="../index.html">Overview</a>
273+ <ul>
274+ <li><a href="index.html">Tooling box <code class="docutils literal notranslate"><span class="pre">utils/*</span></code></a>
275+ <ul>
276+ <li>Previous: <a href="searx.sh.html" title="previous chapter"><code class="docutils literal notranslate"><span class="pre">utils/searx.sh</span></code></a>
277+ <li>Next: <a href="morty.sh.html" title="next chapter"><code class="docutils literal notranslate"><span class="pre">utils/morty.sh</span></code></a></ul>
278+ </li>
279+ </ul>
280+ </li>
281+</ul>
282+<div id="searchbox" style="display: none" role="search">
283+ <h3 id="searchlabel">Quick search</h3>
284+ <div class="searchformwrapper">
285+ <form class="search" action="../search.html" method="get">
286+ <input type="text" name="q" aria-labelledby="searchlabel" />
287+ <input type="submit" value="Go" />
288+ </form>
289+ </div>
290+</div>
291+<script>$('#searchbox').show(0);</script>
292+ </div>
293+ </div>
294+ <div class="clearer"></div>
295+ </div>
296+
297+ <div class="footer" role="contentinfo">
298+ &#169; Copyright 2015-2020, Adam Tauber, Noémi Ványi.
299+ Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 3.1.1.
300+ </div>
301+ <script src="../_static/version_warning_offset.js"></script>
302+
303+ </body>
304+</html>
utils/index.htmlnew file+220
@@ -0,0 +1,220 @@
1+
2+<!DOCTYPE html>
3+
4+<html>
5+ <head>
6+ <meta charset="utf-8" />
7+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
8+ <meta name="viewport" content="width=device-width, initial-scale=1">
9+ <title>Tooling box utils/* &#8212; Searx Documentation (Searx-0.16.0.tex)</title>
10+ <link rel="stylesheet" href="../_static/searx.css" type="text/css" />
11+ <link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
12+ <script id="documentation_options" data-url_root="../" src="../_static/documentation_options.js"></script>
13+ <script src="../_static/jquery.js"></script>
14+ <script src="../_static/underscore.js"></script>
15+ <script src="../_static/doctools.js"></script>
16+ <script src="../_static/language_data.js"></script>
17+ <link rel="index" title="Index" href="../genindex.html" />
18+ <link rel="search" title="Search" href="../search.html" />
19+ <link rel="next" title="utils/searx.sh" href="searx.sh.html" />
20+ <link rel="prev" title="reST primer" href="../dev/reST.html" />
21+ <script>DOCUMENTATION_OPTIONS.URL_ROOT = '../';</script>
22+
23+ </head><body>
24+ <div class="related" role="navigation" aria-label="related navigation">
25+ <h3>Navigation</h3>
26+ <ul>
27+ <li class="right" style="margin-right: 10px">
28+ <a href="../genindex.html" title="General Index"
29+ accesskey="I">index</a></li>
30+ <li class="right" >
31+ <a href="searx.sh.html" title="utils/searx.sh"
32+ accesskey="N">next</a> |</li>
33+ <li class="right" >
34+ <a href="../dev/reST.html" title="reST primer"
35+ accesskey="P">previous</a> |</li>
36+ <li class="nav-item nav-item-0"><a href="../index.html">Searx Documentation (Searx-0.16.0.tex)</a> &#187;</li>
37+ <li class="nav-item nav-item-this"><a href="">Tooling box <code class="docutils literal notranslate"><span class="pre">utils/*</span></code></a></li>
38+ </ul>
39+ </div>
40+
41+ <div class="document">
42+ <div class="documentwrapper">
43+ <div class="bodywrapper">
44+ <div class="body" role="main">
45+
46+ <div class="section" id="tooling-box-utils">
47+<span id="toolboxing"></span><span id="searx-utils"></span><h1>Tooling box <code class="docutils literal notranslate"><span class="pre">utils/*</span></code><a class="headerlink" href="#tooling-box-utils" title="Permalink to this headline">¶</a></h1>
48+<p>In the folder <a class="reference external" href="https://github.com/asciimoo/searx/blob/master/utils/">git://utils/</a> we maintain some tools useful for admins and
49+developers.</p>
50+<div class="toctree-wrapper compound">
51+<p class="caption"><span class="caption-text">Contents</span></p>
52+<ul>
53+<li class="toctree-l1"><a class="reference internal" href="searx.sh.html"><code class="docutils literal notranslate"><span class="pre">utils/searx.sh</span></code></a><ul>
54+<li class="toctree-l2"><a class="reference internal" href="searx.sh.html#install">Install</a></li>
55+<li class="toctree-l2"><a class="reference internal" href="searx.sh.html#overview">Overview</a></li>
56+</ul>
57+</li>
58+<li class="toctree-l1"><a class="reference internal" href="filtron.sh.html"><code class="docutils literal notranslate"><span class="pre">utils/filtron.sh</span></code></a><ul>
59+<li class="toctree-l2"><a class="reference internal" href="filtron.sh.html#create-user">Create user</a></li>
60+<li class="toctree-l2"><a class="reference internal" href="filtron.sh.html#install-go">Install go</a></li>
61+<li class="toctree-l2"><a class="reference internal" href="filtron.sh.html#install-filtron">Install filtron</a></li>
62+<li class="toctree-l2"><a class="reference internal" href="filtron.sh.html#overview">Overview</a></li>
63+</ul>
64+</li>
65+<li class="toctree-l1"><a class="reference internal" href="morty.sh.html"><code class="docutils literal notranslate"><span class="pre">utils/morty.sh</span></code></a><ul>
66+<li class="toctree-l2"><a class="reference internal" href="morty.sh.html#create-user">Create user</a></li>
67+<li class="toctree-l2"><a class="reference internal" href="morty.sh.html#install-go">Install go</a></li>
68+<li class="toctree-l2"><a class="reference internal" href="morty.sh.html#install-morty">Install morty</a></li>
69+<li class="toctree-l2"><a class="reference internal" href="morty.sh.html#overview">Overview</a></li>
70+</ul>
71+</li>
72+<li class="toctree-l1"><a class="reference internal" href="lxc.sh.html"><code class="docutils literal notranslate"><span class="pre">utils/lxc.sh</span></code></a><ul>
73+<li class="toctree-l2"><a class="reference internal" href="lxc.sh.html#install-suite">Install suite</a></li>
74+<li class="toctree-l2"><a class="reference internal" href="lxc.sh.html#running-commands">Running commands</a></li>
75+<li class="toctree-l2"><a class="reference internal" href="lxc.sh.html#setup-searx-buildhost">Setup searx buildhost</a></li>
76+<li class="toctree-l2"><a class="reference internal" href="lxc.sh.html#overview">Overview</a></li>
77+<li class="toctree-l2"><a class="reference internal" href="lxc.sh.html#searx-suite">searx suite</a></li>
78+</ul>
79+</li>
80+</ul>
81+</div>
82+<div class="section" id="common-commands-environment">
83+<span id="toolboxing-common"></span><h2>Common commands &amp; environment<a class="headerlink" href="#common-commands-environment" title="Permalink to this headline">¶</a></h2>
84+<p>Scripts to maintain services often dispose of common commands and environments.</p>
85+<dl>
86+<dt><code class="docutils literal notranslate"><span class="pre">shell</span></code><span class="classifier">command</span></dt><dd><p>Opens a shell from the service user <code class="docutils literal notranslate"><span class="pre">${SERVICE_USSR}</span></code>, very helpful for
87+troubleshooting.</p>
88+</dd>
89+<dt><code class="docutils literal notranslate"><span class="pre">inspect</span> <span class="pre">service</span></code><span class="classifier">command</span></dt><dd><p>Shows status and log of the service, most often you have a option to enable
90+more verbose debug logs. Very helpful for debugging, but be careful not to
91+enable debugging in a production environment!</p>
92+</dd>
93+<dt><code class="docutils literal notranslate"><span class="pre">FORCE_TIMEOUT</span></code><span class="classifier">environment</span></dt><dd><p>Sets timeout for interactive prompts. If you want to run a script in batch
94+job, with defaults choices, set <code class="docutils literal notranslate"><span class="pre">FORCE_TIMEOUT=0</span></code>. By example; to install a
95+reverse proxy for filtron on all containers of the <a class="reference internal" href="lxc.sh.html#lxc-searx-env"><span class="std std-ref">searx suite</span></a> use</p>
96+<div class="highlight-none notranslate"><div class="highlight"><pre><span></span>sudo -H ./utils/lxc.sh cmd -- FORCE_TIMEOUT=0 ./utils/filtron.sh apache install
97+</pre></div>
98+</div>
99+</dd>
100+</dl>
101+</div>
102+<div class="section" id="tooling-box-setup">
103+<span id="toolboxing-setup"></span><h2>Tooling box setup<a class="headerlink" href="#tooling-box-setup" title="Permalink to this headline">¶</a></h2>
104+<p>The main setup is done in the <a class="reference external" href="https://github.com/asciimoo/searx/blob/master/.config.sh">git://.config.sh</a> (read also <a class="reference internal" href="../dev/makefile.html#makefile-setup"><span class="std std-ref">Makefile setup</span></a>).</p>
105+<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span><span class="c1"># -*- coding: utf-8; mode: sh -*-</span>
106+<span class="c1"># SPDX-License-Identifier: AGPL-3.0-or-later</span>
107+<span class="c1"># shellcheck shell=bash disable=SC2034</span>
108+<span class="c1">#</span>
109+<span class="c1"># This environment is used by ./utils scripts like filtron.sh or searx.sh. The</span>
110+<span class="c1"># default values are *most flexible* and *best maintained*, you normally not</span>
111+<span class="c1"># need to change the defaults (except PUBLIC_URL).</span>
112+<span class="c1">#</span>
113+<span class="c1"># Before you change any value here you have to uninstall any previous</span>
114+<span class="c1"># installation. Further is it recommended to backup your changes simply by</span>
115+<span class="c1"># adding them to you local brand (git branch)::</span>
116+<span class="c1">#</span>
117+<span class="c1"># git add .config</span>
118+
119+<span class="c1"># The public URL of the searx instance: PUBLIC_URL=&quot;https://mydomain.xy/searx&quot;</span>
120+<span class="c1"># The default is taken from ./utils/brand.env.</span>
121+
122+<span class="nv">PUBLIC_URL</span><span class="o">=</span><span class="s2">&quot;</span><span class="si">${</span><span class="nv">SEARX_URL</span><span class="si">}</span><span class="s2">&quot;</span>
123+
124+<span class="k">if</span> <span class="o">[[</span> <span class="si">${</span><span class="nv">PUBLIC_URL</span><span class="si">}</span> <span class="o">==</span> <span class="s2">&quot;https://searx.me&quot;</span> <span class="o">]]</span><span class="p">;</span> <span class="k">then</span>
125+ <span class="c1"># hint: Linux containers do not have DNS entries, lets use IPs</span>
126+ <span class="nv">PUBLIC_URL</span><span class="o">=</span><span class="s2">&quot;http://</span><span class="k">$(</span>primary_ip<span class="k">)</span><span class="s2">/searx&quot;</span>
127+<span class="k">fi</span>
128+
129+<span class="c1"># searx.sh</span>
130+<span class="c1"># ---------</span>
131+
132+<span class="c1"># SEARX_INTERNAL_URL=&quot;127.0.0.1:8888&quot;</span>
133+
134+<span class="c1"># Only change, if you maintain a searx brand in your searx fork.</span>
135+<span class="c1"># GIT_BRANCH=&quot;${GIT_BRANCH:-master}&quot;</span>
136+
137+<span class="c1"># filtron.sh</span>
138+<span class="c1"># ----------</span>
139+
140+<span class="c1"># FILTRON_API=&quot;127.0.0.1:4005&quot;</span>
141+<span class="c1"># FILTRON_LISTEN=&quot;127.0.0.1:4004&quot;</span>
142+<span class="c1"># FILTRON_TARGET=&quot;127.0.0.1:8888&quot;</span>
143+
144+<span class="c1"># morty.sh</span>
145+<span class="c1"># --------</span>
146+
147+<span class="c1"># morty listen address</span>
148+<span class="c1"># MORTY_LISTEN=&quot;127.0.0.1:3000&quot;</span>
149+<span class="c1"># PUBLIC_URL_PATH_MORTY=&quot;/morty/&quot;</span>
150+
151+<span class="c1"># system services</span>
152+<span class="c1"># ---------------</span>
153+
154+<span class="c1"># Common $HOME folder of the service accounts</span>
155+<span class="c1"># SERVICE_HOME_BASE=&quot;/usr/local&quot;</span>
156+
157+<span class="c1"># **experimental**: Set SERVICE_USER to run all services by one account, but be</span>
158+<span class="c1"># aware that removing discrete components might conflict!</span>
159+<span class="c1"># SERVICE_USER=searx</span>
160+</pre></div>
161+</div>
162+</div>
163+</div>
164+
165+
166+ <div class="clearer"></div>
167+ </div>
168+ </div>
169+ </div>
170+ <span id="sidebar-top"></span>
171+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
172+ <div class="sphinxsidebarwrapper">
173+
174+
175+ <p class="logo"><a href="../index.html">
176+ <img class="logo" src="../_static/searx_logo_small.png" alt="Logo"/>
177+ </a></p>
178+
179+
180+ <h3>Project Links</h3>
181+ <ul>
182+ <li><a href="https://github.com/asciimoo/searx">Source</a>
183+
184+ <li><a href="https://github.com/asciimoo/searx/wiki">Wiki</a>
185+
186+ <li><a href="https://searx.space/">Public instances</a>
187+
188+ <li><a href="https://twitter.com/Searx_engine">Twitter</a>
189+ </ul><h3>Navigation</h3>
190+<ul>
191+ <li><a href="../index.html">Overview</a>
192+ <ul>
193+ <li>Previous: <a href="../dev/reST.html" title="previous chapter">reST primer</a>
194+ <li>Next: <a href="searx.sh.html" title="next chapter"><code class="docutils literal notranslate"><span class="pre">utils/searx.sh</span></code></a>
195+ </ul>
196+ </li>
197+</ul>
198+<div id="searchbox" style="display: none" role="search">
199+ <h3 id="searchlabel">Quick search</h3>
200+ <div class="searchformwrapper">
201+ <form class="search" action="../search.html" method="get">
202+ <input type="text" name="q" aria-labelledby="searchlabel" />
203+ <input type="submit" value="Go" />
204+ </form>
205+ </div>
206+</div>
207+<script>$('#searchbox').show(0);</script>
208+ </div>
209+ </div>
210+ <div class="clearer"></div>
211+ </div>
212+
213+ <div class="footer" role="contentinfo">
214+ &#169; Copyright 2015-2020, Adam Tauber, Noémi Ványi.
215+ Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 3.1.1.
216+ </div>
217+ <script src="../_static/version_warning_offset.js"></script>
218+
219+ </body>
220+</html>
utils/lxc.sh.htmlnew file+364
@@ -0,0 +1,364 @@
1+
2+<!DOCTYPE html>
3+
4+<html>
5+ <head>
6+ <meta charset="utf-8" />
7+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
8+ <meta name="viewport" content="width=device-width, initial-scale=1">
9+ <title>utils/lxc.sh &#8212; Searx Documentation (Searx-0.16.0.tex)</title>
10+ <link rel="stylesheet" href="../_static/searx.css" type="text/css" />
11+ <link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
12+ <script id="documentation_options" data-url_root="../" src="../_static/documentation_options.js"></script>
13+ <script src="../_static/jquery.js"></script>
14+ <script src="../_static/underscore.js"></script>
15+ <script src="../_static/doctools.js"></script>
16+ <script src="../_static/language_data.js"></script>
17+ <link rel="index" title="Index" href="../genindex.html" />
18+ <link rel="search" title="Search" href="../search.html" />
19+ <link rel="next" title="Blog" href="../blog/index.html" />
20+ <link rel="prev" title="utils/morty.sh" href="morty.sh.html" />
21+ <script>DOCUMENTATION_OPTIONS.URL_ROOT = '../';</script>
22+
23+ </head><body>
24+ <div class="related" role="navigation" aria-label="related navigation">
25+ <h3>Navigation</h3>
26+ <ul>
27+ <li class="right" style="margin-right: 10px">
28+ <a href="../genindex.html" title="General Index"
29+ accesskey="I">index</a></li>
30+ <li class="right" >
31+ <a href="../blog/index.html" title="Blog"
32+ accesskey="N">next</a> |</li>
33+ <li class="right" >
34+ <a href="morty.sh.html" title="utils/morty.sh"
35+ accesskey="P">previous</a> |</li>
36+ <li class="nav-item nav-item-0"><a href="../index.html">Searx Documentation (Searx-0.16.0.tex)</a> &#187;</li>
37+ <li class="nav-item nav-item-1"><a href="index.html" accesskey="U">Tooling box <code class="docutils literal notranslate"><span class="pre">utils/*</span></code></a> &#187;</li>
38+ <li class="nav-item nav-item-this"><a href=""><code class="docutils literal notranslate"><span class="pre">utils/lxc.sh</span></code></a></li>
39+ </ul>
40+ </div>
41+
42+ <div class="document">
43+ <div class="documentwrapper">
44+ <div class="bodywrapper">
45+ <div class="body" role="main">
46+
47+ <div class="section" id="utils-lxc-sh">
48+<span id="lxc-sh"></span><h1><code class="docutils literal notranslate"><span class="pre">utils/lxc.sh</span></code><a class="headerlink" href="#utils-lxc-sh" title="Permalink to this headline">¶</a></h1>
49+<div class="sidebar">
50+<p class="sidebar-title">further reading</p>
51+<ul class="simple">
52+<li><p><a class="reference external" href="https://snapcraft.io">snap</a>, <a class="reference external" href="https://snapcraft.io/lxd">snapcraft LXD</a></p></li>
53+<li><p><a class="reference external" href="https://linuxcontainers.org/lxc/introduction/">LXC</a>, <a class="reference external" href="https://linuxcontainers.org/lxd/introduction/">LXD</a></p></li>
54+<li><p><a class="reference external" href="https://uk.images.linuxcontainers.org/">LXC/LXD Image Server</a></p></li>
55+<li><p><a class="reference external" href="https://github.com/lxc/lxd">LXD&#64;github</a></p></li>
56+</ul>
57+</div>
58+<p>With the use of <em>Linux Containers</em> (<a class="reference external" href="https://linuxcontainers.org/lxc/introduction/">LXC</a>) we can scale our tasks over a stack of
59+containers, what we call the: <em>lxc suite</em>. The <em>searx suite</em>
60+(<a class="reference external" href="https://github.com/asciimoo/searx/blob/master/utils/lxc-searx.env">lxc-searx.env</a>) is loaded by default, every time
61+you start the <code class="docutils literal notranslate"><span class="pre">lxc.sh</span></code> script (<em>you do not need to care about</em>).</p>
62+<p>Before you can start with containers, you need to install and initiate <a class="reference external" href="https://linuxcontainers.org/lxd/introduction/">LXD</a>
63+once:</p>
64+<div class="highlight-none notranslate"><div class="highlight"><pre><span></span>$ snap install lxd
65+$ lxd init --auto
66+</pre></div>
67+</div>
68+<p>To make use of the containers from the <em>searx suite</em>, you have to build the
69+<a class="reference internal" href="#lxc-sh-help"><span class="std std-ref">LXC suite containers</span></a> initial. But be warned, <strong>this might
70+take some time</strong>:</p>
71+<div class="highlight-none notranslate"><div class="highlight"><pre><span></span>$ sudo -H ./utils/lxc.sh build
72+</pre></div>
73+</div>
74+<p>A cup of coffee later, your LXC suite is build up and you can run whatever task
75+you want / in a selected or even in all <a class="reference internal" href="#lxc-sh-help"><span class="std std-ref">LXC suite containers</span></a>. If you do not want to build all containers, <strong>you can build just
76+one</strong>:</p>
77+<div class="highlight-none notranslate"><div class="highlight"><pre><span></span>$ sudo -H ./utils/lxc.sh build searx-ubu1804
78+</pre></div>
79+</div>
80+<p><em>Good to know …</em></p>
81+<p>Eeach container shares the root folder of the repository and the
82+command <code class="docutils literal notranslate"><span class="pre">utils/lxc.sh</span> <span class="pre">cmd</span></code> <strong>handles relative path names transparent</strong>,
83+compare output of:</p>
84+<div class="highlight-none notranslate"><div class="highlight"><pre><span></span>$ sudo -H ./utils/lxc.sh cmd -- ls -la Makefile
85+...
86+</pre></div>
87+</div>
88+<p>In the containers, you can run what ever you want, e.g. to start a bash use:</p>
89+<div class="highlight-none notranslate"><div class="highlight"><pre><span></span>$ sudo -H ./utils/lxc.sh cmd searx-ubu1804 bash
90+INFO: [searx-ubu1804] bash
91+root@searx-ubu1804:/share/searx#
92+</pre></div>
93+</div>
94+<p>If there comes the time you want to <strong>get rid off all</strong> the containers and
95+<strong>clean up local images</strong> just type:</p>
96+<div class="highlight-none notranslate"><div class="highlight"><pre><span></span>$ sudo -H ./utils/lxc.sh remove
97+$ sudo -H ./utils/lxc.sh remove images
98+</pre></div>
99+</div>
100+<div class="section" id="install-suite">
101+<h2>Install suite<a class="headerlink" href="#install-suite" title="Permalink to this headline">¶</a></h2>
102+<p>To install the complete <a class="reference internal" href="#lxc-searx-env"><span class="std std-ref">searx suite (includes searx, morty &amp; filtron)</span></a> into all <a class="reference external" href="https://linuxcontainers.org/lxc/introduction/">LXC</a> use:</p>
103+<div class="highlight-none notranslate"><div class="highlight"><pre><span></span>$ sudo -H ./utils/lxc.sh install suite
104+</pre></div>
105+</div>
106+<p>The command above installs a searx suite (see <a class="reference internal" href="../admin/installation.html#installation-scripts"><span class="std std-ref">Installation scripts</span></a>). To
107+get the IP (URL) of the filtron service in the containers use <code class="docutils literal notranslate"><span class="pre">show</span> <span class="pre">suite</span></code>
108+command. To test instances from containers just open the URLs in your
109+WEB-Browser:</p>
110+<div class="highlight-none notranslate"><div class="highlight"><pre><span></span>$ sudo ./utils/lxc.sh show suite | grep filtron
111+[searx-ubu1604] INFO: (eth0) filtron: http://n.n.n.246:4004/ http://n.n.n.246/searx
112+[searx-ubu1804] INFO: (eth0) filtron: http://n.n.n.147:4004/ http://n.n.n.147/searx
113+[searx-ubu1910] INFO: (eth0) filtron: http://n.n.n.140:4004/ http://n.n.n.140/searx
114+[searx-ubu2004] INFO: (eth0) filtron: http://n.n.n.18:4004/ http://n.n.n.18/searx
115+[searx-fedora31] INFO: (eth0) filtron: http://n.n.n.46:4004/ http://n.n.n.46/searx
116+[searx-archlinux] INFO: (eth0) filtron: http://n.n.n.32:4004/ http://n.n.n.32/searx
117+</pre></div>
118+</div>
119+<p>To <a class="reference internal" href="../admin/installation-nginx.html#installation-nginx"><span class="std std-ref">install a nginx</span></a> reverse proxy for filtron and
120+morty use (or alternatively use <a class="reference internal" href="../admin/installation-apache.html#installation-apache"><span class="std std-ref">apache</span></a>):</p>
121+<div class="highlight-none notranslate"><div class="highlight"><pre><span></span>sudo -H ./utils/lxc.sh cmd -- FORCE_TIMEOUT=0 ./utils/filtron.sh nginx install
122+sudo -H ./utils/lxc.sh cmd -- FORCE_TIMEOUT=0 ./utils/morty.sh nginx install
123+</pre></div>
124+</div>
125+</div>
126+<div class="section" id="running-commands">
127+<h2>Running commands<a class="headerlink" href="#running-commands" title="Permalink to this headline">¶</a></h2>
128+<p><strong>Inside containers, you can use make or run scripts</strong> from the
129+<a class="reference internal" href="index.html#toolboxing"><span class="std std-ref">Tooling box utils/*</span></a>. By example: to setup a <a class="reference internal" href="../admin/buildhosts.html#buildhosts"><span class="std std-ref">Buildhosts</span></a> and run the
130+Makefile target <code class="docutils literal notranslate"><span class="pre">test</span></code> in the <a class="reference external" href="https://www.archlinux.org/">archlinux</a> container:</p>
131+<div class="highlight-none notranslate"><div class="highlight"><pre><span></span>sudo -H ./utils/lxc.sh cmd searx-archlinux ./utils/searx.sh install buildhost
132+sudo -H ./utils/lxc.sh cmd searx-archlinux make test
133+</pre></div>
134+</div>
135+</div>
136+<div class="section" id="setup-searx-buildhost">
137+<h2>Setup searx buildhost<a class="headerlink" href="#setup-searx-buildhost" title="Permalink to this headline">¶</a></h2>
138+<p>You can <strong>install the searx buildhost environment</strong> into one or all containers.
139+The installation procedure to set up a <a class="reference internal" href="../admin/buildhosts.html#buildhosts"><span class="std std-ref">build host</span></a> takes its
140+time. Installation in all containers will take more time (time for another cup
141+of coffee).:</p>
142+<div class="highlight-none notranslate"><div class="highlight"><pre><span></span>sudo -H ./utils/lxc.sh cmd -- ./utils/searx.sh install buildhost
143+</pre></div>
144+</div>
145+<p>To build (live) documentation inside a <a class="reference external" href="https://www.archlinux.org/">archlinux</a> container:</p>
146+<div class="highlight-none notranslate"><div class="highlight"><pre><span></span>sudo -H ./utils/lxc.sh cmd searx-archlinux make docs-clean docs-live
147+...
148+[I 200331 15:00:42 server:296] Serving on http://0.0.0.0:8080
149+</pre></div>
150+</div>
151+<p>To get IP of the container and the port number <em>live docs</em> is listening:</p>
152+<div class="highlight-none notranslate"><div class="highlight"><pre><span></span>$ sudo ./utils/lxc.sh show suite | grep docs-live
153+...
154+[searx-archlinux] INFO: (eth0) docs-live: http://n.n.n.12:8080/
155+</pre></div>
156+</div>
157+</div>
158+<div class="section" id="overview">
159+<span id="lxc-sh-help"></span><h2>Overview<a class="headerlink" href="#overview" title="Permalink to this headline">¶</a></h2>
160+<p>The <code class="docutils literal notranslate"><span class="pre">--help</span></code> output of the script is largely self-explanatory:</p>
161+<div class="highlight-text notranslate"><div class="highlight"><pre><span></span>usage::
162+ lxc.sh build [containers|&lt;name&gt;]
163+ lxc.sh copy [images]
164+ lxc.sh remove [containers|&lt;name&gt;|images]
165+ lxc.sh [start|stop] [containers|&lt;name&gt;]
166+ lxc.sh show [images|suite|info|config [&lt;name&gt;]]
167+ lxc.sh cmd [--|&lt;name&gt;] &#39;...&#39;
168+ lxc.sh install [suite|base [&lt;name&gt;]]
169+
170+build
171+ :containers: build, launch all containers and &#39;install base&#39; packages
172+ :&lt;name&gt;: build, launch container &lt;name&gt; and &#39;install base&#39; packages
173+copy:
174+ :images: copy remote images of the suite into local storage
175+remove
176+ :containers: delete all &#39;containers&#39; or only &lt;container-name&gt;
177+ :images: delete local images of the suite
178+start/stop
179+ :containers: start/stop all &#39;containers&#39; from the suite
180+ :&lt;name&gt;: start/stop container &lt;name&gt; from suite
181+show
182+ :info: show info of all (or &lt;name&gt;) containers from LXC suite
183+ :config: show config of all (or &lt;name&gt;) containers from the LXC suite
184+ :suite: show services of all (or &lt;name&gt;) containers from the LXC suite
185+ :images: show information of local images
186+cmd
187+ use single qoutes to evaluate in container&#39;s bash, e.g.: &#39;echo $(hostname)&#39;
188+ -- run command &#39;...&#39; in all containers of the LXC suite
189+ :&lt;name&gt;: run command &#39;...&#39; in container &lt;name&gt;
190+install
191+ :base: prepare LXC; install basic packages
192+ :suite: install LXC searx suite into all (or &lt;name&gt;) containers
193+
194+LXC suite: searx --&gt; http://192.168.1.127/searx
195+ suite includes searx, morty &amp; filtron
196+suite images:
197+ ubu1604 ubu1804 ubu1910 ubu2004 fedora31 archlinux
198+suite containers:
199+ searx-ubu1604 searx-ubu1804 searx-ubu1910 searx-ubu2004 searx-fedora31
200+ searx-archlinux
201+</pre></div>
202+</div>
203+</div>
204+<div class="section" id="searx-suite">
205+<span id="lxc-searx-env"></span><h2>searx suite<a class="headerlink" href="#searx-suite" title="Permalink to this headline">¶</a></h2>
206+<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span><span class="c1"># -*- coding: utf-8; mode: sh indent-tabs-mode: nil -*-</span>
207+<span class="c1"># SPDX-License-Identifier: AGPL-3.0-or-later</span>
208+<span class="c1"># shellcheck shell=bash</span>
209+
210+<span class="c1"># This file is a setup of a LXC suite. It is sourced from different context, do</span>
211+<span class="c1"># not manipulate the environment directly, implement functions and manipulate</span>
212+<span class="c1"># environment only is subshells!</span>
213+
214+<span class="c1"># ----------------------------------------------------------------------------</span>
215+<span class="c1"># config</span>
216+<span class="c1"># ----------------------------------------------------------------------------</span>
217+
218+<span class="c1"># shellcheck disable=SC2034</span>
219+<span class="nv">LXC_SUITE_NAME</span><span class="o">=</span><span class="s2">&quot;searx&quot;</span>
220+lxc_set_suite_env<span class="o">()</span> <span class="o">{</span>
221+ <span class="c1"># name of https://images.linuxcontainers.org</span>
222+ <span class="nb">export</span> <span class="nv">LINUXCONTAINERS_ORG_NAME</span><span class="o">=</span><span class="s2">&quot;</span><span class="si">${</span><span class="nv">LINUXCONTAINERS_ORG_NAME</span><span class="k">:-</span><span class="nv">images</span><span class="si">}</span><span class="s2">&quot;</span>
223+ <span class="nb">export</span> <span class="nv">LXC_HOST_PREFIX</span><span class="o">=</span><span class="s2">&quot;</span><span class="si">${</span><span class="nv">LXC_SUITE_NAME</span><span class="k">:-</span><span class="nv">searx</span><span class="si">}</span><span class="s2">&quot;</span>
224+ <span class="nb">export</span> <span class="nv">LXC_SUITE</span><span class="o">=(</span>
225+
226+ <span class="c1"># to disable containers, comment out lines ..</span>
227+
228+ <span class="c1"># end of standard support see https://wiki.ubuntu.com/Releases</span>
229+ <span class="s2">&quot;</span><span class="nv">$LINUXCONTAINERS_ORG_NAME</span><span class="s2">:ubuntu/16.04&quot;</span> <span class="s2">&quot;ubu1604&quot;</span> <span class="c1"># April 2021</span>
230+ <span class="s2">&quot;</span><span class="nv">$LINUXCONTAINERS_ORG_NAME</span><span class="s2">:ubuntu/18.04&quot;</span> <span class="s2">&quot;ubu1804&quot;</span> <span class="c1"># April 2023</span>
231+ <span class="s2">&quot;</span><span class="nv">$LINUXCONTAINERS_ORG_NAME</span><span class="s2">:ubuntu/19.10&quot;</span> <span class="s2">&quot;ubu1910&quot;</span> <span class="c1"># July 2020</span>
232+ <span class="s2">&quot;</span><span class="nv">$LINUXCONTAINERS_ORG_NAME</span><span class="s2">:ubuntu/20.04&quot;</span> <span class="s2">&quot;ubu2004&quot;</span> <span class="c1"># future (EOL 2030)</span>
233+
234+ <span class="c1"># EOL see https://fedoraproject.org/wiki/Releases</span>
235+ <span class="s2">&quot;</span><span class="nv">$LINUXCONTAINERS_ORG_NAME</span><span class="s2">:fedora/31&quot;</span> <span class="s2">&quot;fedora31&quot;</span>
236+
237+ <span class="c1"># rolling releases see https://www.archlinux.org/releng/releases/</span>
238+ <span class="s2">&quot;</span><span class="nv">$LINUXCONTAINERS_ORG_NAME</span><span class="s2">:archlinux&quot;</span> <span class="s2">&quot;archlinux&quot;</span>
239+ <span class="o">)</span>
240+
241+ <span class="nv">PUBLIC_URL</span><span class="o">=</span><span class="s2">&quot;</span><span class="si">${</span><span class="nv">PUBLIC_URL</span><span class="k">:-</span><span class="nv">http</span><span class="p">://</span><span class="k">$(</span>uname -n<span class="k">)</span><span class="p">/searx</span><span class="si">}</span><span class="s2">&quot;</span>
242+ <span class="k">if</span> in_container<span class="p">;</span> <span class="k">then</span>
243+ <span class="c1"># container hostnames do not have a DNS entry: use primary IP!</span>
244+ <span class="nv">PUBLIC_URL</span><span class="o">=</span><span class="s2">&quot;http://</span><span class="k">$(</span>primary_ip<span class="k">)</span><span class="s2">/searx&quot;</span>
245+
246+ <span class="c1"># make GUEST&#39;s services public to the HOST</span>
247+ <span class="nv">FILTRON_API</span><span class="o">=</span><span class="s2">&quot;0.0.0.0:4005&quot;</span>
248+ <span class="nv">FILTRON_LISTEN</span><span class="o">=</span><span class="s2">&quot;0.0.0.0:4004&quot;</span>
249+ <span class="nv">MORTY_LISTEN</span><span class="o">=</span><span class="s2">&quot;0.0.0.0:3000&quot;</span>
250+
251+ <span class="c1"># export LXC specific environment</span>
252+ <span class="nb">export</span> PUBLIC_URL FILTRON_API FILTRON_LISTEN MORTY_LISTEN
253+ <span class="k">fi</span>
254+<span class="o">}</span>
255+
256+lxc_suite_install_info<span class="o">()</span> <span class="o">{</span>
257+ <span class="o">(</span>
258+ lxc_set_suite_env
259+ cat <span class="s">&lt;&lt;EOF</span>
260+<span class="s">LXC suite: ${LXC_SUITE_NAME} --&gt; ${PUBLIC_URL}</span>
261+<span class="s"> suite includes searx, morty &amp; filtron</span>
262+<span class="s">suite images:</span>
263+<span class="s">$(echo &quot; ${LOCAL_IMAGES[*]}&quot; | $FMT)</span>
264+<span class="s">suite containers:</span>
265+<span class="s">$(echo &quot; ${CONTAINERS[*]}&quot; | $FMT)</span>
266+<span class="s">EOF</span>
267+ <span class="o">)</span>
268+ <span class="o">}</span>
269+
270+lxc_suite_install<span class="o">()</span> <span class="o">{</span>
271+ <span class="o">(</span>
272+ lxc_set_suite_env
273+ <span class="nv">FORCE_TIMEOUT</span><span class="o">=</span>0
274+ <span class="nb">export</span> FORCE_TIMEOUT
275+ <span class="s2">&quot;</span><span class="si">${</span><span class="nv">LXC_REPO_ROOT</span><span class="si">}</span><span class="s2">/utils/searx.sh&quot;</span> install all
276+ <span class="s2">&quot;</span><span class="si">${</span><span class="nv">LXC_REPO_ROOT</span><span class="si">}</span><span class="s2">/utils/morty.sh&quot;</span> install all
277+ <span class="s2">&quot;</span><span class="si">${</span><span class="nv">LXC_REPO_ROOT</span><span class="si">}</span><span class="s2">/utils/filtron.sh&quot;</span> install all
278+
279+ rst_title <span class="s2">&quot;suite installation finished (</span><span class="k">$(</span>hostname<span class="k">)</span><span class="s2">)&quot;</span> part
280+ lxc_suite_info
281+ <span class="nb">echo</span>
282+ <span class="o">)</span>
283+<span class="o">}</span>
284+
285+lxc_suite_info<span class="o">()</span> <span class="o">{</span>
286+ <span class="o">(</span>
287+ lxc_set_suite_env
288+ <span class="k">for</span> ip in <span class="k">$(</span>global_IPs<span class="k">)</span> <span class="p">;</span> <span class="k">do</span>
289+ <span class="k">if</span> <span class="o">[[</span> <span class="nv">$ip</span> <span class="o">=</span>~ .*:.* <span class="o">]]</span><span class="p">;</span> <span class="k">then</span>
290+ info_msg <span class="s2">&quot;(</span><span class="si">${</span><span class="nv">ip</span><span class="p">%|*</span><span class="si">}</span><span class="s2">) IPv6: http://[</span><span class="si">${</span><span class="nv">ip</span><span class="p">#*|</span><span class="si">}</span><span class="s2">]&quot;</span>
291+ <span class="k">else</span>
292+ <span class="c1"># IPv4:</span>
293+ <span class="c1"># shellcheck disable=SC2034,SC2031</span>
294+ info_msg <span class="s2">&quot;(</span><span class="si">${</span><span class="nv">ip</span><span class="p">%|*</span><span class="si">}</span><span class="s2">) filtron: http://</span><span class="si">${</span><span class="nv">ip</span><span class="p">#*|</span><span class="si">}</span><span class="s2">:4004/ </span><span class="nv">$PUBLIC_URL</span><span class="s2">&quot;</span>
295+ info_msg <span class="s2">&quot;(</span><span class="si">${</span><span class="nv">ip</span><span class="p">%|*</span><span class="si">}</span><span class="s2">) morty: http://</span><span class="si">${</span><span class="nv">ip</span><span class="p">#*|</span><span class="si">}</span><span class="s2">:3000/ </span><span class="nv">$PUBLIC_URL_MORTY</span><span class="s2">&quot;</span>
296+ info_msg <span class="s2">&quot;(</span><span class="si">${</span><span class="nv">ip</span><span class="p">%|*</span><span class="si">}</span><span class="s2">) docs-live: http://</span><span class="si">${</span><span class="nv">ip</span><span class="p">#*|</span><span class="si">}</span><span class="s2">:8080/&quot;</span>
297+ <span class="k">fi</span>
298+ <span class="k">done</span>
299+ <span class="o">)</span>
300+<span class="o">}</span>
301+</pre></div>
302+</div>
303+</div>
304+</div>
305+
306+
307+ <div class="clearer"></div>
308+ </div>
309+ </div>
310+ </div>
311+ <span id="sidebar-top"></span>
312+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
313+ <div class="sphinxsidebarwrapper">
314+
315+
316+ <p class="logo"><a href="../index.html">
317+ <img class="logo" src="../_static/searx_logo_small.png" alt="Logo"/>
318+ </a></p>
319+
320+
321+ <h3>Project Links</h3>
322+ <ul>
323+ <li><a href="https://github.com/asciimoo/searx">Source</a>
324+
325+ <li><a href="https://github.com/asciimoo/searx/wiki">Wiki</a>
326+
327+ <li><a href="https://searx.space/">Public instances</a>
328+
329+ <li><a href="https://twitter.com/Searx_engine">Twitter</a>
330+ </ul><h3>Navigation</h3>
331+<ul>
332+ <li><a href="../index.html">Overview</a>
333+ <ul>
334+ <li><a href="index.html">Tooling box <code class="docutils literal notranslate"><span class="pre">utils/*</span></code></a>
335+ <ul>
336+ <li>Previous: <a href="morty.sh.html" title="previous chapter"><code class="docutils literal notranslate"><span class="pre">utils/morty.sh</span></code></a>
337+ <li>Next: <a href="../blog/index.html" title="next chapter">Blog</a></ul>
338+ </li>
339+ </ul>
340+ </li>
341+</ul>
342+<div id="searchbox" style="display: none" role="search">
343+ <h3 id="searchlabel">Quick search</h3>
344+ <div class="searchformwrapper">
345+ <form class="search" action="../search.html" method="get">
346+ <input type="text" name="q" aria-labelledby="searchlabel" />
347+ <input type="submit" value="Go" />
348+ </form>
349+ </div>
350+</div>
351+<script>$('#searchbox').show(0);</script>
352+ </div>
353+ </div>
354+ <div class="clearer"></div>
355+ </div>
356+
357+ <div class="footer" role="contentinfo">
358+ &#169; Copyright 2015-2020, Adam Tauber, Noémi Ványi.
359+ Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 3.1.1.
360+ </div>
361+ <script src="../_static/version_warning_offset.js"></script>
362+
363+ </body>
364+</html>
utils/morty.sh.htmlnew file+308
@@ -0,0 +1,308 @@
1+
2+<!DOCTYPE html>
3+
4+<html>
5+ <head>
6+ <meta charset="utf-8" />
7+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
8+ <meta name="viewport" content="width=device-width, initial-scale=1">
9+ <title>utils/morty.sh &#8212; Searx Documentation (Searx-0.16.0.tex)</title>
10+ <link rel="stylesheet" href="../_static/searx.css" type="text/css" />
11+ <link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
12+ <link rel="stylesheet" type="text/css" href="../_static/sphinx_tabs/semantic-ui-2.4.1/segment.min.css" />
13+ <link rel="stylesheet" type="text/css" href="../_static/sphinx_tabs/semantic-ui-2.4.1/menu.min.css" />
14+ <link rel="stylesheet" type="text/css" href="../_static/sphinx_tabs/semantic-ui-2.4.1/tab.min.css" />
15+ <link rel="stylesheet" type="text/css" href="../_static/sphinx_tabs/tabs.css" />
16+ <script id="documentation_options" data-url_root="../" src="../_static/documentation_options.js"></script>
17+ <script src="../_static/jquery.js"></script>
18+ <script src="../_static/underscore.js"></script>
19+ <script src="../_static/doctools.js"></script>
20+ <script src="../_static/language_data.js"></script>
21+ <script src="../_static/sphinx_tabs/semantic-ui-2.4.1/tab.min.js"></script>
22+ <script src="../_static/sphinx_tabs/tabs.js"></script>
23+ <link rel="index" title="Index" href="../genindex.html" />
24+ <link rel="search" title="Search" href="../search.html" />
25+ <link rel="next" title="utils/lxc.sh" href="lxc.sh.html" />
26+ <link rel="prev" title="utils/filtron.sh" href="filtron.sh.html" />
27+ <script>DOCUMENTATION_OPTIONS.URL_ROOT = '../';</script>
28+
29+ </head><body>
30+ <div class="related" role="navigation" aria-label="related navigation">
31+ <h3>Navigation</h3>
32+ <ul>
33+ <li class="right" style="margin-right: 10px">
34+ <a href="../genindex.html" title="General Index"
35+ accesskey="I">index</a></li>
36+ <li class="right" >
37+ <a href="lxc.sh.html" title="utils/lxc.sh"
38+ accesskey="N">next</a> |</li>
39+ <li class="right" >
40+ <a href="filtron.sh.html" title="utils/filtron.sh"
41+ accesskey="P">previous</a> |</li>
42+ <li class="nav-item nav-item-0"><a href="../index.html">Searx Documentation (Searx-0.16.0.tex)</a> &#187;</li>
43+ <li class="nav-item nav-item-1"><a href="index.html" accesskey="U">Tooling box <code class="docutils literal notranslate"><span class="pre">utils/*</span></code></a> &#187;</li>
44+ <li class="nav-item nav-item-this"><a href=""><code class="docutils literal notranslate"><span class="pre">utils/morty.sh</span></code></a></li>
45+ </ul>
46+ </div>
47+
48+ <div class="document">
49+ <div class="documentwrapper">
50+ <div class="bodywrapper">
51+ <div class="body" role="main">
52+
53+ <div class="section" id="utils-morty-sh">
54+<span id="morty-sh"></span><h1><code class="docutils literal notranslate"><span class="pre">utils/morty.sh</span></code><a class="headerlink" href="#utils-morty-sh" title="Permalink to this headline">¶</a></h1>
55+<div class="sidebar">
56+<p class="sidebar-title">further reading</p>
57+<ul class="simple">
58+<li><p><a class="reference internal" href="../admin/architecture.html#architecture"><span class="std std-ref">Architecture</span></a></p></li>
59+<li><p><a class="reference internal" href="../admin/installation.html#installation"><span class="std std-ref">Installation</span></a> (<a class="reference internal" href="../admin/installation-nginx.html#installation-nginx"><span class="std std-ref">nginx</span></a> &amp; <a class="reference internal" href="../admin/installation-apache.html#installation-apache"><span class="std std-ref">apache</span></a>)</p></li>
60+<li><p><a class="reference internal" href="../admin/morty.html#searx-morty"><span class="std std-ref">How to setup result proxy</span></a></p></li>
61+</ul>
62+</div>
63+<p>To simplify installation and maintenance of a <a class="reference external" href="https://github.com/asciimoo/morty">morty</a> instance you can use the
64+script <a class="reference external" href="https://github.com/asciimoo/searx/blob/master/utils/morty.sh">git://utils/morty.sh</a>. In most cases you will install <a class="reference external" href="https://github.com/asciimoo/morty">morty</a> simply by
65+running the command:</p>
66+<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>sudo -H ./utils/morty.sh install all
67+</pre></div>
68+</div>
69+<p>The script adds a <code class="docutils literal notranslate"><span class="pre">${SERVICE_USER}</span></code> (default:<code class="docutils literal notranslate"><span class="pre">morty</span></code>) and installs <a class="reference external" href="https://github.com/asciimoo/morty">morty</a>
70+into this user account:</p>
71+<ol class="arabic simple">
72+<li><p>Create a separated user account (<code class="docutils literal notranslate"><span class="pre">morty</span></code>).</p></li>
73+<li><p>Download and install <a class="reference external" href="https://golang.org/">Go</a> binary in user’s $HOME (<code class="docutils literal notranslate"><span class="pre">~morty</span></code>).</p></li>
74+<li><p>Install <a class="reference external" href="https://github.com/asciimoo/morty">morty</a> with the package management from <a class="reference external" href="https://golang.org/">Go</a> (<code class="docutils literal notranslate"><span class="pre">go</span> <span class="pre">get</span> <span class="pre">-v</span> <span class="pre">-u</span>
75+<span class="pre">github.com/asciimoo/morty</span></code>)</p></li>
76+<li><p>Setup a systemd service unit <a class="reference external" href="https://github.com/asciimoo/searx/blob/master/utils/templates/lib/systemd/system/morty.service">[ref]</a>
77+(<code class="docutils literal notranslate"><span class="pre">/lib/systemd/system/morty.service</span></code>).</p></li>
78+</ol>
79+<div class="admonition hint">
80+<p class="admonition-title">Hint</p>
81+<p>To add morty to your searx instance read chapter <a class="reference internal" href="../admin/morty.html#searx-morty"><span class="std std-ref">How to setup result proxy</span></a>.</p>
82+</div>
83+<div class="section" id="create-user">
84+<h2>Create user<a class="headerlink" href="#create-user" title="Permalink to this headline">¶</a></h2>
85+<div class="sphinx-tabs docutils container">
86+<div class="ui top attached tabular menu sphinx-menu docutils container">
87+<div class="active item sphinx-data-tab-YmFzaA== docutils container">
88+<div class="docutils container">
89+<p>bash</p>
90+</div>
91+</div>
92+</div>
93+<div class="ui bottom attached sphinx-tab tab segment sphinx-data-tab-YmFzaA== active docutils container">
94+<div class="highlight-sh notranslate"><div class="highlight"><pre><span></span>$ sudo -H useradd --shell /bin/bash --system <span class="se">\</span>
95+ --home-dir /usr/local/morty <span class="se">\</span>
96+ --comment Privacy-respecting metasearch engine morty
97+
98+$ sudo -H mkdir /usr/local/morty
99+$ sudo -H chown -R morty:morty /usr/local/morty
100+</pre></div>
101+</div>
102+</div>
103+</div>
104+</div>
105+<div class="section" id="install-go">
106+<h2>Install go<a class="headerlink" href="#install-go" title="Permalink to this headline">¶</a></h2>
107+<div class="sphinx-tabs docutils container">
108+<div class="ui top attached tabular menu sphinx-menu docutils container">
109+<div class="active item sphinx-data-tab-YmFzaA== docutils container">
110+<div class="docutils container">
111+<p>bash</p>
112+</div>
113+</div>
114+</div>
115+<div class="ui bottom attached sphinx-tab tab segment sphinx-data-tab-YmFzaA== active docutils container">
116+<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$ cat &gt; /usr/local/morty/.go_env <span class="s">&lt;&lt;EOF</span>
117+<span class="s">export GOPATH=/usr/local/morty/go-apps</span>
118+<span class="s">export PATH=$PATH:/usr/local/morty/local/go/bin:$GOPATH/bin</span>
119+<span class="s">EOF</span>
120+$ sudo -i -u morty
121+<span class="o">(</span>morty<span class="o">)</span> $ <span class="nb">echo</span> <span class="s1">&#39;source /usr/local/morty/.go_env&#39;</span> &gt;&gt; ~/.profile
122+<span class="o">(</span>morty<span class="o">)</span> $ mkdir /usr/local/morty/local
123+<span class="o">(</span>morty<span class="o">)</span> $ wget --progress<span class="o">=</span>bar -O go1.13.5.linux-amd64.tar.gz <span class="se">\</span>
124+ https://dl.google.com/go/go1.13.5.linux-amd64.tar.gz
125+<span class="o">(</span>morty<span class="o">)</span> $ tar -C /usr/local/morty/local/go -xzf go1.13.5.linux-amd64.tar.gz
126+<span class="o">(</span>morty<span class="o">)</span> $ which go
127+/usr/local/morty/local/go/bin/go
128+</pre></div>
129+</div>
130+</div>
131+</div>
132+</div>
133+<div class="section" id="install-morty">
134+<h2>Install morty<a class="headerlink" href="#install-morty" title="Permalink to this headline">¶</a></h2>
135+<p>Install morty software and systemd unit:</p>
136+<div class="sphinx-tabs docutils container">
137+<div class="ui top attached tabular menu sphinx-menu docutils container">
138+<div class="active item sphinx-data-tab-YmFzaA== docutils container">
139+<div class="docutils container">
140+<p>bash</p>
141+</div>
142+</div>
143+</div>
144+<div class="ui bottom attached sphinx-tab tab segment sphinx-data-tab-YmFzaA== active docutils container">
145+<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$ sudo -i -u morty
146+<span class="o">(</span>morty<span class="o">)</span> $ go get -v -u github.com/asciimoo/morty
147+</pre></div>
148+</div>
149+</div>
150+</div>
151+<div class="sphinx-tabs docutils container">
152+<div class="ui top attached tabular menu sphinx-menu docutils container">
153+<div class="active item sphinx-data-tab-c3lzdGVtZA== docutils container">
154+<div class="docutils container">
155+<p>systemd</p>
156+</div>
157+</div>
158+</div>
159+<div class="ui bottom attached sphinx-tab tab segment sphinx-data-tab-c3lzdGVtZA== active docutils container">
160+<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span><span class="o">[</span>Unit<span class="o">]</span>
161+
162+<span class="nv">Description</span><span class="o">=</span>morty
163+<span class="nv">After</span><span class="o">=</span>syslog.target
164+<span class="nv">After</span><span class="o">=</span>network.target
165+
166+<span class="o">[</span>Service<span class="o">]</span>
167+
168+<span class="nv">Type</span><span class="o">=</span>simple
169+<span class="nv">User</span><span class="o">=</span>morty
170+<span class="nv">Group</span><span class="o">=</span>morty
171+<span class="nv">WorkingDirectory</span><span class="o">=</span>/usr/local/morty
172+<span class="nv">ExecStart</span><span class="o">=</span>/usr/local/morty/go-apps/bin/morty -key <span class="s1">&#39;&#39;</span> -listen <span class="s1">&#39;127.0.0.1:3000&#39;</span> -timeout 5
173+
174+<span class="nv">Restart</span><span class="o">=</span>always
175+<span class="nv">Environment</span><span class="o">=</span><span class="nv">USER</span><span class="o">=</span>morty <span class="nv">HOME</span><span class="o">=</span>/usr/local/morty <span class="nv">DEBUG</span><span class="o">=</span><span class="nb">false</span>
176+
177+<span class="c1"># Some distributions may not support these hardening directives. If you cannot</span>
178+<span class="c1"># start the service due to an unknown option, comment out the ones not supported</span>
179+<span class="c1"># by your version of systemd.</span>
180+
181+<span class="nv">ProtectSystem</span><span class="o">=</span>full
182+<span class="nv">PrivateDevices</span><span class="o">=</span>yes
183+<span class="nv">PrivateTmp</span><span class="o">=</span>yes
184+<span class="nv">NoNewPrivileges</span><span class="o">=</span><span class="nb">true</span>
185+
186+<span class="o">[</span>Install<span class="o">]</span>
187+
188+<span class="nv">WantedBy</span><span class="o">=</span>multi-user.target
189+</pre></div>
190+</div>
191+</div>
192+</div>
193+</div>
194+<div class="section" id="overview">
195+<span id="morty-sh-overview"></span><h2>Overview<a class="headerlink" href="#overview" title="Permalink to this headline">¶</a></h2>
196+<p>The <code class="docutils literal notranslate"><span class="pre">--help</span></code> output of the script is largely self-explanatory
197+(<a class="reference internal" href="index.html#toolboxing-common"><span class="std std-ref">Common commands &amp; environment</span></a>):</p>
198+<div class="highlight-text notranslate"><div class="highlight"><pre><span></span>usage::
199+ morty.sh shell
200+ morty.sh install [all|user]
201+ morty.sh update [morty]
202+ morty.sh remove [all]
203+ morty.sh activate [service]
204+ morty.sh deactivate [service]
205+ morty.sh inspect [service]
206+ morty.sh option [debug-on|debug-off|new-key]
207+ morty.sh apache [install|remove]
208+ morty.sh nginx [install|remove]
209+ morty.sh info [searx]
210+
211+shell
212+ start interactive shell from user morty
213+install / remove
214+ all: complete setup of morty service
215+ user: add/remove service user &#39;morty&#39; (/usr/local/morty)
216+update morty
217+ Update morty installation (/usr/local/morty)
218+activate service
219+ activate and start service daemon (systemd unit)
220+deactivate service
221+ stop and deactivate service daemon (systemd unit)
222+inspect service
223+ show service status and log
224+option
225+ set one of the available options
226+ :new-key: set new morty key
227+apache : http://192.168.1.127/morty/
228+ :install: apache site with a reverse proxy (ProxyPass)
229+ :remove: apache site morty.conf
230+nginx (http://192.168.1.127/morty/)
231+ :install: nginx site with a reverse proxy (ProxyPass)
232+ :remove: nginx site morty.conf
233+
234+If needed, set the environment variables in the &#39;.config.sh&#39; file::
235+ PUBLIC_URL_MORTY: http://192.168.1.127/morty/
236+ MORTY_LISTEN: 127.0.0.1:3000
237+ SERVICE_USER: morty
238+
239+To activate result and image proxy in searx, edit settings.yml (read:
240+https://asciimoo.github.io/searx/admin/morty.html)::
241+ result_proxy:
242+ url : http://192.168.1.127/morty/
243+ server:
244+ image_proxy : True
245+</pre></div>
246+</div>
247+</div>
248+</div>
249+
250+
251+ <div class="clearer"></div>
252+ </div>
253+ </div>
254+ </div>
255+ <span id="sidebar-top"></span>
256+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
257+ <div class="sphinxsidebarwrapper">
258+
259+
260+ <p class="logo"><a href="../index.html">
261+ <img class="logo" src="../_static/searx_logo_small.png" alt="Logo"/>
262+ </a></p>
263+
264+
265+ <h3>Project Links</h3>
266+ <ul>
267+ <li><a href="https://github.com/asciimoo/searx">Source</a>
268+
269+ <li><a href="https://github.com/asciimoo/searx/wiki">Wiki</a>
270+
271+ <li><a href="https://searx.space/">Public instances</a>
272+
273+ <li><a href="https://twitter.com/Searx_engine">Twitter</a>
274+ </ul><h3>Navigation</h3>
275+<ul>
276+ <li><a href="../index.html">Overview</a>
277+ <ul>
278+ <li><a href="index.html">Tooling box <code class="docutils literal notranslate"><span class="pre">utils/*</span></code></a>
279+ <ul>
280+ <li>Previous: <a href="filtron.sh.html" title="previous chapter"><code class="docutils literal notranslate"><span class="pre">utils/filtron.sh</span></code></a>
281+ <li>Next: <a href="lxc.sh.html" title="next chapter"><code class="docutils literal notranslate"><span class="pre">utils/lxc.sh</span></code></a></ul>
282+ </li>
283+ </ul>
284+ </li>
285+</ul>
286+<div id="searchbox" style="display: none" role="search">
287+ <h3 id="searchlabel">Quick search</h3>
288+ <div class="searchformwrapper">
289+ <form class="search" action="../search.html" method="get">
290+ <input type="text" name="q" aria-labelledby="searchlabel" />
291+ <input type="submit" value="Go" />
292+ </form>
293+ </div>
294+</div>
295+<script>$('#searchbox').show(0);</script>
296+ </div>
297+ </div>
298+ <div class="clearer"></div>
299+ </div>
300+
301+ <div class="footer" role="contentinfo">
302+ &#169; Copyright 2015-2020, Adam Tauber, Noémi Ványi.
303+ Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 3.1.1.
304+ </div>
305+ <script src="../_static/version_warning_offset.js"></script>
306+
307+ </body>
308+</html>
utils/searx.sh.htmlnew file+180
@@ -0,0 +1,180 @@
1+
2+<!DOCTYPE html>
3+
4+<html>
5+ <head>
6+ <meta charset="utf-8" />
7+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
8+ <meta name="viewport" content="width=device-width, initial-scale=1">
9+ <title>utils/searx.sh &#8212; Searx Documentation (Searx-0.16.0.tex)</title>
10+ <link rel="stylesheet" href="../_static/searx.css" type="text/css" />
11+ <link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
12+ <script id="documentation_options" data-url_root="../" src="../_static/documentation_options.js"></script>
13+ <script src="../_static/jquery.js"></script>
14+ <script src="../_static/underscore.js"></script>
15+ <script src="../_static/doctools.js"></script>
16+ <script src="../_static/language_data.js"></script>
17+ <link rel="index" title="Index" href="../genindex.html" />
18+ <link rel="search" title="Search" href="../search.html" />
19+ <link rel="next" title="utils/filtron.sh" href="filtron.sh.html" />
20+ <link rel="prev" title="Tooling box utils/*" href="index.html" />
21+ <script>DOCUMENTATION_OPTIONS.URL_ROOT = '../';</script>
22+
23+ </head><body>
24+ <div class="related" role="navigation" aria-label="related navigation">
25+ <h3>Navigation</h3>
26+ <ul>
27+ <li class="right" style="margin-right: 10px">
28+ <a href="../genindex.html" title="General Index"
29+ accesskey="I">index</a></li>
30+ <li class="right" >
31+ <a href="filtron.sh.html" title="utils/filtron.sh"
32+ accesskey="N">next</a> |</li>
33+ <li class="right" >
34+ <a href="index.html" title="Tooling box utils/*"
35+ accesskey="P">previous</a> |</li>
36+ <li class="nav-item nav-item-0"><a href="../index.html">Searx Documentation (Searx-0.16.0.tex)</a> &#187;</li>
37+ <li class="nav-item nav-item-1"><a href="index.html" accesskey="U">Tooling box <code class="docutils literal notranslate"><span class="pre">utils/*</span></code></a> &#187;</li>
38+ <li class="nav-item nav-item-this"><a href=""><code class="docutils literal notranslate"><span class="pre">utils/searx.sh</span></code></a></li>
39+ </ul>
40+ </div>
41+
42+ <div class="document">
43+ <div class="documentwrapper">
44+ <div class="bodywrapper">
45+ <div class="body" role="main">
46+
47+ <div class="section" id="utils-searx-sh">
48+<span id="searx-sh"></span><h1><code class="docutils literal notranslate"><span class="pre">utils/searx.sh</span></code><a class="headerlink" href="#utils-searx-sh" title="Permalink to this headline">¶</a></h1>
49+<div class="sidebar">
50+<p class="sidebar-title">further reading</p>
51+<ul class="simple">
52+<li><p><a class="reference internal" href="../admin/architecture.html#architecture"><span class="std std-ref">Architecture</span></a></p></li>
53+<li><p><a class="reference internal" href="../admin/installation.html#installation"><span class="std std-ref">Installation</span></a></p></li>
54+<li><p><a class="reference internal" href="../admin/installation-nginx.html#installation-nginx"><span class="std std-ref">Install with nginx</span></a></p></li>
55+<li><p><a class="reference internal" href="../admin/installation-apache.html#installation-apache"><span class="std std-ref">Install with apache</span></a></p></li>
56+</ul>
57+</div>
58+<p>To simplify installation and maintenance of a searx instance you can use the
59+script <a class="reference external" href="https://github.com/asciimoo/searx/blob/master/utils/searx.sh">git://utils/searx.sh</a>.</p>
60+<div class="section" id="install">
61+<h2>Install<a class="headerlink" href="#install" title="Permalink to this headline">¶</a></h2>
62+<p>In most cases you will install searx simply by running the command:</p>
63+<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>sudo -H ./utils/searx.sh install all
64+</pre></div>
65+</div>
66+<p>The script adds a <code class="docutils literal notranslate"><span class="pre">${SERVICE_USER}</span></code> (default:<code class="docutils literal notranslate"><span class="pre">searx</span></code>) and installs searx
67+into this user account. The installation is described in chapter
68+<a class="reference internal" href="../admin/installation-searx.html#installation-basic"><span class="std std-ref">Step by step installation</span></a>.</p>
69+</div>
70+<div class="section" id="overview">
71+<span id="intranet-reverse-proxy"></span><h2>Overview<a class="headerlink" href="#overview" title="Permalink to this headline">¶</a></h2>
72+<p>The <code class="docutils literal notranslate"><span class="pre">--help</span></code> output of the script is largely self-explanatory
73+(<a class="reference internal" href="index.html#toolboxing-common"><span class="std std-ref">Common commands &amp; environment</span></a>):</p>
74+<div class="highlight-text notranslate"><div class="highlight"><pre><span></span>usage::
75+ searx.sh shell
76+ searx.sh install [all|user|searx-src|pyenv|uwsgi|packages|buildhost]
77+ searx.sh update [searx]
78+ searx.sh remove [all|user|pyenv|searx-src]
79+ searx.sh activate [service]
80+ searx.sh deactivate [service]
81+ searx.sh inspect [service]
82+ searx.sh option [debug-[on|off]|image-proxy-[on|off]|result-proxy &lt;url&gt; &lt;key&gt;]
83+ searx.sh apache [install|remove]
84+
85+shell
86+ start interactive shell from user searx
87+install / remove
88+ :all: complete (de-) installation of searx service
89+ :user: add/remove service user &#39;searx&#39; (/usr/local/searx)
90+ :searx-src: clone https://github.com/asciimoo/searx
91+ :pyenv: create/remove virtualenv (python) in /usr/local/searx/searx-pyenv
92+ :uwsgi: install searx uWSGI application
93+ :settings: reinstall settings from /800GBPCIex4/share/test123/asciimoo-searx/searx/settings.yml
94+ :packages: install needed packages from OS package manager
95+ :buildhost: install packages from OS package manager needed by buildhosts
96+update searx
97+ Update searx installation (/usr/local/searx)
98+activate service
99+ activate and start service daemon (systemd unit)
100+deactivate service
101+ stop and deactivate service daemon (systemd unit)
102+inspect service
103+ run some small tests and inspect service&#39;s status and log
104+option
105+ set one of the available options
106+apache
107+ :install: apache site with the searx uwsgi app
108+ :remove: apache site
109+
110+searx settings: /etc/searx/settings.yml
111+
112+If needed, set PUBLIC_URL of your WEB service in the &#39;.config.sh&#39; file::
113+ PUBLIC_URL : http://192.168.1.127/searx
114+ SEARX_INSTANCE_NAME : searx@192.168.1.127
115+ SERVICE_USER : searx
116+ SEARX_INTERNAL_HTTP : http://127.0.0.1:8888
117+</pre></div>
118+</div>
119+</div>
120+</div>
121+
122+
123+ <div class="clearer"></div>
124+ </div>
125+ </div>
126+ </div>
127+ <span id="sidebar-top"></span>
128+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
129+ <div class="sphinxsidebarwrapper">
130+
131+
132+ <p class="logo"><a href="../index.html">
133+ <img class="logo" src="../_static/searx_logo_small.png" alt="Logo"/>
134+ </a></p>
135+
136+
137+ <h3>Project Links</h3>
138+ <ul>
139+ <li><a href="https://github.com/asciimoo/searx">Source</a>
140+
141+ <li><a href="https://github.com/asciimoo/searx/wiki">Wiki</a>
142+
143+ <li><a href="https://searx.space/">Public instances</a>
144+
145+ <li><a href="https://twitter.com/Searx_engine">Twitter</a>
146+ </ul><h3>Navigation</h3>
147+<ul>
148+ <li><a href="../index.html">Overview</a>
149+ <ul>
150+ <li><a href="index.html">Tooling box <code class="docutils literal notranslate"><span class="pre">utils/*</span></code></a>
151+ <ul>
152+ <li>Previous: <a href="index.html" title="previous chapter">Tooling box <code class="docutils literal notranslate"><span class="pre">utils/*</span></code></a>
153+ <li>Next: <a href="filtron.sh.html" title="next chapter"><code class="docutils literal notranslate"><span class="pre">utils/filtron.sh</span></code></a></ul>
154+ </li>
155+ </ul>
156+ </li>
157+</ul>
158+<div id="searchbox" style="display: none" role="search">
159+ <h3 id="searchlabel">Quick search</h3>
160+ <div class="searchformwrapper">
161+ <form class="search" action="../search.html" method="get">
162+ <input type="text" name="q" aria-labelledby="searchlabel" />
163+ <input type="submit" value="Go" />
164+ </form>
165+ </div>
166+</div>
167+<script>$('#searchbox').show(0);</script>
168+ </div>
169+ </div>
170+ <div class="clearer"></div>
171+ </div>
172+
173+ <div class="footer" role="contentinfo">
174+ &#169; Copyright 2015-2020, Adam Tauber, Noémi Ványi.
175+ Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 3.1.1.
176+ </div>
177+ <script src="../_static/version_warning_offset.js"></script>
178+
179+ </body>
180+</html>