2017-06-12 12:34:30 +02:00
2019-12-30 18:31:17 +01:00
<!DOCTYPE html>
2016-10-30 01:02:58 +02:00
2020-06-19 11:15:15 +02:00
< html >
2016-10-30 01:02:58 +02:00
< head >
2019-12-30 18:31:17 +01:00
< meta charset = "utf-8" / >
2020-09-30 10:35:05 +02:00
< meta name = "viewport" content = "width=device-width, initial-scale=1.0" / >
2019-12-30 18:31:17 +01:00
< meta name = "viewport" content = "width=device-width, initial-scale=1" >
2020-07-25 18:33:36 +02:00
< title > How to protect an instance — Searx Documentation (Searx-0.17.0.tex)< / title >
2019-12-30 18:31:17 +01:00
< link rel = "stylesheet" href = "../_static/searx.css" type = "text/css" / >
2016-10-30 01:02:58 +02:00
< link rel = "stylesheet" href = "../_static/pygments.css" type = "text/css" / >
2020-09-30 10:35:05 +02:00
< link rel = "stylesheet" type = "text/css" href = "../_static/sphinx_tabs/semantic-ui-2.4.1/segment.min.css" / >
< link rel = "stylesheet" type = "text/css" href = "../_static/sphinx_tabs/semantic-ui-2.4.1/menu.min.css" / >
< link rel = "stylesheet" type = "text/css" href = "../_static/sphinx_tabs/semantic-ui-2.4.1/tab.min.css" / >
< link rel = "stylesheet" type = "text/css" href = "../_static/sphinx_tabs/tabs.css" / >
2020-02-15 10:08:58 +01:00
< script id = "documentation_options" data-url_root = "../" src = "../_static/documentation_options.js" > < / script >
< script src = "../_static/jquery.js" > < / script >
< script src = "../_static/underscore.js" > < / script >
< script src = "../_static/doctools.js" > < / script >
< script src = "../_static/language_data.js" > < / script >
2016-10-30 01:02:58 +02:00
< link rel = "index" title = "Index" href = "../genindex.html" / >
< link rel = "search" title = "Search" href = "../search.html" / >
2017-08-08 15:19:02 +02:00
< link rel = "next" title = "How to setup result proxy" href = "morty.html" / >
2019-12-30 18:31:17 +01:00
< link rel = "prev" title = "Architecture" href = "architecture.html" / >
< script > DOCUMENTATION _OPTIONS . URL _ROOT = '../' ; < / script >
2016-10-30 01:02:58 +02:00
2019-12-30 18:31:17 +01:00
< / head > < body >
< div class = "related" role = "navigation" aria-label = "related navigation" >
< h3 > Navigation< / h3 >
< ul >
< li class = "right" style = "margin-right: 10px" >
< a href = "../genindex.html" title = "General Index"
accesskey="I">index< / a > < / li >
< li class = "right" >
< a href = "morty.html" title = "How to setup result proxy"
accesskey="N">next< / a > |< / li >
< li class = "right" >
< a href = "architecture.html" title = "Architecture"
accesskey="P">previous< / a > |< / li >
2020-07-25 18:33:36 +02:00
< li class = "nav-item nav-item-0" > < a href = "../index.html" > Searx Documentation (Searx-0.17.0.tex)< / a > » < / li >
2020-09-30 10:35:05 +02:00
< li class = "nav-item nav-item-1" > < a href = "index.html" accesskey = "U" > Administrator documentation< / a > » < / li >
< li class = "nav-item nav-item-this" > < a href = "" > How to protect an instance< / a > < / li >
2019-12-30 18:31:17 +01:00
< / ul >
< / div >
2016-10-30 01:02:58 +02:00
< div class = "document" >
< div class = "documentwrapper" >
< div class = "bodywrapper" >
< div class = "body" role = "main" >
< div class = "section" id = "how-to-protect-an-instance" >
2020-06-19 11:15:15 +02:00
< 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 >
< div class = "sidebar" >
< p class = "sidebar-title" > further reading< / p >
< ul class = "simple" >
< 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 >
< 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 >
< / ul >
< / div >
< div class = "contents local topic" id = "contents" >
< p class = "topic-title" > Contents< / p >
< ul class = "simple" >
< li > < p > < a class = "reference internal" href = "#filtron-go" id = "id2" > filtron & go< / a > < / p > < / li >
< li > < p > < a class = "reference internal" href = "#sample-configuration-of-filtron" id = "id3" > Sample configuration of filtron< / a > < / p > < / li >
< li > < p > < a class = "reference internal" href = "#route-request-through-filtron" id = "id4" > Route request through filtron< / a > < / p > < / li >
< / ul >
< / div >
< p > Searx depends on external search services. To avoid the abuse of these services
2019-12-30 18:31:17 +01:00
it is advised to limit the number of requests processed by searx.< / p >
2020-06-19 11:15:15 +02:00
< p > An application firewall, < a class = "reference external" href = "https://github.com/asciimoo/filtron" > filtron< / a > solves exactly this problem. Filtron is just
a middleware between your web server (nginx, apache, …) and searx, we describe
such infratructures in chapter: < a class = "reference internal" href = "architecture.html#architecture" > < span class = "std std-ref" > Architecture< / span > < / a > .< / p >
< div class = "section" id = "filtron-go" >
< h2 > < a class = "toc-backref" href = "#id2" > filtron & go< / a > < a class = "headerlink" href = "#filtron-go" title = "Permalink to this headline" > ¶< / a > < / h2 >
< 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
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
filtron as middleware, a more isolated setup is recommended. To simplify such
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 >
< / div >
2016-10-30 01:02:58 +02:00
< div class = "section" id = "sample-configuration-of-filtron" >
2020-06-19 11:15:15 +02:00
< 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 >
< div class = "sidebar" >
< p class = "sidebar-title" > Tooling box< / p >
< ul class = "simple" >
2020-09-30 10:35:05 +02:00
< li > < p > < a class = "reference external" href = "https://github.com/searx/searx/blob/master/utils/templates/etc/filtron/rules.json" > /etc/filtron/rules.json< / a > < / p > < / li >
2020-06-19 11:15:15 +02:00
< / ul >
< / div >
2019-12-30 18:31:17 +01:00
< p > An example configuration can be find below. This configuration limits the access
of:< / p >
< ul class = "simple" >
< li > < p > scripts or applications (roboagent limit)< / p > < / li >
< li > < p > webcrawlers (botlimit)< / p > < / li >
< li > < p > IPs which send too many requests (IP limit)< / p > < / li >
< li > < p > too many json, csv, etc. requests (rss/json limit)< / p > < / li >
< li > < p > the same UserAgent of if too many requests (useragent limit)< / p > < / li >
2016-10-30 01:02:58 +02:00
< / ul >
2020-06-19 11:15:15 +02:00
< div class = "highlight-json notranslate" > < div class = "highlight" > < pre > < span > < / span > < span class = "p" > [< / span >
< span class = "p" > {< / span >
< span class = "nt" > " name" < / span > < span class = "p" > :< / span > < span class = "s2" > " search request" < / span > < span class = "p" > ,< / span >
< span class = "nt" > " filters" < / span > < span class = "p" > :< / span > < span class = "p" > [< / span >
< span class = "s2" > " Param:q" < / span > < span class = "p" > ,< / span >
< span class = "s2" > " Path=^(/|/search)$" < / span >
< span class = "p" > ],< / span >
2020-07-25 18:33:36 +02:00
< span class = "nt" > " interval" < / span > < span class = "p" > :< / span > < span class = "s2" > " < time-interval-in-sec (int)> " < / span > < span class = "p" > ,< / span >
< span class = "nt" > " limit" < / span > < span class = "p" > :< / span > < span class = "s2" > " < max-request-number-in-interval (int)> " < / span > < span class = "p" > ,< / span >
2020-06-19 11:15:15 +02:00
< span class = "nt" > " subrules" < / span > < span class = "p" > :< / span > < span class = "p" > [< / span >
2020-04-19 12:57:50 +02:00
< span class = "p" > {< / span >
2020-06-19 11:15:15 +02:00
< span class = "nt" > " name" < / span > < span class = "p" > :< / span > < span class = "s2" > " missing Accept-Language" < / span > < span class = "p" > ,< / span >
< span class = "nt" > " filters" < / span > < span class = "p" > :< / span > < span class = "p" > [< / span > < span class = "s2" > " !Header:Accept-Language" < / span > < span class = "p" > ],< / span >
< span class = "nt" > " limit" < / span > < span class = "p" > :< / span > < span class = "s2" > " < max-request-number-in-interval (int)> " < / span > < span class = "p" > ,< / span >
< span class = "nt" > " stop" < / span > < span class = "p" > :< / span > < span class = "kc" > true< / span > < span class = "p" > ,< / span >
< span class = "nt" > " actions" < / span > < span class = "p" > :< / span > < span class = "p" > [< / span >
< span class = "p" > {< / span > < span class = "nt" > " name" < / span > < span class = "p" > :< / span > < span class = "s2" > " log" < / span > < span class = "p" > },< / span >
< span class = "p" > {< / span > < span class = "nt" > " name" < / span > < span class = "p" > :< / span > < span class = "s2" > " block" < / span > < span class = "p" > ,< / span >
< span class = "nt" > " params" < / span > < span class = "p" > :< / span > < span class = "p" > {< / span > < span class = "nt" > " message" < / span > < span class = "p" > :< / span > < span class = "s2" > " Rate limit exceeded" < / span > < span class = "p" > }}< / span >
< span class = "p" > ]< / span >
< span class = "p" > },< / span >
2020-04-19 12:57:50 +02:00
< span class = "p" > {< / span >
2020-06-19 11:15:15 +02:00
< span class = "nt" > " name" < / span > < span class = "p" > :< / span > < span class = "s2" > " suspiciously Connection=close header" < / span > < span class = "p" > ,< / span >
< span class = "nt" > " filters" < / span > < span class = "p" > :< / span > < span class = "p" > [< / span > < span class = "s2" > " Header:Connection=close" < / span > < span class = "p" > ],< / span >
< span class = "nt" > " limit" < / span > < span class = "p" > :< / span > < span class = "s2" > " < max-request-number-in-interval (int)> " < / span > < span class = "p" > ,< / span >
< span class = "nt" > " stop" < / span > < span class = "p" > :< / span > < span class = "kc" > true< / span > < span class = "p" > ,< / span >
< span class = "nt" > " actions" < / span > < span class = "p" > :< / span > < span class = "p" > [< / span >
< span class = "p" > {< / span > < span class = "nt" > " name" < / span > < span class = "p" > :< / span > < span class = "s2" > " log" < / span > < span class = "p" > },< / span >
< span class = "p" > {< / span > < span class = "nt" > " name" < / span > < span class = "p" > :< / span > < span class = "s2" > " block" < / span > < span class = "p" > ,< / span >
< span class = "nt" > " params" < / span > < span class = "p" > :< / span > < span class = "p" > {< / span > < span class = "nt" > " message" < / span > < span class = "p" > :< / span > < span class = "s2" > " Rate limit exceeded" < / span > < span class = "p" > }}< / span >
< span class = "p" > ]< / span >
< span class = "p" > },< / span >
2020-04-19 12:57:50 +02:00
< span class = "p" > {< / span >
2020-06-19 11:15:15 +02:00
< span class = "nt" > " name" < / span > < span class = "p" > :< / span > < span class = "s2" > " IP limit" < / span > < span class = "p" > ,< / span >
2020-07-25 18:33:36 +02:00
< span class = "nt" > " interval" < / span > < span class = "p" > :< / span > < span class = "s2" > " < time-interval-in-sec (int)> " < / span > < span class = "p" > ,< / span >
< span class = "nt" > " limit" < / span > < span class = "p" > :< / span > < span class = "s2" > " < max-request-number-in-interval (int)> " < / span > < span class = "p" > ,< / span >
2020-06-19 11:15:15 +02:00
< span class = "nt" > " stop" < / span > < span class = "p" > :< / span > < span class = "kc" > true< / span > < span class = "p" > ,< / span >
< span class = "nt" > " aggregations" < / span > < span class = "p" > :< / span > < span class = "p" > [< / span >
< span class = "s2" > " Header:X-Forwarded-For" < / span >
< span class = "p" > ],< / span >
< span class = "nt" > " actions" < / span > < span class = "p" > :< / span > < span class = "p" > [< / span >
< span class = "p" > {< / span > < span class = "nt" > " name" < / span > < span class = "p" > :< / span > < span class = "s2" > " log" < / span > < span class = "p" > },< / span >
< span class = "p" > {< / span > < span class = "nt" > " name" < / span > < span class = "p" > :< / span > < span class = "s2" > " block" < / span > < span class = "p" > ,< / span >
< span class = "nt" > " params" < / span > < span class = "p" > :< / span > < span class = "p" > {< / span >
< span class = "nt" > " message" < / span > < span class = "p" > :< / span > < span class = "s2" > " Rate limit exceeded" < / span >
< span class = "p" > }< / span >
< span class = "p" > }< / span >
< span class = "p" > ]< / span >
< span class = "p" > },< / span >
2020-04-19 12:57:50 +02:00
< span class = "p" > {< / span >
2020-06-19 11:15:15 +02:00
< span class = "nt" > " name" < / span > < span class = "p" > :< / span > < span class = "s2" > " rss/json limit" < / span > < span class = "p" > ,< / span >
< span class = "nt" > " filters" < / span > < span class = "p" > :< / span > < span class = "p" > [< / span >
< span class = "s2" > " Param:format=(csv|json|rss)" < / span >
< span class = "p" > ],< / span >
2020-07-25 18:33:36 +02:00
< span class = "nt" > " interval" < / span > < span class = "p" > :< / span > < span class = "s2" > " < time-interval-in-sec (int)> " < / span > < span class = "p" > ,< / span >
< span class = "nt" > " limit" < / span > < span class = "p" > :< / span > < span class = "s2" > " < max-request-number-in-interval (int)> " < / span > < span class = "p" > ,< / span >
2020-06-19 11:15:15 +02:00
< span class = "nt" > " stop" < / span > < span class = "p" > :< / span > < span class = "kc" > true< / span > < span class = "p" > ,< / span >
< span class = "nt" > " actions" < / span > < span class = "p" > :< / span > < span class = "p" > [< / span >
< span class = "p" > {< / span > < span class = "nt" > " name" < / span > < span class = "p" > :< / span > < span class = "s2" > " log" < / span > < span class = "p" > },< / span >
< span class = "p" > {< / span > < span class = "nt" > " name" < / span > < span class = "p" > :< / span > < span class = "s2" > " block" < / span > < span class = "p" > ,< / span >
< span class = "nt" > " params" < / span > < span class = "p" > :< / span > < span class = "p" > {< / span >
< span class = "nt" > " message" < / span > < span class = "p" > :< / span > < span class = "s2" > " Rate limit exceeded" < / span >
< span class = "p" > }< / span >
< span class = "p" > }< / span >
< span class = "p" > ]< / span >
< span class = "p" > },< / span >
2020-04-19 12:57:50 +02:00
< span class = "p" > {< / span >
2020-06-19 11:15:15 +02:00
< span class = "nt" > " name" < / span > < span class = "p" > :< / span > < span class = "s2" > " useragent limit" < / span > < span class = "p" > ,< / span >
2020-07-25 18:33:36 +02:00
< span class = "nt" > " interval" < / span > < span class = "p" > :< / span > < span class = "s2" > " < time-interval-in-sec (int)> " < / span > < span class = "p" > ,< / span >
< span class = "nt" > " limit" < / span > < span class = "p" > :< / span > < span class = "s2" > " < max-request-number-in-interval (int)> " < / span > < span class = "p" > ,< / span >
2020-06-19 11:15:15 +02:00
< span class = "nt" > " aggregations" < / span > < span class = "p" > :< / span > < span class = "p" > [< / span >
< span class = "s2" > " Header:User-Agent" < / span >
< span class = "p" > ],< / span >
< span class = "nt" > " actions" < / span > < span class = "p" > :< / span > < span class = "p" > [< / span >
< span class = "p" > {< / span > < span class = "nt" > " name" < / span > < span class = "p" > :< / span > < span class = "s2" > " log" < / span > < span class = "p" > },< / span >
< span class = "p" > {< / span > < span class = "nt" > " name" < / span > < span class = "p" > :< / span > < span class = "s2" > " block" < / span > < span class = "p" > ,< / span >
< span class = "nt" > " params" < / span > < span class = "p" > :< / span > < span class = "p" > {< / span >
< span class = "nt" > " message" < / span > < span class = "p" > :< / span > < span class = "s2" > " Rate limit exceeded" < / span >
< span class = "p" > }< / span >
< span class = "p" > }< / span >
< span class = "p" > ]< / span >
2016-10-30 01:02:58 +02:00
< span class = "p" > }< / span >
2020-06-19 11:15:15 +02:00
< span class = "p" > ]< / span >
< span class = "p" > }< / span >
< span class = "p" > ]< / span >
2016-10-30 01:02:58 +02:00
< / pre > < / div >
< / div >
< / div >
< div class = "section" id = "route-request-through-filtron" >
2020-06-19 11:15:15 +02:00
< 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 >
< div class = "sidebar" >
< p class = "sidebar-title" > further reading< / p >
< ul class = "simple" >
< li > < p > < a class = "reference internal" href = "../utils/filtron.sh.html#filtron-sh-overview" > < span class = "std std-ref" > Overview< / span > < / a > < / p > < / li >
< li > < p > < a class = "reference internal" href = "installation-nginx.html#installation-nginx" > < span class = "std std-ref" > Install with nginx< / span > < / a > < / p > < / li >
< li > < p > < a class = "reference internal" href = "installation-apache.html#installation-apache" > < span class = "std std-ref" > Install with apache< / span > < / a > < / p > < / li >
< / ul >
< / div >
2016-10-30 01:02:58 +02:00
< p > Filtron can be started using the following command:< / p >
2019-12-30 18:31:17 +01:00
< div class = "highlight-sh notranslate" > < div class = "highlight" > < pre > < span > < / span > $ filtron -rules rules.json
2016-10-30 01:02:58 +02:00
< / pre > < / div >
< / div >
2019-12-30 18:31:17 +01:00
< p > It listens on < code class = "docutils literal notranslate" > < span class = "pre" > 127.0.0.1:4004< / span > < / code > and forwards filtered requests to
< code class = "docutils literal notranslate" > < span class = "pre" > 127.0.0.1:8888< / span > < / code > by default.< / p >
< p > Use it along with < code class = "docutils literal notranslate" > < span class = "pre" > nginx< / span > < / code > with the following example configuration.< / p >
2020-06-19 11:15:15 +02:00
< div class = "highlight-nginx notranslate" > < div class = "highlight" > < pre > < span > < / span > < span class = "c1" > # https://example.org/searx< / span >
< span class = "k" > location< / span > < span class = "s" > /searx< / span > < span class = "p" > {< / span >
< span class = "kn" > proxy_pass< / span > < span class = "s" > http://127.0.0.1:4004/< / span > < span class = "p" > ;< / span >
< span class = "kn" > proxy_set_header< / span > < span class = "s" > Host< / span > < span class = "nv" > $http_host< / span > < span class = "p" > ;< / span >
< span class = "kn" > proxy_set_header< / span > < span class = "s" > Connection< / span > < span class = "nv" > $http_connection< / span > < span class = "p" > ;< / span >
< span class = "kn" > proxy_set_header< / span > < span class = "s" > X-Real-IP< / span > < span class = "nv" > $remote_addr< / span > < span class = "p" > ;< / span >
< 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 >
< span class = "kn" > proxy_set_header< / span > < span class = "s" > X-Scheme< / span > < span class = "nv" > $scheme< / span > < span class = "p" > ;< / span >
< span class = "kn" > proxy_set_header< / span > < span class = "s" > X-Script-Name< / span > < span class = "s" > /searx< / span > < span class = "p" > ;< / span >
< span class = "p" > }< / span >
< span class = "k" > location< / span > < span class = "s" > /searx/static< / span > < span class = "p" > {< / span >
< span class = "kn" > /usr/local/searx/searx-src/searx/static< / span > < span class = "p" > ;< / span >
2019-12-30 18:31:17 +01:00
< span class = "p" > }< / span >
2016-10-30 01:02:58 +02:00
< / pre > < / div >
< / div >
2019-12-30 18:31:17 +01:00
< p > Requests are coming from port 4004 going through filtron and then forwarded to
2020-06-19 11:15:15 +02:00
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 >
2016-10-30 01:02:58 +02:00
< / div >
< / div >
2020-09-30 10:35:05 +02:00
< div class = "clearer" > < / div >
2016-10-30 01:02:58 +02:00
< / div >
< / div >
< / div >
2019-12-30 18:31:17 +01:00
< span id = "sidebar-top" > < / span >
2016-10-30 01:02:58 +02:00
< div class = "sphinxsidebar" role = "navigation" aria-label = "main navigation" >
2019-12-30 18:31:17 +01:00
< div class = "sphinxsidebarwrapper" >
< p class = "logo" > < a href = "../index.html" >
< img class = "logo" src = "../_static/searx_logo_small.png" alt = "Logo" / >
< / a > < / p >
< h3 > Project Links< / h3 >
< ul >
2020-09-30 10:35:05 +02:00
< li > < a href = "https://github.com/searx/searx" > Source< / a >
2019-12-30 18:31:17 +01:00
2020-09-30 10:35:05 +02:00
< li > < a href = "https://github.com/searx/searx/wiki" > Wiki< / a >
2019-12-30 18:31:17 +01:00
2020-02-15 10:08:58 +01:00
< li > < a href = "https://searx.space/" > Public instances< / a >
2019-12-30 18:31:17 +01:00
< li > < a href = "https://twitter.com/Searx_engine" > Twitter< / a >
< / ul > < h3 > Navigation< / h3 >
2016-10-30 01:02:58 +02:00
< ul >
2019-12-30 18:31:17 +01:00
< li > < a href = "../index.html" > Overview< / a >
< ul >
< li > < a href = "index.html" > Administrator documentation< / a >
< ul >
< li > Previous: < a href = "architecture.html" title = "previous chapter" > Architecture< / a >
< li > Next: < a href = "morty.html" title = "next chapter" > How to setup result proxy< / a > < / ul >
< / li >
< / ul >
< / li >
2016-10-30 01:02:58 +02:00
< / ul >
2019-12-30 18:31:17 +01:00
< div id = "searchbox" style = "display: none" role = "search" >
< h3 id = "searchlabel" > Quick search< / h3 >
< div class = "searchformwrapper" >
< form class = "search" action = "../search.html" method = "get" >
< input type = "text" name = "q" aria-labelledby = "searchlabel" / >
< input type = "submit" value = "Go" / >
< / form >
< / div >
2016-10-30 01:02:58 +02:00
< / div >
2020-02-15 10:08:58 +01:00
< script > $ ( '#searchbox' ) . show ( 0 ) ; < / script >
2016-10-30 01:02:58 +02:00
< / div >
< / div >
< div class = "clearer" > < / div >
< / div >
2019-12-30 18:31:17 +01:00
< div class = "footer" role = "contentinfo" >
2020-02-20 19:32:55 +01:00
© Copyright 2015-2020, Adam Tauber, Noémi Ványi.
2020-09-30 10:35:05 +02:00
Created using < a href = "https://www.sphinx-doc.org/" > Sphinx< / a > 3.2.1.
2016-10-30 01:02:58 +02:00
< / div >
2020-02-15 10:08:58 +01:00
< script src = "../_static/version_warning_offset.js" > < / script >
2019-12-30 18:31:17 +01:00
2016-10-30 01:02:58 +02:00
< / body >
< / html >