From 79fe03c917ea44c659fee74896cdddfb002eb2e6 Mon Sep 17 00:00:00 2001 From: Matt Costi Date: Mon, 14 Oct 2019 10:55:28 -0400 Subject: [PATCH 01/16] Initial app bootstrapping with cookie cutter Add pared down version of wsgi application from esp32 example to start --- CODE_OF_CONDUCT.md | 127 + LICENSE | 21 + README.md | 2 - README.rst | 92 + adafruit_wsgi/wsgi_app.py | 102 + docs/_build/html/.buildinfo | 4 + docs/_build/html/.doctrees/api.doctree | Bin 0 -> 3276 bytes docs/_build/html/.doctrees/environment.pickle | Bin 0 -> 1574809 bytes docs/_build/html/.doctrees/examples.doctree | Bin 0 -> 2977 bytes docs/_build/html/.doctrees/index.doctree | Bin 0 -> 20352 bytes docs/_build/html/_sources/api.rst.txt | 8 + docs/_build/html/_sources/examples.rst.txt | 8 + docs/_build/html/_sources/index.rst.txt | 51 + docs/_build/html/_static/basic.css | 764 ++ docs/_build/html/_static/classic.css | 266 + docs/_build/html/_static/default.css | 1 + docs/_build/html/_static/doctools.js | 314 + .../html/_static/documentation_options.js | 10 + docs/_build/html/_static/favicon.ico | Bin 0 -> 4414 bytes docs/_build/html/_static/file.png | Bin 0 -> 286 bytes docs/_build/html/_static/jquery-3.4.1.js | 10598 ++++++++++++++++ docs/_build/html/_static/jquery.js | 2 + docs/_build/html/_static/language_data.js | 297 + docs/_build/html/_static/minus.png | Bin 0 -> 90 bytes docs/_build/html/_static/plus.png | Bin 0 -> 90 bytes docs/_build/html/_static/pygments.css | 69 + docs/_build/html/_static/searchtools.js | 506 + docs/_build/html/_static/sidebar.js | 159 + docs/_build/html/_static/underscore-1.3.1.js | 999 ++ docs/_build/html/_static/underscore.js | 31 + docs/_build/html/api.html | 94 + docs/_build/html/examples.html | 114 + docs/_build/html/genindex.html | 93 + docs/_build/html/index.html | 214 + docs/_build/html/objects.inv | Bin 0 -> 298 bytes docs/_build/html/py-modindex.html | 101 + docs/_build/html/search.html | 94 + docs/_build/html/searchindex.js | 1 + docs/_static/favicon.ico | Bin 0 -> 4414 bytes docs/api.rst | 8 + docs/conf.py | 160 + docs/examples.rst | 8 + docs/index.rst | 51 + examples/wsgi_simpletest.py | 0 requirements.txt | 1 + setup.py | 64 + 46 files changed, 15432 insertions(+), 2 deletions(-) create mode 100644 CODE_OF_CONDUCT.md create mode 100644 LICENSE delete mode 100644 README.md create mode 100644 README.rst create mode 100644 adafruit_wsgi/wsgi_app.py create mode 100644 docs/_build/html/.buildinfo create mode 100644 docs/_build/html/.doctrees/api.doctree create mode 100644 docs/_build/html/.doctrees/environment.pickle create mode 100644 docs/_build/html/.doctrees/examples.doctree create mode 100644 docs/_build/html/.doctrees/index.doctree create mode 100644 docs/_build/html/_sources/api.rst.txt create mode 100644 docs/_build/html/_sources/examples.rst.txt create mode 100644 docs/_build/html/_sources/index.rst.txt create mode 100644 docs/_build/html/_static/basic.css create mode 100644 docs/_build/html/_static/classic.css create mode 100644 docs/_build/html/_static/default.css create mode 100644 docs/_build/html/_static/doctools.js create mode 100644 docs/_build/html/_static/documentation_options.js create mode 100644 docs/_build/html/_static/favicon.ico create mode 100644 docs/_build/html/_static/file.png create mode 100644 docs/_build/html/_static/jquery-3.4.1.js create mode 100644 docs/_build/html/_static/jquery.js create mode 100644 docs/_build/html/_static/language_data.js create mode 100644 docs/_build/html/_static/minus.png create mode 100644 docs/_build/html/_static/plus.png create mode 100644 docs/_build/html/_static/pygments.css create mode 100644 docs/_build/html/_static/searchtools.js create mode 100644 docs/_build/html/_static/sidebar.js create mode 100644 docs/_build/html/_static/underscore-1.3.1.js create mode 100644 docs/_build/html/_static/underscore.js create mode 100644 docs/_build/html/api.html create mode 100644 docs/_build/html/examples.html create mode 100644 docs/_build/html/genindex.html create mode 100644 docs/_build/html/index.html create mode 100644 docs/_build/html/objects.inv create mode 100644 docs/_build/html/py-modindex.html create mode 100644 docs/_build/html/search.html create mode 100644 docs/_build/html/searchindex.js create mode 100644 docs/_static/favicon.ico create mode 100644 docs/api.rst create mode 100644 docs/conf.py create mode 100644 docs/examples.rst create mode 100644 docs/index.rst create mode 100644 examples/wsgi_simpletest.py create mode 100644 requirements.txt create mode 100644 setup.py diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md new file mode 100644 index 0000000..7ca3a1d --- /dev/null +++ b/CODE_OF_CONDUCT.md @@ -0,0 +1,127 @@ +# Adafruit Community Code of Conduct + +## Our Pledge + +In the interest of fostering an open and welcoming environment, we as +contributors and leaders pledge to making participation in our project and +our community a harassment-free experience for everyone, regardless of age, body +size, disability, ethnicity, gender identity and expression, level or type of +experience, education, socio-economic status, nationality, personal appearance, +race, religion, or sexual identity and orientation. + +## Our Standards + +We are committed to providing a friendly, safe and welcoming environment for +all. + +Examples of behavior that contributes to creating a positive environment +include: + +* Be kind and courteous to others +* Using welcoming and inclusive language +* Being respectful of differing viewpoints and experiences +* Collaborating with other community members +* Gracefully accepting constructive criticism +* Focusing on what is best for the community +* Showing empathy towards other community members + +Examples of unacceptable behavior by participants include: + +* The use of sexualized language or imagery and sexual attention or advances +* The use of inappropriate images, including in a community member's avatar +* The use of inappropriate language, including in a community member's nickname +* Any spamming, flaming, baiting or other attention-stealing behavior +* Excessive or unwelcome helping; answering outside the scope of the question + asked +* Trolling, insulting/derogatory comments, and personal or political attacks +* Public or private harassment +* Publishing others' private information, such as a physical or electronic + address, without explicit permission +* Other conduct which could reasonably be considered inappropriate + +The goal of the standards and moderation guidelines outlined here is to build +and maintain a respectful community. We ask that you don’t just aim to be +"technically unimpeachable", but rather try to be your best self. + +We value many things beyond technical expertise, including collaboration and +supporting others within our community. Providing a positive experience for +other community members can have a much more significant impact than simply +providing the correct answer. + +## Our Responsibilities + +Project leaders are responsible for clarifying the standards of acceptable +behavior and are expected to take appropriate and fair corrective action in +response to any instances of unacceptable behavior. + +Project leaders have the right and responsibility to remove, edit, or +reject messages, comments, commits, code, issues, and other contributions +that are not aligned to this Code of Conduct, or to ban temporarily or +permanently any community member for other behaviors that they deem +inappropriate, threatening, offensive, or harmful. + +## Moderation + +Instances of behaviors that violate the Adafruit Community Code of Conduct +may be reported by any member of the community. Community members are +encouraged to report these situations, including situations they witness +involving other community members. + +You may report in the following ways: + +In any situation, you may send an email to . + +On the Adafruit Discord, you may send an open message from any channel +to all Community Helpers by tagging @community moderators. You may also send an +open message from any channel, or a direct message to @kattni#1507, +@tannewt#4653, @Dan Halbert#1614, @cater#2442, @sommersoft#0222, or +@Andon#8175. + +Email and direct message reports will be kept confidential. + +In situations on Discord where the issue is particularly egregious, possibly +illegal, requires immediate action, or violates the Discord terms of service, +you should also report the message directly to Discord. + +These are the steps for upholding our community’s standards of conduct. + +1. Any member of the community may report any situation that violates the +Adafruit Community Code of Conduct. All reports will be reviewed and +investigated. +2. If the behavior is an egregious violation, the community member who +committed the violation may be banned immediately, without warning. +3. Otherwise, moderators will first respond to such behavior with a warning. +4. Moderators follow a soft "three strikes" policy - the community member may +be given another chance, if they are receptive to the warning and change their +behavior. +5. If the community member is unreceptive or unreasonable when warned by a +moderator, or the warning goes unheeded, they may be banned for a first or +second offense. Repeated offenses will result in the community member being +banned. + +## Scope + +This Code of Conduct and the enforcement policies listed above apply to all +Adafruit Community venues. This includes but is not limited to any community +spaces (both public and private), the entire Adafruit Discord server, and +Adafruit GitHub repositories. Examples of Adafruit Community spaces include +but are not limited to meet-ups, audio chats on the Adafruit Discord, or +interaction at a conference. + +This Code of Conduct applies both within project spaces and in public spaces +when an individual is representing the project or its community. As a community +member, you are representing our community, and are expected to behave +accordingly. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], +version 1.4, available at +, +and the [Rust Code of Conduct](https://www.rust-lang.org/en-US/conduct.html). + +For other projects adopting the Adafruit Community Code of +Conduct, please contact the maintainers of those projects for enforcement. +If you wish to use this code of conduct for your own project, consider +explicitly mentioning your moderation policy or making a copy with your +own moderation policy so as to avoid confusion. diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..06dd210 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2019 Matthew Costi for Adafruit Industries + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md deleted file mode 100644 index 57821d6..0000000 --- a/README.md +++ /dev/null @@ -1,2 +0,0 @@ -# Adafruit_CircuitPython_WSGI -WSGI library for simple web servers diff --git a/README.rst b/README.rst new file mode 100644 index 0000000..9d0084e --- /dev/null +++ b/README.rst @@ -0,0 +1,92 @@ +Introduction +============ + +.. image:: https://readthedocs.org/projects/adafruit-circuitpython-wsgi/badge/?version=latest + :target: https://circuitpython.readthedocs.io/projects/wsgi/en/latest/ + :alt: Documentation Status + +.. image:: https://img.shields.io/discord/327254708534116352.svg + :target: https://discord.gg/nBQh6qu + :alt: Discord + +.. image:: https://travis-ci.com/adafruit/Adafruit_CircuitPython_WSGI.svg?branch=master + :target: https://travis-ci.com/adafruit/Adafruit_CircuitPython_WSGI + :alt: Build Status + +CircuitPython framework for creating WSGI compatible web server applications. + + +Dependencies +============= +This driver depends on: + +* `Adafruit CircuitPython `_ + +Please ensure all dependencies are available on the CircuitPython filesystem. +This is easily achieved by downloading +`the Adafruit library and driver bundle `_. + +Installing from PyPI +===================== +.. note:: This library is not available on PyPI yet. Install documentation is included + as a standard element. Stay tuned for PyPI availability! + +.. todo:: Remove the above note if PyPI version is/will be available at time of release. + If the library is not planned for PyPI, remove the entire 'Installing from PyPI' section. + +On supported GNU/Linux systems like the Raspberry Pi, you can install the driver locally `from +PyPI `_. To install for current user: + +.. code-block:: shell + + pip3 install adafruit-circuitpython-wsgi + +To install system-wide (this may be required in some cases): + +.. code-block:: shell + + sudo pip3 install adafruit-circuitpython-wsgi + +To install in a virtual environment in your current project: + +.. code-block:: shell + + mkdir project-name && cd project-name + python3 -m venv .env + source .env/bin/activate + pip3 install adafruit-circuitpython-wsgi + +Usage Example +============= + +.. todo:: Add a quick, simple example. It and other examples should live in the examples folder and be included in docs/examples.rst. + +Contributing +============ + +Contributions are welcome! Please read our `Code of Conduct +`_ +before contributing to help this project stay welcoming. + +Sphinx documentation +----------------------- + +Sphinx is used to build the documentation based on rST files and comments in the code. First, +install dependencies (feel free to reuse the virtual environment from above): + +.. code-block:: shell + + python3 -m venv .env + source .env/bin/activate + pip install Sphinx sphinx-rtd-theme + +Now, once you have the virtual environment activated: + +.. code-block:: shell + + cd docs + sphinx-build -E -W -b html . _build/html + +This will output the documentation to ``docs/_build/html``. Open the index.html in your browser to +view them. It will also (due to -W) error out on any warning like Travis will. This is a good way to +locally verify it will pass. diff --git a/adafruit_wsgi/wsgi_app.py b/adafruit_wsgi/wsgi_app.py new file mode 100644 index 0000000..f9bb139 --- /dev/null +++ b/adafruit_wsgi/wsgi_app.py @@ -0,0 +1,102 @@ +# The MIT License (MIT) +# +# Copyright (c) 2019 Matthew Costi for Adafruit Industries +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. +""" +`adafruit_wsgi` +================================================================================ + +CircuitPython framework for creating WSGI server compatible web applications. +This does *not* include server implementation, and must + + +* Author(s): Matthew Costi + +Implementation Notes +-------------------- + +**Hardware:** + +.. todo:: Add links to any specific hardware product page(s), or category page(s). Use unordered list & hyperlink rST + inline format: "* `Link Text `_" + +**Software and Dependencies:** + +* Adafruit CircuitPython firmware for the supported boards: + https://github.com/adafruit/circuitpython/releases + +.. todo:: Uncomment or remove the Bus Device and/or the Register library dependencies based on the library's use of either. + +# * Adafruit's Bus Device library: https://github.com/adafruit/Adafruit_CircuitPython_BusDevice +# * Adafruit's Register library: https://github.com/adafruit/Adafruit_CircuitPython_Register +""" + +# imports + +__version__ = "0.0.0-auto.0" +__repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_WSGI.git" + +class WSGIApp: + """ + TODO + """ + + def __init__(self): + self._listeners = {} + + def __call__(self, environ, start_response): + """ + Called whenever the server gets a request. + The environ dict has details about the request per wsgi specification. + Call start_response with the response status string and headers as a list of tuples. + Return a single item list with the item being your response data string. + """ + + self._start_response = start_response + status = "" + headers = [] + resp_data = [] + + key = self._get_listener_key(environ["REQUEST_METHOD"].lower(), environ["PATH_INFO"]) + if key in self._listeners: + status, headers, resp_data = self._listeners[key](environ) + + self._start_response(status, headers) + return resp_data + + def on_request(self, method, path, request_handler): + """ + Register a Request Handler for a particular HTTP method and path. + request_handler will be called whenever a matching HTTP request is received. + + request_handler should accept the following args: + (Dict environ) + request_handler should return a tuple in the shape of: + (status, header_list, data_iterable) + + :param str method: the method of the HTTP request + :param str path: the path of the HTTP request + :param func request_handler: the function to call + """ + self._listeners[self._get_listener_key(method, path)] = request_handler + + def _get_listener_key(self, method, path): # pylint: disable=no-self-use + return "{0}|{1}".format(method.lower(), path) + diff --git a/docs/_build/html/.buildinfo b/docs/_build/html/.buildinfo new file mode 100644 index 0000000..ec97753 --- /dev/null +++ b/docs/_build/html/.buildinfo @@ -0,0 +1,4 @@ +# Sphinx build info version 1 +# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. +config: e238659d11b1f69af7ecff38526d4a39 +tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/docs/_build/html/.doctrees/api.doctree b/docs/_build/html/.doctrees/api.doctree new file mode 100644 index 0000000000000000000000000000000000000000..d519f7d04f2a01eddab6bc969fe5ab8a5acad1ce GIT binary patch literal 3276 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�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 literal 0 HcmV?d00001 diff --git a/docs/_build/html/.doctrees/examples.doctree b/docs/_build/html/.doctrees/examples.doctree new file mode 100644 index 0000000000000000000000000000000000000000..1f5243411c101c3e6122d7baab36947090134d5c GIT binary patch literal 2977 zcmb7GTW=dh6wb|d9LH{&5*|pR8lj4|C^1MppdutFAcTUfN(K5=5h`18F`2boimy-ai{Z0`3- z5R1g+f94N<&tK&CecSM<)tL!I?zf;3NEL-fB>D4PZuyoKfm1rE^<_ggW$Sru^N+l64|B)9nQ}P9fg`yscYU)8XXy7Lm56+p zjkrJH&KWhzV7Ul;SA`ZK`c@EeYazsUBjIuRwI62baxvn;wGm^|$$ZQ432o)FC*PAD z@+eRJ7(0mJW{?{F3(~fOuR=aHnR4uFWdi(vGIvrZ?Ag=rz8|2Hb|7Y)^0k+S z@;$rS$wtVyjePjT@KmnWX7FudGb8$Q6uTda8x@HDRGVwtpDHK&PAc2C%ko{8^*ixz zeQsIW0W!QOGaSk@s-rwd&*fb-=6(D=!0#S@AEGewf&56G%7@5eZ&8>sn?NUyqY-8$ znx}tYye!5gt>42%%cpA~eDT?ZRro$z z-(?r-VLty^gnR&sy7v9n=9{^NV4(PaROqi5?I8z=n{C16n{ ziTXsvpmigjOfo(ZD0hfy+rhQw?-&ti6S7dG00-PCAYsUDs#*vX0A~^&k-=Mq1f@+Z^?oTzt;j;nKnTz}60=lW!B$Te z5D6T+QC5}syv0Ig`6!}9swi8FX^;>7A(FAcKQD+Fkg3$zSmAP_tFf1glp!a9ISPt= z4@olOa81DWed%0k9}Nc6=@cwY_uQp6lL0QO0W|FZTtX+vBAsAP;O4{B5S@wi;@-!f zqAWc#4mRA7Wa;K?;l^o=XNeMST)2@gj^Lv0_z3t9oy@QH{W;JSvwE=V@L9>Dul&13 zG%5j^Qsw|H)hGmtJ9yR9OHAF7o#PUlv6@@D+!{x!N z3Z4fNw|ap7mNSKp5&1BjzRprGI6bzC2T?WauK*GqsAP;*FNXh^=)h*9b-g1Ik3@)h zoWqwC!ok`}5NUqRM9fvhc!(ES@ydDWcSUkTPa?lx(g5ZTC{jtNfNRHaLrer{1wFqF zM?i(c3lOyl=>hZtM71U@A4w3y+PGdc3H^9qLEa)^`7Mpq*0)LE<|&HxB9~@pl2t=(R;*j{)o z4jr%A2R9b?s6W}XRqbr~eN23{*unI0gF(UL(t=D%gY{sqi95Bp=*vM!TvLrD-GABW F@?VYHk(dAg literal 0 HcmV?d00001 diff --git a/docs/_build/html/.doctrees/index.doctree b/docs/_build/html/.doctrees/index.doctree new file mode 100644 index 0000000000000000000000000000000000000000..a1e3506995a79fdff4d898d619bdd2c70031ccad GIT binary patch literal 20352 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�FG`X#VS&14g{CS$y@L^x2FbU0me{m!(3uF;!FgUMUc8N!One+hK8~^7#<~@% zSa8LMbF$Jg-Ka%P3^$uBA)y8~6SYt>h3{F^4FU>=WY%)A+@<2sAE{TkX;V?yC_hpT zEc`xDe5vx~Db<8a;UL2a+5t9f(O^5pqFJt&G2Tne?(BHe(Sq-+=uxY!ri=%~@&bG>!th;6p)IkUyad>F10sJ`)D8^nkyf$y z9JO}AqI-d%=38(KnnQbL-ae7)Kt@) z_-xx~tK>rPuP)Ja;6$~-u^64$o28#nA|G2U^Yb$?y0KbC&7c~yIch;YQVSJF&4Fkf zoW$mNqg}rDp`*aetly}23_~T^FbAY7A9^0Xp=B9igAYS1r5IugY6en(Z#cz^lk86L zR7*|8E1kY7cI{th`}l0I#lY|>#}B3>H0j{w9mr9qkC44x!G;@Z>uS1zKgMUUJYw?c zprt{iUWg#U0b1V9pT(of*HHP21G}?s;tMHtkXT3-h(;<%MeCKQ4VR3*48~Us5{bVK zKJn_7+W@tt3fMzRA&6?ldbU?fu2VC_&9o*@5l*KQ01t_YzMfg7DZ)rF5c?J1Pf?rvU;-Wurx zeOiIO1cvGpR49Hgn6ddK`v~ped zg5PfMr^~O=;}_|&j~;KQO9i&hevmHzNtd_D^sy-#nOtC+2gY9FLobGVh{(zGUtY(|^VMf%z|D?)zx6eC~7{&3>6KbYM|H z@q6@(LqR)K?IpUDp!)TM)jo3_{ z!#UDt;N){zCRq|Cq=;laLEU_bsE4&L@Oi7|IjPX_s(U*M)7n#o9;f7}ywRRQ|F9{3 zNJea~v#;b0d{?N+;&Vb!EnqI%zAHLRwPB%nM_SA|xulbVP81o%6ZnkF{{xH> B-5~$~ literal 0 HcmV?d00001 diff --git a/docs/_build/html/_sources/api.rst.txt b/docs/_build/html/_sources/api.rst.txt new file mode 100644 index 0000000..f721834 --- /dev/null +++ b/docs/_build/html/_sources/api.rst.txt @@ -0,0 +1,8 @@ + +.. If you created a package, create one automodule per module in the package. + +.. If your library file(s) are nested in a directory (e.g. /adafruit_foo/foo.py) +.. use this format as the module name: "adafruit_foo.foo" + +.. automodule:: adafruit_wsgi + :members: diff --git a/docs/_build/html/_sources/examples.rst.txt b/docs/_build/html/_sources/examples.rst.txt new file mode 100644 index 0000000..fbb2994 --- /dev/null +++ b/docs/_build/html/_sources/examples.rst.txt @@ -0,0 +1,8 @@ +Simple test +------------ + +Ensure your device works with this simple test. + +.. literalinclude:: ../examples/wsgi_simpletest.py + :caption: examples/wsgi_simpletest.py + :linenos: diff --git a/docs/_build/html/_sources/index.rst.txt b/docs/_build/html/_sources/index.rst.txt new file mode 100644 index 0000000..6e7c5fe --- /dev/null +++ b/docs/_build/html/_sources/index.rst.txt @@ -0,0 +1,51 @@ +.. include:: ../README.rst + +Table of Contents +================= + +.. toctree:: + :maxdepth: 4 + :hidden: + + self + +.. toctree:: + :caption: Examples + + examples + +.. toctree:: + :caption: API Reference + :maxdepth: 3 + + api + +.. toctree:: + :caption: Tutorials + +.. todo:: Add any Learn guide links here. If there are none, then simply delete this todo and leave + the toctree above for use later. + +.. toctree:: + :caption: Related Products + +.. todo:: Add any product links here. If there are none, then simply delete this todo and leave + the toctree above for use later. + +.. toctree:: + :caption: Other Links + + Download + CircuitPython Reference Documentation + CircuitPython Support Forum + Discord Chat + Adafruit Learning System + Adafruit Blog + Adafruit Store + +Indices and tables +================== + +* :ref:`genindex` +* :ref:`modindex` +* :ref:`search` diff --git a/docs/_build/html/_static/basic.css b/docs/_build/html/_static/basic.css new file mode 100644 index 0000000..ea6972d --- /dev/null +++ b/docs/_build/html/_static/basic.css @@ -0,0 +1,764 @@ +/* + * basic.css + * ~~~~~~~~~ + * + * Sphinx stylesheet -- basic theme. + * + * :copyright: Copyright 2007-2019 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +/* -- main layout ----------------------------------------------------------- */ + +div.clearer { + clear: both; +} + +/* -- relbar ---------------------------------------------------------------- */ + +div.related { + width: 100%; + font-size: 90%; +} + +div.related h3 { + display: none; +} + +div.related ul { + margin: 0; + padding: 0 0 0 10px; + list-style: none; +} + +div.related li { + display: inline; +} + +div.related li.right { + float: right; + margin-right: 5px; +} + +/* -- sidebar --------------------------------------------------------------- */ + +div.sphinxsidebarwrapper { + padding: 10px 5px 0 10px; +} + +div.sphinxsidebar { + float: left; + width: 230px; + margin-left: -100%; + font-size: 90%; + word-wrap: break-word; + overflow-wrap : break-word; +} + +div.sphinxsidebar ul { + list-style: none; +} + +div.sphinxsidebar ul ul, +div.sphinxsidebar ul.want-points { + margin-left: 20px; + list-style: square; +} + +div.sphinxsidebar ul ul { + margin-top: 0; + margin-bottom: 0; +} + +div.sphinxsidebar form { + margin-top: 10px; +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + +div.sphinxsidebar #searchbox form.search { + overflow: hidden; +} + +div.sphinxsidebar #searchbox input[type="text"] { + float: left; + width: 80%; + padding: 0.25em; + box-sizing: border-box; +} + +div.sphinxsidebar #searchbox input[type="submit"] { + float: left; + width: 20%; + border-left: none; + padding: 0.25em; + box-sizing: border-box; +} + + +img { + border: 0; + max-width: 100%; +} + +/* -- search page ----------------------------------------------------------- */ + +ul.search { + margin: 10px 0 0 20px; + padding: 0; +} + +ul.search li { + padding: 5px 0 5px 20px; + background-image: url(file.png); + background-repeat: no-repeat; + background-position: 0 7px; +} + +ul.search li a { + font-weight: bold; +} + +ul.search li div.context { + color: #888; + margin: 2px 0 0 30px; + text-align: left; +} + +ul.keywordmatches li.goodmatch a { + font-weight: bold; +} + +/* -- index page ------------------------------------------------------------ */ + +table.contentstable { + width: 90%; + margin-left: auto; + margin-right: auto; +} + +table.contentstable p.biglink { + line-height: 150%; +} + +a.biglink { + font-size: 1.3em; +} + +span.linkdescr { + font-style: italic; + padding-top: 5px; + font-size: 90%; +} + +/* -- general index --------------------------------------------------------- */ + +table.indextable { + width: 100%; +} + +table.indextable td { + text-align: left; + vertical-align: top; +} + +table.indextable ul { + margin-top: 0; + margin-bottom: 0; + list-style-type: none; +} + +table.indextable > tbody > tr > td > ul { + padding-left: 0em; +} + +table.indextable tr.pcap { + height: 10px; +} + +table.indextable tr.cap { + margin-top: 10px; + background-color: #f2f2f2; +} + +img.toggler { + margin-right: 3px; + margin-top: 3px; + cursor: pointer; +} + +div.modindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +div.genindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +/* -- domain module index --------------------------------------------------- */ + +table.modindextable td { + padding: 2px; + border-collapse: collapse; +} + +/* -- general body styles --------------------------------------------------- */ + +div.body { + min-width: 450px; + max-width: 800px; +} + +div.body p, div.body dd, div.body li, div.body blockquote { + -moz-hyphens: auto; + -ms-hyphens: auto; + -webkit-hyphens: auto; + hyphens: auto; +} + +a.headerlink { + visibility: hidden; +} + +a.brackets:before, +span.brackets > a:before{ + content: "["; +} + +a.brackets:after, +span.brackets > a:after { + content: "]"; +} + +h1:hover > a.headerlink, +h2:hover > a.headerlink, +h3:hover > a.headerlink, +h4:hover > a.headerlink, +h5:hover > a.headerlink, +h6:hover > a.headerlink, +dt:hover > a.headerlink, +caption:hover > a.headerlink, +p.caption:hover > a.headerlink, +div.code-block-caption:hover > a.headerlink { + visibility: visible; +} + +div.body p.caption { + text-align: inherit; +} + +div.body td { + text-align: left; +} + +.first { + margin-top: 0 !important; +} + +p.rubric { + margin-top: 30px; + font-weight: bold; +} + +img.align-left, .figure.align-left, object.align-left { + clear: left; + float: left; + margin-right: 1em; +} + +img.align-right, .figure.align-right, object.align-right { + clear: right; + float: right; + margin-left: 1em; +} + +img.align-center, .figure.align-center, object.align-center { + display: block; + margin-left: auto; + margin-right: auto; +} + +img.align-default, .figure.align-default { + display: block; + margin-left: auto; + margin-right: auto; +} + +.align-left { + text-align: left; +} + +.align-center { + text-align: center; +} + +.align-default { + text-align: center; +} + +.align-right { + text-align: right; +} + +/* -- sidebars -------------------------------------------------------------- */ + +div.sidebar { + margin: 0 0 0.5em 1em; + border: 1px solid #ddb; + padding: 7px 7px 0 7px; + background-color: #ffe; + width: 40%; + float: right; +} + +p.sidebar-title { + font-weight: bold; +} + +/* -- topics ---------------------------------------------------------------- */ + +div.topic { + border: 1px solid #ccc; + padding: 7px 7px 0 7px; + margin: 10px 0 10px 0; +} + +p.topic-title { + font-size: 1.1em; + font-weight: bold; + margin-top: 10px; +} + +/* -- admonitions ----------------------------------------------------------- */ + +div.admonition { + margin-top: 10px; + margin-bottom: 10px; + padding: 7px; +} + +div.admonition dt { + font-weight: bold; +} + +div.admonition dl { + margin-bottom: 0; +} + +p.admonition-title { + margin: 0px 10px 5px 0px; + font-weight: bold; +} + +div.body p.centered { + text-align: center; + margin-top: 25px; +} + +/* -- tables ---------------------------------------------------------------- */ + +table.docutils { + border: 0; + border-collapse: collapse; +} + +table.align-center { + margin-left: auto; + margin-right: auto; +} + +table.align-default { + margin-left: auto; + margin-right: auto; +} + +table caption span.caption-number { + font-style: italic; +} + +table caption span.caption-text { +} + +table.docutils td, table.docutils th { + padding: 1px 8px 1px 5px; + border-top: 0; + border-left: 0; + border-right: 0; + border-bottom: 1px solid #aaa; +} + +table.footnote td, table.footnote th { + border: 0 !important; +} + +th { + text-align: left; + padding-right: 5px; +} + +table.citation { + border-left: solid 1px gray; + margin-left: 1px; +} + +table.citation td { + border-bottom: none; +} + +th > p:first-child, +td > p:first-child { + margin-top: 0px; +} + +th > p:last-child, +td > p:last-child { + margin-bottom: 0px; +} + +/* -- figures --------------------------------------------------------------- */ + +div.figure { + margin: 0.5em; + padding: 0.5em; +} + +div.figure p.caption { + padding: 0.3em; +} + +div.figure p.caption span.caption-number { + font-style: italic; +} + +div.figure p.caption span.caption-text { +} + +/* -- field list styles ----------------------------------------------------- */ + +table.field-list td, table.field-list th { + border: 0 !important; +} + +.field-list ul { + margin: 0; + padding-left: 1em; +} + +.field-list p { + margin: 0; +} + +.field-name { + -moz-hyphens: manual; + -ms-hyphens: manual; + -webkit-hyphens: manual; + hyphens: manual; +} + +/* -- hlist styles ---------------------------------------------------------- */ + +table.hlist td { + vertical-align: top; +} + + +/* -- other body styles ----------------------------------------------------- */ + +ol.arabic { + list-style: decimal; +} + +ol.loweralpha { + list-style: lower-alpha; +} + +ol.upperalpha { + list-style: upper-alpha; +} + +ol.lowerroman { + list-style: lower-roman; +} + +ol.upperroman { + list-style: upper-roman; +} + +li > p:first-child { + margin-top: 0px; +} + +li > p:last-child { + margin-bottom: 0px; +} + +dl.footnote > dt, +dl.citation > dt { + float: left; +} + +dl.footnote > dd, +dl.citation > dd { + margin-bottom: 0em; +} + +dl.footnote > dd:after, +dl.citation > dd:after { + content: ""; + clear: both; +} + +dl.field-list { + display: grid; + grid-template-columns: fit-content(30%) auto; +} + +dl.field-list > dt { + font-weight: bold; + word-break: break-word; + padding-left: 0.5em; + padding-right: 5px; +} + +dl.field-list > dt:after { + content: ":"; +} + +dl.field-list > dd { + padding-left: 0.5em; + margin-top: 0em; + margin-left: 0em; + margin-bottom: 0em; +} + +dl { + margin-bottom: 15px; +} + +dd > p:first-child { + margin-top: 0px; +} + +dd ul, dd table { + margin-bottom: 10px; +} + +dd { + margin-top: 3px; + margin-bottom: 10px; + margin-left: 30px; +} + +dt:target, span.highlighted { + background-color: #fbe54e; +} + +rect.highlighted { + fill: #fbe54e; +} + +dl.glossary dt { + font-weight: bold; + font-size: 1.1em; +} + +.optional { + font-size: 1.3em; +} + +.sig-paren { + font-size: larger; +} + +.versionmodified { + font-style: italic; +} + +.system-message { + background-color: #fda; + padding: 5px; + border: 3px solid red; +} + +.footnote:target { + background-color: #ffa; +} + +.line-block { + display: block; + margin-top: 1em; + margin-bottom: 1em; +} + +.line-block .line-block { + margin-top: 0; + margin-bottom: 0; + margin-left: 1.5em; +} + +.guilabel, .menuselection { + font-family: sans-serif; +} + +.accelerator { + text-decoration: underline; +} + +.classifier { + font-style: oblique; +} + +.classifier:before { + font-style: normal; + margin: 0.5em; + content: ":"; +} + +abbr, acronym { + border-bottom: dotted 1px; + cursor: help; +} + +/* -- code displays --------------------------------------------------------- */ + +pre { + overflow: auto; + overflow-y: hidden; /* fixes display issues on Chrome browsers */ +} + +span.pre { + -moz-hyphens: none; + -ms-hyphens: none; + -webkit-hyphens: none; + hyphens: none; +} + +td.linenos pre { + padding: 5px 0px; + border: 0; + background-color: transparent; + color: #aaa; +} + +table.highlighttable { + margin-left: 0.5em; +} + +table.highlighttable td { + padding: 0 0.5em 0 0.5em; +} + +div.code-block-caption { + padding: 2px 5px; + font-size: small; +} + +div.code-block-caption code { + background-color: transparent; +} + +div.code-block-caption + div > div.highlight > pre { + margin-top: 0; +} + +div.code-block-caption span.caption-number { + padding: 0.1em 0.3em; + font-style: italic; +} + +div.code-block-caption span.caption-text { +} + +div.literal-block-wrapper { + padding: 1em 1em 0; +} + +div.literal-block-wrapper div.highlight { + margin: 0; +} + +code.descname { + background-color: transparent; + font-weight: bold; + font-size: 1.2em; +} + +code.descclassname { + background-color: transparent; +} + +code.xref, a code { + background-color: transparent; + font-weight: bold; +} + +h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { + background-color: transparent; +} + +.viewcode-link { + float: right; +} + +.viewcode-back { + float: right; + font-family: sans-serif; +} + +div.viewcode-block:target { + margin: -1px -10px; + padding: 0 10px; +} + +/* -- math display ---------------------------------------------------------- */ + +img.math { + vertical-align: middle; +} + +div.body div.math p { + text-align: center; +} + +span.eqno { + float: right; +} + +span.eqno a.headerlink { + position: relative; + left: 0px; + z-index: 1; +} + +div.math:hover a.headerlink { + visibility: visible; +} + +/* -- printout stylesheet --------------------------------------------------- */ + +@media print { + div.document, + div.documentwrapper, + div.bodywrapper { + margin: 0 !important; + width: 100%; + } + + div.sphinxsidebar, + div.related, + div.footer, + #top-link { + display: none; + } +} \ No newline at end of file diff --git a/docs/_build/html/_static/classic.css b/docs/_build/html/_static/classic.css new file mode 100644 index 0000000..a414f1f --- /dev/null +++ b/docs/_build/html/_static/classic.css @@ -0,0 +1,266 @@ +/* + * classic.css_t + * ~~~~~~~~~~~~~ + * + * Sphinx stylesheet -- classic theme. + * + * :copyright: Copyright 2007-2019 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +@import url("basic.css"); + +/* -- page layout ----------------------------------------------------------- */ + +html { + /* CSS hack for macOS's scrollbar (see #1125) */ + background-color: #FFFFFF; +} + +body { + font-family: sans-serif; + font-size: 100%; + background-color: #11303d; + color: #000; + margin: 0; + padding: 0; +} + +div.document { + background-color: #1c4e63; +} + +div.documentwrapper { + float: left; + width: 100%; +} + +div.bodywrapper { + margin: 0 0 0 230px; +} + +div.body { + background-color: #ffffff; + color: #000000; + padding: 0 20px 30px 20px; +} + +div.footer { + color: #ffffff; + width: 100%; + padding: 9px 0 9px 0; + text-align: center; + font-size: 75%; +} + +div.footer a { + color: #ffffff; + text-decoration: underline; +} + +div.related { + background-color: #133f52; + line-height: 30px; + color: #ffffff; +} + +div.related a { + color: #ffffff; +} + +div.sphinxsidebar { +} + +div.sphinxsidebar h3 { + font-family: 'Trebuchet MS', sans-serif; + color: #ffffff; + font-size: 1.4em; + font-weight: normal; + margin: 0; + padding: 0; +} + +div.sphinxsidebar h3 a { + color: #ffffff; +} + +div.sphinxsidebar h4 { + font-family: 'Trebuchet MS', sans-serif; + color: #ffffff; + font-size: 1.3em; + font-weight: normal; + margin: 5px 0 0 0; + padding: 0; +} + +div.sphinxsidebar p { + color: #ffffff; +} + +div.sphinxsidebar p.topless { + margin: 5px 10px 10px 10px; +} + +div.sphinxsidebar ul { + margin: 10px; + padding: 0; + color: #ffffff; +} + +div.sphinxsidebar a { + color: #98dbcc; +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + + + +/* -- hyperlink styles ------------------------------------------------------ */ + +a { + color: #355f7c; + text-decoration: none; +} + +a:visited { + color: #355f7c; + text-decoration: none; +} + +a:hover { + text-decoration: underline; +} + + + +/* -- body styles ----------------------------------------------------------- */ + +div.body h1, +div.body h2, +div.body h3, +div.body h4, +div.body h5, +div.body h6 { + font-family: 'Trebuchet MS', sans-serif; + background-color: #f2f2f2; + font-weight: normal; + color: #20435c; + border-bottom: 1px solid #ccc; + margin: 20px -20px 10px -20px; + padding: 3px 0 3px 10px; +} + +div.body h1 { margin-top: 0; font-size: 200%; } +div.body h2 { font-size: 160%; } +div.body h3 { font-size: 140%; } +div.body h4 { font-size: 120%; } +div.body h5 { font-size: 110%; } +div.body h6 { font-size: 100%; } + +a.headerlink { + color: #c60f0f; + font-size: 0.8em; + padding: 0 4px 0 4px; + text-decoration: none; +} + +a.headerlink:hover { + background-color: #c60f0f; + color: white; +} + +div.body p, div.body dd, div.body li, div.body blockquote { + text-align: justify; + line-height: 130%; +} + +div.admonition p.admonition-title + p { + display: inline; +} + +div.admonition p { + margin-bottom: 5px; +} + +div.admonition pre { + margin-bottom: 5px; +} + +div.admonition ul, div.admonition ol { + margin-bottom: 5px; +} + +div.note { + background-color: #eee; + border: 1px solid #ccc; +} + +div.seealso { + background-color: #ffc; + border: 1px solid #ff6; +} + +div.topic { + background-color: #eee; +} + +div.warning { + background-color: #ffe4e4; + border: 1px solid #f66; +} + +p.admonition-title { + display: inline; +} + +p.admonition-title:after { + content: ":"; +} + +pre { + padding: 5px; + background-color: #eeffcc; + color: #333333; + line-height: 120%; + border: 1px solid #ac9; + border-left: none; + border-right: none; +} + +code { + background-color: #ecf0f3; + padding: 0 1px 0 1px; + font-size: 0.95em; +} + +th, dl.field-list > dt { + background-color: #ede; +} + +.warning code { + background: #efc2c2; +} + +.note code { + background: #d6d6d6; +} + +.viewcode-back { + font-family: sans-serif; +} + +div.viewcode-block:target { + background-color: #f4debf; + border-top: 1px solid #ac9; + border-bottom: 1px solid #ac9; +} + +div.code-block-caption { + color: #efefef; + background-color: #1c4e63; +} \ No newline at end of file diff --git a/docs/_build/html/_static/default.css b/docs/_build/html/_static/default.css new file mode 100644 index 0000000..81b9363 --- /dev/null +++ b/docs/_build/html/_static/default.css @@ -0,0 +1 @@ +@import url("classic.css"); diff --git a/docs/_build/html/_static/doctools.js b/docs/_build/html/_static/doctools.js new file mode 100644 index 0000000..b33f87f --- /dev/null +++ b/docs/_build/html/_static/doctools.js @@ -0,0 +1,314 @@ +/* + * doctools.js + * ~~~~~~~~~~~ + * + * Sphinx JavaScript utilities for all documentation. + * + * :copyright: Copyright 2007-2019 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +/** + * select a different prefix for underscore + */ +$u = _.noConflict(); + +/** + * make the code below compatible with browsers without + * an installed firebug like debugger +if (!window.console || !console.firebug) { + var names = ["log", "debug", "info", "warn", "error", "assert", "dir", + "dirxml", "group", "groupEnd", "time", "timeEnd", "count", "trace", + "profile", "profileEnd"]; + window.console = {}; + for (var i = 0; i < names.length; ++i) + window.console[names[i]] = function() {}; +} + */ + +/** + * small helper function to urldecode strings + */ +jQuery.urldecode = function(x) { + return decodeURIComponent(x).replace(/\+/g, ' '); +}; + +/** + * small helper function to urlencode strings + */ +jQuery.urlencode = encodeURIComponent; + +/** + * This function returns the parsed url parameters of the + * current request. Multiple values per key are supported, + * it will always return arrays of strings for the value parts. + */ +jQuery.getQueryParameters = function(s) { + if (typeof s === 'undefined') + s = document.location.search; + var parts = s.substr(s.indexOf('?') + 1).split('&'); + var result = {}; + for (var i = 0; i < parts.length; i++) { + var tmp = parts[i].split('=', 2); + var key = jQuery.urldecode(tmp[0]); + var value = jQuery.urldecode(tmp[1]); + if (key in result) + result[key].push(value); + else + result[key] = [value]; + } + return result; +}; + +/** + * highlight a given string on a jquery object by wrapping it in + * span elements with the given class name. + */ +jQuery.fn.highlightText = function(text, className) { + function highlight(node, addItems) { + if (node.nodeType === 3) { + var val = node.nodeValue; + var pos = val.toLowerCase().indexOf(text); + if (pos >= 0 && + !jQuery(node.parentNode).hasClass(className) && + !jQuery(node.parentNode).hasClass("nohighlight")) { + var span; + var isInSVG = jQuery(node).closest("body, svg, foreignObject").is("svg"); + if (isInSVG) { + span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); + } else { + span = document.createElement("span"); + span.className = className; + } + span.appendChild(document.createTextNode(val.substr(pos, text.length))); + node.parentNode.insertBefore(span, node.parentNode.insertBefore( + document.createTextNode(val.substr(pos + text.length)), + node.nextSibling)); + node.nodeValue = val.substr(0, pos); + if (isInSVG) { + var rect = document.createElementNS("http://www.w3.org/2000/svg", "rect"); + var bbox = node.parentElement.getBBox(); + rect.x.baseVal.value = bbox.x; + rect.y.baseVal.value = bbox.y; + rect.width.baseVal.value = bbox.width; + rect.height.baseVal.value = bbox.height; + rect.setAttribute('class', className); + addItems.push({ + "parent": node.parentNode, + "target": rect}); + } + } + } + else if (!jQuery(node).is("button, select, textarea")) { + jQuery.each(node.childNodes, function() { + highlight(this, addItems); + }); + } + } + var addItems = []; + var result = this.each(function() { + highlight(this, addItems); + }); + for (var i = 0; i < addItems.length; ++i) { + jQuery(addItems[i].parent).before(addItems[i].target); + } + return result; +}; + +/* + * backward compatibility for jQuery.browser + * This will be supported until firefox bug is fixed. + */ +if (!jQuery.browser) { + jQuery.uaMatch = function(ua) { + ua = ua.toLowerCase(); + + var match = /(chrome)[ \/]([\w.]+)/.exec(ua) || + /(webkit)[ \/]([\w.]+)/.exec(ua) || + /(opera)(?:.*version|)[ \/]([\w.]+)/.exec(ua) || + /(msie) ([\w.]+)/.exec(ua) || + ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec(ua) || + []; + + return { + browser: match[ 1 ] || "", + version: match[ 2 ] || "0" + }; + }; + jQuery.browser = {}; + jQuery.browser[jQuery.uaMatch(navigator.userAgent).browser] = true; +} + +/** + * Small JavaScript module for the documentation. + */ +var Documentation = { + + init : function() { + this.fixFirefoxAnchorBug(); + this.highlightSearchWords(); + this.initIndexTable(); + if (DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) { + this.initOnKeyListeners(); + } + }, + + /** + * i18n support + */ + TRANSLATIONS : {}, + PLURAL_EXPR : function(n) { return n === 1 ? 0 : 1; }, + LOCALE : 'unknown', + + // gettext and ngettext don't access this so that the functions + // can safely bound to a different name (_ = Documentation.gettext) + gettext : function(string) { + var translated = Documentation.TRANSLATIONS[string]; + if (typeof translated === 'undefined') + return string; + return (typeof translated === 'string') ? translated : translated[0]; + }, + + ngettext : function(singular, plural, n) { + var translated = Documentation.TRANSLATIONS[singular]; + if (typeof translated === 'undefined') + return (n == 1) ? singular : plural; + return translated[Documentation.PLURALEXPR(n)]; + }, + + addTranslations : function(catalog) { + for (var key in catalog.messages) + this.TRANSLATIONS[key] = catalog.messages[key]; + this.PLURAL_EXPR = new Function('n', 'return +(' + catalog.plural_expr + ')'); + this.LOCALE = catalog.locale; + }, + + /** + * add context elements like header anchor links + */ + addContextElements : function() { + $('div[id] > :header:first').each(function() { + $('\u00B6'). + attr('href', '#' + this.id). + attr('title', _('Permalink to this headline')). + appendTo(this); + }); + $('dt[id]').each(function() { + $('\u00B6'). + attr('href', '#' + this.id). + attr('title', _('Permalink to this definition')). + appendTo(this); + }); + }, + + /** + * workaround a firefox stupidity + * see: https://bugzilla.mozilla.org/show_bug.cgi?id=645075 + */ + fixFirefoxAnchorBug : function() { + if (document.location.hash && $.browser.mozilla) + window.setTimeout(function() { + document.location.href += ''; + }, 10); + }, + + /** + * highlight the search words provided in the url in the text + */ + highlightSearchWords : function() { + var params = $.getQueryParameters(); + var terms = (params.highlight) ? params.highlight[0].split(/\s+/) : []; + if (terms.length) { + var body = $('div.body'); + if (!body.length) { + body = $('body'); + } + window.setTimeout(function() { + $.each(terms, function() { + body.highlightText(this.toLowerCase(), 'highlighted'); + }); + }, 10); + $('') + .appendTo($('#searchbox')); + } + }, + + /** + * init the domain index toggle buttons + */ + initIndexTable : function() { + var togglers = $('img.toggler').click(function() { + var src = $(this).attr('src'); + var idnum = $(this).attr('id').substr(7); + $('tr.cg-' + idnum).toggle(); + if (src.substr(-9) === 'minus.png') + $(this).attr('src', src.substr(0, src.length-9) + 'plus.png'); + else + $(this).attr('src', src.substr(0, src.length-8) + 'minus.png'); + }).css('display', ''); + if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) { + togglers.click(); + } + }, + + /** + * helper function to hide the search marks again + */ + hideSearchWords : function() { + $('#searchbox .highlight-link').fadeOut(300); + $('span.highlighted').removeClass('highlighted'); + }, + + /** + * make the url absolute + */ + makeURL : function(relativeURL) { + return DOCUMENTATION_OPTIONS.URL_ROOT + '/' + relativeURL; + }, + + /** + * get the current relative url + */ + getCurrentURL : function() { + var path = document.location.pathname; + var parts = path.split(/\//); + $.each(DOCUMENTATION_OPTIONS.URL_ROOT.split(/\//), function() { + if (this === '..') + parts.pop(); + }); + var url = parts.join('/'); + return path.substring(url.lastIndexOf('/') + 1, path.length - 1); + }, + + initOnKeyListeners: function() { + $(document).keyup(function(event) { + var activeElementType = document.activeElement.tagName; + // don't navigate when in search box or textarea + if (activeElementType !== 'TEXTAREA' && activeElementType !== 'INPUT' && activeElementType !== 'SELECT') { + switch (event.keyCode) { + case 37: // left + var prevHref = $('link[rel="prev"]').prop('href'); + if (prevHref) { + window.location.href = prevHref; + return false; + } + case 39: // right + var nextHref = $('link[rel="next"]').prop('href'); + if (nextHref) { + window.location.href = nextHref; + return false; + } + } + } + }); + } +}; + +// quick alias for translations +_ = Documentation.gettext; + +$(document).ready(function() { + Documentation.init(); +}); diff --git a/docs/_build/html/_static/documentation_options.js b/docs/_build/html/_static/documentation_options.js new file mode 100644 index 0000000..ad3a3d9 --- /dev/null +++ b/docs/_build/html/_static/documentation_options.js @@ -0,0 +1,10 @@ +var DOCUMENTATION_OPTIONS = { + URL_ROOT: document.getElementById("documentation_options").getAttribute('data-url_root'), + VERSION: '1.0', + LANGUAGE: 'None', + COLLAPSE_INDEX: false, + FILE_SUFFIX: '.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '.txt', + NAVIGATION_WITH_KEYS: false +}; \ No newline at end of file diff --git a/docs/_build/html/_static/favicon.ico b/docs/_build/html/_static/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..5aca98376a1f7e593ebd9cf41a808512c2135635 GIT binary patch literal 4414 zcmd^BX;4#F6n=SG-XmlONeGrD5E6J{RVh+e928U#MG!$jWvO+UsvWh`x&VqGNx*en zx=qox7Dqv{kPwo%fZC$dDwVpRtz{HzTkSs8QhG0)%Y=-3@Kt!4ag|JcIo?$-F|?bXVS9UDUyev>MVZQ(H8K4#;BQW-t2CPorj8^KJrMX}QK zp+e<;4ldpXz~=)2GxNy811&)gt-}Q*yVQpsxr@VMoA##{)$1~=bZ1MmjeFw?uT(`8 z^g=09<=zW%r%buwN%iHtuKSg|+r7HkT0PYN*_u9k1;^Ss-Z!RBfJ?Un4w(awqp2b3 z%+myoFis_lTlCrGx2z$0BQdh+7?!JK#9K9@Z!VrG zNj6gK5r(b4?YDOLw|DPRoN7bdP{(>GEG41YcN~4r_SUHU2hgVtUwZG@s%edC;k7Sn zC)RvEnlq~raE2mY2ko64^m1KQL}3riixh?#J{o)IT+K-RdHae2eRX91-+g!y`8^># z-zI0ir>P%Xon)!@xp-BK2bDYUB9k613NRrY6%lVjbFcQc*pRqiK~8xtkNPLxt}e?&QsTB}^!39t_%Qb)~Ukn0O%iC;zt z<&A-y;3h++)>c1br`5VFM~5(83!HKx$L+my8sW_c#@x*|*vB1yU)_dt3vH;2hqPWx zAl^6@?ipx&U7pf`a*>Yq6C85nb+B=Fnn+(id$W#WB^uHAcZVG`qg;rWB}ubvi(Y>D z$ei>REw$#xp0SHAd^|1hq&9HJ=jKK8^zTH~nk)G?yUcmTh9vUM6Y0LMw4(gYVY$D$ zGl&WY&H<)BbJ&3sYbKjx1j^=3-0Q#f^}(aP1?8^`&FUWMp|rmtpK)bLQ1Zo?^s4jqK=Lfg*9&geMGVQ z#^-*!V`fG@;H&{M9S8%+;|h&Qrxym0Ar>WT4BCVLR8cGXF=JmEYN(sNT(9vl+S|%g z8r7nXQ(95i^`=+XHo|){$vf2$?=`F$^&wFlYXyXg$B{a>$-Fp+V}+D;9k=~Xl~?C4 zAB-;RKXdUzBJE{V&d&%R>aEfFe;vxqI$0@hwVM}gFeQR@j}a>DDxR+n+-*6|_)k%% z*mSpDV|=5I9!&VC&9tD%fcVygWZV!iIo2qFtm#!*(s|@ZT33*Ad;+<|3^+yrp*;oH zBSYLV(H1zTU?2WjrCQoQW)Z>J2a=dTriuvezBmu16`tM2fm7Q@d4^iqII-xFpwHGI zn9CL}QE*1vdj2PX{PIuqOe5dracsciH6OlAZATvE8rj6ykqdIjal2 z0S0S~PwHb-5?OQ-tU-^KTG@XNrEVSvo|HIP?H;7ZhYeZkhSqh-{reE!5di;1zk$#Y zCe7rOnlzFYJ6Z#Hm$GoidKB=2HBCwm`BbZVeZY4ukmG%1uz7p2URs6c9j-Gjj^oQV zsdDb3@k2e`C$1I5ML5U0Qs0C1GAp^?!*`=|Nm(vWz3j*j*8ucum2;r0^-6Aca=Gv) zc%}&;!+_*S2tlnnJnz0EKeRmw-Y!@9ob!XQBwiv}^u9MkaXHvM=!<3YX;+2#5Cj5pp?FEK750S3BgeSDtaE^ zXUM@xoV6yBFKfzvY20V&Lr0yCs`hMrGg#P~ix$^RISR_I47Y|r1 z_CyJOe}D1){SET-^Amu_i71Lt6eYfZjRyw@I6OQAIXXHDfiX^GbOlHe=Ae4>0m)d(f|Me07*qoM6N<$f}vM^LjV8( literal 0 HcmV?d00001 diff --git a/docs/_build/html/_static/jquery-3.4.1.js b/docs/_build/html/_static/jquery-3.4.1.js new file mode 100644 index 0000000..773ad95 --- /dev/null +++ b/docs/_build/html/_static/jquery-3.4.1.js @@ -0,0 +1,10598 @@ +/*! + * jQuery JavaScript Library v3.4.1 + * https://jquery.com/ + * + * Includes Sizzle.js + * https://sizzlejs.com/ + * + * Copyright JS Foundation and other contributors + * Released under the MIT license + * https://jquery.org/license + * + * Date: 2019-05-01T21:04Z + */ +( function( global, factory ) { + + "use strict"; + + if ( typeof module === "object" && typeof module.exports === "object" ) { + + // For CommonJS and CommonJS-like environments where a proper `window` + // is present, execute the factory and get jQuery. + // For environments that do not have a `window` with a `document` + // (such as Node.js), expose a factory as module.exports. + // This accentuates the need for the creation of a real `window`. + // e.g. var jQuery = require("jquery")(window); + // See ticket #14549 for more info. + module.exports = global.document ? + factory( global, true ) : + function( w ) { + if ( !w.document ) { + throw new Error( "jQuery requires a window with a document" ); + } + return factory( w ); + }; + } else { + factory( global ); + } + +// Pass this if window is not defined yet +} )( typeof window !== "undefined" ? window : this, function( window, noGlobal ) { + +// Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1 +// throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode +// arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), strict mode should be common +// enough that all such attempts are guarded in a try block. +"use strict"; + +var arr = []; + +var document = window.document; + +var getProto = Object.getPrototypeOf; + +var slice = arr.slice; + +var concat = arr.concat; + +var push = arr.push; + +var indexOf = arr.indexOf; + +var class2type = {}; + +var toString = class2type.toString; + +var hasOwn = class2type.hasOwnProperty; + +var fnToString = hasOwn.toString; + +var ObjectFunctionString = fnToString.call( Object ); + +var support = {}; + +var isFunction = function isFunction( obj ) { + + // Support: Chrome <=57, Firefox <=52 + // In some browsers, typeof returns "function" for HTML elements + // (i.e., `typeof document.createElement( "object" ) === "function"`). + // We don't want to classify *any* DOM node as a function. + return typeof obj === "function" && typeof obj.nodeType !== "number"; + }; + + +var isWindow = function isWindow( obj ) { + return obj != null && obj === obj.window; + }; + + + + + var preservedScriptAttributes = { + type: true, + src: true, + nonce: true, + noModule: true + }; + + function DOMEval( code, node, doc ) { + doc = doc || document; + + var i, val, + script = doc.createElement( "script" ); + + script.text = code; + if ( node ) { + for ( i in preservedScriptAttributes ) { + + // Support: Firefox 64+, Edge 18+ + // Some browsers don't support the "nonce" property on scripts. + // On the other hand, just using `getAttribute` is not enough as + // the `nonce` attribute is reset to an empty string whenever it + // becomes browsing-context connected. + // See https://github.com/whatwg/html/issues/2369 + // See https://html.spec.whatwg.org/#nonce-attributes + // The `node.getAttribute` check was added for the sake of + // `jQuery.globalEval` so that it can fake a nonce-containing node + // via an object. + val = node[ i ] || node.getAttribute && node.getAttribute( i ); + if ( val ) { + script.setAttribute( i, val ); + } + } + } + doc.head.appendChild( script ).parentNode.removeChild( script ); + } + + +function toType( obj ) { + if ( obj == null ) { + return obj + ""; + } + + // Support: Android <=2.3 only (functionish RegExp) + return typeof obj === "object" || typeof obj === "function" ? + class2type[ toString.call( obj ) ] || "object" : + typeof obj; +} +/* global Symbol */ +// Defining this global in .eslintrc.json would create a danger of using the global +// unguarded in another place, it seems safer to define global only for this module + + + +var + version = "3.4.1", + + // Define a local copy of jQuery + jQuery = function( selector, context ) { + + // The jQuery object is actually just the init constructor 'enhanced' + // Need init if jQuery is called (just allow error to be thrown if not included) + return new jQuery.fn.init( selector, context ); + }, + + // Support: Android <=4.0 only + // Make sure we trim BOM and NBSP + rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g; + +jQuery.fn = jQuery.prototype = { + + // The current version of jQuery being used + jquery: version, + + constructor: jQuery, + + // The default length of a jQuery object is 0 + length: 0, + + toArray: function() { + return slice.call( this ); + }, + + // Get the Nth element in the matched element set OR + // Get the whole matched element set as a clean array + get: function( num ) { + + // Return all the elements in a clean array + if ( num == null ) { + return slice.call( this ); + } + + // Return just the one element from the set + return num < 0 ? this[ num + this.length ] : this[ num ]; + }, + + // Take an array of elements and push it onto the stack + // (returning the new matched element set) + pushStack: function( elems ) { + + // Build a new jQuery matched element set + var ret = jQuery.merge( this.constructor(), elems ); + + // Add the old object onto the stack (as a reference) + ret.prevObject = this; + + // Return the newly-formed element set + return ret; + }, + + // Execute a callback for every element in the matched set. + each: function( callback ) { + return jQuery.each( this, callback ); + }, + + map: function( callback ) { + return this.pushStack( jQuery.map( this, function( elem, i ) { + return callback.call( elem, i, elem ); + } ) ); + }, + + slice: function() { + return this.pushStack( slice.apply( this, arguments ) ); + }, + + first: function() { + return this.eq( 0 ); + }, + + last: function() { + return this.eq( -1 ); + }, + + eq: function( i ) { + var len = this.length, + j = +i + ( i < 0 ? len : 0 ); + return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] ); + }, + + end: function() { + return this.prevObject || this.constructor(); + }, + + // For internal use only. + // Behaves like an Array's method, not like a jQuery method. + push: push, + sort: arr.sort, + splice: arr.splice +}; + +jQuery.extend = jQuery.fn.extend = function() { + var options, name, src, copy, copyIsArray, clone, + target = arguments[ 0 ] || {}, + i = 1, + length = arguments.length, + deep = false; + + // Handle a deep copy situation + if ( typeof target === "boolean" ) { + deep = target; + + // Skip the boolean and the target + target = arguments[ i ] || {}; + i++; + } + + // Handle case when target is a string or something (possible in deep copy) + if ( typeof target !== "object" && !isFunction( target ) ) { + target = {}; + } + + // Extend jQuery itself if only one argument is passed + if ( i === length ) { + target = this; + i--; + } + + for ( ; i < length; i++ ) { + + // Only deal with non-null/undefined values + if ( ( options = arguments[ i ] ) != null ) { + + // Extend the base object + for ( name in options ) { + copy = options[ name ]; + + // Prevent Object.prototype pollution + // Prevent never-ending loop + if ( name === "__proto__" || target === copy ) { + continue; + } + + // Recurse if we're merging plain objects or arrays + if ( deep && copy && ( jQuery.isPlainObject( copy ) || + ( copyIsArray = Array.isArray( copy ) ) ) ) { + src = target[ name ]; + + // Ensure proper type for the source value + if ( copyIsArray && !Array.isArray( src ) ) { + clone = []; + } else if ( !copyIsArray && !jQuery.isPlainObject( src ) ) { + clone = {}; + } else { + clone = src; + } + copyIsArray = false; + + // Never move original objects, clone them + target[ name ] = jQuery.extend( deep, clone, copy ); + + // Don't bring in undefined values + } else if ( copy !== undefined ) { + target[ name ] = copy; + } + } + } + } + + // Return the modified object + return target; +}; + +jQuery.extend( { + + // Unique for each copy of jQuery on the page + expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ), + + // Assume jQuery is ready without the ready module + isReady: true, + + error: function( msg ) { + throw new Error( msg ); + }, + + noop: function() {}, + + isPlainObject: function( obj ) { + var proto, Ctor; + + // Detect obvious negatives + // Use toString instead of jQuery.type to catch host objects + if ( !obj || toString.call( obj ) !== "[object Object]" ) { + return false; + } + + proto = getProto( obj ); + + // Objects with no prototype (e.g., `Object.create( null )`) are plain + if ( !proto ) { + return true; + } + + // Objects with prototype are plain iff they were constructed by a global Object function + Ctor = hasOwn.call( proto, "constructor" ) && proto.constructor; + return typeof Ctor === "function" && fnToString.call( Ctor ) === ObjectFunctionString; + }, + + isEmptyObject: function( obj ) { + var name; + + for ( name in obj ) { + return false; + } + return true; + }, + + // Evaluates a script in a global context + globalEval: function( code, options ) { + DOMEval( code, { nonce: options && options.nonce } ); + }, + + each: function( obj, callback ) { + var length, i = 0; + + if ( isArrayLike( obj ) ) { + length = obj.length; + for ( ; i < length; i++ ) { + if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { + break; + } + } + } else { + for ( i in obj ) { + if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { + break; + } + } + } + + return obj; + }, + + // Support: Android <=4.0 only + trim: function( text ) { + return text == null ? + "" : + ( text + "" ).replace( rtrim, "" ); + }, + + // results is for internal usage only + makeArray: function( arr, results ) { + var ret = results || []; + + if ( arr != null ) { + if ( isArrayLike( Object( arr ) ) ) { + jQuery.merge( ret, + typeof arr === "string" ? + [ arr ] : arr + ); + } else { + push.call( ret, arr ); + } + } + + return ret; + }, + + inArray: function( elem, arr, i ) { + return arr == null ? -1 : indexOf.call( arr, elem, i ); + }, + + // Support: Android <=4.0 only, PhantomJS 1 only + // push.apply(_, arraylike) throws on ancient WebKit + merge: function( first, second ) { + var len = +second.length, + j = 0, + i = first.length; + + for ( ; j < len; j++ ) { + first[ i++ ] = second[ j ]; + } + + first.length = i; + + return first; + }, + + grep: function( elems, callback, invert ) { + var callbackInverse, + matches = [], + i = 0, + length = elems.length, + callbackExpect = !invert; + + // Go through the array, only saving the items + // that pass the validator function + for ( ; i < length; i++ ) { + callbackInverse = !callback( elems[ i ], i ); + if ( callbackInverse !== callbackExpect ) { + matches.push( elems[ i ] ); + } + } + + return matches; + }, + + // arg is for internal usage only + map: function( elems, callback, arg ) { + var length, value, + i = 0, + ret = []; + + // Go through the array, translating each of the items to their new values + if ( isArrayLike( elems ) ) { + length = elems.length; + for ( ; i < length; i++ ) { + value = callback( elems[ i ], i, arg ); + + if ( value != null ) { + ret.push( value ); + } + } + + // Go through every key on the object, + } else { + for ( i in elems ) { + value = callback( elems[ i ], i, arg ); + + if ( value != null ) { + ret.push( value ); + } + } + } + + // Flatten any nested arrays + return concat.apply( [], ret ); + }, + + // A global GUID counter for objects + guid: 1, + + // jQuery.support is not used in Core but other projects attach their + // properties to it so it needs to exist. + support: support +} ); + +if ( typeof Symbol === "function" ) { + jQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ]; +} + +// Populate the class2type map +jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ), +function( i, name ) { + class2type[ "[object " + name + "]" ] = name.toLowerCase(); +} ); + +function isArrayLike( obj ) { + + // Support: real iOS 8.2 only (not reproducible in simulator) + // `in` check used to prevent JIT error (gh-2145) + // hasOwn isn't used here due to false negatives + // regarding Nodelist length in IE + var length = !!obj && "length" in obj && obj.length, + type = toType( obj ); + + if ( isFunction( obj ) || isWindow( obj ) ) { + return false; + } + + return type === "array" || length === 0 || + typeof length === "number" && length > 0 && ( length - 1 ) in obj; +} +var Sizzle = +/*! + * Sizzle CSS Selector Engine v2.3.4 + * https://sizzlejs.com/ + * + * Copyright JS Foundation and other contributors + * Released under the MIT license + * https://js.foundation/ + * + * Date: 2019-04-08 + */ +(function( window ) { + +var i, + support, + Expr, + getText, + isXML, + tokenize, + compile, + select, + outermostContext, + sortInput, + hasDuplicate, + + // Local document vars + setDocument, + document, + docElem, + documentIsHTML, + rbuggyQSA, + rbuggyMatches, + matches, + contains, + + // Instance-specific data + expando = "sizzle" + 1 * new Date(), + preferredDoc = window.document, + dirruns = 0, + done = 0, + classCache = createCache(), + tokenCache = createCache(), + compilerCache = createCache(), + nonnativeSelectorCache = createCache(), + sortOrder = function( a, b ) { + if ( a === b ) { + hasDuplicate = true; + } + return 0; + }, + + // Instance methods + hasOwn = ({}).hasOwnProperty, + arr = [], + pop = arr.pop, + push_native = arr.push, + push = arr.push, + slice = arr.slice, + // Use a stripped-down indexOf as it's faster than native + // https://jsperf.com/thor-indexof-vs-for/5 + indexOf = function( list, elem ) { + var i = 0, + len = list.length; + for ( ; i < len; i++ ) { + if ( list[i] === elem ) { + return i; + } + } + return -1; + }, + + booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped", + + // Regular expressions + + // http://www.w3.org/TR/css3-selectors/#whitespace + whitespace = "[\\x20\\t\\r\\n\\f]", + + // http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier + identifier = "(?:\\\\.|[\\w-]|[^\0-\\xa0])+", + + // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors + attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace + + // Operator (capture 2) + "*([*^$|!~]?=)" + whitespace + + // "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]" + "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace + + "*\\]", + + pseudos = ":(" + identifier + ")(?:\\((" + + // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments: + // 1. quoted (capture 3; capture 4 or capture 5) + "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" + + // 2. simple (capture 6) + "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" + + // 3. anything else (capture 2) + ".*" + + ")\\)|)", + + // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter + rwhitespace = new RegExp( whitespace + "+", "g" ), + rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ), + + rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ), + rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ), + rdescend = new RegExp( whitespace + "|>" ), + + rpseudo = new RegExp( pseudos ), + ridentifier = new RegExp( "^" + identifier + "$" ), + + matchExpr = { + "ID": new RegExp( "^#(" + identifier + ")" ), + "CLASS": new RegExp( "^\\.(" + identifier + ")" ), + "TAG": new RegExp( "^(" + identifier + "|[*])" ), + "ATTR": new RegExp( "^" + attributes ), + "PSEUDO": new RegExp( "^" + pseudos ), + "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace + + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace + + "*(\\d+)|))" + whitespace + "*\\)|)", "i" ), + "bool": new RegExp( "^(?:" + booleans + ")$", "i" ), + // For use in libraries implementing .is() + // We use this for POS matching in `select` + "needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + + whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" ) + }, + + rhtml = /HTML$/i, + rinputs = /^(?:input|select|textarea|button)$/i, + rheader = /^h\d$/i, + + rnative = /^[^{]+\{\s*\[native \w/, + + // Easily-parseable/retrievable ID or TAG or CLASS selectors + rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, + + rsibling = /[+~]/, + + // CSS escapes + // http://www.w3.org/TR/CSS21/syndata.html#escaped-characters + runescape = new RegExp( "\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ), + funescape = function( _, escaped, escapedWhitespace ) { + var high = "0x" + escaped - 0x10000; + // NaN means non-codepoint + // Support: Firefox<24 + // Workaround erroneous numeric interpretation of +"0x" + return high !== high || escapedWhitespace ? + escaped : + high < 0 ? + // BMP codepoint + String.fromCharCode( high + 0x10000 ) : + // Supplemental Plane codepoint (surrogate pair) + String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 ); + }, + + // CSS string/identifier serialization + // https://drafts.csswg.org/cssom/#common-serializing-idioms + rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g, + fcssescape = function( ch, asCodePoint ) { + if ( asCodePoint ) { + + // U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER + if ( ch === "\0" ) { + return "\uFFFD"; + } + + // Control characters and (dependent upon position) numbers get escaped as code points + return ch.slice( 0, -1 ) + "\\" + ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " "; + } + + // Other potentially-special ASCII characters get backslash-escaped + return "\\" + ch; + }, + + // Used for iframes + // See setDocument() + // Removing the function wrapper causes a "Permission Denied" + // error in IE + unloadHandler = function() { + setDocument(); + }, + + inDisabledFieldset = addCombinator( + function( elem ) { + return elem.disabled === true && elem.nodeName.toLowerCase() === "fieldset"; + }, + { dir: "parentNode", next: "legend" } + ); + +// Optimize for push.apply( _, NodeList ) +try { + push.apply( + (arr = slice.call( preferredDoc.childNodes )), + preferredDoc.childNodes + ); + // Support: Android<4.0 + // Detect silently failing push.apply + arr[ preferredDoc.childNodes.length ].nodeType; +} catch ( e ) { + push = { apply: arr.length ? + + // Leverage slice if possible + function( target, els ) { + push_native.apply( target, slice.call(els) ); + } : + + // Support: IE<9 + // Otherwise append directly + function( target, els ) { + var j = target.length, + i = 0; + // Can't trust NodeList.length + while ( (target[j++] = els[i++]) ) {} + target.length = j - 1; + } + }; +} + +function Sizzle( selector, context, results, seed ) { + var m, i, elem, nid, match, groups, newSelector, + newContext = context && context.ownerDocument, + + // nodeType defaults to 9, since context defaults to document + nodeType = context ? context.nodeType : 9; + + results = results || []; + + // Return early from calls with invalid selector or context + if ( typeof selector !== "string" || !selector || + nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) { + + return results; + } + + // Try to shortcut find operations (as opposed to filters) in HTML documents + if ( !seed ) { + + if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) { + setDocument( context ); + } + context = context || document; + + if ( documentIsHTML ) { + + // If the selector is sufficiently simple, try using a "get*By*" DOM method + // (excepting DocumentFragment context, where the methods don't exist) + if ( nodeType !== 11 && (match = rquickExpr.exec( selector )) ) { + + // ID selector + if ( (m = match[1]) ) { + + // Document context + if ( nodeType === 9 ) { + if ( (elem = context.getElementById( m )) ) { + + // Support: IE, Opera, Webkit + // TODO: identify versions + // getElementById can match elements by name instead of ID + if ( elem.id === m ) { + results.push( elem ); + return results; + } + } else { + return results; + } + + // Element context + } else { + + // Support: IE, Opera, Webkit + // TODO: identify versions + // getElementById can match elements by name instead of ID + if ( newContext && (elem = newContext.getElementById( m )) && + contains( context, elem ) && + elem.id === m ) { + + results.push( elem ); + return results; + } + } + + // Type selector + } else if ( match[2] ) { + push.apply( results, context.getElementsByTagName( selector ) ); + return results; + + // Class selector + } else if ( (m = match[3]) && support.getElementsByClassName && + context.getElementsByClassName ) { + + push.apply( results, context.getElementsByClassName( m ) ); + return results; + } + } + + // Take advantage of querySelectorAll + if ( support.qsa && + !nonnativeSelectorCache[ selector + " " ] && + (!rbuggyQSA || !rbuggyQSA.test( selector )) && + + // Support: IE 8 only + // Exclude object elements + (nodeType !== 1 || context.nodeName.toLowerCase() !== "object") ) { + + newSelector = selector; + newContext = context; + + // qSA considers elements outside a scoping root when evaluating child or + // descendant combinators, which is not what we want. + // In such cases, we work around the behavior by prefixing every selector in the + // list with an ID selector referencing the scope context. + // Thanks to Andrew Dupont for this technique. + if ( nodeType === 1 && rdescend.test( selector ) ) { + + // Capture the context ID, setting it first if necessary + if ( (nid = context.getAttribute( "id" )) ) { + nid = nid.replace( rcssescape, fcssescape ); + } else { + context.setAttribute( "id", (nid = expando) ); + } + + // Prefix every selector in the list + groups = tokenize( selector ); + i = groups.length; + while ( i-- ) { + groups[i] = "#" + nid + " " + toSelector( groups[i] ); + } + newSelector = groups.join( "," ); + + // Expand context for sibling selectors + newContext = rsibling.test( selector ) && testContext( context.parentNode ) || + context; + } + + try { + push.apply( results, + newContext.querySelectorAll( newSelector ) + ); + return results; + } catch ( qsaError ) { + nonnativeSelectorCache( selector, true ); + } finally { + if ( nid === expando ) { + context.removeAttribute( "id" ); + } + } + } + } + } + + // All others + return select( selector.replace( rtrim, "$1" ), context, results, seed ); +} + +/** + * Create key-value caches of limited size + * @returns {function(string, object)} Returns the Object data after storing it on itself with + * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength) + * deleting the oldest entry + */ +function createCache() { + var keys = []; + + function cache( key, value ) { + // Use (key + " ") to avoid collision with native prototype properties (see Issue #157) + if ( keys.push( key + " " ) > Expr.cacheLength ) { + // Only keep the most recent entries + delete cache[ keys.shift() ]; + } + return (cache[ key + " " ] = value); + } + return cache; +} + +/** + * Mark a function for special use by Sizzle + * @param {Function} fn The function to mark + */ +function markFunction( fn ) { + fn[ expando ] = true; + return fn; +} + +/** + * Support testing using an element + * @param {Function} fn Passed the created element and returns a boolean result + */ +function assert( fn ) { + var el = document.createElement("fieldset"); + + try { + return !!fn( el ); + } catch (e) { + return false; + } finally { + // Remove from its parent by default + if ( el.parentNode ) { + el.parentNode.removeChild( el ); + } + // release memory in IE + el = null; + } +} + +/** + * Adds the same handler for all of the specified attrs + * @param {String} attrs Pipe-separated list of attributes + * @param {Function} handler The method that will be applied + */ +function addHandle( attrs, handler ) { + var arr = attrs.split("|"), + i = arr.length; + + while ( i-- ) { + Expr.attrHandle[ arr[i] ] = handler; + } +} + +/** + * Checks document order of two siblings + * @param {Element} a + * @param {Element} b + * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b + */ +function siblingCheck( a, b ) { + var cur = b && a, + diff = cur && a.nodeType === 1 && b.nodeType === 1 && + a.sourceIndex - b.sourceIndex; + + // Use IE sourceIndex if available on both nodes + if ( diff ) { + return diff; + } + + // Check if b follows a + if ( cur ) { + while ( (cur = cur.nextSibling) ) { + if ( cur === b ) { + return -1; + } + } + } + + return a ? 1 : -1; +} + +/** + * Returns a function to use in pseudos for input types + * @param {String} type + */ +function createInputPseudo( type ) { + return function( elem ) { + var name = elem.nodeName.toLowerCase(); + return name === "input" && elem.type === type; + }; +} + +/** + * Returns a function to use in pseudos for buttons + * @param {String} type + */ +function createButtonPseudo( type ) { + return function( elem ) { + var name = elem.nodeName.toLowerCase(); + return (name === "input" || name === "button") && elem.type === type; + }; +} + +/** + * Returns a function to use in pseudos for :enabled/:disabled + * @param {Boolean} disabled true for :disabled; false for :enabled + */ +function createDisabledPseudo( disabled ) { + + // Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable + return function( elem ) { + + // Only certain elements can match :enabled or :disabled + // https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled + // https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled + if ( "form" in elem ) { + + // Check for inherited disabledness on relevant non-disabled elements: + // * listed form-associated elements in a disabled fieldset + // https://html.spec.whatwg.org/multipage/forms.html#category-listed + // https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled + // * option elements in a disabled optgroup + // https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled + // All such elements have a "form" property. + if ( elem.parentNode && elem.disabled === false ) { + + // Option elements defer to a parent optgroup if present + if ( "label" in elem ) { + if ( "label" in elem.parentNode ) { + return elem.parentNode.disabled === disabled; + } else { + return elem.disabled === disabled; + } + } + + // Support: IE 6 - 11 + // Use the isDisabled shortcut property to check for disabled fieldset ancestors + return elem.isDisabled === disabled || + + // Where there is no isDisabled, check manually + /* jshint -W018 */ + elem.isDisabled !== !disabled && + inDisabledFieldset( elem ) === disabled; + } + + return elem.disabled === disabled; + + // Try to winnow out elements that can't be disabled before trusting the disabled property. + // Some victims get caught in our net (label, legend, menu, track), but it shouldn't + // even exist on them, let alone have a boolean value. + } else if ( "label" in elem ) { + return elem.disabled === disabled; + } + + // Remaining elements are neither :enabled nor :disabled + return false; + }; +} + +/** + * Returns a function to use in pseudos for positionals + * @param {Function} fn + */ +function createPositionalPseudo( fn ) { + return markFunction(function( argument ) { + argument = +argument; + return markFunction(function( seed, matches ) { + var j, + matchIndexes = fn( [], seed.length, argument ), + i = matchIndexes.length; + + // Match elements found at the specified indexes + while ( i-- ) { + if ( seed[ (j = matchIndexes[i]) ] ) { + seed[j] = !(matches[j] = seed[j]); + } + } + }); + }); +} + +/** + * Checks a node for validity as a Sizzle context + * @param {Element|Object=} context + * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value + */ +function testContext( context ) { + return context && typeof context.getElementsByTagName !== "undefined" && context; +} + +// Expose support vars for convenience +support = Sizzle.support = {}; + +/** + * Detects XML nodes + * @param {Element|Object} elem An element or a document + * @returns {Boolean} True iff elem is a non-HTML XML node + */ +isXML = Sizzle.isXML = function( elem ) { + var namespace = elem.namespaceURI, + docElem = (elem.ownerDocument || elem).documentElement; + + // Support: IE <=8 + // Assume HTML when documentElement doesn't yet exist, such as inside loading iframes + // https://bugs.jquery.com/ticket/4833 + return !rhtml.test( namespace || docElem && docElem.nodeName || "HTML" ); +}; + +/** + * Sets document-related variables once based on the current document + * @param {Element|Object} [doc] An element or document object to use to set the document + * @returns {Object} Returns the current document + */ +setDocument = Sizzle.setDocument = function( node ) { + var hasCompare, subWindow, + doc = node ? node.ownerDocument || node : preferredDoc; + + // Return early if doc is invalid or already selected + if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) { + return document; + } + + // Update global variables + document = doc; + docElem = document.documentElement; + documentIsHTML = !isXML( document ); + + // Support: IE 9-11, Edge + // Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936) + if ( preferredDoc !== document && + (subWindow = document.defaultView) && subWindow.top !== subWindow ) { + + // Support: IE 11, Edge + if ( subWindow.addEventListener ) { + subWindow.addEventListener( "unload", unloadHandler, false ); + + // Support: IE 9 - 10 only + } else if ( subWindow.attachEvent ) { + subWindow.attachEvent( "onunload", unloadHandler ); + } + } + + /* Attributes + ---------------------------------------------------------------------- */ + + // Support: IE<8 + // Verify that getAttribute really returns attributes and not properties + // (excepting IE8 booleans) + support.attributes = assert(function( el ) { + el.className = "i"; + return !el.getAttribute("className"); + }); + + /* getElement(s)By* + ---------------------------------------------------------------------- */ + + // Check if getElementsByTagName("*") returns only elements + support.getElementsByTagName = assert(function( el ) { + el.appendChild( document.createComment("") ); + return !el.getElementsByTagName("*").length; + }); + + // Support: IE<9 + support.getElementsByClassName = rnative.test( document.getElementsByClassName ); + + // Support: IE<10 + // Check if getElementById returns elements by name + // The broken getElementById methods don't pick up programmatically-set names, + // so use a roundabout getElementsByName test + support.getById = assert(function( el ) { + docElem.appendChild( el ).id = expando; + return !document.getElementsByName || !document.getElementsByName( expando ).length; + }); + + // ID filter and find + if ( support.getById ) { + Expr.filter["ID"] = function( id ) { + var attrId = id.replace( runescape, funescape ); + return function( elem ) { + return elem.getAttribute("id") === attrId; + }; + }; + Expr.find["ID"] = function( id, context ) { + if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { + var elem = context.getElementById( id ); + return elem ? [ elem ] : []; + } + }; + } else { + Expr.filter["ID"] = function( id ) { + var attrId = id.replace( runescape, funescape ); + return function( elem ) { + var node = typeof elem.getAttributeNode !== "undefined" && + elem.getAttributeNode("id"); + return node && node.value === attrId; + }; + }; + + // Support: IE 6 - 7 only + // getElementById is not reliable as a find shortcut + Expr.find["ID"] = function( id, context ) { + if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { + var node, i, elems, + elem = context.getElementById( id ); + + if ( elem ) { + + // Verify the id attribute + node = elem.getAttributeNode("id"); + if ( node && node.value === id ) { + return [ elem ]; + } + + // Fall back on getElementsByName + elems = context.getElementsByName( id ); + i = 0; + while ( (elem = elems[i++]) ) { + node = elem.getAttributeNode("id"); + if ( node && node.value === id ) { + return [ elem ]; + } + } + } + + return []; + } + }; + } + + // Tag + Expr.find["TAG"] = support.getElementsByTagName ? + function( tag, context ) { + if ( typeof context.getElementsByTagName !== "undefined" ) { + return context.getElementsByTagName( tag ); + + // DocumentFragment nodes don't have gEBTN + } else if ( support.qsa ) { + return context.querySelectorAll( tag ); + } + } : + + function( tag, context ) { + var elem, + tmp = [], + i = 0, + // By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too + results = context.getElementsByTagName( tag ); + + // Filter out possible comments + if ( tag === "*" ) { + while ( (elem = results[i++]) ) { + if ( elem.nodeType === 1 ) { + tmp.push( elem ); + } + } + + return tmp; + } + return results; + }; + + // Class + Expr.find["CLASS"] = support.getElementsByClassName && function( className, context ) { + if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) { + return context.getElementsByClassName( className ); + } + }; + + /* QSA/matchesSelector + ---------------------------------------------------------------------- */ + + // QSA and matchesSelector support + + // matchesSelector(:active) reports false when true (IE9/Opera 11.5) + rbuggyMatches = []; + + // qSa(:focus) reports false when true (Chrome 21) + // We allow this because of a bug in IE8/9 that throws an error + // whenever `document.activeElement` is accessed on an iframe + // So, we allow :focus to pass through QSA all the time to avoid the IE error + // See https://bugs.jquery.com/ticket/13378 + rbuggyQSA = []; + + if ( (support.qsa = rnative.test( document.querySelectorAll )) ) { + // Build QSA regex + // Regex strategy adopted from Diego Perini + assert(function( el ) { + // Select is set to empty string on purpose + // This is to test IE's treatment of not explicitly + // setting a boolean content attribute, + // since its presence should be enough + // https://bugs.jquery.com/ticket/12359 + docElem.appendChild( el ).innerHTML = "" + + ""; + + // Support: IE8, Opera 11-12.16 + // Nothing should be selected when empty strings follow ^= or $= or *= + // The test attribute must be unknown in Opera but "safe" for WinRT + // https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section + if ( el.querySelectorAll("[msallowcapture^='']").length ) { + rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" ); + } + + // Support: IE8 + // Boolean attributes and "value" are not treated correctly + if ( !el.querySelectorAll("[selected]").length ) { + rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" ); + } + + // Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+ + if ( !el.querySelectorAll( "[id~=" + expando + "-]" ).length ) { + rbuggyQSA.push("~="); + } + + // Webkit/Opera - :checked should return selected option elements + // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked + // IE8 throws error here and will not see later tests + if ( !el.querySelectorAll(":checked").length ) { + rbuggyQSA.push(":checked"); + } + + // Support: Safari 8+, iOS 8+ + // https://bugs.webkit.org/show_bug.cgi?id=136851 + // In-page `selector#id sibling-combinator selector` fails + if ( !el.querySelectorAll( "a#" + expando + "+*" ).length ) { + rbuggyQSA.push(".#.+[+~]"); + } + }); + + assert(function( el ) { + el.innerHTML = "" + + ""; + + // Support: Windows 8 Native Apps + // The type and name attributes are restricted during .innerHTML assignment + var input = document.createElement("input"); + input.setAttribute( "type", "hidden" ); + el.appendChild( input ).setAttribute( "name", "D" ); + + // Support: IE8 + // Enforce case-sensitivity of name attribute + if ( el.querySelectorAll("[name=d]").length ) { + rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" ); + } + + // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled) + // IE8 throws error here and will not see later tests + if ( el.querySelectorAll(":enabled").length !== 2 ) { + rbuggyQSA.push( ":enabled", ":disabled" ); + } + + // Support: IE9-11+ + // IE's :disabled selector does not pick up the children of disabled fieldsets + docElem.appendChild( el ).disabled = true; + if ( el.querySelectorAll(":disabled").length !== 2 ) { + rbuggyQSA.push( ":enabled", ":disabled" ); + } + + // Opera 10-11 does not throw on post-comma invalid pseudos + el.querySelectorAll("*,:x"); + rbuggyQSA.push(",.*:"); + }); + } + + if ( (support.matchesSelector = rnative.test( (matches = docElem.matches || + docElem.webkitMatchesSelector || + docElem.mozMatchesSelector || + docElem.oMatchesSelector || + docElem.msMatchesSelector) )) ) { + + assert(function( el ) { + // Check to see if it's possible to do matchesSelector + // on a disconnected node (IE 9) + support.disconnectedMatch = matches.call( el, "*" ); + + // This should fail with an exception + // Gecko does not error, returns false instead + matches.call( el, "[s!='']:x" ); + rbuggyMatches.push( "!=", pseudos ); + }); + } + + rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") ); + rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join("|") ); + + /* Contains + ---------------------------------------------------------------------- */ + hasCompare = rnative.test( docElem.compareDocumentPosition ); + + // Element contains another + // Purposefully self-exclusive + // As in, an element does not contain itself + contains = hasCompare || rnative.test( docElem.contains ) ? + function( a, b ) { + var adown = a.nodeType === 9 ? a.documentElement : a, + bup = b && b.parentNode; + return a === bup || !!( bup && bup.nodeType === 1 && ( + adown.contains ? + adown.contains( bup ) : + a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16 + )); + } : + function( a, b ) { + if ( b ) { + while ( (b = b.parentNode) ) { + if ( b === a ) { + return true; + } + } + } + return false; + }; + + /* Sorting + ---------------------------------------------------------------------- */ + + // Document order sorting + sortOrder = hasCompare ? + function( a, b ) { + + // Flag for duplicate removal + if ( a === b ) { + hasDuplicate = true; + return 0; + } + + // Sort on method existence if only one input has compareDocumentPosition + var compare = !a.compareDocumentPosition - !b.compareDocumentPosition; + if ( compare ) { + return compare; + } + + // Calculate position if both inputs belong to the same document + compare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ? + a.compareDocumentPosition( b ) : + + // Otherwise we know they are disconnected + 1; + + // Disconnected nodes + if ( compare & 1 || + (!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) { + + // Choose the first element that is related to our preferred document + if ( a === document || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) { + return -1; + } + if ( b === document || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) { + return 1; + } + + // Maintain original order + return sortInput ? + ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : + 0; + } + + return compare & 4 ? -1 : 1; + } : + function( a, b ) { + // Exit early if the nodes are identical + if ( a === b ) { + hasDuplicate = true; + return 0; + } + + var cur, + i = 0, + aup = a.parentNode, + bup = b.parentNode, + ap = [ a ], + bp = [ b ]; + + // Parentless nodes are either documents or disconnected + if ( !aup || !bup ) { + return a === document ? -1 : + b === document ? 1 : + aup ? -1 : + bup ? 1 : + sortInput ? + ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : + 0; + + // If the nodes are siblings, we can do a quick check + } else if ( aup === bup ) { + return siblingCheck( a, b ); + } + + // Otherwise we need full lists of their ancestors for comparison + cur = a; + while ( (cur = cur.parentNode) ) { + ap.unshift( cur ); + } + cur = b; + while ( (cur = cur.parentNode) ) { + bp.unshift( cur ); + } + + // Walk down the tree looking for a discrepancy + while ( ap[i] === bp[i] ) { + i++; + } + + return i ? + // Do a sibling check if the nodes have a common ancestor + siblingCheck( ap[i], bp[i] ) : + + // Otherwise nodes in our document sort first + ap[i] === preferredDoc ? -1 : + bp[i] === preferredDoc ? 1 : + 0; + }; + + return document; +}; + +Sizzle.matches = function( expr, elements ) { + return Sizzle( expr, null, null, elements ); +}; + +Sizzle.matchesSelector = function( elem, expr ) { + // Set document vars if needed + if ( ( elem.ownerDocument || elem ) !== document ) { + setDocument( elem ); + } + + if ( support.matchesSelector && documentIsHTML && + !nonnativeSelectorCache[ expr + " " ] && + ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) && + ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) { + + try { + var ret = matches.call( elem, expr ); + + // IE 9's matchesSelector returns false on disconnected nodes + if ( ret || support.disconnectedMatch || + // As well, disconnected nodes are said to be in a document + // fragment in IE 9 + elem.document && elem.document.nodeType !== 11 ) { + return ret; + } + } catch (e) { + nonnativeSelectorCache( expr, true ); + } + } + + return Sizzle( expr, document, null, [ elem ] ).length > 0; +}; + +Sizzle.contains = function( context, elem ) { + // Set document vars if needed + if ( ( context.ownerDocument || context ) !== document ) { + setDocument( context ); + } + return contains( context, elem ); +}; + +Sizzle.attr = function( elem, name ) { + // Set document vars if needed + if ( ( elem.ownerDocument || elem ) !== document ) { + setDocument( elem ); + } + + var fn = Expr.attrHandle[ name.toLowerCase() ], + // Don't get fooled by Object.prototype properties (jQuery #13807) + val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ? + fn( elem, name, !documentIsHTML ) : + undefined; + + return val !== undefined ? + val : + support.attributes || !documentIsHTML ? + elem.getAttribute( name ) : + (val = elem.getAttributeNode(name)) && val.specified ? + val.value : + null; +}; + +Sizzle.escape = function( sel ) { + return (sel + "").replace( rcssescape, fcssescape ); +}; + +Sizzle.error = function( msg ) { + throw new Error( "Syntax error, unrecognized expression: " + msg ); +}; + +/** + * Document sorting and removing duplicates + * @param {ArrayLike} results + */ +Sizzle.uniqueSort = function( results ) { + var elem, + duplicates = [], + j = 0, + i = 0; + + // Unless we *know* we can detect duplicates, assume their presence + hasDuplicate = !support.detectDuplicates; + sortInput = !support.sortStable && results.slice( 0 ); + results.sort( sortOrder ); + + if ( hasDuplicate ) { + while ( (elem = results[i++]) ) { + if ( elem === results[ i ] ) { + j = duplicates.push( i ); + } + } + while ( j-- ) { + results.splice( duplicates[ j ], 1 ); + } + } + + // Clear input after sorting to release objects + // See https://github.com/jquery/sizzle/pull/225 + sortInput = null; + + return results; +}; + +/** + * Utility function for retrieving the text value of an array of DOM nodes + * @param {Array|Element} elem + */ +getText = Sizzle.getText = function( elem ) { + var node, + ret = "", + i = 0, + nodeType = elem.nodeType; + + if ( !nodeType ) { + // If no nodeType, this is expected to be an array + while ( (node = elem[i++]) ) { + // Do not traverse comment nodes + ret += getText( node ); + } + } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) { + // Use textContent for elements + // innerText usage removed for consistency of new lines (jQuery #11153) + if ( typeof elem.textContent === "string" ) { + return elem.textContent; + } else { + // Traverse its children + for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { + ret += getText( elem ); + } + } + } else if ( nodeType === 3 || nodeType === 4 ) { + return elem.nodeValue; + } + // Do not include comment or processing instruction nodes + + return ret; +}; + +Expr = Sizzle.selectors = { + + // Can be adjusted by the user + cacheLength: 50, + + createPseudo: markFunction, + + match: matchExpr, + + attrHandle: {}, + + find: {}, + + relative: { + ">": { dir: "parentNode", first: true }, + " ": { dir: "parentNode" }, + "+": { dir: "previousSibling", first: true }, + "~": { dir: "previousSibling" } + }, + + preFilter: { + "ATTR": function( match ) { + match[1] = match[1].replace( runescape, funescape ); + + // Move the given value to match[3] whether quoted or unquoted + match[3] = ( match[3] || match[4] || match[5] || "" ).replace( runescape, funescape ); + + if ( match[2] === "~=" ) { + match[3] = " " + match[3] + " "; + } + + return match.slice( 0, 4 ); + }, + + "CHILD": function( match ) { + /* matches from matchExpr["CHILD"] + 1 type (only|nth|...) + 2 what (child|of-type) + 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...) + 4 xn-component of xn+y argument ([+-]?\d*n|) + 5 sign of xn-component + 6 x of xn-component + 7 sign of y-component + 8 y of y-component + */ + match[1] = match[1].toLowerCase(); + + if ( match[1].slice( 0, 3 ) === "nth" ) { + // nth-* requires argument + if ( !match[3] ) { + Sizzle.error( match[0] ); + } + + // numeric x and y parameters for Expr.filter.CHILD + // remember that false/true cast respectively to 0/1 + match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) ); + match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" ); + + // other types prohibit arguments + } else if ( match[3] ) { + Sizzle.error( match[0] ); + } + + return match; + }, + + "PSEUDO": function( match ) { + var excess, + unquoted = !match[6] && match[2]; + + if ( matchExpr["CHILD"].test( match[0] ) ) { + return null; + } + + // Accept quoted arguments as-is + if ( match[3] ) { + match[2] = match[4] || match[5] || ""; + + // Strip excess characters from unquoted arguments + } else if ( unquoted && rpseudo.test( unquoted ) && + // Get excess from tokenize (recursively) + (excess = tokenize( unquoted, true )) && + // advance to the next closing parenthesis + (excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) { + + // excess is a negative index + match[0] = match[0].slice( 0, excess ); + match[2] = unquoted.slice( 0, excess ); + } + + // Return only captures needed by the pseudo filter method (type and argument) + return match.slice( 0, 3 ); + } + }, + + filter: { + + "TAG": function( nodeNameSelector ) { + var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase(); + return nodeNameSelector === "*" ? + function() { return true; } : + function( elem ) { + return elem.nodeName && elem.nodeName.toLowerCase() === nodeName; + }; + }, + + "CLASS": function( className ) { + var pattern = classCache[ className + " " ]; + + return pattern || + (pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) && + classCache( className, function( elem ) { + return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== "undefined" && elem.getAttribute("class") || "" ); + }); + }, + + "ATTR": function( name, operator, check ) { + return function( elem ) { + var result = Sizzle.attr( elem, name ); + + if ( result == null ) { + return operator === "!="; + } + if ( !operator ) { + return true; + } + + result += ""; + + return operator === "=" ? result === check : + operator === "!=" ? result !== check : + operator === "^=" ? check && result.indexOf( check ) === 0 : + operator === "*=" ? check && result.indexOf( check ) > -1 : + operator === "$=" ? check && result.slice( -check.length ) === check : + operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 : + operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" : + false; + }; + }, + + "CHILD": function( type, what, argument, first, last ) { + var simple = type.slice( 0, 3 ) !== "nth", + forward = type.slice( -4 ) !== "last", + ofType = what === "of-type"; + + return first === 1 && last === 0 ? + + // Shortcut for :nth-*(n) + function( elem ) { + return !!elem.parentNode; + } : + + function( elem, context, xml ) { + var cache, uniqueCache, outerCache, node, nodeIndex, start, + dir = simple !== forward ? "nextSibling" : "previousSibling", + parent = elem.parentNode, + name = ofType && elem.nodeName.toLowerCase(), + useCache = !xml && !ofType, + diff = false; + + if ( parent ) { + + // :(first|last|only)-(child|of-type) + if ( simple ) { + while ( dir ) { + node = elem; + while ( (node = node[ dir ]) ) { + if ( ofType ? + node.nodeName.toLowerCase() === name : + node.nodeType === 1 ) { + + return false; + } + } + // Reverse direction for :only-* (if we haven't yet done so) + start = dir = type === "only" && !start && "nextSibling"; + } + return true; + } + + start = [ forward ? parent.firstChild : parent.lastChild ]; + + // non-xml :nth-child(...) stores cache data on `parent` + if ( forward && useCache ) { + + // Seek `elem` from a previously-cached index + + // ...in a gzip-friendly way + node = parent; + outerCache = node[ expando ] || (node[ expando ] = {}); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ node.uniqueID ] || + (outerCache[ node.uniqueID ] = {}); + + cache = uniqueCache[ type ] || []; + nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; + diff = nodeIndex && cache[ 2 ]; + node = nodeIndex && parent.childNodes[ nodeIndex ]; + + while ( (node = ++nodeIndex && node && node[ dir ] || + + // Fallback to seeking `elem` from the start + (diff = nodeIndex = 0) || start.pop()) ) { + + // When found, cache indexes on `parent` and break + if ( node.nodeType === 1 && ++diff && node === elem ) { + uniqueCache[ type ] = [ dirruns, nodeIndex, diff ]; + break; + } + } + + } else { + // Use previously-cached element index if available + if ( useCache ) { + // ...in a gzip-friendly way + node = elem; + outerCache = node[ expando ] || (node[ expando ] = {}); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ node.uniqueID ] || + (outerCache[ node.uniqueID ] = {}); + + cache = uniqueCache[ type ] || []; + nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; + diff = nodeIndex; + } + + // xml :nth-child(...) + // or :nth-last-child(...) or :nth(-last)?-of-type(...) + if ( diff === false ) { + // Use the same loop as above to seek `elem` from the start + while ( (node = ++nodeIndex && node && node[ dir ] || + (diff = nodeIndex = 0) || start.pop()) ) { + + if ( ( ofType ? + node.nodeName.toLowerCase() === name : + node.nodeType === 1 ) && + ++diff ) { + + // Cache the index of each encountered element + if ( useCache ) { + outerCache = node[ expando ] || (node[ expando ] = {}); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ node.uniqueID ] || + (outerCache[ node.uniqueID ] = {}); + + uniqueCache[ type ] = [ dirruns, diff ]; + } + + if ( node === elem ) { + break; + } + } + } + } + } + + // Incorporate the offset, then check against cycle size + diff -= last; + return diff === first || ( diff % first === 0 && diff / first >= 0 ); + } + }; + }, + + "PSEUDO": function( pseudo, argument ) { + // pseudo-class names are case-insensitive + // http://www.w3.org/TR/selectors/#pseudo-classes + // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters + // Remember that setFilters inherits from pseudos + var args, + fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] || + Sizzle.error( "unsupported pseudo: " + pseudo ); + + // The user may use createPseudo to indicate that + // arguments are needed to create the filter function + // just as Sizzle does + if ( fn[ expando ] ) { + return fn( argument ); + } + + // But maintain support for old signatures + if ( fn.length > 1 ) { + args = [ pseudo, pseudo, "", argument ]; + return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ? + markFunction(function( seed, matches ) { + var idx, + matched = fn( seed, argument ), + i = matched.length; + while ( i-- ) { + idx = indexOf( seed, matched[i] ); + seed[ idx ] = !( matches[ idx ] = matched[i] ); + } + }) : + function( elem ) { + return fn( elem, 0, args ); + }; + } + + return fn; + } + }, + + pseudos: { + // Potentially complex pseudos + "not": markFunction(function( selector ) { + // Trim the selector passed to compile + // to avoid treating leading and trailing + // spaces as combinators + var input = [], + results = [], + matcher = compile( selector.replace( rtrim, "$1" ) ); + + return matcher[ expando ] ? + markFunction(function( seed, matches, context, xml ) { + var elem, + unmatched = matcher( seed, null, xml, [] ), + i = seed.length; + + // Match elements unmatched by `matcher` + while ( i-- ) { + if ( (elem = unmatched[i]) ) { + seed[i] = !(matches[i] = elem); + } + } + }) : + function( elem, context, xml ) { + input[0] = elem; + matcher( input, null, xml, results ); + // Don't keep the element (issue #299) + input[0] = null; + return !results.pop(); + }; + }), + + "has": markFunction(function( selector ) { + return function( elem ) { + return Sizzle( selector, elem ).length > 0; + }; + }), + + "contains": markFunction(function( text ) { + text = text.replace( runescape, funescape ); + return function( elem ) { + return ( elem.textContent || getText( elem ) ).indexOf( text ) > -1; + }; + }), + + // "Whether an element is represented by a :lang() selector + // is based solely on the element's language value + // being equal to the identifier C, + // or beginning with the identifier C immediately followed by "-". + // The matching of C against the element's language value is performed case-insensitively. + // The identifier C does not have to be a valid language name." + // http://www.w3.org/TR/selectors/#lang-pseudo + "lang": markFunction( function( lang ) { + // lang value must be a valid identifier + if ( !ridentifier.test(lang || "") ) { + Sizzle.error( "unsupported lang: " + lang ); + } + lang = lang.replace( runescape, funescape ).toLowerCase(); + return function( elem ) { + var elemLang; + do { + if ( (elemLang = documentIsHTML ? + elem.lang : + elem.getAttribute("xml:lang") || elem.getAttribute("lang")) ) { + + elemLang = elemLang.toLowerCase(); + return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0; + } + } while ( (elem = elem.parentNode) && elem.nodeType === 1 ); + return false; + }; + }), + + // Miscellaneous + "target": function( elem ) { + var hash = window.location && window.location.hash; + return hash && hash.slice( 1 ) === elem.id; + }, + + "root": function( elem ) { + return elem === docElem; + }, + + "focus": function( elem ) { + return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex); + }, + + // Boolean properties + "enabled": createDisabledPseudo( false ), + "disabled": createDisabledPseudo( true ), + + "checked": function( elem ) { + // In CSS3, :checked should return both checked and selected elements + // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked + var nodeName = elem.nodeName.toLowerCase(); + return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected); + }, + + "selected": function( elem ) { + // Accessing this property makes selected-by-default + // options in Safari work properly + if ( elem.parentNode ) { + elem.parentNode.selectedIndex; + } + + return elem.selected === true; + }, + + // Contents + "empty": function( elem ) { + // http://www.w3.org/TR/selectors/#empty-pseudo + // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5), + // but not by others (comment: 8; processing instruction: 7; etc.) + // nodeType < 6 works because attributes (2) do not appear as children + for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { + if ( elem.nodeType < 6 ) { + return false; + } + } + return true; + }, + + "parent": function( elem ) { + return !Expr.pseudos["empty"]( elem ); + }, + + // Element/input types + "header": function( elem ) { + return rheader.test( elem.nodeName ); + }, + + "input": function( elem ) { + return rinputs.test( elem.nodeName ); + }, + + "button": function( elem ) { + var name = elem.nodeName.toLowerCase(); + return name === "input" && elem.type === "button" || name === "button"; + }, + + "text": function( elem ) { + var attr; + return elem.nodeName.toLowerCase() === "input" && + elem.type === "text" && + + // Support: IE<8 + // New HTML5 attribute values (e.g., "search") appear with elem.type === "text" + ( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === "text" ); + }, + + // Position-in-collection + "first": createPositionalPseudo(function() { + return [ 0 ]; + }), + + "last": createPositionalPseudo(function( matchIndexes, length ) { + return [ length - 1 ]; + }), + + "eq": createPositionalPseudo(function( matchIndexes, length, argument ) { + return [ argument < 0 ? argument + length : argument ]; + }), + + "even": createPositionalPseudo(function( matchIndexes, length ) { + var i = 0; + for ( ; i < length; i += 2 ) { + matchIndexes.push( i ); + } + return matchIndexes; + }), + + "odd": createPositionalPseudo(function( matchIndexes, length ) { + var i = 1; + for ( ; i < length; i += 2 ) { + matchIndexes.push( i ); + } + return matchIndexes; + }), + + "lt": createPositionalPseudo(function( matchIndexes, length, argument ) { + var i = argument < 0 ? + argument + length : + argument > length ? + length : + argument; + for ( ; --i >= 0; ) { + matchIndexes.push( i ); + } + return matchIndexes; + }), + + "gt": createPositionalPseudo(function( matchIndexes, length, argument ) { + var i = argument < 0 ? argument + length : argument; + for ( ; ++i < length; ) { + matchIndexes.push( i ); + } + return matchIndexes; + }) + } +}; + +Expr.pseudos["nth"] = Expr.pseudos["eq"]; + +// Add button/input type pseudos +for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) { + Expr.pseudos[ i ] = createInputPseudo( i ); +} +for ( i in { submit: true, reset: true } ) { + Expr.pseudos[ i ] = createButtonPseudo( i ); +} + +// Easy API for creating new setFilters +function setFilters() {} +setFilters.prototype = Expr.filters = Expr.pseudos; +Expr.setFilters = new setFilters(); + +tokenize = Sizzle.tokenize = function( selector, parseOnly ) { + var matched, match, tokens, type, + soFar, groups, preFilters, + cached = tokenCache[ selector + " " ]; + + if ( cached ) { + return parseOnly ? 0 : cached.slice( 0 ); + } + + soFar = selector; + groups = []; + preFilters = Expr.preFilter; + + while ( soFar ) { + + // Comma and first run + if ( !matched || (match = rcomma.exec( soFar )) ) { + if ( match ) { + // Don't consume trailing commas as valid + soFar = soFar.slice( match[0].length ) || soFar; + } + groups.push( (tokens = []) ); + } + + matched = false; + + // Combinators + if ( (match = rcombinators.exec( soFar )) ) { + matched = match.shift(); + tokens.push({ + value: matched, + // Cast descendant combinators to space + type: match[0].replace( rtrim, " " ) + }); + soFar = soFar.slice( matched.length ); + } + + // Filters + for ( type in Expr.filter ) { + if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] || + (match = preFilters[ type ]( match ))) ) { + matched = match.shift(); + tokens.push({ + value: matched, + type: type, + matches: match + }); + soFar = soFar.slice( matched.length ); + } + } + + if ( !matched ) { + break; + } + } + + // Return the length of the invalid excess + // if we're just parsing + // Otherwise, throw an error or return tokens + return parseOnly ? + soFar.length : + soFar ? + Sizzle.error( selector ) : + // Cache the tokens + tokenCache( selector, groups ).slice( 0 ); +}; + +function toSelector( tokens ) { + var i = 0, + len = tokens.length, + selector = ""; + for ( ; i < len; i++ ) { + selector += tokens[i].value; + } + return selector; +} + +function addCombinator( matcher, combinator, base ) { + var dir = combinator.dir, + skip = combinator.next, + key = skip || dir, + checkNonElements = base && key === "parentNode", + doneName = done++; + + return combinator.first ? + // Check against closest ancestor/preceding element + function( elem, context, xml ) { + while ( (elem = elem[ dir ]) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + return matcher( elem, context, xml ); + } + } + return false; + } : + + // Check against all ancestor/preceding elements + function( elem, context, xml ) { + var oldCache, uniqueCache, outerCache, + newCache = [ dirruns, doneName ]; + + // We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching + if ( xml ) { + while ( (elem = elem[ dir ]) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + if ( matcher( elem, context, xml ) ) { + return true; + } + } + } + } else { + while ( (elem = elem[ dir ]) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + outerCache = elem[ expando ] || (elem[ expando ] = {}); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ elem.uniqueID ] || (outerCache[ elem.uniqueID ] = {}); + + if ( skip && skip === elem.nodeName.toLowerCase() ) { + elem = elem[ dir ] || elem; + } else if ( (oldCache = uniqueCache[ key ]) && + oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) { + + // Assign to newCache so results back-propagate to previous elements + return (newCache[ 2 ] = oldCache[ 2 ]); + } else { + // Reuse newcache so results back-propagate to previous elements + uniqueCache[ key ] = newCache; + + // A match means we're done; a fail means we have to keep checking + if ( (newCache[ 2 ] = matcher( elem, context, xml )) ) { + return true; + } + } + } + } + } + return false; + }; +} + +function elementMatcher( matchers ) { + return matchers.length > 1 ? + function( elem, context, xml ) { + var i = matchers.length; + while ( i-- ) { + if ( !matchers[i]( elem, context, xml ) ) { + return false; + } + } + return true; + } : + matchers[0]; +} + +function multipleContexts( selector, contexts, results ) { + var i = 0, + len = contexts.length; + for ( ; i < len; i++ ) { + Sizzle( selector, contexts[i], results ); + } + return results; +} + +function condense( unmatched, map, filter, context, xml ) { + var elem, + newUnmatched = [], + i = 0, + len = unmatched.length, + mapped = map != null; + + for ( ; i < len; i++ ) { + if ( (elem = unmatched[i]) ) { + if ( !filter || filter( elem, context, xml ) ) { + newUnmatched.push( elem ); + if ( mapped ) { + map.push( i ); + } + } + } + } + + return newUnmatched; +} + +function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) { + if ( postFilter && !postFilter[ expando ] ) { + postFilter = setMatcher( postFilter ); + } + if ( postFinder && !postFinder[ expando ] ) { + postFinder = setMatcher( postFinder, postSelector ); + } + return markFunction(function( seed, results, context, xml ) { + var temp, i, elem, + preMap = [], + postMap = [], + preexisting = results.length, + + // Get initial elements from seed or context + elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ), + + // Prefilter to get matcher input, preserving a map for seed-results synchronization + matcherIn = preFilter && ( seed || !selector ) ? + condense( elems, preMap, preFilter, context, xml ) : + elems, + + matcherOut = matcher ? + // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results, + postFinder || ( seed ? preFilter : preexisting || postFilter ) ? + + // ...intermediate processing is necessary + [] : + + // ...otherwise use results directly + results : + matcherIn; + + // Find primary matches + if ( matcher ) { + matcher( matcherIn, matcherOut, context, xml ); + } + + // Apply postFilter + if ( postFilter ) { + temp = condense( matcherOut, postMap ); + postFilter( temp, [], context, xml ); + + // Un-match failing elements by moving them back to matcherIn + i = temp.length; + while ( i-- ) { + if ( (elem = temp[i]) ) { + matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem); + } + } + } + + if ( seed ) { + if ( postFinder || preFilter ) { + if ( postFinder ) { + // Get the final matcherOut by condensing this intermediate into postFinder contexts + temp = []; + i = matcherOut.length; + while ( i-- ) { + if ( (elem = matcherOut[i]) ) { + // Restore matcherIn since elem is not yet a final match + temp.push( (matcherIn[i] = elem) ); + } + } + postFinder( null, (matcherOut = []), temp, xml ); + } + + // Move matched elements from seed to results to keep them synchronized + i = matcherOut.length; + while ( i-- ) { + if ( (elem = matcherOut[i]) && + (temp = postFinder ? indexOf( seed, elem ) : preMap[i]) > -1 ) { + + seed[temp] = !(results[temp] = elem); + } + } + } + + // Add elements to results, through postFinder if defined + } else { + matcherOut = condense( + matcherOut === results ? + matcherOut.splice( preexisting, matcherOut.length ) : + matcherOut + ); + if ( postFinder ) { + postFinder( null, results, matcherOut, xml ); + } else { + push.apply( results, matcherOut ); + } + } + }); +} + +function matcherFromTokens( tokens ) { + var checkContext, matcher, j, + len = tokens.length, + leadingRelative = Expr.relative[ tokens[0].type ], + implicitRelative = leadingRelative || Expr.relative[" "], + i = leadingRelative ? 1 : 0, + + // The foundational matcher ensures that elements are reachable from top-level context(s) + matchContext = addCombinator( function( elem ) { + return elem === checkContext; + }, implicitRelative, true ), + matchAnyContext = addCombinator( function( elem ) { + return indexOf( checkContext, elem ) > -1; + }, implicitRelative, true ), + matchers = [ function( elem, context, xml ) { + var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || ( + (checkContext = context).nodeType ? + matchContext( elem, context, xml ) : + matchAnyContext( elem, context, xml ) ); + // Avoid hanging onto element (issue #299) + checkContext = null; + return ret; + } ]; + + for ( ; i < len; i++ ) { + if ( (matcher = Expr.relative[ tokens[i].type ]) ) { + matchers = [ addCombinator(elementMatcher( matchers ), matcher) ]; + } else { + matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches ); + + // Return special upon seeing a positional matcher + if ( matcher[ expando ] ) { + // Find the next relative operator (if any) for proper handling + j = ++i; + for ( ; j < len; j++ ) { + if ( Expr.relative[ tokens[j].type ] ) { + break; + } + } + return setMatcher( + i > 1 && elementMatcher( matchers ), + i > 1 && toSelector( + // If the preceding token was a descendant combinator, insert an implicit any-element `*` + tokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === " " ? "*" : "" }) + ).replace( rtrim, "$1" ), + matcher, + i < j && matcherFromTokens( tokens.slice( i, j ) ), + j < len && matcherFromTokens( (tokens = tokens.slice( j )) ), + j < len && toSelector( tokens ) + ); + } + matchers.push( matcher ); + } + } + + return elementMatcher( matchers ); +} + +function matcherFromGroupMatchers( elementMatchers, setMatchers ) { + var bySet = setMatchers.length > 0, + byElement = elementMatchers.length > 0, + superMatcher = function( seed, context, xml, results, outermost ) { + var elem, j, matcher, + matchedCount = 0, + i = "0", + unmatched = seed && [], + setMatched = [], + contextBackup = outermostContext, + // We must always have either seed elements or outermost context + elems = seed || byElement && Expr.find["TAG"]( "*", outermost ), + // Use integer dirruns iff this is the outermost matcher + dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1), + len = elems.length; + + if ( outermost ) { + outermostContext = context === document || context || outermost; + } + + // Add elements passing elementMatchers directly to results + // Support: IE<9, Safari + // Tolerate NodeList properties (IE: "length"; Safari: ) matching elements by id + for ( ; i !== len && (elem = elems[i]) != null; i++ ) { + if ( byElement && elem ) { + j = 0; + if ( !context && elem.ownerDocument !== document ) { + setDocument( elem ); + xml = !documentIsHTML; + } + while ( (matcher = elementMatchers[j++]) ) { + if ( matcher( elem, context || document, xml) ) { + results.push( elem ); + break; + } + } + if ( outermost ) { + dirruns = dirrunsUnique; + } + } + + // Track unmatched elements for set filters + if ( bySet ) { + // They will have gone through all possible matchers + if ( (elem = !matcher && elem) ) { + matchedCount--; + } + + // Lengthen the array for every element, matched or not + if ( seed ) { + unmatched.push( elem ); + } + } + } + + // `i` is now the count of elements visited above, and adding it to `matchedCount` + // makes the latter nonnegative. + matchedCount += i; + + // Apply set filters to unmatched elements + // NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount` + // equals `i`), unless we didn't visit _any_ elements in the above loop because we have + // no element matchers and no seed. + // Incrementing an initially-string "0" `i` allows `i` to remain a string only in that + // case, which will result in a "00" `matchedCount` that differs from `i` but is also + // numerically zero. + if ( bySet && i !== matchedCount ) { + j = 0; + while ( (matcher = setMatchers[j++]) ) { + matcher( unmatched, setMatched, context, xml ); + } + + if ( seed ) { + // Reintegrate element matches to eliminate the need for sorting + if ( matchedCount > 0 ) { + while ( i-- ) { + if ( !(unmatched[i] || setMatched[i]) ) { + setMatched[i] = pop.call( results ); + } + } + } + + // Discard index placeholder values to get only actual matches + setMatched = condense( setMatched ); + } + + // Add matches to results + push.apply( results, setMatched ); + + // Seedless set matches succeeding multiple successful matchers stipulate sorting + if ( outermost && !seed && setMatched.length > 0 && + ( matchedCount + setMatchers.length ) > 1 ) { + + Sizzle.uniqueSort( results ); + } + } + + // Override manipulation of globals by nested matchers + if ( outermost ) { + dirruns = dirrunsUnique; + outermostContext = contextBackup; + } + + return unmatched; + }; + + return bySet ? + markFunction( superMatcher ) : + superMatcher; +} + +compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) { + var i, + setMatchers = [], + elementMatchers = [], + cached = compilerCache[ selector + " " ]; + + if ( !cached ) { + // Generate a function of recursive functions that can be used to check each element + if ( !match ) { + match = tokenize( selector ); + } + i = match.length; + while ( i-- ) { + cached = matcherFromTokens( match[i] ); + if ( cached[ expando ] ) { + setMatchers.push( cached ); + } else { + elementMatchers.push( cached ); + } + } + + // Cache the compiled function + cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) ); + + // Save selector and tokenization + cached.selector = selector; + } + return cached; +}; + +/** + * A low-level selection function that works with Sizzle's compiled + * selector functions + * @param {String|Function} selector A selector or a pre-compiled + * selector function built with Sizzle.compile + * @param {Element} context + * @param {Array} [results] + * @param {Array} [seed] A set of elements to match against + */ +select = Sizzle.select = function( selector, context, results, seed ) { + var i, tokens, token, type, find, + compiled = typeof selector === "function" && selector, + match = !seed && tokenize( (selector = compiled.selector || selector) ); + + results = results || []; + + // Try to minimize operations if there is only one selector in the list and no seed + // (the latter of which guarantees us context) + if ( match.length === 1 ) { + + // Reduce context if the leading compound selector is an ID + tokens = match[0] = match[0].slice( 0 ); + if ( tokens.length > 2 && (token = tokens[0]).type === "ID" && + context.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[1].type ] ) { + + context = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0]; + if ( !context ) { + return results; + + // Precompiled matchers will still verify ancestry, so step up a level + } else if ( compiled ) { + context = context.parentNode; + } + + selector = selector.slice( tokens.shift().value.length ); + } + + // Fetch a seed set for right-to-left matching + i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length; + while ( i-- ) { + token = tokens[i]; + + // Abort if we hit a combinator + if ( Expr.relative[ (type = token.type) ] ) { + break; + } + if ( (find = Expr.find[ type ]) ) { + // Search, expanding context for leading sibling combinators + if ( (seed = find( + token.matches[0].replace( runescape, funescape ), + rsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context + )) ) { + + // If seed is empty or no tokens remain, we can return early + tokens.splice( i, 1 ); + selector = seed.length && toSelector( tokens ); + if ( !selector ) { + push.apply( results, seed ); + return results; + } + + break; + } + } + } + } + + // Compile and execute a filtering function if one is not provided + // Provide `match` to avoid retokenization if we modified the selector above + ( compiled || compile( selector, match ) )( + seed, + context, + !documentIsHTML, + results, + !context || rsibling.test( selector ) && testContext( context.parentNode ) || context + ); + return results; +}; + +// One-time assignments + +// Sort stability +support.sortStable = expando.split("").sort( sortOrder ).join("") === expando; + +// Support: Chrome 14-35+ +// Always assume duplicates if they aren't passed to the comparison function +support.detectDuplicates = !!hasDuplicate; + +// Initialize against the default document +setDocument(); + +// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27) +// Detached nodes confoundingly follow *each other* +support.sortDetached = assert(function( el ) { + // Should return 1, but returns 4 (following) + return el.compareDocumentPosition( document.createElement("fieldset") ) & 1; +}); + +// Support: IE<8 +// Prevent attribute/property "interpolation" +// https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx +if ( !assert(function( el ) { + el.innerHTML = ""; + return el.firstChild.getAttribute("href") === "#" ; +}) ) { + addHandle( "type|href|height|width", function( elem, name, isXML ) { + if ( !isXML ) { + return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 ); + } + }); +} + +// Support: IE<9 +// Use defaultValue in place of getAttribute("value") +if ( !support.attributes || !assert(function( el ) { + el.innerHTML = ""; + el.firstChild.setAttribute( "value", "" ); + return el.firstChild.getAttribute( "value" ) === ""; +}) ) { + addHandle( "value", function( elem, name, isXML ) { + if ( !isXML && elem.nodeName.toLowerCase() === "input" ) { + return elem.defaultValue; + } + }); +} + +// Support: IE<9 +// Use getAttributeNode to fetch booleans when getAttribute lies +if ( !assert(function( el ) { + return el.getAttribute("disabled") == null; +}) ) { + addHandle( booleans, function( elem, name, isXML ) { + var val; + if ( !isXML ) { + return elem[ name ] === true ? name.toLowerCase() : + (val = elem.getAttributeNode( name )) && val.specified ? + val.value : + null; + } + }); +} + +return Sizzle; + +})( window ); + + + +jQuery.find = Sizzle; +jQuery.expr = Sizzle.selectors; + +// Deprecated +jQuery.expr[ ":" ] = jQuery.expr.pseudos; +jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort; +jQuery.text = Sizzle.getText; +jQuery.isXMLDoc = Sizzle.isXML; +jQuery.contains = Sizzle.contains; +jQuery.escapeSelector = Sizzle.escape; + + + + +var dir = function( elem, dir, until ) { + var matched = [], + truncate = until !== undefined; + + while ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) { + if ( elem.nodeType === 1 ) { + if ( truncate && jQuery( elem ).is( until ) ) { + break; + } + matched.push( elem ); + } + } + return matched; +}; + + +var siblings = function( n, elem ) { + var matched = []; + + for ( ; n; n = n.nextSibling ) { + if ( n.nodeType === 1 && n !== elem ) { + matched.push( n ); + } + } + + return matched; +}; + + +var rneedsContext = jQuery.expr.match.needsContext; + + + +function nodeName( elem, name ) { + + return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); + +}; +var rsingleTag = ( /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i ); + + + +// Implement the identical functionality for filter and not +function winnow( elements, qualifier, not ) { + if ( isFunction( qualifier ) ) { + return jQuery.grep( elements, function( elem, i ) { + return !!qualifier.call( elem, i, elem ) !== not; + } ); + } + + // Single element + if ( qualifier.nodeType ) { + return jQuery.grep( elements, function( elem ) { + return ( elem === qualifier ) !== not; + } ); + } + + // Arraylike of elements (jQuery, arguments, Array) + if ( typeof qualifier !== "string" ) { + return jQuery.grep( elements, function( elem ) { + return ( indexOf.call( qualifier, elem ) > -1 ) !== not; + } ); + } + + // Filtered directly for both simple and complex selectors + return jQuery.filter( qualifier, elements, not ); +} + +jQuery.filter = function( expr, elems, not ) { + var elem = elems[ 0 ]; + + if ( not ) { + expr = ":not(" + expr + ")"; + } + + if ( elems.length === 1 && elem.nodeType === 1 ) { + return jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : []; + } + + return jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) { + return elem.nodeType === 1; + } ) ); +}; + +jQuery.fn.extend( { + find: function( selector ) { + var i, ret, + len = this.length, + self = this; + + if ( typeof selector !== "string" ) { + return this.pushStack( jQuery( selector ).filter( function() { + for ( i = 0; i < len; i++ ) { + if ( jQuery.contains( self[ i ], this ) ) { + return true; + } + } + } ) ); + } + + ret = this.pushStack( [] ); + + for ( i = 0; i < len; i++ ) { + jQuery.find( selector, self[ i ], ret ); + } + + return len > 1 ? jQuery.uniqueSort( ret ) : ret; + }, + filter: function( selector ) { + return this.pushStack( winnow( this, selector || [], false ) ); + }, + not: function( selector ) { + return this.pushStack( winnow( this, selector || [], true ) ); + }, + is: function( selector ) { + return !!winnow( + this, + + // If this is a positional/relative selector, check membership in the returned set + // so $("p:first").is("p:last") won't return true for a doc with two "p". + typeof selector === "string" && rneedsContext.test( selector ) ? + jQuery( selector ) : + selector || [], + false + ).length; + } +} ); + + +// Initialize a jQuery object + + +// A central reference to the root jQuery(document) +var rootjQuery, + + // A simple way to check for HTML strings + // Prioritize #id over to avoid XSS via location.hash (#9521) + // Strict HTML recognition (#11290: must start with <) + // Shortcut simple #id case for speed + rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/, + + init = jQuery.fn.init = function( selector, context, root ) { + var match, elem; + + // HANDLE: $(""), $(null), $(undefined), $(false) + if ( !selector ) { + return this; + } + + // Method init() accepts an alternate rootjQuery + // so migrate can support jQuery.sub (gh-2101) + root = root || rootjQuery; + + // Handle HTML strings + if ( typeof selector === "string" ) { + if ( selector[ 0 ] === "<" && + selector[ selector.length - 1 ] === ">" && + selector.length >= 3 ) { + + // Assume that strings that start and end with <> are HTML and skip the regex check + match = [ null, selector, null ]; + + } else { + match = rquickExpr.exec( selector ); + } + + // Match html or make sure no context is specified for #id + if ( match && ( match[ 1 ] || !context ) ) { + + // HANDLE: $(html) -> $(array) + if ( match[ 1 ] ) { + context = context instanceof jQuery ? context[ 0 ] : context; + + // Option to run scripts is true for back-compat + // Intentionally let the error be thrown if parseHTML is not present + jQuery.merge( this, jQuery.parseHTML( + match[ 1 ], + context && context.nodeType ? context.ownerDocument || context : document, + true + ) ); + + // HANDLE: $(html, props) + if ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) { + for ( match in context ) { + + // Properties of context are called as methods if possible + if ( isFunction( this[ match ] ) ) { + this[ match ]( context[ match ] ); + + // ...and otherwise set as attributes + } else { + this.attr( match, context[ match ] ); + } + } + } + + return this; + + // HANDLE: $(#id) + } else { + elem = document.getElementById( match[ 2 ] ); + + if ( elem ) { + + // Inject the element directly into the jQuery object + this[ 0 ] = elem; + this.length = 1; + } + return this; + } + + // HANDLE: $(expr, $(...)) + } else if ( !context || context.jquery ) { + return ( context || root ).find( selector ); + + // HANDLE: $(expr, context) + // (which is just equivalent to: $(context).find(expr) + } else { + return this.constructor( context ).find( selector ); + } + + // HANDLE: $(DOMElement) + } else if ( selector.nodeType ) { + this[ 0 ] = selector; + this.length = 1; + return this; + + // HANDLE: $(function) + // Shortcut for document ready + } else if ( isFunction( selector ) ) { + return root.ready !== undefined ? + root.ready( selector ) : + + // Execute immediately if ready is not present + selector( jQuery ); + } + + return jQuery.makeArray( selector, this ); + }; + +// Give the init function the jQuery prototype for later instantiation +init.prototype = jQuery.fn; + +// Initialize central reference +rootjQuery = jQuery( document ); + + +var rparentsprev = /^(?:parents|prev(?:Until|All))/, + + // Methods guaranteed to produce a unique set when starting from a unique set + guaranteedUnique = { + children: true, + contents: true, + next: true, + prev: true + }; + +jQuery.fn.extend( { + has: function( target ) { + var targets = jQuery( target, this ), + l = targets.length; + + return this.filter( function() { + var i = 0; + for ( ; i < l; i++ ) { + if ( jQuery.contains( this, targets[ i ] ) ) { + return true; + } + } + } ); + }, + + closest: function( selectors, context ) { + var cur, + i = 0, + l = this.length, + matched = [], + targets = typeof selectors !== "string" && jQuery( selectors ); + + // Positional selectors never match, since there's no _selection_ context + if ( !rneedsContext.test( selectors ) ) { + for ( ; i < l; i++ ) { + for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) { + + // Always skip document fragments + if ( cur.nodeType < 11 && ( targets ? + targets.index( cur ) > -1 : + + // Don't pass non-elements to Sizzle + cur.nodeType === 1 && + jQuery.find.matchesSelector( cur, selectors ) ) ) { + + matched.push( cur ); + break; + } + } + } + } + + return this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched ); + }, + + // Determine the position of an element within the set + index: function( elem ) { + + // No argument, return index in parent + if ( !elem ) { + return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1; + } + + // Index in selector + if ( typeof elem === "string" ) { + return indexOf.call( jQuery( elem ), this[ 0 ] ); + } + + // Locate the position of the desired element + return indexOf.call( this, + + // If it receives a jQuery object, the first element is used + elem.jquery ? elem[ 0 ] : elem + ); + }, + + add: function( selector, context ) { + return this.pushStack( + jQuery.uniqueSort( + jQuery.merge( this.get(), jQuery( selector, context ) ) + ) + ); + }, + + addBack: function( selector ) { + return this.add( selector == null ? + this.prevObject : this.prevObject.filter( selector ) + ); + } +} ); + +function sibling( cur, dir ) { + while ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {} + return cur; +} + +jQuery.each( { + parent: function( elem ) { + var parent = elem.parentNode; + return parent && parent.nodeType !== 11 ? parent : null; + }, + parents: function( elem ) { + return dir( elem, "parentNode" ); + }, + parentsUntil: function( elem, i, until ) { + return dir( elem, "parentNode", until ); + }, + next: function( elem ) { + return sibling( elem, "nextSibling" ); + }, + prev: function( elem ) { + return sibling( elem, "previousSibling" ); + }, + nextAll: function( elem ) { + return dir( elem, "nextSibling" ); + }, + prevAll: function( elem ) { + return dir( elem, "previousSibling" ); + }, + nextUntil: function( elem, i, until ) { + return dir( elem, "nextSibling", until ); + }, + prevUntil: function( elem, i, until ) { + return dir( elem, "previousSibling", until ); + }, + siblings: function( elem ) { + return siblings( ( elem.parentNode || {} ).firstChild, elem ); + }, + children: function( elem ) { + return siblings( elem.firstChild ); + }, + contents: function( elem ) { + if ( typeof elem.contentDocument !== "undefined" ) { + return elem.contentDocument; + } + + // Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only + // Treat the template element as a regular one in browsers that + // don't support it. + if ( nodeName( elem, "template" ) ) { + elem = elem.content || elem; + } + + return jQuery.merge( [], elem.childNodes ); + } +}, function( name, fn ) { + jQuery.fn[ name ] = function( until, selector ) { + var matched = jQuery.map( this, fn, until ); + + if ( name.slice( -5 ) !== "Until" ) { + selector = until; + } + + if ( selector && typeof selector === "string" ) { + matched = jQuery.filter( selector, matched ); + } + + if ( this.length > 1 ) { + + // Remove duplicates + if ( !guaranteedUnique[ name ] ) { + jQuery.uniqueSort( matched ); + } + + // Reverse order for parents* and prev-derivatives + if ( rparentsprev.test( name ) ) { + matched.reverse(); + } + } + + return this.pushStack( matched ); + }; +} ); +var rnothtmlwhite = ( /[^\x20\t\r\n\f]+/g ); + + + +// Convert String-formatted options into Object-formatted ones +function createOptions( options ) { + var object = {}; + jQuery.each( options.match( rnothtmlwhite ) || [], function( _, flag ) { + object[ flag ] = true; + } ); + return object; +} + +/* + * Create a callback list using the following parameters: + * + * options: an optional list of space-separated options that will change how + * the callback list behaves or a more traditional option object + * + * By default a callback list will act like an event callback list and can be + * "fired" multiple times. + * + * Possible options: + * + * once: will ensure the callback list can only be fired once (like a Deferred) + * + * memory: will keep track of previous values and will call any callback added + * after the list has been fired right away with the latest "memorized" + * values (like a Deferred) + * + * unique: will ensure a callback can only be added once (no duplicate in the list) + * + * stopOnFalse: interrupt callings when a callback returns false + * + */ +jQuery.Callbacks = function( options ) { + + // Convert options from String-formatted to Object-formatted if needed + // (we check in cache first) + options = typeof options === "string" ? + createOptions( options ) : + jQuery.extend( {}, options ); + + var // Flag to know if list is currently firing + firing, + + // Last fire value for non-forgettable lists + memory, + + // Flag to know if list was already fired + fired, + + // Flag to prevent firing + locked, + + // Actual callback list + list = [], + + // Queue of execution data for repeatable lists + queue = [], + + // Index of currently firing callback (modified by add/remove as needed) + firingIndex = -1, + + // Fire callbacks + fire = function() { + + // Enforce single-firing + locked = locked || options.once; + + // Execute callbacks for all pending executions, + // respecting firingIndex overrides and runtime changes + fired = firing = true; + for ( ; queue.length; firingIndex = -1 ) { + memory = queue.shift(); + while ( ++firingIndex < list.length ) { + + // Run callback and check for early termination + if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false && + options.stopOnFalse ) { + + // Jump to end and forget the data so .add doesn't re-fire + firingIndex = list.length; + memory = false; + } + } + } + + // Forget the data if we're done with it + if ( !options.memory ) { + memory = false; + } + + firing = false; + + // Clean up if we're done firing for good + if ( locked ) { + + // Keep an empty list if we have data for future add calls + if ( memory ) { + list = []; + + // Otherwise, this object is spent + } else { + list = ""; + } + } + }, + + // Actual Callbacks object + self = { + + // Add a callback or a collection of callbacks to the list + add: function() { + if ( list ) { + + // If we have memory from a past run, we should fire after adding + if ( memory && !firing ) { + firingIndex = list.length - 1; + queue.push( memory ); + } + + ( function add( args ) { + jQuery.each( args, function( _, arg ) { + if ( isFunction( arg ) ) { + if ( !options.unique || !self.has( arg ) ) { + list.push( arg ); + } + } else if ( arg && arg.length && toType( arg ) !== "string" ) { + + // Inspect recursively + add( arg ); + } + } ); + } )( arguments ); + + if ( memory && !firing ) { + fire(); + } + } + return this; + }, + + // Remove a callback from the list + remove: function() { + jQuery.each( arguments, function( _, arg ) { + var index; + while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) { + list.splice( index, 1 ); + + // Handle firing indexes + if ( index <= firingIndex ) { + firingIndex--; + } + } + } ); + return this; + }, + + // Check if a given callback is in the list. + // If no argument is given, return whether or not list has callbacks attached. + has: function( fn ) { + return fn ? + jQuery.inArray( fn, list ) > -1 : + list.length > 0; + }, + + // Remove all callbacks from the list + empty: function() { + if ( list ) { + list = []; + } + return this; + }, + + // Disable .fire and .add + // Abort any current/pending executions + // Clear all callbacks and values + disable: function() { + locked = queue = []; + list = memory = ""; + return this; + }, + disabled: function() { + return !list; + }, + + // Disable .fire + // Also disable .add unless we have memory (since it would have no effect) + // Abort any pending executions + lock: function() { + locked = queue = []; + if ( !memory && !firing ) { + list = memory = ""; + } + return this; + }, + locked: function() { + return !!locked; + }, + + // Call all callbacks with the given context and arguments + fireWith: function( context, args ) { + if ( !locked ) { + args = args || []; + args = [ context, args.slice ? args.slice() : args ]; + queue.push( args ); + if ( !firing ) { + fire(); + } + } + return this; + }, + + // Call all the callbacks with the given arguments + fire: function() { + self.fireWith( this, arguments ); + return this; + }, + + // To know if the callbacks have already been called at least once + fired: function() { + return !!fired; + } + }; + + return self; +}; + + +function Identity( v ) { + return v; +} +function Thrower( ex ) { + throw ex; +} + +function adoptValue( value, resolve, reject, noValue ) { + var method; + + try { + + // Check for promise aspect first to privilege synchronous behavior + if ( value && isFunction( ( method = value.promise ) ) ) { + method.call( value ).done( resolve ).fail( reject ); + + // Other thenables + } else if ( value && isFunction( ( method = value.then ) ) ) { + method.call( value, resolve, reject ); + + // Other non-thenables + } else { + + // Control `resolve` arguments by letting Array#slice cast boolean `noValue` to integer: + // * false: [ value ].slice( 0 ) => resolve( value ) + // * true: [ value ].slice( 1 ) => resolve() + resolve.apply( undefined, [ value ].slice( noValue ) ); + } + + // For Promises/A+, convert exceptions into rejections + // Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in + // Deferred#then to conditionally suppress rejection. + } catch ( value ) { + + // Support: Android 4.0 only + // Strict mode functions invoked without .call/.apply get global-object context + reject.apply( undefined, [ value ] ); + } +} + +jQuery.extend( { + + Deferred: function( func ) { + var tuples = [ + + // action, add listener, callbacks, + // ... .then handlers, argument index, [final state] + [ "notify", "progress", jQuery.Callbacks( "memory" ), + jQuery.Callbacks( "memory" ), 2 ], + [ "resolve", "done", jQuery.Callbacks( "once memory" ), + jQuery.Callbacks( "once memory" ), 0, "resolved" ], + [ "reject", "fail", jQuery.Callbacks( "once memory" ), + jQuery.Callbacks( "once memory" ), 1, "rejected" ] + ], + state = "pending", + promise = { + state: function() { + return state; + }, + always: function() { + deferred.done( arguments ).fail( arguments ); + return this; + }, + "catch": function( fn ) { + return promise.then( null, fn ); + }, + + // Keep pipe for back-compat + pipe: function( /* fnDone, fnFail, fnProgress */ ) { + var fns = arguments; + + return jQuery.Deferred( function( newDefer ) { + jQuery.each( tuples, function( i, tuple ) { + + // Map tuples (progress, done, fail) to arguments (done, fail, progress) + var fn = isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ]; + + // deferred.progress(function() { bind to newDefer or newDefer.notify }) + // deferred.done(function() { bind to newDefer or newDefer.resolve }) + // deferred.fail(function() { bind to newDefer or newDefer.reject }) + deferred[ tuple[ 1 ] ]( function() { + var returned = fn && fn.apply( this, arguments ); + if ( returned && isFunction( returned.promise ) ) { + returned.promise() + .progress( newDefer.notify ) + .done( newDefer.resolve ) + .fail( newDefer.reject ); + } else { + newDefer[ tuple[ 0 ] + "With" ]( + this, + fn ? [ returned ] : arguments + ); + } + } ); + } ); + fns = null; + } ).promise(); + }, + then: function( onFulfilled, onRejected, onProgress ) { + var maxDepth = 0; + function resolve( depth, deferred, handler, special ) { + return function() { + var that = this, + args = arguments, + mightThrow = function() { + var returned, then; + + // Support: Promises/A+ section 2.3.3.3.3 + // https://promisesaplus.com/#point-59 + // Ignore double-resolution attempts + if ( depth < maxDepth ) { + return; + } + + returned = handler.apply( that, args ); + + // Support: Promises/A+ section 2.3.1 + // https://promisesaplus.com/#point-48 + if ( returned === deferred.promise() ) { + throw new TypeError( "Thenable self-resolution" ); + } + + // Support: Promises/A+ sections 2.3.3.1, 3.5 + // https://promisesaplus.com/#point-54 + // https://promisesaplus.com/#point-75 + // Retrieve `then` only once + then = returned && + + // Support: Promises/A+ section 2.3.4 + // https://promisesaplus.com/#point-64 + // Only check objects and functions for thenability + ( typeof returned === "object" || + typeof returned === "function" ) && + returned.then; + + // Handle a returned thenable + if ( isFunction( then ) ) { + + // Special processors (notify) just wait for resolution + if ( special ) { + then.call( + returned, + resolve( maxDepth, deferred, Identity, special ), + resolve( maxDepth, deferred, Thrower, special ) + ); + + // Normal processors (resolve) also hook into progress + } else { + + // ...and disregard older resolution values + maxDepth++; + + then.call( + returned, + resolve( maxDepth, deferred, Identity, special ), + resolve( maxDepth, deferred, Thrower, special ), + resolve( maxDepth, deferred, Identity, + deferred.notifyWith ) + ); + } + + // Handle all other returned values + } else { + + // Only substitute handlers pass on context + // and multiple values (non-spec behavior) + if ( handler !== Identity ) { + that = undefined; + args = [ returned ]; + } + + // Process the value(s) + // Default process is resolve + ( special || deferred.resolveWith )( that, args ); + } + }, + + // Only normal processors (resolve) catch and reject exceptions + process = special ? + mightThrow : + function() { + try { + mightThrow(); + } catch ( e ) { + + if ( jQuery.Deferred.exceptionHook ) { + jQuery.Deferred.exceptionHook( e, + process.stackTrace ); + } + + // Support: Promises/A+ section 2.3.3.3.4.1 + // https://promisesaplus.com/#point-61 + // Ignore post-resolution exceptions + if ( depth + 1 >= maxDepth ) { + + // Only substitute handlers pass on context + // and multiple values (non-spec behavior) + if ( handler !== Thrower ) { + that = undefined; + args = [ e ]; + } + + deferred.rejectWith( that, args ); + } + } + }; + + // Support: Promises/A+ section 2.3.3.3.1 + // https://promisesaplus.com/#point-57 + // Re-resolve promises immediately to dodge false rejection from + // subsequent errors + if ( depth ) { + process(); + } else { + + // Call an optional hook to record the stack, in case of exception + // since it's otherwise lost when execution goes async + if ( jQuery.Deferred.getStackHook ) { + process.stackTrace = jQuery.Deferred.getStackHook(); + } + window.setTimeout( process ); + } + }; + } + + return jQuery.Deferred( function( newDefer ) { + + // progress_handlers.add( ... ) + tuples[ 0 ][ 3 ].add( + resolve( + 0, + newDefer, + isFunction( onProgress ) ? + onProgress : + Identity, + newDefer.notifyWith + ) + ); + + // fulfilled_handlers.add( ... ) + tuples[ 1 ][ 3 ].add( + resolve( + 0, + newDefer, + isFunction( onFulfilled ) ? + onFulfilled : + Identity + ) + ); + + // rejected_handlers.add( ... ) + tuples[ 2 ][ 3 ].add( + resolve( + 0, + newDefer, + isFunction( onRejected ) ? + onRejected : + Thrower + ) + ); + } ).promise(); + }, + + // Get a promise for this deferred + // If obj is provided, the promise aspect is added to the object + promise: function( obj ) { + return obj != null ? jQuery.extend( obj, promise ) : promise; + } + }, + deferred = {}; + + // Add list-specific methods + jQuery.each( tuples, function( i, tuple ) { + var list = tuple[ 2 ], + stateString = tuple[ 5 ]; + + // promise.progress = list.add + // promise.done = list.add + // promise.fail = list.add + promise[ tuple[ 1 ] ] = list.add; + + // Handle state + if ( stateString ) { + list.add( + function() { + + // state = "resolved" (i.e., fulfilled) + // state = "rejected" + state = stateString; + }, + + // rejected_callbacks.disable + // fulfilled_callbacks.disable + tuples[ 3 - i ][ 2 ].disable, + + // rejected_handlers.disable + // fulfilled_handlers.disable + tuples[ 3 - i ][ 3 ].disable, + + // progress_callbacks.lock + tuples[ 0 ][ 2 ].lock, + + // progress_handlers.lock + tuples[ 0 ][ 3 ].lock + ); + } + + // progress_handlers.fire + // fulfilled_handlers.fire + // rejected_handlers.fire + list.add( tuple[ 3 ].fire ); + + // deferred.notify = function() { deferred.notifyWith(...) } + // deferred.resolve = function() { deferred.resolveWith(...) } + // deferred.reject = function() { deferred.rejectWith(...) } + deferred[ tuple[ 0 ] ] = function() { + deferred[ tuple[ 0 ] + "With" ]( this === deferred ? undefined : this, arguments ); + return this; + }; + + // deferred.notifyWith = list.fireWith + // deferred.resolveWith = list.fireWith + // deferred.rejectWith = list.fireWith + deferred[ tuple[ 0 ] + "With" ] = list.fireWith; + } ); + + // Make the deferred a promise + promise.promise( deferred ); + + // Call given func if any + if ( func ) { + func.call( deferred, deferred ); + } + + // All done! + return deferred; + }, + + // Deferred helper + when: function( singleValue ) { + var + + // count of uncompleted subordinates + remaining = arguments.length, + + // count of unprocessed arguments + i = remaining, + + // subordinate fulfillment data + resolveContexts = Array( i ), + resolveValues = slice.call( arguments ), + + // the master Deferred + master = jQuery.Deferred(), + + // subordinate callback factory + updateFunc = function( i ) { + return function( value ) { + resolveContexts[ i ] = this; + resolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value; + if ( !( --remaining ) ) { + master.resolveWith( resolveContexts, resolveValues ); + } + }; + }; + + // Single- and empty arguments are adopted like Promise.resolve + if ( remaining <= 1 ) { + adoptValue( singleValue, master.done( updateFunc( i ) ).resolve, master.reject, + !remaining ); + + // Use .then() to unwrap secondary thenables (cf. gh-3000) + if ( master.state() === "pending" || + isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) { + + return master.then(); + } + } + + // Multiple arguments are aggregated like Promise.all array elements + while ( i-- ) { + adoptValue( resolveValues[ i ], updateFunc( i ), master.reject ); + } + + return master.promise(); + } +} ); + + +// These usually indicate a programmer mistake during development, +// warn about them ASAP rather than swallowing them by default. +var rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/; + +jQuery.Deferred.exceptionHook = function( error, stack ) { + + // Support: IE 8 - 9 only + // Console exists when dev tools are open, which can happen at any time + if ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) { + window.console.warn( "jQuery.Deferred exception: " + error.message, error.stack, stack ); + } +}; + + + + +jQuery.readyException = function( error ) { + window.setTimeout( function() { + throw error; + } ); +}; + + + + +// The deferred used on DOM ready +var readyList = jQuery.Deferred(); + +jQuery.fn.ready = function( fn ) { + + readyList + .then( fn ) + + // Wrap jQuery.readyException in a function so that the lookup + // happens at the time of error handling instead of callback + // registration. + .catch( function( error ) { + jQuery.readyException( error ); + } ); + + return this; +}; + +jQuery.extend( { + + // Is the DOM ready to be used? Set to true once it occurs. + isReady: false, + + // A counter to track how many items to wait for before + // the ready event fires. See #6781 + readyWait: 1, + + // Handle when the DOM is ready + ready: function( wait ) { + + // Abort if there are pending holds or we're already ready + if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) { + return; + } + + // Remember that the DOM is ready + jQuery.isReady = true; + + // If a normal DOM Ready event fired, decrement, and wait if need be + if ( wait !== true && --jQuery.readyWait > 0 ) { + return; + } + + // If there are functions bound, to execute + readyList.resolveWith( document, [ jQuery ] ); + } +} ); + +jQuery.ready.then = readyList.then; + +// The ready event handler and self cleanup method +function completed() { + document.removeEventListener( "DOMContentLoaded", completed ); + window.removeEventListener( "load", completed ); + jQuery.ready(); +} + +// Catch cases where $(document).ready() is called +// after the browser event has already occurred. +// Support: IE <=9 - 10 only +// Older IE sometimes signals "interactive" too soon +if ( document.readyState === "complete" || + ( document.readyState !== "loading" && !document.documentElement.doScroll ) ) { + + // Handle it asynchronously to allow scripts the opportunity to delay ready + window.setTimeout( jQuery.ready ); + +} else { + + // Use the handy event callback + document.addEventListener( "DOMContentLoaded", completed ); + + // A fallback to window.onload, that will always work + window.addEventListener( "load", completed ); +} + + + + +// Multifunctional method to get and set values of a collection +// The value/s can optionally be executed if it's a function +var access = function( elems, fn, key, value, chainable, emptyGet, raw ) { + var i = 0, + len = elems.length, + bulk = key == null; + + // Sets many values + if ( toType( key ) === "object" ) { + chainable = true; + for ( i in key ) { + access( elems, fn, i, key[ i ], true, emptyGet, raw ); + } + + // Sets one value + } else if ( value !== undefined ) { + chainable = true; + + if ( !isFunction( value ) ) { + raw = true; + } + + if ( bulk ) { + + // Bulk operations run against the entire set + if ( raw ) { + fn.call( elems, value ); + fn = null; + + // ...except when executing function values + } else { + bulk = fn; + fn = function( elem, key, value ) { + return bulk.call( jQuery( elem ), value ); + }; + } + } + + if ( fn ) { + for ( ; i < len; i++ ) { + fn( + elems[ i ], key, raw ? + value : + value.call( elems[ i ], i, fn( elems[ i ], key ) ) + ); + } + } + } + + if ( chainable ) { + return elems; + } + + // Gets + if ( bulk ) { + return fn.call( elems ); + } + + return len ? fn( elems[ 0 ], key ) : emptyGet; +}; + + +// Matches dashed string for camelizing +var rmsPrefix = /^-ms-/, + rdashAlpha = /-([a-z])/g; + +// Used by camelCase as callback to replace() +function fcamelCase( all, letter ) { + return letter.toUpperCase(); +} + +// Convert dashed to camelCase; used by the css and data modules +// Support: IE <=9 - 11, Edge 12 - 15 +// Microsoft forgot to hump their vendor prefix (#9572) +function camelCase( string ) { + return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); +} +var acceptData = function( owner ) { + + // Accepts only: + // - Node + // - Node.ELEMENT_NODE + // - Node.DOCUMENT_NODE + // - Object + // - Any + return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType ); +}; + + + + +function Data() { + this.expando = jQuery.expando + Data.uid++; +} + +Data.uid = 1; + +Data.prototype = { + + cache: function( owner ) { + + // Check if the owner object already has a cache + var value = owner[ this.expando ]; + + // If not, create one + if ( !value ) { + value = {}; + + // We can accept data for non-element nodes in modern browsers, + // but we should not, see #8335. + // Always return an empty object. + if ( acceptData( owner ) ) { + + // If it is a node unlikely to be stringify-ed or looped over + // use plain assignment + if ( owner.nodeType ) { + owner[ this.expando ] = value; + + // Otherwise secure it in a non-enumerable property + // configurable must be true to allow the property to be + // deleted when data is removed + } else { + Object.defineProperty( owner, this.expando, { + value: value, + configurable: true + } ); + } + } + } + + return value; + }, + set: function( owner, data, value ) { + var prop, + cache = this.cache( owner ); + + // Handle: [ owner, key, value ] args + // Always use camelCase key (gh-2257) + if ( typeof data === "string" ) { + cache[ camelCase( data ) ] = value; + + // Handle: [ owner, { properties } ] args + } else { + + // Copy the properties one-by-one to the cache object + for ( prop in data ) { + cache[ camelCase( prop ) ] = data[ prop ]; + } + } + return cache; + }, + get: function( owner, key ) { + return key === undefined ? + this.cache( owner ) : + + // Always use camelCase key (gh-2257) + owner[ this.expando ] && owner[ this.expando ][ camelCase( key ) ]; + }, + access: function( owner, key, value ) { + + // In cases where either: + // + // 1. No key was specified + // 2. A string key was specified, but no value provided + // + // Take the "read" path and allow the get method to determine + // which value to return, respectively either: + // + // 1. The entire cache object + // 2. The data stored at the key + // + if ( key === undefined || + ( ( key && typeof key === "string" ) && value === undefined ) ) { + + return this.get( owner, key ); + } + + // When the key is not a string, or both a key and value + // are specified, set or extend (existing objects) with either: + // + // 1. An object of properties + // 2. A key and value + // + this.set( owner, key, value ); + + // Since the "set" path can have two possible entry points + // return the expected data based on which path was taken[*] + return value !== undefined ? value : key; + }, + remove: function( owner, key ) { + var i, + cache = owner[ this.expando ]; + + if ( cache === undefined ) { + return; + } + + if ( key !== undefined ) { + + // Support array or space separated string of keys + if ( Array.isArray( key ) ) { + + // If key is an array of keys... + // We always set camelCase keys, so remove that. + key = key.map( camelCase ); + } else { + key = camelCase( key ); + + // If a key with the spaces exists, use it. + // Otherwise, create an array by matching non-whitespace + key = key in cache ? + [ key ] : + ( key.match( rnothtmlwhite ) || [] ); + } + + i = key.length; + + while ( i-- ) { + delete cache[ key[ i ] ]; + } + } + + // Remove the expando if there's no more data + if ( key === undefined || jQuery.isEmptyObject( cache ) ) { + + // Support: Chrome <=35 - 45 + // Webkit & Blink performance suffers when deleting properties + // from DOM nodes, so set to undefined instead + // https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted) + if ( owner.nodeType ) { + owner[ this.expando ] = undefined; + } else { + delete owner[ this.expando ]; + } + } + }, + hasData: function( owner ) { + var cache = owner[ this.expando ]; + return cache !== undefined && !jQuery.isEmptyObject( cache ); + } +}; +var dataPriv = new Data(); + +var dataUser = new Data(); + + + +// Implementation Summary +// +// 1. Enforce API surface and semantic compatibility with 1.9.x branch +// 2. Improve the module's maintainability by reducing the storage +// paths to a single mechanism. +// 3. Use the same single mechanism to support "private" and "user" data. +// 4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData) +// 5. Avoid exposing implementation details on user objects (eg. expando properties) +// 6. Provide a clear path for implementation upgrade to WeakMap in 2014 + +var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/, + rmultiDash = /[A-Z]/g; + +function getData( data ) { + if ( data === "true" ) { + return true; + } + + if ( data === "false" ) { + return false; + } + + if ( data === "null" ) { + return null; + } + + // Only convert to a number if it doesn't change the string + if ( data === +data + "" ) { + return +data; + } + + if ( rbrace.test( data ) ) { + return JSON.parse( data ); + } + + return data; +} + +function dataAttr( elem, key, data ) { + var name; + + // If nothing was found internally, try to fetch any + // data from the HTML5 data-* attribute + if ( data === undefined && elem.nodeType === 1 ) { + name = "data-" + key.replace( rmultiDash, "-$&" ).toLowerCase(); + data = elem.getAttribute( name ); + + if ( typeof data === "string" ) { + try { + data = getData( data ); + } catch ( e ) {} + + // Make sure we set the data so it isn't changed later + dataUser.set( elem, key, data ); + } else { + data = undefined; + } + } + return data; +} + +jQuery.extend( { + hasData: function( elem ) { + return dataUser.hasData( elem ) || dataPriv.hasData( elem ); + }, + + data: function( elem, name, data ) { + return dataUser.access( elem, name, data ); + }, + + removeData: function( elem, name ) { + dataUser.remove( elem, name ); + }, + + // TODO: Now that all calls to _data and _removeData have been replaced + // with direct calls to dataPriv methods, these can be deprecated. + _data: function( elem, name, data ) { + return dataPriv.access( elem, name, data ); + }, + + _removeData: function( elem, name ) { + dataPriv.remove( elem, name ); + } +} ); + +jQuery.fn.extend( { + data: function( key, value ) { + var i, name, data, + elem = this[ 0 ], + attrs = elem && elem.attributes; + + // Gets all values + if ( key === undefined ) { + if ( this.length ) { + data = dataUser.get( elem ); + + if ( elem.nodeType === 1 && !dataPriv.get( elem, "hasDataAttrs" ) ) { + i = attrs.length; + while ( i-- ) { + + // Support: IE 11 only + // The attrs elements can be null (#14894) + if ( attrs[ i ] ) { + name = attrs[ i ].name; + if ( name.indexOf( "data-" ) === 0 ) { + name = camelCase( name.slice( 5 ) ); + dataAttr( elem, name, data[ name ] ); + } + } + } + dataPriv.set( elem, "hasDataAttrs", true ); + } + } + + return data; + } + + // Sets multiple values + if ( typeof key === "object" ) { + return this.each( function() { + dataUser.set( this, key ); + } ); + } + + return access( this, function( value ) { + var data; + + // The calling jQuery object (element matches) is not empty + // (and therefore has an element appears at this[ 0 ]) and the + // `value` parameter was not undefined. An empty jQuery object + // will result in `undefined` for elem = this[ 0 ] which will + // throw an exception if an attempt to read a data cache is made. + if ( elem && value === undefined ) { + + // Attempt to get data from the cache + // The key will always be camelCased in Data + data = dataUser.get( elem, key ); + if ( data !== undefined ) { + return data; + } + + // Attempt to "discover" the data in + // HTML5 custom data-* attrs + data = dataAttr( elem, key ); + if ( data !== undefined ) { + return data; + } + + // We tried really hard, but the data doesn't exist. + return; + } + + // Set the data... + this.each( function() { + + // We always store the camelCased key + dataUser.set( this, key, value ); + } ); + }, null, value, arguments.length > 1, null, true ); + }, + + removeData: function( key ) { + return this.each( function() { + dataUser.remove( this, key ); + } ); + } +} ); + + +jQuery.extend( { + queue: function( elem, type, data ) { + var queue; + + if ( elem ) { + type = ( type || "fx" ) + "queue"; + queue = dataPriv.get( elem, type ); + + // Speed up dequeue by getting out quickly if this is just a lookup + if ( data ) { + if ( !queue || Array.isArray( data ) ) { + queue = dataPriv.access( elem, type, jQuery.makeArray( data ) ); + } else { + queue.push( data ); + } + } + return queue || []; + } + }, + + dequeue: function( elem, type ) { + type = type || "fx"; + + var queue = jQuery.queue( elem, type ), + startLength = queue.length, + fn = queue.shift(), + hooks = jQuery._queueHooks( elem, type ), + next = function() { + jQuery.dequeue( elem, type ); + }; + + // If the fx queue is dequeued, always remove the progress sentinel + if ( fn === "inprogress" ) { + fn = queue.shift(); + startLength--; + } + + if ( fn ) { + + // Add a progress sentinel to prevent the fx queue from being + // automatically dequeued + if ( type === "fx" ) { + queue.unshift( "inprogress" ); + } + + // Clear up the last queue stop function + delete hooks.stop; + fn.call( elem, next, hooks ); + } + + if ( !startLength && hooks ) { + hooks.empty.fire(); + } + }, + + // Not public - generate a queueHooks object, or return the current one + _queueHooks: function( elem, type ) { + var key = type + "queueHooks"; + return dataPriv.get( elem, key ) || dataPriv.access( elem, key, { + empty: jQuery.Callbacks( "once memory" ).add( function() { + dataPriv.remove( elem, [ type + "queue", key ] ); + } ) + } ); + } +} ); + +jQuery.fn.extend( { + queue: function( type, data ) { + var setter = 2; + + if ( typeof type !== "string" ) { + data = type; + type = "fx"; + setter--; + } + + if ( arguments.length < setter ) { + return jQuery.queue( this[ 0 ], type ); + } + + return data === undefined ? + this : + this.each( function() { + var queue = jQuery.queue( this, type, data ); + + // Ensure a hooks for this queue + jQuery._queueHooks( this, type ); + + if ( type === "fx" && queue[ 0 ] !== "inprogress" ) { + jQuery.dequeue( this, type ); + } + } ); + }, + dequeue: function( type ) { + return this.each( function() { + jQuery.dequeue( this, type ); + } ); + }, + clearQueue: function( type ) { + return this.queue( type || "fx", [] ); + }, + + // Get a promise resolved when queues of a certain type + // are emptied (fx is the type by default) + promise: function( type, obj ) { + var tmp, + count = 1, + defer = jQuery.Deferred(), + elements = this, + i = this.length, + resolve = function() { + if ( !( --count ) ) { + defer.resolveWith( elements, [ elements ] ); + } + }; + + if ( typeof type !== "string" ) { + obj = type; + type = undefined; + } + type = type || "fx"; + + while ( i-- ) { + tmp = dataPriv.get( elements[ i ], type + "queueHooks" ); + if ( tmp && tmp.empty ) { + count++; + tmp.empty.add( resolve ); + } + } + resolve(); + return defer.promise( obj ); + } +} ); +var pnum = ( /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/ ).source; + +var rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" ); + + +var cssExpand = [ "Top", "Right", "Bottom", "Left" ]; + +var documentElement = document.documentElement; + + + + var isAttached = function( elem ) { + return jQuery.contains( elem.ownerDocument, elem ); + }, + composed = { composed: true }; + + // Support: IE 9 - 11+, Edge 12 - 18+, iOS 10.0 - 10.2 only + // Check attachment across shadow DOM boundaries when possible (gh-3504) + // Support: iOS 10.0-10.2 only + // Early iOS 10 versions support `attachShadow` but not `getRootNode`, + // leading to errors. We need to check for `getRootNode`. + if ( documentElement.getRootNode ) { + isAttached = function( elem ) { + return jQuery.contains( elem.ownerDocument, elem ) || + elem.getRootNode( composed ) === elem.ownerDocument; + }; + } +var isHiddenWithinTree = function( elem, el ) { + + // isHiddenWithinTree might be called from jQuery#filter function; + // in that case, element will be second argument + elem = el || elem; + + // Inline style trumps all + return elem.style.display === "none" || + elem.style.display === "" && + + // Otherwise, check computed style + // Support: Firefox <=43 - 45 + // Disconnected elements can have computed display: none, so first confirm that elem is + // in the document. + isAttached( elem ) && + + jQuery.css( elem, "display" ) === "none"; + }; + +var swap = function( elem, options, callback, args ) { + var ret, name, + old = {}; + + // Remember the old values, and insert the new ones + for ( name in options ) { + old[ name ] = elem.style[ name ]; + elem.style[ name ] = options[ name ]; + } + + ret = callback.apply( elem, args || [] ); + + // Revert the old values + for ( name in options ) { + elem.style[ name ] = old[ name ]; + } + + return ret; +}; + + + + +function adjustCSS( elem, prop, valueParts, tween ) { + var adjusted, scale, + maxIterations = 20, + currentValue = tween ? + function() { + return tween.cur(); + } : + function() { + return jQuery.css( elem, prop, "" ); + }, + initial = currentValue(), + unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ), + + // Starting value computation is required for potential unit mismatches + initialInUnit = elem.nodeType && + ( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) && + rcssNum.exec( jQuery.css( elem, prop ) ); + + if ( initialInUnit && initialInUnit[ 3 ] !== unit ) { + + // Support: Firefox <=54 + // Halve the iteration target value to prevent interference from CSS upper bounds (gh-2144) + initial = initial / 2; + + // Trust units reported by jQuery.css + unit = unit || initialInUnit[ 3 ]; + + // Iteratively approximate from a nonzero starting point + initialInUnit = +initial || 1; + + while ( maxIterations-- ) { + + // Evaluate and update our best guess (doubling guesses that zero out). + // Finish if the scale equals or crosses 1 (making the old*new product non-positive). + jQuery.style( elem, prop, initialInUnit + unit ); + if ( ( 1 - scale ) * ( 1 - ( scale = currentValue() / initial || 0.5 ) ) <= 0 ) { + maxIterations = 0; + } + initialInUnit = initialInUnit / scale; + + } + + initialInUnit = initialInUnit * 2; + jQuery.style( elem, prop, initialInUnit + unit ); + + // Make sure we update the tween properties later on + valueParts = valueParts || []; + } + + if ( valueParts ) { + initialInUnit = +initialInUnit || +initial || 0; + + // Apply relative offset (+=/-=) if specified + adjusted = valueParts[ 1 ] ? + initialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] : + +valueParts[ 2 ]; + if ( tween ) { + tween.unit = unit; + tween.start = initialInUnit; + tween.end = adjusted; + } + } + return adjusted; +} + + +var defaultDisplayMap = {}; + +function getDefaultDisplay( elem ) { + var temp, + doc = elem.ownerDocument, + nodeName = elem.nodeName, + display = defaultDisplayMap[ nodeName ]; + + if ( display ) { + return display; + } + + temp = doc.body.appendChild( doc.createElement( nodeName ) ); + display = jQuery.css( temp, "display" ); + + temp.parentNode.removeChild( temp ); + + if ( display === "none" ) { + display = "block"; + } + defaultDisplayMap[ nodeName ] = display; + + return display; +} + +function showHide( elements, show ) { + var display, elem, + values = [], + index = 0, + length = elements.length; + + // Determine new display value for elements that need to change + for ( ; index < length; index++ ) { + elem = elements[ index ]; + if ( !elem.style ) { + continue; + } + + display = elem.style.display; + if ( show ) { + + // Since we force visibility upon cascade-hidden elements, an immediate (and slow) + // check is required in this first loop unless we have a nonempty display value (either + // inline or about-to-be-restored) + if ( display === "none" ) { + values[ index ] = dataPriv.get( elem, "display" ) || null; + if ( !values[ index ] ) { + elem.style.display = ""; + } + } + if ( elem.style.display === "" && isHiddenWithinTree( elem ) ) { + values[ index ] = getDefaultDisplay( elem ); + } + } else { + if ( display !== "none" ) { + values[ index ] = "none"; + + // Remember what we're overwriting + dataPriv.set( elem, "display", display ); + } + } + } + + // Set the display of the elements in a second loop to avoid constant reflow + for ( index = 0; index < length; index++ ) { + if ( values[ index ] != null ) { + elements[ index ].style.display = values[ index ]; + } + } + + return elements; +} + +jQuery.fn.extend( { + show: function() { + return showHide( this, true ); + }, + hide: function() { + return showHide( this ); + }, + toggle: function( state ) { + if ( typeof state === "boolean" ) { + return state ? this.show() : this.hide(); + } + + return this.each( function() { + if ( isHiddenWithinTree( this ) ) { + jQuery( this ).show(); + } else { + jQuery( this ).hide(); + } + } ); + } +} ); +var rcheckableType = ( /^(?:checkbox|radio)$/i ); + +var rtagName = ( /<([a-z][^\/\0>\x20\t\r\n\f]*)/i ); + +var rscriptType = ( /^$|^module$|\/(?:java|ecma)script/i ); + + + +// We have to close these tags to support XHTML (#13200) +var wrapMap = { + + // Support: IE <=9 only + option: [ 1, "" ], + + // XHTML parsers do not magically insert elements in the + // same way that tag soup parsers do. So we cannot shorten + // this by omitting or other required elements. + thead: [ 1, "", "
" ], + col: [ 2, "", "
" ], + tr: [ 2, "", "
" ], + td: [ 3, "", "
" ], + + _default: [ 0, "", "" ] +}; + +// Support: IE <=9 only +wrapMap.optgroup = wrapMap.option; + +wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; +wrapMap.th = wrapMap.td; + + +function getAll( context, tag ) { + + // Support: IE <=9 - 11 only + // Use typeof to avoid zero-argument method invocation on host objects (#15151) + var ret; + + if ( typeof context.getElementsByTagName !== "undefined" ) { + ret = context.getElementsByTagName( tag || "*" ); + + } else if ( typeof context.querySelectorAll !== "undefined" ) { + ret = context.querySelectorAll( tag || "*" ); + + } else { + ret = []; + } + + if ( tag === undefined || tag && nodeName( context, tag ) ) { + return jQuery.merge( [ context ], ret ); + } + + return ret; +} + + +// Mark scripts as having already been evaluated +function setGlobalEval( elems, refElements ) { + var i = 0, + l = elems.length; + + for ( ; i < l; i++ ) { + dataPriv.set( + elems[ i ], + "globalEval", + !refElements || dataPriv.get( refElements[ i ], "globalEval" ) + ); + } +} + + +var rhtml = /<|&#?\w+;/; + +function buildFragment( elems, context, scripts, selection, ignored ) { + var elem, tmp, tag, wrap, attached, j, + fragment = context.createDocumentFragment(), + nodes = [], + i = 0, + l = elems.length; + + for ( ; i < l; i++ ) { + elem = elems[ i ]; + + if ( elem || elem === 0 ) { + + // Add nodes directly + if ( toType( elem ) === "object" ) { + + // Support: Android <=4.0 only, PhantomJS 1 only + // push.apply(_, arraylike) throws on ancient WebKit + jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem ); + + // Convert non-html into a text node + } else if ( !rhtml.test( elem ) ) { + nodes.push( context.createTextNode( elem ) ); + + // Convert html into DOM nodes + } else { + tmp = tmp || fragment.appendChild( context.createElement( "div" ) ); + + // Deserialize a standard representation + tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase(); + wrap = wrapMap[ tag ] || wrapMap._default; + tmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ]; + + // Descend through wrappers to the right content + j = wrap[ 0 ]; + while ( j-- ) { + tmp = tmp.lastChild; + } + + // Support: Android <=4.0 only, PhantomJS 1 only + // push.apply(_, arraylike) throws on ancient WebKit + jQuery.merge( nodes, tmp.childNodes ); + + // Remember the top-level container + tmp = fragment.firstChild; + + // Ensure the created nodes are orphaned (#12392) + tmp.textContent = ""; + } + } + } + + // Remove wrapper from fragment + fragment.textContent = ""; + + i = 0; + while ( ( elem = nodes[ i++ ] ) ) { + + // Skip elements already in the context collection (trac-4087) + if ( selection && jQuery.inArray( elem, selection ) > -1 ) { + if ( ignored ) { + ignored.push( elem ); + } + continue; + } + + attached = isAttached( elem ); + + // Append to fragment + tmp = getAll( fragment.appendChild( elem ), "script" ); + + // Preserve script evaluation history + if ( attached ) { + setGlobalEval( tmp ); + } + + // Capture executables + if ( scripts ) { + j = 0; + while ( ( elem = tmp[ j++ ] ) ) { + if ( rscriptType.test( elem.type || "" ) ) { + scripts.push( elem ); + } + } + } + } + + return fragment; +} + + +( function() { + var fragment = document.createDocumentFragment(), + div = fragment.appendChild( document.createElement( "div" ) ), + input = document.createElement( "input" ); + + // Support: Android 4.0 - 4.3 only + // Check state lost if the name is set (#11217) + // Support: Windows Web Apps (WWA) + // `name` and `type` must use .setAttribute for WWA (#14901) + input.setAttribute( "type", "radio" ); + input.setAttribute( "checked", "checked" ); + input.setAttribute( "name", "t" ); + + div.appendChild( input ); + + // Support: Android <=4.1 only + // Older WebKit doesn't clone checked state correctly in fragments + support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked; + + // Support: IE <=11 only + // Make sure textarea (and checkbox) defaultValue is properly cloned + div.innerHTML = ""; + support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue; +} )(); + + +var + rkeyEvent = /^key/, + rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/, + rtypenamespace = /^([^.]*)(?:\.(.+)|)/; + +function returnTrue() { + return true; +} + +function returnFalse() { + return false; +} + +// Support: IE <=9 - 11+ +// focus() and blur() are asynchronous, except when they are no-op. +// So expect focus to be synchronous when the element is already active, +// and blur to be synchronous when the element is not already active. +// (focus and blur are always synchronous in other supported browsers, +// this just defines when we can count on it). +function expectSync( elem, type ) { + return ( elem === safeActiveElement() ) === ( type === "focus" ); +} + +// Support: IE <=9 only +// Accessing document.activeElement can throw unexpectedly +// https://bugs.jquery.com/ticket/13393 +function safeActiveElement() { + try { + return document.activeElement; + } catch ( err ) { } +} + +function on( elem, types, selector, data, fn, one ) { + var origFn, type; + + // Types can be a map of types/handlers + if ( typeof types === "object" ) { + + // ( types-Object, selector, data ) + if ( typeof selector !== "string" ) { + + // ( types-Object, data ) + data = data || selector; + selector = undefined; + } + for ( type in types ) { + on( elem, type, selector, data, types[ type ], one ); + } + return elem; + } + + if ( data == null && fn == null ) { + + // ( types, fn ) + fn = selector; + data = selector = undefined; + } else if ( fn == null ) { + if ( typeof selector === "string" ) { + + // ( types, selector, fn ) + fn = data; + data = undefined; + } else { + + // ( types, data, fn ) + fn = data; + data = selector; + selector = undefined; + } + } + if ( fn === false ) { + fn = returnFalse; + } else if ( !fn ) { + return elem; + } + + if ( one === 1 ) { + origFn = fn; + fn = function( event ) { + + // Can use an empty set, since event contains the info + jQuery().off( event ); + return origFn.apply( this, arguments ); + }; + + // Use same guid so caller can remove using origFn + fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); + } + return elem.each( function() { + jQuery.event.add( this, types, fn, data, selector ); + } ); +} + +/* + * Helper functions for managing events -- not part of the public interface. + * Props to Dean Edwards' addEvent library for many of the ideas. + */ +jQuery.event = { + + global: {}, + + add: function( elem, types, handler, data, selector ) { + + var handleObjIn, eventHandle, tmp, + events, t, handleObj, + special, handlers, type, namespaces, origType, + elemData = dataPriv.get( elem ); + + // Don't attach events to noData or text/comment nodes (but allow plain objects) + if ( !elemData ) { + return; + } + + // Caller can pass in an object of custom data in lieu of the handler + if ( handler.handler ) { + handleObjIn = handler; + handler = handleObjIn.handler; + selector = handleObjIn.selector; + } + + // Ensure that invalid selectors throw exceptions at attach time + // Evaluate against documentElement in case elem is a non-element node (e.g., document) + if ( selector ) { + jQuery.find.matchesSelector( documentElement, selector ); + } + + // Make sure that the handler has a unique ID, used to find/remove it later + if ( !handler.guid ) { + handler.guid = jQuery.guid++; + } + + // Init the element's event structure and main handler, if this is the first + if ( !( events = elemData.events ) ) { + events = elemData.events = {}; + } + if ( !( eventHandle = elemData.handle ) ) { + eventHandle = elemData.handle = function( e ) { + + // Discard the second event of a jQuery.event.trigger() and + // when an event is called after a page has unloaded + return typeof jQuery !== "undefined" && jQuery.event.triggered !== e.type ? + jQuery.event.dispatch.apply( elem, arguments ) : undefined; + }; + } + + // Handle multiple events separated by a space + types = ( types || "" ).match( rnothtmlwhite ) || [ "" ]; + t = types.length; + while ( t-- ) { + tmp = rtypenamespace.exec( types[ t ] ) || []; + type = origType = tmp[ 1 ]; + namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); + + // There *must* be a type, no attaching namespace-only handlers + if ( !type ) { + continue; + } + + // If event changes its type, use the special event handlers for the changed type + special = jQuery.event.special[ type ] || {}; + + // If selector defined, determine special event api type, otherwise given type + type = ( selector ? special.delegateType : special.bindType ) || type; + + // Update special based on newly reset type + special = jQuery.event.special[ type ] || {}; + + // handleObj is passed to all event handlers + handleObj = jQuery.extend( { + type: type, + origType: origType, + data: data, + handler: handler, + guid: handler.guid, + selector: selector, + needsContext: selector && jQuery.expr.match.needsContext.test( selector ), + namespace: namespaces.join( "." ) + }, handleObjIn ); + + // Init the event handler queue if we're the first + if ( !( handlers = events[ type ] ) ) { + handlers = events[ type ] = []; + handlers.delegateCount = 0; + + // Only use addEventListener if the special events handler returns false + if ( !special.setup || + special.setup.call( elem, data, namespaces, eventHandle ) === false ) { + + if ( elem.addEventListener ) { + elem.addEventListener( type, eventHandle ); + } + } + } + + if ( special.add ) { + special.add.call( elem, handleObj ); + + if ( !handleObj.handler.guid ) { + handleObj.handler.guid = handler.guid; + } + } + + // Add to the element's handler list, delegates in front + if ( selector ) { + handlers.splice( handlers.delegateCount++, 0, handleObj ); + } else { + handlers.push( handleObj ); + } + + // Keep track of which events have ever been used, for event optimization + jQuery.event.global[ type ] = true; + } + + }, + + // Detach an event or set of events from an element + remove: function( elem, types, handler, selector, mappedTypes ) { + + var j, origCount, tmp, + events, t, handleObj, + special, handlers, type, namespaces, origType, + elemData = dataPriv.hasData( elem ) && dataPriv.get( elem ); + + if ( !elemData || !( events = elemData.events ) ) { + return; + } + + // Once for each type.namespace in types; type may be omitted + types = ( types || "" ).match( rnothtmlwhite ) || [ "" ]; + t = types.length; + while ( t-- ) { + tmp = rtypenamespace.exec( types[ t ] ) || []; + type = origType = tmp[ 1 ]; + namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); + + // Unbind all events (on this namespace, if provided) for the element + if ( !type ) { + for ( type in events ) { + jQuery.event.remove( elem, type + types[ t ], handler, selector, true ); + } + continue; + } + + special = jQuery.event.special[ type ] || {}; + type = ( selector ? special.delegateType : special.bindType ) || type; + handlers = events[ type ] || []; + tmp = tmp[ 2 ] && + new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ); + + // Remove matching events + origCount = j = handlers.length; + while ( j-- ) { + handleObj = handlers[ j ]; + + if ( ( mappedTypes || origType === handleObj.origType ) && + ( !handler || handler.guid === handleObj.guid ) && + ( !tmp || tmp.test( handleObj.namespace ) ) && + ( !selector || selector === handleObj.selector || + selector === "**" && handleObj.selector ) ) { + handlers.splice( j, 1 ); + + if ( handleObj.selector ) { + handlers.delegateCount--; + } + if ( special.remove ) { + special.remove.call( elem, handleObj ); + } + } + } + + // Remove generic event handler if we removed something and no more handlers exist + // (avoids potential for endless recursion during removal of special event handlers) + if ( origCount && !handlers.length ) { + if ( !special.teardown || + special.teardown.call( elem, namespaces, elemData.handle ) === false ) { + + jQuery.removeEvent( elem, type, elemData.handle ); + } + + delete events[ type ]; + } + } + + // Remove data and the expando if it's no longer used + if ( jQuery.isEmptyObject( events ) ) { + dataPriv.remove( elem, "handle events" ); + } + }, + + dispatch: function( nativeEvent ) { + + // Make a writable jQuery.Event from the native event object + var event = jQuery.event.fix( nativeEvent ); + + var i, j, ret, matched, handleObj, handlerQueue, + args = new Array( arguments.length ), + handlers = ( dataPriv.get( this, "events" ) || {} )[ event.type ] || [], + special = jQuery.event.special[ event.type ] || {}; + + // Use the fix-ed jQuery.Event rather than the (read-only) native event + args[ 0 ] = event; + + for ( i = 1; i < arguments.length; i++ ) { + args[ i ] = arguments[ i ]; + } + + event.delegateTarget = this; + + // Call the preDispatch hook for the mapped type, and let it bail if desired + if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) { + return; + } + + // Determine handlers + handlerQueue = jQuery.event.handlers.call( this, event, handlers ); + + // Run delegates first; they may want to stop propagation beneath us + i = 0; + while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) { + event.currentTarget = matched.elem; + + j = 0; + while ( ( handleObj = matched.handlers[ j++ ] ) && + !event.isImmediatePropagationStopped() ) { + + // If the event is namespaced, then each handler is only invoked if it is + // specially universal or its namespaces are a superset of the event's. + if ( !event.rnamespace || handleObj.namespace === false || + event.rnamespace.test( handleObj.namespace ) ) { + + event.handleObj = handleObj; + event.data = handleObj.data; + + ret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle || + handleObj.handler ).apply( matched.elem, args ); + + if ( ret !== undefined ) { + if ( ( event.result = ret ) === false ) { + event.preventDefault(); + event.stopPropagation(); + } + } + } + } + } + + // Call the postDispatch hook for the mapped type + if ( special.postDispatch ) { + special.postDispatch.call( this, event ); + } + + return event.result; + }, + + handlers: function( event, handlers ) { + var i, handleObj, sel, matchedHandlers, matchedSelectors, + handlerQueue = [], + delegateCount = handlers.delegateCount, + cur = event.target; + + // Find delegate handlers + if ( delegateCount && + + // Support: IE <=9 + // Black-hole SVG instance trees (trac-13180) + cur.nodeType && + + // Support: Firefox <=42 + // Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861) + // https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click + // Support: IE 11 only + // ...but not arrow key "clicks" of radio inputs, which can have `button` -1 (gh-2343) + !( event.type === "click" && event.button >= 1 ) ) { + + for ( ; cur !== this; cur = cur.parentNode || this ) { + + // Don't check non-elements (#13208) + // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764) + if ( cur.nodeType === 1 && !( event.type === "click" && cur.disabled === true ) ) { + matchedHandlers = []; + matchedSelectors = {}; + for ( i = 0; i < delegateCount; i++ ) { + handleObj = handlers[ i ]; + + // Don't conflict with Object.prototype properties (#13203) + sel = handleObj.selector + " "; + + if ( matchedSelectors[ sel ] === undefined ) { + matchedSelectors[ sel ] = handleObj.needsContext ? + jQuery( sel, this ).index( cur ) > -1 : + jQuery.find( sel, this, null, [ cur ] ).length; + } + if ( matchedSelectors[ sel ] ) { + matchedHandlers.push( handleObj ); + } + } + if ( matchedHandlers.length ) { + handlerQueue.push( { elem: cur, handlers: matchedHandlers } ); + } + } + } + } + + // Add the remaining (directly-bound) handlers + cur = this; + if ( delegateCount < handlers.length ) { + handlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } ); + } + + return handlerQueue; + }, + + addProp: function( name, hook ) { + Object.defineProperty( jQuery.Event.prototype, name, { + enumerable: true, + configurable: true, + + get: isFunction( hook ) ? + function() { + if ( this.originalEvent ) { + return hook( this.originalEvent ); + } + } : + function() { + if ( this.originalEvent ) { + return this.originalEvent[ name ]; + } + }, + + set: function( value ) { + Object.defineProperty( this, name, { + enumerable: true, + configurable: true, + writable: true, + value: value + } ); + } + } ); + }, + + fix: function( originalEvent ) { + return originalEvent[ jQuery.expando ] ? + originalEvent : + new jQuery.Event( originalEvent ); + }, + + special: { + load: { + + // Prevent triggered image.load events from bubbling to window.load + noBubble: true + }, + click: { + + // Utilize native event to ensure correct state for checkable inputs + setup: function( data ) { + + // For mutual compressibility with _default, replace `this` access with a local var. + // `|| data` is dead code meant only to preserve the variable through minification. + var el = this || data; + + // Claim the first handler + if ( rcheckableType.test( el.type ) && + el.click && nodeName( el, "input" ) ) { + + // dataPriv.set( el, "click", ... ) + leverageNative( el, "click", returnTrue ); + } + + // Return false to allow normal processing in the caller + return false; + }, + trigger: function( data ) { + + // For mutual compressibility with _default, replace `this` access with a local var. + // `|| data` is dead code meant only to preserve the variable through minification. + var el = this || data; + + // Force setup before triggering a click + if ( rcheckableType.test( el.type ) && + el.click && nodeName( el, "input" ) ) { + + leverageNative( el, "click" ); + } + + // Return non-false to allow normal event-path propagation + return true; + }, + + // For cross-browser consistency, suppress native .click() on links + // Also prevent it if we're currently inside a leveraged native-event stack + _default: function( event ) { + var target = event.target; + return rcheckableType.test( target.type ) && + target.click && nodeName( target, "input" ) && + dataPriv.get( target, "click" ) || + nodeName( target, "a" ); + } + }, + + beforeunload: { + postDispatch: function( event ) { + + // Support: Firefox 20+ + // Firefox doesn't alert if the returnValue field is not set. + if ( event.result !== undefined && event.originalEvent ) { + event.originalEvent.returnValue = event.result; + } + } + } + } +}; + +// Ensure the presence of an event listener that handles manually-triggered +// synthetic events by interrupting progress until reinvoked in response to +// *native* events that it fires directly, ensuring that state changes have +// already occurred before other listeners are invoked. +function leverageNative( el, type, expectSync ) { + + // Missing expectSync indicates a trigger call, which must force setup through jQuery.event.add + if ( !expectSync ) { + if ( dataPriv.get( el, type ) === undefined ) { + jQuery.event.add( el, type, returnTrue ); + } + return; + } + + // Register the controller as a special universal handler for all event namespaces + dataPriv.set( el, type, false ); + jQuery.event.add( el, type, { + namespace: false, + handler: function( event ) { + var notAsync, result, + saved = dataPriv.get( this, type ); + + if ( ( event.isTrigger & 1 ) && this[ type ] ) { + + // Interrupt processing of the outer synthetic .trigger()ed event + // Saved data should be false in such cases, but might be a leftover capture object + // from an async native handler (gh-4350) + if ( !saved.length ) { + + // Store arguments for use when handling the inner native event + // There will always be at least one argument (an event object), so this array + // will not be confused with a leftover capture object. + saved = slice.call( arguments ); + dataPriv.set( this, type, saved ); + + // Trigger the native event and capture its result + // Support: IE <=9 - 11+ + // focus() and blur() are asynchronous + notAsync = expectSync( this, type ); + this[ type ](); + result = dataPriv.get( this, type ); + if ( saved !== result || notAsync ) { + dataPriv.set( this, type, false ); + } else { + result = {}; + } + if ( saved !== result ) { + + // Cancel the outer synthetic event + event.stopImmediatePropagation(); + event.preventDefault(); + return result.value; + } + + // If this is an inner synthetic event for an event with a bubbling surrogate + // (focus or blur), assume that the surrogate already propagated from triggering the + // native event and prevent that from happening again here. + // This technically gets the ordering wrong w.r.t. to `.trigger()` (in which the + // bubbling surrogate propagates *after* the non-bubbling base), but that seems + // less bad than duplication. + } else if ( ( jQuery.event.special[ type ] || {} ).delegateType ) { + event.stopPropagation(); + } + + // If this is a native event triggered above, everything is now in order + // Fire an inner synthetic event with the original arguments + } else if ( saved.length ) { + + // ...and capture the result + dataPriv.set( this, type, { + value: jQuery.event.trigger( + + // Support: IE <=9 - 11+ + // Extend with the prototype to reset the above stopImmediatePropagation() + jQuery.extend( saved[ 0 ], jQuery.Event.prototype ), + saved.slice( 1 ), + this + ) + } ); + + // Abort handling of the native event + event.stopImmediatePropagation(); + } + } + } ); +} + +jQuery.removeEvent = function( elem, type, handle ) { + + // This "if" is needed for plain objects + if ( elem.removeEventListener ) { + elem.removeEventListener( type, handle ); + } +}; + +jQuery.Event = function( src, props ) { + + // Allow instantiation without the 'new' keyword + if ( !( this instanceof jQuery.Event ) ) { + return new jQuery.Event( src, props ); + } + + // Event object + if ( src && src.type ) { + this.originalEvent = src; + this.type = src.type; + + // Events bubbling up the document may have been marked as prevented + // by a handler lower down the tree; reflect the correct value. + this.isDefaultPrevented = src.defaultPrevented || + src.defaultPrevented === undefined && + + // Support: Android <=2.3 only + src.returnValue === false ? + returnTrue : + returnFalse; + + // Create target properties + // Support: Safari <=6 - 7 only + // Target should not be a text node (#504, #13143) + this.target = ( src.target && src.target.nodeType === 3 ) ? + src.target.parentNode : + src.target; + + this.currentTarget = src.currentTarget; + this.relatedTarget = src.relatedTarget; + + // Event type + } else { + this.type = src; + } + + // Put explicitly provided properties onto the event object + if ( props ) { + jQuery.extend( this, props ); + } + + // Create a timestamp if incoming event doesn't have one + this.timeStamp = src && src.timeStamp || Date.now(); + + // Mark it as fixed + this[ jQuery.expando ] = true; +}; + +// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding +// https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html +jQuery.Event.prototype = { + constructor: jQuery.Event, + isDefaultPrevented: returnFalse, + isPropagationStopped: returnFalse, + isImmediatePropagationStopped: returnFalse, + isSimulated: false, + + preventDefault: function() { + var e = this.originalEvent; + + this.isDefaultPrevented = returnTrue; + + if ( e && !this.isSimulated ) { + e.preventDefault(); + } + }, + stopPropagation: function() { + var e = this.originalEvent; + + this.isPropagationStopped = returnTrue; + + if ( e && !this.isSimulated ) { + e.stopPropagation(); + } + }, + stopImmediatePropagation: function() { + var e = this.originalEvent; + + this.isImmediatePropagationStopped = returnTrue; + + if ( e && !this.isSimulated ) { + e.stopImmediatePropagation(); + } + + this.stopPropagation(); + } +}; + +// Includes all common event props including KeyEvent and MouseEvent specific props +jQuery.each( { + altKey: true, + bubbles: true, + cancelable: true, + changedTouches: true, + ctrlKey: true, + detail: true, + eventPhase: true, + metaKey: true, + pageX: true, + pageY: true, + shiftKey: true, + view: true, + "char": true, + code: true, + charCode: true, + key: true, + keyCode: true, + button: true, + buttons: true, + clientX: true, + clientY: true, + offsetX: true, + offsetY: true, + pointerId: true, + pointerType: true, + screenX: true, + screenY: true, + targetTouches: true, + toElement: true, + touches: true, + + which: function( event ) { + var button = event.button; + + // Add which for key events + if ( event.which == null && rkeyEvent.test( event.type ) ) { + return event.charCode != null ? event.charCode : event.keyCode; + } + + // Add which for click: 1 === left; 2 === middle; 3 === right + if ( !event.which && button !== undefined && rmouseEvent.test( event.type ) ) { + if ( button & 1 ) { + return 1; + } + + if ( button & 2 ) { + return 3; + } + + if ( button & 4 ) { + return 2; + } + + return 0; + } + + return event.which; + } +}, jQuery.event.addProp ); + +jQuery.each( { focus: "focusin", blur: "focusout" }, function( type, delegateType ) { + jQuery.event.special[ type ] = { + + // Utilize native event if possible so blur/focus sequence is correct + setup: function() { + + // Claim the first handler + // dataPriv.set( this, "focus", ... ) + // dataPriv.set( this, "blur", ... ) + leverageNative( this, type, expectSync ); + + // Return false to allow normal processing in the caller + return false; + }, + trigger: function() { + + // Force setup before trigger + leverageNative( this, type ); + + // Return non-false to allow normal event-path propagation + return true; + }, + + delegateType: delegateType + }; +} ); + +// Create mouseenter/leave events using mouseover/out and event-time checks +// so that event delegation works in jQuery. +// Do the same for pointerenter/pointerleave and pointerover/pointerout +// +// Support: Safari 7 only +// Safari sends mouseenter too often; see: +// https://bugs.chromium.org/p/chromium/issues/detail?id=470258 +// for the description of the bug (it existed in older Chrome versions as well). +jQuery.each( { + mouseenter: "mouseover", + mouseleave: "mouseout", + pointerenter: "pointerover", + pointerleave: "pointerout" +}, function( orig, fix ) { + jQuery.event.special[ orig ] = { + delegateType: fix, + bindType: fix, + + handle: function( event ) { + var ret, + target = this, + related = event.relatedTarget, + handleObj = event.handleObj; + + // For mouseenter/leave call the handler if related is outside the target. + // NB: No relatedTarget if the mouse left/entered the browser window + if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) { + event.type = handleObj.origType; + ret = handleObj.handler.apply( this, arguments ); + event.type = fix; + } + return ret; + } + }; +} ); + +jQuery.fn.extend( { + + on: function( types, selector, data, fn ) { + return on( this, types, selector, data, fn ); + }, + one: function( types, selector, data, fn ) { + return on( this, types, selector, data, fn, 1 ); + }, + off: function( types, selector, fn ) { + var handleObj, type; + if ( types && types.preventDefault && types.handleObj ) { + + // ( event ) dispatched jQuery.Event + handleObj = types.handleObj; + jQuery( types.delegateTarget ).off( + handleObj.namespace ? + handleObj.origType + "." + handleObj.namespace : + handleObj.origType, + handleObj.selector, + handleObj.handler + ); + return this; + } + if ( typeof types === "object" ) { + + // ( types-object [, selector] ) + for ( type in types ) { + this.off( type, selector, types[ type ] ); + } + return this; + } + if ( selector === false || typeof selector === "function" ) { + + // ( types [, fn] ) + fn = selector; + selector = undefined; + } + if ( fn === false ) { + fn = returnFalse; + } + return this.each( function() { + jQuery.event.remove( this, types, fn, selector ); + } ); + } +} ); + + +var + + /* eslint-disable max-len */ + + // See https://github.com/eslint/eslint/issues/3229 + rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\/\0>\x20\t\r\n\f]*)[^>]*)\/>/gi, + + /* eslint-enable */ + + // Support: IE <=10 - 11, Edge 12 - 13 only + // In IE/Edge using regex groups here causes severe slowdowns. + // See https://connect.microsoft.com/IE/feedback/details/1736512/ + rnoInnerhtml = /\s*$/g; + +// Prefer a tbody over its parent table for containing new rows +function manipulationTarget( elem, content ) { + if ( nodeName( elem, "table" ) && + nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ) { + + return jQuery( elem ).children( "tbody" )[ 0 ] || elem; + } + + return elem; +} + +// Replace/restore the type attribute of script elements for safe DOM manipulation +function disableScript( elem ) { + elem.type = ( elem.getAttribute( "type" ) !== null ) + "/" + elem.type; + return elem; +} +function restoreScript( elem ) { + if ( ( elem.type || "" ).slice( 0, 5 ) === "true/" ) { + elem.type = elem.type.slice( 5 ); + } else { + elem.removeAttribute( "type" ); + } + + return elem; +} + +function cloneCopyEvent( src, dest ) { + var i, l, type, pdataOld, pdataCur, udataOld, udataCur, events; + + if ( dest.nodeType !== 1 ) { + return; + } + + // 1. Copy private data: events, handlers, etc. + if ( dataPriv.hasData( src ) ) { + pdataOld = dataPriv.access( src ); + pdataCur = dataPriv.set( dest, pdataOld ); + events = pdataOld.events; + + if ( events ) { + delete pdataCur.handle; + pdataCur.events = {}; + + for ( type in events ) { + for ( i = 0, l = events[ type ].length; i < l; i++ ) { + jQuery.event.add( dest, type, events[ type ][ i ] ); + } + } + } + } + + // 2. Copy user data + if ( dataUser.hasData( src ) ) { + udataOld = dataUser.access( src ); + udataCur = jQuery.extend( {}, udataOld ); + + dataUser.set( dest, udataCur ); + } +} + +// Fix IE bugs, see support tests +function fixInput( src, dest ) { + var nodeName = dest.nodeName.toLowerCase(); + + // Fails to persist the checked state of a cloned checkbox or radio button. + if ( nodeName === "input" && rcheckableType.test( src.type ) ) { + dest.checked = src.checked; + + // Fails to return the selected option to the default selected state when cloning options + } else if ( nodeName === "input" || nodeName === "textarea" ) { + dest.defaultValue = src.defaultValue; + } +} + +function domManip( collection, args, callback, ignored ) { + + // Flatten any nested arrays + args = concat.apply( [], args ); + + var fragment, first, scripts, hasScripts, node, doc, + i = 0, + l = collection.length, + iNoClone = l - 1, + value = args[ 0 ], + valueIsFunction = isFunction( value ); + + // We can't cloneNode fragments that contain checked, in WebKit + if ( valueIsFunction || + ( l > 1 && typeof value === "string" && + !support.checkClone && rchecked.test( value ) ) ) { + return collection.each( function( index ) { + var self = collection.eq( index ); + if ( valueIsFunction ) { + args[ 0 ] = value.call( this, index, self.html() ); + } + domManip( self, args, callback, ignored ); + } ); + } + + if ( l ) { + fragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored ); + first = fragment.firstChild; + + if ( fragment.childNodes.length === 1 ) { + fragment = first; + } + + // Require either new content or an interest in ignored elements to invoke the callback + if ( first || ignored ) { + scripts = jQuery.map( getAll( fragment, "script" ), disableScript ); + hasScripts = scripts.length; + + // Use the original fragment for the last item + // instead of the first because it can end up + // being emptied incorrectly in certain situations (#8070). + for ( ; i < l; i++ ) { + node = fragment; + + if ( i !== iNoClone ) { + node = jQuery.clone( node, true, true ); + + // Keep references to cloned scripts for later restoration + if ( hasScripts ) { + + // Support: Android <=4.0 only, PhantomJS 1 only + // push.apply(_, arraylike) throws on ancient WebKit + jQuery.merge( scripts, getAll( node, "script" ) ); + } + } + + callback.call( collection[ i ], node, i ); + } + + if ( hasScripts ) { + doc = scripts[ scripts.length - 1 ].ownerDocument; + + // Reenable scripts + jQuery.map( scripts, restoreScript ); + + // Evaluate executable scripts on first document insertion + for ( i = 0; i < hasScripts; i++ ) { + node = scripts[ i ]; + if ( rscriptType.test( node.type || "" ) && + !dataPriv.access( node, "globalEval" ) && + jQuery.contains( doc, node ) ) { + + if ( node.src && ( node.type || "" ).toLowerCase() !== "module" ) { + + // Optional AJAX dependency, but won't run scripts if not present + if ( jQuery._evalUrl && !node.noModule ) { + jQuery._evalUrl( node.src, { + nonce: node.nonce || node.getAttribute( "nonce" ) + } ); + } + } else { + DOMEval( node.textContent.replace( rcleanScript, "" ), node, doc ); + } + } + } + } + } + } + + return collection; +} + +function remove( elem, selector, keepData ) { + var node, + nodes = selector ? jQuery.filter( selector, elem ) : elem, + i = 0; + + for ( ; ( node = nodes[ i ] ) != null; i++ ) { + if ( !keepData && node.nodeType === 1 ) { + jQuery.cleanData( getAll( node ) ); + } + + if ( node.parentNode ) { + if ( keepData && isAttached( node ) ) { + setGlobalEval( getAll( node, "script" ) ); + } + node.parentNode.removeChild( node ); + } + } + + return elem; +} + +jQuery.extend( { + htmlPrefilter: function( html ) { + return html.replace( rxhtmlTag, "<$1>" ); + }, + + clone: function( elem, dataAndEvents, deepDataAndEvents ) { + var i, l, srcElements, destElements, + clone = elem.cloneNode( true ), + inPage = isAttached( elem ); + + // Fix IE cloning issues + if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) && + !jQuery.isXMLDoc( elem ) ) { + + // We eschew Sizzle here for performance reasons: https://jsperf.com/getall-vs-sizzle/2 + destElements = getAll( clone ); + srcElements = getAll( elem ); + + for ( i = 0, l = srcElements.length; i < l; i++ ) { + fixInput( srcElements[ i ], destElements[ i ] ); + } + } + + // Copy the events from the original to the clone + if ( dataAndEvents ) { + if ( deepDataAndEvents ) { + srcElements = srcElements || getAll( elem ); + destElements = destElements || getAll( clone ); + + for ( i = 0, l = srcElements.length; i < l; i++ ) { + cloneCopyEvent( srcElements[ i ], destElements[ i ] ); + } + } else { + cloneCopyEvent( elem, clone ); + } + } + + // Preserve script evaluation history + destElements = getAll( clone, "script" ); + if ( destElements.length > 0 ) { + setGlobalEval( destElements, !inPage && getAll( elem, "script" ) ); + } + + // Return the cloned set + return clone; + }, + + cleanData: function( elems ) { + var data, elem, type, + special = jQuery.event.special, + i = 0; + + for ( ; ( elem = elems[ i ] ) !== undefined; i++ ) { + if ( acceptData( elem ) ) { + if ( ( data = elem[ dataPriv.expando ] ) ) { + if ( data.events ) { + for ( type in data.events ) { + if ( special[ type ] ) { + jQuery.event.remove( elem, type ); + + // This is a shortcut to avoid jQuery.event.remove's overhead + } else { + jQuery.removeEvent( elem, type, data.handle ); + } + } + } + + // Support: Chrome <=35 - 45+ + // Assign undefined instead of using delete, see Data#remove + elem[ dataPriv.expando ] = undefined; + } + if ( elem[ dataUser.expando ] ) { + + // Support: Chrome <=35 - 45+ + // Assign undefined instead of using delete, see Data#remove + elem[ dataUser.expando ] = undefined; + } + } + } + } +} ); + +jQuery.fn.extend( { + detach: function( selector ) { + return remove( this, selector, true ); + }, + + remove: function( selector ) { + return remove( this, selector ); + }, + + text: function( value ) { + return access( this, function( value ) { + return value === undefined ? + jQuery.text( this ) : + this.empty().each( function() { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + this.textContent = value; + } + } ); + }, null, value, arguments.length ); + }, + + append: function() { + return domManip( this, arguments, function( elem ) { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + var target = manipulationTarget( this, elem ); + target.appendChild( elem ); + } + } ); + }, + + prepend: function() { + return domManip( this, arguments, function( elem ) { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + var target = manipulationTarget( this, elem ); + target.insertBefore( elem, target.firstChild ); + } + } ); + }, + + before: function() { + return domManip( this, arguments, function( elem ) { + if ( this.parentNode ) { + this.parentNode.insertBefore( elem, this ); + } + } ); + }, + + after: function() { + return domManip( this, arguments, function( elem ) { + if ( this.parentNode ) { + this.parentNode.insertBefore( elem, this.nextSibling ); + } + } ); + }, + + empty: function() { + var elem, + i = 0; + + for ( ; ( elem = this[ i ] ) != null; i++ ) { + if ( elem.nodeType === 1 ) { + + // Prevent memory leaks + jQuery.cleanData( getAll( elem, false ) ); + + // Remove any remaining nodes + elem.textContent = ""; + } + } + + return this; + }, + + clone: function( dataAndEvents, deepDataAndEvents ) { + dataAndEvents = dataAndEvents == null ? false : dataAndEvents; + deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents; + + return this.map( function() { + return jQuery.clone( this, dataAndEvents, deepDataAndEvents ); + } ); + }, + + html: function( value ) { + return access( this, function( value ) { + var elem = this[ 0 ] || {}, + i = 0, + l = this.length; + + if ( value === undefined && elem.nodeType === 1 ) { + return elem.innerHTML; + } + + // See if we can take a shortcut and just use innerHTML + if ( typeof value === "string" && !rnoInnerhtml.test( value ) && + !wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) { + + value = jQuery.htmlPrefilter( value ); + + try { + for ( ; i < l; i++ ) { + elem = this[ i ] || {}; + + // Remove element nodes and prevent memory leaks + if ( elem.nodeType === 1 ) { + jQuery.cleanData( getAll( elem, false ) ); + elem.innerHTML = value; + } + } + + elem = 0; + + // If using innerHTML throws an exception, use the fallback method + } catch ( e ) {} + } + + if ( elem ) { + this.empty().append( value ); + } + }, null, value, arguments.length ); + }, + + replaceWith: function() { + var ignored = []; + + // Make the changes, replacing each non-ignored context element with the new content + return domManip( this, arguments, function( elem ) { + var parent = this.parentNode; + + if ( jQuery.inArray( this, ignored ) < 0 ) { + jQuery.cleanData( getAll( this ) ); + if ( parent ) { + parent.replaceChild( elem, this ); + } + } + + // Force callback invocation + }, ignored ); + } +} ); + +jQuery.each( { + appendTo: "append", + prependTo: "prepend", + insertBefore: "before", + insertAfter: "after", + replaceAll: "replaceWith" +}, function( name, original ) { + jQuery.fn[ name ] = function( selector ) { + var elems, + ret = [], + insert = jQuery( selector ), + last = insert.length - 1, + i = 0; + + for ( ; i <= last; i++ ) { + elems = i === last ? this : this.clone( true ); + jQuery( insert[ i ] )[ original ]( elems ); + + // Support: Android <=4.0 only, PhantomJS 1 only + // .get() because push.apply(_, arraylike) throws on ancient WebKit + push.apply( ret, elems.get() ); + } + + return this.pushStack( ret ); + }; +} ); +var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" ); + +var getStyles = function( elem ) { + + // Support: IE <=11 only, Firefox <=30 (#15098, #14150) + // IE throws on elements created in popups + // FF meanwhile throws on frame elements through "defaultView.getComputedStyle" + var view = elem.ownerDocument.defaultView; + + if ( !view || !view.opener ) { + view = window; + } + + return view.getComputedStyle( elem ); + }; + +var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" ); + + + +( function() { + + // Executing both pixelPosition & boxSizingReliable tests require only one layout + // so they're executed at the same time to save the second computation. + function computeStyleTests() { + + // This is a singleton, we need to execute it only once + if ( !div ) { + return; + } + + container.style.cssText = "position:absolute;left:-11111px;width:60px;" + + "margin-top:1px;padding:0;border:0"; + div.style.cssText = + "position:relative;display:block;box-sizing:border-box;overflow:scroll;" + + "margin:auto;border:1px;padding:1px;" + + "width:60%;top:1%"; + documentElement.appendChild( container ).appendChild( div ); + + var divStyle = window.getComputedStyle( div ); + pixelPositionVal = divStyle.top !== "1%"; + + // Support: Android 4.0 - 4.3 only, Firefox <=3 - 44 + reliableMarginLeftVal = roundPixelMeasures( divStyle.marginLeft ) === 12; + + // Support: Android 4.0 - 4.3 only, Safari <=9.1 - 10.1, iOS <=7.0 - 9.3 + // Some styles come back with percentage values, even though they shouldn't + div.style.right = "60%"; + pixelBoxStylesVal = roundPixelMeasures( divStyle.right ) === 36; + + // Support: IE 9 - 11 only + // Detect misreporting of content dimensions for box-sizing:border-box elements + boxSizingReliableVal = roundPixelMeasures( divStyle.width ) === 36; + + // Support: IE 9 only + // Detect overflow:scroll screwiness (gh-3699) + // Support: Chrome <=64 + // Don't get tricked when zoom affects offsetWidth (gh-4029) + div.style.position = "absolute"; + scrollboxSizeVal = roundPixelMeasures( div.offsetWidth / 3 ) === 12; + + documentElement.removeChild( container ); + + // Nullify the div so it wouldn't be stored in the memory and + // it will also be a sign that checks already performed + div = null; + } + + function roundPixelMeasures( measure ) { + return Math.round( parseFloat( measure ) ); + } + + var pixelPositionVal, boxSizingReliableVal, scrollboxSizeVal, pixelBoxStylesVal, + reliableMarginLeftVal, + container = document.createElement( "div" ), + div = document.createElement( "div" ); + + // Finish early in limited (non-browser) environments + if ( !div.style ) { + return; + } + + // Support: IE <=9 - 11 only + // Style of cloned element affects source element cloned (#8908) + div.style.backgroundClip = "content-box"; + div.cloneNode( true ).style.backgroundClip = ""; + support.clearCloneStyle = div.style.backgroundClip === "content-box"; + + jQuery.extend( support, { + boxSizingReliable: function() { + computeStyleTests(); + return boxSizingReliableVal; + }, + pixelBoxStyles: function() { + computeStyleTests(); + return pixelBoxStylesVal; + }, + pixelPosition: function() { + computeStyleTests(); + return pixelPositionVal; + }, + reliableMarginLeft: function() { + computeStyleTests(); + return reliableMarginLeftVal; + }, + scrollboxSize: function() { + computeStyleTests(); + return scrollboxSizeVal; + } + } ); +} )(); + + +function curCSS( elem, name, computed ) { + var width, minWidth, maxWidth, ret, + + // Support: Firefox 51+ + // Retrieving style before computed somehow + // fixes an issue with getting wrong values + // on detached elements + style = elem.style; + + computed = computed || getStyles( elem ); + + // getPropertyValue is needed for: + // .css('filter') (IE 9 only, #12537) + // .css('--customProperty) (#3144) + if ( computed ) { + ret = computed.getPropertyValue( name ) || computed[ name ]; + + if ( ret === "" && !isAttached( elem ) ) { + ret = jQuery.style( elem, name ); + } + + // A tribute to the "awesome hack by Dean Edwards" + // Android Browser returns percentage for some values, + // but width seems to be reliably pixels. + // This is against the CSSOM draft spec: + // https://drafts.csswg.org/cssom/#resolved-values + if ( !support.pixelBoxStyles() && rnumnonpx.test( ret ) && rboxStyle.test( name ) ) { + + // Remember the original values + width = style.width; + minWidth = style.minWidth; + maxWidth = style.maxWidth; + + // Put in the new values to get a computed value out + style.minWidth = style.maxWidth = style.width = ret; + ret = computed.width; + + // Revert the changed values + style.width = width; + style.minWidth = minWidth; + style.maxWidth = maxWidth; + } + } + + return ret !== undefined ? + + // Support: IE <=9 - 11 only + // IE returns zIndex value as an integer. + ret + "" : + ret; +} + + +function addGetHookIf( conditionFn, hookFn ) { + + // Define the hook, we'll check on the first run if it's really needed. + return { + get: function() { + if ( conditionFn() ) { + + // Hook not needed (or it's not possible to use it due + // to missing dependency), remove it. + delete this.get; + return; + } + + // Hook needed; redefine it so that the support test is not executed again. + return ( this.get = hookFn ).apply( this, arguments ); + } + }; +} + + +var cssPrefixes = [ "Webkit", "Moz", "ms" ], + emptyStyle = document.createElement( "div" ).style, + vendorProps = {}; + +// Return a vendor-prefixed property or undefined +function vendorPropName( name ) { + + // Check for vendor prefixed names + var capName = name[ 0 ].toUpperCase() + name.slice( 1 ), + i = cssPrefixes.length; + + while ( i-- ) { + name = cssPrefixes[ i ] + capName; + if ( name in emptyStyle ) { + return name; + } + } +} + +// Return a potentially-mapped jQuery.cssProps or vendor prefixed property +function finalPropName( name ) { + var final = jQuery.cssProps[ name ] || vendorProps[ name ]; + + if ( final ) { + return final; + } + if ( name in emptyStyle ) { + return name; + } + return vendorProps[ name ] = vendorPropName( name ) || name; +} + + +var + + // Swappable if display is none or starts with table + // except "table", "table-cell", or "table-caption" + // See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display + rdisplayswap = /^(none|table(?!-c[ea]).+)/, + rcustomProp = /^--/, + cssShow = { position: "absolute", visibility: "hidden", display: "block" }, + cssNormalTransform = { + letterSpacing: "0", + fontWeight: "400" + }; + +function setPositiveNumber( elem, value, subtract ) { + + // Any relative (+/-) values have already been + // normalized at this point + var matches = rcssNum.exec( value ); + return matches ? + + // Guard against undefined "subtract", e.g., when used as in cssHooks + Math.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || "px" ) : + value; +} + +function boxModelAdjustment( elem, dimension, box, isBorderBox, styles, computedVal ) { + var i = dimension === "width" ? 1 : 0, + extra = 0, + delta = 0; + + // Adjustment may not be necessary + if ( box === ( isBorderBox ? "border" : "content" ) ) { + return 0; + } + + for ( ; i < 4; i += 2 ) { + + // Both box models exclude margin + if ( box === "margin" ) { + delta += jQuery.css( elem, box + cssExpand[ i ], true, styles ); + } + + // If we get here with a content-box, we're seeking "padding" or "border" or "margin" + if ( !isBorderBox ) { + + // Add padding + delta += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); + + // For "border" or "margin", add border + if ( box !== "padding" ) { + delta += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); + + // But still keep track of it otherwise + } else { + extra += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); + } + + // If we get here with a border-box (content + padding + border), we're seeking "content" or + // "padding" or "margin" + } else { + + // For "content", subtract padding + if ( box === "content" ) { + delta -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); + } + + // For "content" or "padding", subtract border + if ( box !== "margin" ) { + delta -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); + } + } + } + + // Account for positive content-box scroll gutter when requested by providing computedVal + if ( !isBorderBox && computedVal >= 0 ) { + + // offsetWidth/offsetHeight is a rounded sum of content, padding, scroll gutter, and border + // Assuming integer scroll gutter, subtract the rest and round down + delta += Math.max( 0, Math.ceil( + elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] - + computedVal - + delta - + extra - + 0.5 + + // If offsetWidth/offsetHeight is unknown, then we can't determine content-box scroll gutter + // Use an explicit zero to avoid NaN (gh-3964) + ) ) || 0; + } + + return delta; +} + +function getWidthOrHeight( elem, dimension, extra ) { + + // Start with computed style + var styles = getStyles( elem ), + + // To avoid forcing a reflow, only fetch boxSizing if we need it (gh-4322). + // Fake content-box until we know it's needed to know the true value. + boxSizingNeeded = !support.boxSizingReliable() || extra, + isBorderBox = boxSizingNeeded && + jQuery.css( elem, "boxSizing", false, styles ) === "border-box", + valueIsBorderBox = isBorderBox, + + val = curCSS( elem, dimension, styles ), + offsetProp = "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ); + + // Support: Firefox <=54 + // Return a confounding non-pixel value or feign ignorance, as appropriate. + if ( rnumnonpx.test( val ) ) { + if ( !extra ) { + return val; + } + val = "auto"; + } + + + // Fall back to offsetWidth/offsetHeight when value is "auto" + // This happens for inline elements with no explicit setting (gh-3571) + // Support: Android <=4.1 - 4.3 only + // Also use offsetWidth/offsetHeight for misreported inline dimensions (gh-3602) + // Support: IE 9-11 only + // Also use offsetWidth/offsetHeight for when box sizing is unreliable + // We use getClientRects() to check for hidden/disconnected. + // In those cases, the computed value can be trusted to be border-box + if ( ( !support.boxSizingReliable() && isBorderBox || + val === "auto" || + !parseFloat( val ) && jQuery.css( elem, "display", false, styles ) === "inline" ) && + elem.getClientRects().length ) { + + isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box"; + + // Where available, offsetWidth/offsetHeight approximate border box dimensions. + // Where not available (e.g., SVG), assume unreliable box-sizing and interpret the + // retrieved value as a content box dimension. + valueIsBorderBox = offsetProp in elem; + if ( valueIsBorderBox ) { + val = elem[ offsetProp ]; + } + } + + // Normalize "" and auto + val = parseFloat( val ) || 0; + + // Adjust for the element's box model + return ( val + + boxModelAdjustment( + elem, + dimension, + extra || ( isBorderBox ? "border" : "content" ), + valueIsBorderBox, + styles, + + // Provide the current computed size to request scroll gutter calculation (gh-3589) + val + ) + ) + "px"; +} + +jQuery.extend( { + + // Add in style property hooks for overriding the default + // behavior of getting and setting a style property + cssHooks: { + opacity: { + get: function( elem, computed ) { + if ( computed ) { + + // We should always get a number back from opacity + var ret = curCSS( elem, "opacity" ); + return ret === "" ? "1" : ret; + } + } + } + }, + + // Don't automatically add "px" to these possibly-unitless properties + cssNumber: { + "animationIterationCount": true, + "columnCount": true, + "fillOpacity": true, + "flexGrow": true, + "flexShrink": true, + "fontWeight": true, + "gridArea": true, + "gridColumn": true, + "gridColumnEnd": true, + "gridColumnStart": true, + "gridRow": true, + "gridRowEnd": true, + "gridRowStart": true, + "lineHeight": true, + "opacity": true, + "order": true, + "orphans": true, + "widows": true, + "zIndex": true, + "zoom": true + }, + + // Add in properties whose names you wish to fix before + // setting or getting the value + cssProps: {}, + + // Get and set the style property on a DOM Node + style: function( elem, name, value, extra ) { + + // Don't set styles on text and comment nodes + if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) { + return; + } + + // Make sure that we're working with the right name + var ret, type, hooks, + origName = camelCase( name ), + isCustomProp = rcustomProp.test( name ), + style = elem.style; + + // Make sure that we're working with the right name. We don't + // want to query the value if it is a CSS custom property + // since they are user-defined. + if ( !isCustomProp ) { + name = finalPropName( origName ); + } + + // Gets hook for the prefixed version, then unprefixed version + hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; + + // Check if we're setting a value + if ( value !== undefined ) { + type = typeof value; + + // Convert "+=" or "-=" to relative numbers (#7345) + if ( type === "string" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) { + value = adjustCSS( elem, name, ret ); + + // Fixes bug #9237 + type = "number"; + } + + // Make sure that null and NaN values aren't set (#7116) + if ( value == null || value !== value ) { + return; + } + + // If a number was passed in, add the unit (except for certain CSS properties) + // The isCustomProp check can be removed in jQuery 4.0 when we only auto-append + // "px" to a few hardcoded values. + if ( type === "number" && !isCustomProp ) { + value += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? "" : "px" ); + } + + // background-* props affect original clone's values + if ( !support.clearCloneStyle && value === "" && name.indexOf( "background" ) === 0 ) { + style[ name ] = "inherit"; + } + + // If a hook was provided, use that value, otherwise just set the specified value + if ( !hooks || !( "set" in hooks ) || + ( value = hooks.set( elem, value, extra ) ) !== undefined ) { + + if ( isCustomProp ) { + style.setProperty( name, value ); + } else { + style[ name ] = value; + } + } + + } else { + + // If a hook was provided get the non-computed value from there + if ( hooks && "get" in hooks && + ( ret = hooks.get( elem, false, extra ) ) !== undefined ) { + + return ret; + } + + // Otherwise just get the value from the style object + return style[ name ]; + } + }, + + css: function( elem, name, extra, styles ) { + var val, num, hooks, + origName = camelCase( name ), + isCustomProp = rcustomProp.test( name ); + + // Make sure that we're working with the right name. We don't + // want to modify the value if it is a CSS custom property + // since they are user-defined. + if ( !isCustomProp ) { + name = finalPropName( origName ); + } + + // Try prefixed name followed by the unprefixed name + hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; + + // If a hook was provided get the computed value from there + if ( hooks && "get" in hooks ) { + val = hooks.get( elem, true, extra ); + } + + // Otherwise, if a way to get the computed value exists, use that + if ( val === undefined ) { + val = curCSS( elem, name, styles ); + } + + // Convert "normal" to computed value + if ( val === "normal" && name in cssNormalTransform ) { + val = cssNormalTransform[ name ]; + } + + // Make numeric if forced or a qualifier was provided and val looks numeric + if ( extra === "" || extra ) { + num = parseFloat( val ); + return extra === true || isFinite( num ) ? num || 0 : val; + } + + return val; + } +} ); + +jQuery.each( [ "height", "width" ], function( i, dimension ) { + jQuery.cssHooks[ dimension ] = { + get: function( elem, computed, extra ) { + if ( computed ) { + + // Certain elements can have dimension info if we invisibly show them + // but it must have a current display style that would benefit + return rdisplayswap.test( jQuery.css( elem, "display" ) ) && + + // Support: Safari 8+ + // Table columns in Safari have non-zero offsetWidth & zero + // getBoundingClientRect().width unless display is changed. + // Support: IE <=11 only + // Running getBoundingClientRect on a disconnected node + // in IE throws an error. + ( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ? + swap( elem, cssShow, function() { + return getWidthOrHeight( elem, dimension, extra ); + } ) : + getWidthOrHeight( elem, dimension, extra ); + } + }, + + set: function( elem, value, extra ) { + var matches, + styles = getStyles( elem ), + + // Only read styles.position if the test has a chance to fail + // to avoid forcing a reflow. + scrollboxSizeBuggy = !support.scrollboxSize() && + styles.position === "absolute", + + // To avoid forcing a reflow, only fetch boxSizing if we need it (gh-3991) + boxSizingNeeded = scrollboxSizeBuggy || extra, + isBorderBox = boxSizingNeeded && + jQuery.css( elem, "boxSizing", false, styles ) === "border-box", + subtract = extra ? + boxModelAdjustment( + elem, + dimension, + extra, + isBorderBox, + styles + ) : + 0; + + // Account for unreliable border-box dimensions by comparing offset* to computed and + // faking a content-box to get border and padding (gh-3699) + if ( isBorderBox && scrollboxSizeBuggy ) { + subtract -= Math.ceil( + elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] - + parseFloat( styles[ dimension ] ) - + boxModelAdjustment( elem, dimension, "border", false, styles ) - + 0.5 + ); + } + + // Convert to pixels if value adjustment is needed + if ( subtract && ( matches = rcssNum.exec( value ) ) && + ( matches[ 3 ] || "px" ) !== "px" ) { + + elem.style[ dimension ] = value; + value = jQuery.css( elem, dimension ); + } + + return setPositiveNumber( elem, value, subtract ); + } + }; +} ); + +jQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft, + function( elem, computed ) { + if ( computed ) { + return ( parseFloat( curCSS( elem, "marginLeft" ) ) || + elem.getBoundingClientRect().left - + swap( elem, { marginLeft: 0 }, function() { + return elem.getBoundingClientRect().left; + } ) + ) + "px"; + } + } +); + +// These hooks are used by animate to expand properties +jQuery.each( { + margin: "", + padding: "", + border: "Width" +}, function( prefix, suffix ) { + jQuery.cssHooks[ prefix + suffix ] = { + expand: function( value ) { + var i = 0, + expanded = {}, + + // Assumes a single number if not a string + parts = typeof value === "string" ? value.split( " " ) : [ value ]; + + for ( ; i < 4; i++ ) { + expanded[ prefix + cssExpand[ i ] + suffix ] = + parts[ i ] || parts[ i - 2 ] || parts[ 0 ]; + } + + return expanded; + } + }; + + if ( prefix !== "margin" ) { + jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber; + } +} ); + +jQuery.fn.extend( { + css: function( name, value ) { + return access( this, function( elem, name, value ) { + var styles, len, + map = {}, + i = 0; + + if ( Array.isArray( name ) ) { + styles = getStyles( elem ); + len = name.length; + + for ( ; i < len; i++ ) { + map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles ); + } + + return map; + } + + return value !== undefined ? + jQuery.style( elem, name, value ) : + jQuery.css( elem, name ); + }, name, value, arguments.length > 1 ); + } +} ); + + +function Tween( elem, options, prop, end, easing ) { + return new Tween.prototype.init( elem, options, prop, end, easing ); +} +jQuery.Tween = Tween; + +Tween.prototype = { + constructor: Tween, + init: function( elem, options, prop, end, easing, unit ) { + this.elem = elem; + this.prop = prop; + this.easing = easing || jQuery.easing._default; + this.options = options; + this.start = this.now = this.cur(); + this.end = end; + this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" ); + }, + cur: function() { + var hooks = Tween.propHooks[ this.prop ]; + + return hooks && hooks.get ? + hooks.get( this ) : + Tween.propHooks._default.get( this ); + }, + run: function( percent ) { + var eased, + hooks = Tween.propHooks[ this.prop ]; + + if ( this.options.duration ) { + this.pos = eased = jQuery.easing[ this.easing ]( + percent, this.options.duration * percent, 0, 1, this.options.duration + ); + } else { + this.pos = eased = percent; + } + this.now = ( this.end - this.start ) * eased + this.start; + + if ( this.options.step ) { + this.options.step.call( this.elem, this.now, this ); + } + + if ( hooks && hooks.set ) { + hooks.set( this ); + } else { + Tween.propHooks._default.set( this ); + } + return this; + } +}; + +Tween.prototype.init.prototype = Tween.prototype; + +Tween.propHooks = { + _default: { + get: function( tween ) { + var result; + + // Use a property on the element directly when it is not a DOM element, + // or when there is no matching style property that exists. + if ( tween.elem.nodeType !== 1 || + tween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) { + return tween.elem[ tween.prop ]; + } + + // Passing an empty string as a 3rd parameter to .css will automatically + // attempt a parseFloat and fallback to a string if the parse fails. + // Simple values such as "10px" are parsed to Float; + // complex values such as "rotate(1rad)" are returned as-is. + result = jQuery.css( tween.elem, tween.prop, "" ); + + // Empty strings, null, undefined and "auto" are converted to 0. + return !result || result === "auto" ? 0 : result; + }, + set: function( tween ) { + + // Use step hook for back compat. + // Use cssHook if its there. + // Use .style if available and use plain properties where available. + if ( jQuery.fx.step[ tween.prop ] ) { + jQuery.fx.step[ tween.prop ]( tween ); + } else if ( tween.elem.nodeType === 1 && ( + jQuery.cssHooks[ tween.prop ] || + tween.elem.style[ finalPropName( tween.prop ) ] != null ) ) { + jQuery.style( tween.elem, tween.prop, tween.now + tween.unit ); + } else { + tween.elem[ tween.prop ] = tween.now; + } + } + } +}; + +// Support: IE <=9 only +// Panic based approach to setting things on disconnected nodes +Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = { + set: function( tween ) { + if ( tween.elem.nodeType && tween.elem.parentNode ) { + tween.elem[ tween.prop ] = tween.now; + } + } +}; + +jQuery.easing = { + linear: function( p ) { + return p; + }, + swing: function( p ) { + return 0.5 - Math.cos( p * Math.PI ) / 2; + }, + _default: "swing" +}; + +jQuery.fx = Tween.prototype.init; + +// Back compat <1.8 extension point +jQuery.fx.step = {}; + + + + +var + fxNow, inProgress, + rfxtypes = /^(?:toggle|show|hide)$/, + rrun = /queueHooks$/; + +function schedule() { + if ( inProgress ) { + if ( document.hidden === false && window.requestAnimationFrame ) { + window.requestAnimationFrame( schedule ); + } else { + window.setTimeout( schedule, jQuery.fx.interval ); + } + + jQuery.fx.tick(); + } +} + +// Animations created synchronously will run synchronously +function createFxNow() { + window.setTimeout( function() { + fxNow = undefined; + } ); + return ( fxNow = Date.now() ); +} + +// Generate parameters to create a standard animation +function genFx( type, includeWidth ) { + var which, + i = 0, + attrs = { height: type }; + + // If we include width, step value is 1 to do all cssExpand values, + // otherwise step value is 2 to skip over Left and Right + includeWidth = includeWidth ? 1 : 0; + for ( ; i < 4; i += 2 - includeWidth ) { + which = cssExpand[ i ]; + attrs[ "margin" + which ] = attrs[ "padding" + which ] = type; + } + + if ( includeWidth ) { + attrs.opacity = attrs.width = type; + } + + return attrs; +} + +function createTween( value, prop, animation ) { + var tween, + collection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ "*" ] ), + index = 0, + length = collection.length; + for ( ; index < length; index++ ) { + if ( ( tween = collection[ index ].call( animation, prop, value ) ) ) { + + // We're done with this property + return tween; + } + } +} + +function defaultPrefilter( elem, props, opts ) { + var prop, value, toggle, hooks, oldfire, propTween, restoreDisplay, display, + isBox = "width" in props || "height" in props, + anim = this, + orig = {}, + style = elem.style, + hidden = elem.nodeType && isHiddenWithinTree( elem ), + dataShow = dataPriv.get( elem, "fxshow" ); + + // Queue-skipping animations hijack the fx hooks + if ( !opts.queue ) { + hooks = jQuery._queueHooks( elem, "fx" ); + if ( hooks.unqueued == null ) { + hooks.unqueued = 0; + oldfire = hooks.empty.fire; + hooks.empty.fire = function() { + if ( !hooks.unqueued ) { + oldfire(); + } + }; + } + hooks.unqueued++; + + anim.always( function() { + + // Ensure the complete handler is called before this completes + anim.always( function() { + hooks.unqueued--; + if ( !jQuery.queue( elem, "fx" ).length ) { + hooks.empty.fire(); + } + } ); + } ); + } + + // Detect show/hide animations + for ( prop in props ) { + value = props[ prop ]; + if ( rfxtypes.test( value ) ) { + delete props[ prop ]; + toggle = toggle || value === "toggle"; + if ( value === ( hidden ? "hide" : "show" ) ) { + + // Pretend to be hidden if this is a "show" and + // there is still data from a stopped show/hide + if ( value === "show" && dataShow && dataShow[ prop ] !== undefined ) { + hidden = true; + + // Ignore all other no-op show/hide data + } else { + continue; + } + } + orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop ); + } + } + + // Bail out if this is a no-op like .hide().hide() + propTween = !jQuery.isEmptyObject( props ); + if ( !propTween && jQuery.isEmptyObject( orig ) ) { + return; + } + + // Restrict "overflow" and "display" styles during box animations + if ( isBox && elem.nodeType === 1 ) { + + // Support: IE <=9 - 11, Edge 12 - 15 + // Record all 3 overflow attributes because IE does not infer the shorthand + // from identically-valued overflowX and overflowY and Edge just mirrors + // the overflowX value there. + opts.overflow = [ style.overflow, style.overflowX, style.overflowY ]; + + // Identify a display type, preferring old show/hide data over the CSS cascade + restoreDisplay = dataShow && dataShow.display; + if ( restoreDisplay == null ) { + restoreDisplay = dataPriv.get( elem, "display" ); + } + display = jQuery.css( elem, "display" ); + if ( display === "none" ) { + if ( restoreDisplay ) { + display = restoreDisplay; + } else { + + // Get nonempty value(s) by temporarily forcing visibility + showHide( [ elem ], true ); + restoreDisplay = elem.style.display || restoreDisplay; + display = jQuery.css( elem, "display" ); + showHide( [ elem ] ); + } + } + + // Animate inline elements as inline-block + if ( display === "inline" || display === "inline-block" && restoreDisplay != null ) { + if ( jQuery.css( elem, "float" ) === "none" ) { + + // Restore the original display value at the end of pure show/hide animations + if ( !propTween ) { + anim.done( function() { + style.display = restoreDisplay; + } ); + if ( restoreDisplay == null ) { + display = style.display; + restoreDisplay = display === "none" ? "" : display; + } + } + style.display = "inline-block"; + } + } + } + + if ( opts.overflow ) { + style.overflow = "hidden"; + anim.always( function() { + style.overflow = opts.overflow[ 0 ]; + style.overflowX = opts.overflow[ 1 ]; + style.overflowY = opts.overflow[ 2 ]; + } ); + } + + // Implement show/hide animations + propTween = false; + for ( prop in orig ) { + + // General show/hide setup for this element animation + if ( !propTween ) { + if ( dataShow ) { + if ( "hidden" in dataShow ) { + hidden = dataShow.hidden; + } + } else { + dataShow = dataPriv.access( elem, "fxshow", { display: restoreDisplay } ); + } + + // Store hidden/visible for toggle so `.stop().toggle()` "reverses" + if ( toggle ) { + dataShow.hidden = !hidden; + } + + // Show elements before animating them + if ( hidden ) { + showHide( [ elem ], true ); + } + + /* eslint-disable no-loop-func */ + + anim.done( function() { + + /* eslint-enable no-loop-func */ + + // The final step of a "hide" animation is actually hiding the element + if ( !hidden ) { + showHide( [ elem ] ); + } + dataPriv.remove( elem, "fxshow" ); + for ( prop in orig ) { + jQuery.style( elem, prop, orig[ prop ] ); + } + } ); + } + + // Per-property setup + propTween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim ); + if ( !( prop in dataShow ) ) { + dataShow[ prop ] = propTween.start; + if ( hidden ) { + propTween.end = propTween.start; + propTween.start = 0; + } + } + } +} + +function propFilter( props, specialEasing ) { + var index, name, easing, value, hooks; + + // camelCase, specialEasing and expand cssHook pass + for ( index in props ) { + name = camelCase( index ); + easing = specialEasing[ name ]; + value = props[ index ]; + if ( Array.isArray( value ) ) { + easing = value[ 1 ]; + value = props[ index ] = value[ 0 ]; + } + + if ( index !== name ) { + props[ name ] = value; + delete props[ index ]; + } + + hooks = jQuery.cssHooks[ name ]; + if ( hooks && "expand" in hooks ) { + value = hooks.expand( value ); + delete props[ name ]; + + // Not quite $.extend, this won't overwrite existing keys. + // Reusing 'index' because we have the correct "name" + for ( index in value ) { + if ( !( index in props ) ) { + props[ index ] = value[ index ]; + specialEasing[ index ] = easing; + } + } + } else { + specialEasing[ name ] = easing; + } + } +} + +function Animation( elem, properties, options ) { + var result, + stopped, + index = 0, + length = Animation.prefilters.length, + deferred = jQuery.Deferred().always( function() { + + // Don't match elem in the :animated selector + delete tick.elem; + } ), + tick = function() { + if ( stopped ) { + return false; + } + var currentTime = fxNow || createFxNow(), + remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ), + + // Support: Android 2.3 only + // Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497) + temp = remaining / animation.duration || 0, + percent = 1 - temp, + index = 0, + length = animation.tweens.length; + + for ( ; index < length; index++ ) { + animation.tweens[ index ].run( percent ); + } + + deferred.notifyWith( elem, [ animation, percent, remaining ] ); + + // If there's more to do, yield + if ( percent < 1 && length ) { + return remaining; + } + + // If this was an empty animation, synthesize a final progress notification + if ( !length ) { + deferred.notifyWith( elem, [ animation, 1, 0 ] ); + } + + // Resolve the animation and report its conclusion + deferred.resolveWith( elem, [ animation ] ); + return false; + }, + animation = deferred.promise( { + elem: elem, + props: jQuery.extend( {}, properties ), + opts: jQuery.extend( true, { + specialEasing: {}, + easing: jQuery.easing._default + }, options ), + originalProperties: properties, + originalOptions: options, + startTime: fxNow || createFxNow(), + duration: options.duration, + tweens: [], + createTween: function( prop, end ) { + var tween = jQuery.Tween( elem, animation.opts, prop, end, + animation.opts.specialEasing[ prop ] || animation.opts.easing ); + animation.tweens.push( tween ); + return tween; + }, + stop: function( gotoEnd ) { + var index = 0, + + // If we are going to the end, we want to run all the tweens + // otherwise we skip this part + length = gotoEnd ? animation.tweens.length : 0; + if ( stopped ) { + return this; + } + stopped = true; + for ( ; index < length; index++ ) { + animation.tweens[ index ].run( 1 ); + } + + // Resolve when we played the last frame; otherwise, reject + if ( gotoEnd ) { + deferred.notifyWith( elem, [ animation, 1, 0 ] ); + deferred.resolveWith( elem, [ animation, gotoEnd ] ); + } else { + deferred.rejectWith( elem, [ animation, gotoEnd ] ); + } + return this; + } + } ), + props = animation.props; + + propFilter( props, animation.opts.specialEasing ); + + for ( ; index < length; index++ ) { + result = Animation.prefilters[ index ].call( animation, elem, props, animation.opts ); + if ( result ) { + if ( isFunction( result.stop ) ) { + jQuery._queueHooks( animation.elem, animation.opts.queue ).stop = + result.stop.bind( result ); + } + return result; + } + } + + jQuery.map( props, createTween, animation ); + + if ( isFunction( animation.opts.start ) ) { + animation.opts.start.call( elem, animation ); + } + + // Attach callbacks from options + animation + .progress( animation.opts.progress ) + .done( animation.opts.done, animation.opts.complete ) + .fail( animation.opts.fail ) + .always( animation.opts.always ); + + jQuery.fx.timer( + jQuery.extend( tick, { + elem: elem, + anim: animation, + queue: animation.opts.queue + } ) + ); + + return animation; +} + +jQuery.Animation = jQuery.extend( Animation, { + + tweeners: { + "*": [ function( prop, value ) { + var tween = this.createTween( prop, value ); + adjustCSS( tween.elem, prop, rcssNum.exec( value ), tween ); + return tween; + } ] + }, + + tweener: function( props, callback ) { + if ( isFunction( props ) ) { + callback = props; + props = [ "*" ]; + } else { + props = props.match( rnothtmlwhite ); + } + + var prop, + index = 0, + length = props.length; + + for ( ; index < length; index++ ) { + prop = props[ index ]; + Animation.tweeners[ prop ] = Animation.tweeners[ prop ] || []; + Animation.tweeners[ prop ].unshift( callback ); + } + }, + + prefilters: [ defaultPrefilter ], + + prefilter: function( callback, prepend ) { + if ( prepend ) { + Animation.prefilters.unshift( callback ); + } else { + Animation.prefilters.push( callback ); + } + } +} ); + +jQuery.speed = function( speed, easing, fn ) { + var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : { + complete: fn || !fn && easing || + isFunction( speed ) && speed, + duration: speed, + easing: fn && easing || easing && !isFunction( easing ) && easing + }; + + // Go to the end state if fx are off + if ( jQuery.fx.off ) { + opt.duration = 0; + + } else { + if ( typeof opt.duration !== "number" ) { + if ( opt.duration in jQuery.fx.speeds ) { + opt.duration = jQuery.fx.speeds[ opt.duration ]; + + } else { + opt.duration = jQuery.fx.speeds._default; + } + } + } + + // Normalize opt.queue - true/undefined/null -> "fx" + if ( opt.queue == null || opt.queue === true ) { + opt.queue = "fx"; + } + + // Queueing + opt.old = opt.complete; + + opt.complete = function() { + if ( isFunction( opt.old ) ) { + opt.old.call( this ); + } + + if ( opt.queue ) { + jQuery.dequeue( this, opt.queue ); + } + }; + + return opt; +}; + +jQuery.fn.extend( { + fadeTo: function( speed, to, easing, callback ) { + + // Show any hidden elements after setting opacity to 0 + return this.filter( isHiddenWithinTree ).css( "opacity", 0 ).show() + + // Animate to the value specified + .end().animate( { opacity: to }, speed, easing, callback ); + }, + animate: function( prop, speed, easing, callback ) { + var empty = jQuery.isEmptyObject( prop ), + optall = jQuery.speed( speed, easing, callback ), + doAnimation = function() { + + // Operate on a copy of prop so per-property easing won't be lost + var anim = Animation( this, jQuery.extend( {}, prop ), optall ); + + // Empty animations, or finishing resolves immediately + if ( empty || dataPriv.get( this, "finish" ) ) { + anim.stop( true ); + } + }; + doAnimation.finish = doAnimation; + + return empty || optall.queue === false ? + this.each( doAnimation ) : + this.queue( optall.queue, doAnimation ); + }, + stop: function( type, clearQueue, gotoEnd ) { + var stopQueue = function( hooks ) { + var stop = hooks.stop; + delete hooks.stop; + stop( gotoEnd ); + }; + + if ( typeof type !== "string" ) { + gotoEnd = clearQueue; + clearQueue = type; + type = undefined; + } + if ( clearQueue && type !== false ) { + this.queue( type || "fx", [] ); + } + + return this.each( function() { + var dequeue = true, + index = type != null && type + "queueHooks", + timers = jQuery.timers, + data = dataPriv.get( this ); + + if ( index ) { + if ( data[ index ] && data[ index ].stop ) { + stopQueue( data[ index ] ); + } + } else { + for ( index in data ) { + if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) { + stopQueue( data[ index ] ); + } + } + } + + for ( index = timers.length; index--; ) { + if ( timers[ index ].elem === this && + ( type == null || timers[ index ].queue === type ) ) { + + timers[ index ].anim.stop( gotoEnd ); + dequeue = false; + timers.splice( index, 1 ); + } + } + + // Start the next in the queue if the last step wasn't forced. + // Timers currently will call their complete callbacks, which + // will dequeue but only if they were gotoEnd. + if ( dequeue || !gotoEnd ) { + jQuery.dequeue( this, type ); + } + } ); + }, + finish: function( type ) { + if ( type !== false ) { + type = type || "fx"; + } + return this.each( function() { + var index, + data = dataPriv.get( this ), + queue = data[ type + "queue" ], + hooks = data[ type + "queueHooks" ], + timers = jQuery.timers, + length = queue ? queue.length : 0; + + // Enable finishing flag on private data + data.finish = true; + + // Empty the queue first + jQuery.queue( this, type, [] ); + + if ( hooks && hooks.stop ) { + hooks.stop.call( this, true ); + } + + // Look for any active animations, and finish them + for ( index = timers.length; index--; ) { + if ( timers[ index ].elem === this && timers[ index ].queue === type ) { + timers[ index ].anim.stop( true ); + timers.splice( index, 1 ); + } + } + + // Look for any animations in the old queue and finish them + for ( index = 0; index < length; index++ ) { + if ( queue[ index ] && queue[ index ].finish ) { + queue[ index ].finish.call( this ); + } + } + + // Turn off finishing flag + delete data.finish; + } ); + } +} ); + +jQuery.each( [ "toggle", "show", "hide" ], function( i, name ) { + var cssFn = jQuery.fn[ name ]; + jQuery.fn[ name ] = function( speed, easing, callback ) { + return speed == null || typeof speed === "boolean" ? + cssFn.apply( this, arguments ) : + this.animate( genFx( name, true ), speed, easing, callback ); + }; +} ); + +// Generate shortcuts for custom animations +jQuery.each( { + slideDown: genFx( "show" ), + slideUp: genFx( "hide" ), + slideToggle: genFx( "toggle" ), + fadeIn: { opacity: "show" }, + fadeOut: { opacity: "hide" }, + fadeToggle: { opacity: "toggle" } +}, function( name, props ) { + jQuery.fn[ name ] = function( speed, easing, callback ) { + return this.animate( props, speed, easing, callback ); + }; +} ); + +jQuery.timers = []; +jQuery.fx.tick = function() { + var timer, + i = 0, + timers = jQuery.timers; + + fxNow = Date.now(); + + for ( ; i < timers.length; i++ ) { + timer = timers[ i ]; + + // Run the timer and safely remove it when done (allowing for external removal) + if ( !timer() && timers[ i ] === timer ) { + timers.splice( i--, 1 ); + } + } + + if ( !timers.length ) { + jQuery.fx.stop(); + } + fxNow = undefined; +}; + +jQuery.fx.timer = function( timer ) { + jQuery.timers.push( timer ); + jQuery.fx.start(); +}; + +jQuery.fx.interval = 13; +jQuery.fx.start = function() { + if ( inProgress ) { + return; + } + + inProgress = true; + schedule(); +}; + +jQuery.fx.stop = function() { + inProgress = null; +}; + +jQuery.fx.speeds = { + slow: 600, + fast: 200, + + // Default speed + _default: 400 +}; + + +// Based off of the plugin by Clint Helfers, with permission. +// https://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/ +jQuery.fn.delay = function( time, type ) { + time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time; + type = type || "fx"; + + return this.queue( type, function( next, hooks ) { + var timeout = window.setTimeout( next, time ); + hooks.stop = function() { + window.clearTimeout( timeout ); + }; + } ); +}; + + +( function() { + var input = document.createElement( "input" ), + select = document.createElement( "select" ), + opt = select.appendChild( document.createElement( "option" ) ); + + input.type = "checkbox"; + + // Support: Android <=4.3 only + // Default value for a checkbox should be "on" + support.checkOn = input.value !== ""; + + // Support: IE <=11 only + // Must access selectedIndex to make default options select + support.optSelected = opt.selected; + + // Support: IE <=11 only + // An input loses its value after becoming a radio + input = document.createElement( "input" ); + input.value = "t"; + input.type = "radio"; + support.radioValue = input.value === "t"; +} )(); + + +var boolHook, + attrHandle = jQuery.expr.attrHandle; + +jQuery.fn.extend( { + attr: function( name, value ) { + return access( this, jQuery.attr, name, value, arguments.length > 1 ); + }, + + removeAttr: function( name ) { + return this.each( function() { + jQuery.removeAttr( this, name ); + } ); + } +} ); + +jQuery.extend( { + attr: function( elem, name, value ) { + var ret, hooks, + nType = elem.nodeType; + + // Don't get/set attributes on text, comment and attribute nodes + if ( nType === 3 || nType === 8 || nType === 2 ) { + return; + } + + // Fallback to prop when attributes are not supported + if ( typeof elem.getAttribute === "undefined" ) { + return jQuery.prop( elem, name, value ); + } + + // Attribute hooks are determined by the lowercase version + // Grab necessary hook if one is defined + if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { + hooks = jQuery.attrHooks[ name.toLowerCase() ] || + ( jQuery.expr.match.bool.test( name ) ? boolHook : undefined ); + } + + if ( value !== undefined ) { + if ( value === null ) { + jQuery.removeAttr( elem, name ); + return; + } + + if ( hooks && "set" in hooks && + ( ret = hooks.set( elem, value, name ) ) !== undefined ) { + return ret; + } + + elem.setAttribute( name, value + "" ); + return value; + } + + if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { + return ret; + } + + ret = jQuery.find.attr( elem, name ); + + // Non-existent attributes return null, we normalize to undefined + return ret == null ? undefined : ret; + }, + + attrHooks: { + type: { + set: function( elem, value ) { + if ( !support.radioValue && value === "radio" && + nodeName( elem, "input" ) ) { + var val = elem.value; + elem.setAttribute( "type", value ); + if ( val ) { + elem.value = val; + } + return value; + } + } + } + }, + + removeAttr: function( elem, value ) { + var name, + i = 0, + + // Attribute names can contain non-HTML whitespace characters + // https://html.spec.whatwg.org/multipage/syntax.html#attributes-2 + attrNames = value && value.match( rnothtmlwhite ); + + if ( attrNames && elem.nodeType === 1 ) { + while ( ( name = attrNames[ i++ ] ) ) { + elem.removeAttribute( name ); + } + } + } +} ); + +// Hooks for boolean attributes +boolHook = { + set: function( elem, value, name ) { + if ( value === false ) { + + // Remove boolean attributes when set to false + jQuery.removeAttr( elem, name ); + } else { + elem.setAttribute( name, name ); + } + return name; + } +}; + +jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( i, name ) { + var getter = attrHandle[ name ] || jQuery.find.attr; + + attrHandle[ name ] = function( elem, name, isXML ) { + var ret, handle, + lowercaseName = name.toLowerCase(); + + if ( !isXML ) { + + // Avoid an infinite loop by temporarily removing this function from the getter + handle = attrHandle[ lowercaseName ]; + attrHandle[ lowercaseName ] = ret; + ret = getter( elem, name, isXML ) != null ? + lowercaseName : + null; + attrHandle[ lowercaseName ] = handle; + } + return ret; + }; +} ); + + + + +var rfocusable = /^(?:input|select|textarea|button)$/i, + rclickable = /^(?:a|area)$/i; + +jQuery.fn.extend( { + prop: function( name, value ) { + return access( this, jQuery.prop, name, value, arguments.length > 1 ); + }, + + removeProp: function( name ) { + return this.each( function() { + delete this[ jQuery.propFix[ name ] || name ]; + } ); + } +} ); + +jQuery.extend( { + prop: function( elem, name, value ) { + var ret, hooks, + nType = elem.nodeType; + + // Don't get/set properties on text, comment and attribute nodes + if ( nType === 3 || nType === 8 || nType === 2 ) { + return; + } + + if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { + + // Fix name and attach hooks + name = jQuery.propFix[ name ] || name; + hooks = jQuery.propHooks[ name ]; + } + + if ( value !== undefined ) { + if ( hooks && "set" in hooks && + ( ret = hooks.set( elem, value, name ) ) !== undefined ) { + return ret; + } + + return ( elem[ name ] = value ); + } + + if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { + return ret; + } + + return elem[ name ]; + }, + + propHooks: { + tabIndex: { + get: function( elem ) { + + // Support: IE <=9 - 11 only + // elem.tabIndex doesn't always return the + // correct value when it hasn't been explicitly set + // https://web.archive.org/web/20141116233347/http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/ + // Use proper attribute retrieval(#12072) + var tabindex = jQuery.find.attr( elem, "tabindex" ); + + if ( tabindex ) { + return parseInt( tabindex, 10 ); + } + + if ( + rfocusable.test( elem.nodeName ) || + rclickable.test( elem.nodeName ) && + elem.href + ) { + return 0; + } + + return -1; + } + } + }, + + propFix: { + "for": "htmlFor", + "class": "className" + } +} ); + +// Support: IE <=11 only +// Accessing the selectedIndex property +// forces the browser to respect setting selected +// on the option +// The getter ensures a default option is selected +// when in an optgroup +// eslint rule "no-unused-expressions" is disabled for this code +// since it considers such accessions noop +if ( !support.optSelected ) { + jQuery.propHooks.selected = { + get: function( elem ) { + + /* eslint no-unused-expressions: "off" */ + + var parent = elem.parentNode; + if ( parent && parent.parentNode ) { + parent.parentNode.selectedIndex; + } + return null; + }, + set: function( elem ) { + + /* eslint no-unused-expressions: "off" */ + + var parent = elem.parentNode; + if ( parent ) { + parent.selectedIndex; + + if ( parent.parentNode ) { + parent.parentNode.selectedIndex; + } + } + } + }; +} + +jQuery.each( [ + "tabIndex", + "readOnly", + "maxLength", + "cellSpacing", + "cellPadding", + "rowSpan", + "colSpan", + "useMap", + "frameBorder", + "contentEditable" +], function() { + jQuery.propFix[ this.toLowerCase() ] = this; +} ); + + + + + // Strip and collapse whitespace according to HTML spec + // https://infra.spec.whatwg.org/#strip-and-collapse-ascii-whitespace + function stripAndCollapse( value ) { + var tokens = value.match( rnothtmlwhite ) || []; + return tokens.join( " " ); + } + + +function getClass( elem ) { + return elem.getAttribute && elem.getAttribute( "class" ) || ""; +} + +function classesToArray( value ) { + if ( Array.isArray( value ) ) { + return value; + } + if ( typeof value === "string" ) { + return value.match( rnothtmlwhite ) || []; + } + return []; +} + +jQuery.fn.extend( { + addClass: function( value ) { + var classes, elem, cur, curValue, clazz, j, finalValue, + i = 0; + + if ( isFunction( value ) ) { + return this.each( function( j ) { + jQuery( this ).addClass( value.call( this, j, getClass( this ) ) ); + } ); + } + + classes = classesToArray( value ); + + if ( classes.length ) { + while ( ( elem = this[ i++ ] ) ) { + curValue = getClass( elem ); + cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); + + if ( cur ) { + j = 0; + while ( ( clazz = classes[ j++ ] ) ) { + if ( cur.indexOf( " " + clazz + " " ) < 0 ) { + cur += clazz + " "; + } + } + + // Only assign if different to avoid unneeded rendering. + finalValue = stripAndCollapse( cur ); + if ( curValue !== finalValue ) { + elem.setAttribute( "class", finalValue ); + } + } + } + } + + return this; + }, + + removeClass: function( value ) { + var classes, elem, cur, curValue, clazz, j, finalValue, + i = 0; + + if ( isFunction( value ) ) { + return this.each( function( j ) { + jQuery( this ).removeClass( value.call( this, j, getClass( this ) ) ); + } ); + } + + if ( !arguments.length ) { + return this.attr( "class", "" ); + } + + classes = classesToArray( value ); + + if ( classes.length ) { + while ( ( elem = this[ i++ ] ) ) { + curValue = getClass( elem ); + + // This expression is here for better compressibility (see addClass) + cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); + + if ( cur ) { + j = 0; + while ( ( clazz = classes[ j++ ] ) ) { + + // Remove *all* instances + while ( cur.indexOf( " " + clazz + " " ) > -1 ) { + cur = cur.replace( " " + clazz + " ", " " ); + } + } + + // Only assign if different to avoid unneeded rendering. + finalValue = stripAndCollapse( cur ); + if ( curValue !== finalValue ) { + elem.setAttribute( "class", finalValue ); + } + } + } + } + + return this; + }, + + toggleClass: function( value, stateVal ) { + var type = typeof value, + isValidValue = type === "string" || Array.isArray( value ); + + if ( typeof stateVal === "boolean" && isValidValue ) { + return stateVal ? this.addClass( value ) : this.removeClass( value ); + } + + if ( isFunction( value ) ) { + return this.each( function( i ) { + jQuery( this ).toggleClass( + value.call( this, i, getClass( this ), stateVal ), + stateVal + ); + } ); + } + + return this.each( function() { + var className, i, self, classNames; + + if ( isValidValue ) { + + // Toggle individual class names + i = 0; + self = jQuery( this ); + classNames = classesToArray( value ); + + while ( ( className = classNames[ i++ ] ) ) { + + // Check each className given, space separated list + if ( self.hasClass( className ) ) { + self.removeClass( className ); + } else { + self.addClass( className ); + } + } + + // Toggle whole class name + } else if ( value === undefined || type === "boolean" ) { + className = getClass( this ); + if ( className ) { + + // Store className if set + dataPriv.set( this, "__className__", className ); + } + + // If the element has a class name or if we're passed `false`, + // then remove the whole classname (if there was one, the above saved it). + // Otherwise bring back whatever was previously saved (if anything), + // falling back to the empty string if nothing was stored. + if ( this.setAttribute ) { + this.setAttribute( "class", + className || value === false ? + "" : + dataPriv.get( this, "__className__" ) || "" + ); + } + } + } ); + }, + + hasClass: function( selector ) { + var className, elem, + i = 0; + + className = " " + selector + " "; + while ( ( elem = this[ i++ ] ) ) { + if ( elem.nodeType === 1 && + ( " " + stripAndCollapse( getClass( elem ) ) + " " ).indexOf( className ) > -1 ) { + return true; + } + } + + return false; + } +} ); + + + + +var rreturn = /\r/g; + +jQuery.fn.extend( { + val: function( value ) { + var hooks, ret, valueIsFunction, + elem = this[ 0 ]; + + if ( !arguments.length ) { + if ( elem ) { + hooks = jQuery.valHooks[ elem.type ] || + jQuery.valHooks[ elem.nodeName.toLowerCase() ]; + + if ( hooks && + "get" in hooks && + ( ret = hooks.get( elem, "value" ) ) !== undefined + ) { + return ret; + } + + ret = elem.value; + + // Handle most common string cases + if ( typeof ret === "string" ) { + return ret.replace( rreturn, "" ); + } + + // Handle cases where value is null/undef or number + return ret == null ? "" : ret; + } + + return; + } + + valueIsFunction = isFunction( value ); + + return this.each( function( i ) { + var val; + + if ( this.nodeType !== 1 ) { + return; + } + + if ( valueIsFunction ) { + val = value.call( this, i, jQuery( this ).val() ); + } else { + val = value; + } + + // Treat null/undefined as ""; convert numbers to string + if ( val == null ) { + val = ""; + + } else if ( typeof val === "number" ) { + val += ""; + + } else if ( Array.isArray( val ) ) { + val = jQuery.map( val, function( value ) { + return value == null ? "" : value + ""; + } ); + } + + hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ]; + + // If set returns undefined, fall back to normal setting + if ( !hooks || !( "set" in hooks ) || hooks.set( this, val, "value" ) === undefined ) { + this.value = val; + } + } ); + } +} ); + +jQuery.extend( { + valHooks: { + option: { + get: function( elem ) { + + var val = jQuery.find.attr( elem, "value" ); + return val != null ? + val : + + // Support: IE <=10 - 11 only + // option.text throws exceptions (#14686, #14858) + // Strip and collapse whitespace + // https://html.spec.whatwg.org/#strip-and-collapse-whitespace + stripAndCollapse( jQuery.text( elem ) ); + } + }, + select: { + get: function( elem ) { + var value, option, i, + options = elem.options, + index = elem.selectedIndex, + one = elem.type === "select-one", + values = one ? null : [], + max = one ? index + 1 : options.length; + + if ( index < 0 ) { + i = max; + + } else { + i = one ? index : 0; + } + + // Loop through all the selected options + for ( ; i < max; i++ ) { + option = options[ i ]; + + // Support: IE <=9 only + // IE8-9 doesn't update selected after form reset (#2551) + if ( ( option.selected || i === index ) && + + // Don't return options that are disabled or in a disabled optgroup + !option.disabled && + ( !option.parentNode.disabled || + !nodeName( option.parentNode, "optgroup" ) ) ) { + + // Get the specific value for the option + value = jQuery( option ).val(); + + // We don't need an array for one selects + if ( one ) { + return value; + } + + // Multi-Selects return an array + values.push( value ); + } + } + + return values; + }, + + set: function( elem, value ) { + var optionSet, option, + options = elem.options, + values = jQuery.makeArray( value ), + i = options.length; + + while ( i-- ) { + option = options[ i ]; + + /* eslint-disable no-cond-assign */ + + if ( option.selected = + jQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1 + ) { + optionSet = true; + } + + /* eslint-enable no-cond-assign */ + } + + // Force browsers to behave consistently when non-matching value is set + if ( !optionSet ) { + elem.selectedIndex = -1; + } + return values; + } + } + } +} ); + +// Radios and checkboxes getter/setter +jQuery.each( [ "radio", "checkbox" ], function() { + jQuery.valHooks[ this ] = { + set: function( elem, value ) { + if ( Array.isArray( value ) ) { + return ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 ); + } + } + }; + if ( !support.checkOn ) { + jQuery.valHooks[ this ].get = function( elem ) { + return elem.getAttribute( "value" ) === null ? "on" : elem.value; + }; + } +} ); + + + + +// Return jQuery for attributes-only inclusion + + +support.focusin = "onfocusin" in window; + + +var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/, + stopPropagationCallback = function( e ) { + e.stopPropagation(); + }; + +jQuery.extend( jQuery.event, { + + trigger: function( event, data, elem, onlyHandlers ) { + + var i, cur, tmp, bubbleType, ontype, handle, special, lastElement, + eventPath = [ elem || document ], + type = hasOwn.call( event, "type" ) ? event.type : event, + namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split( "." ) : []; + + cur = lastElement = tmp = elem = elem || document; + + // Don't do events on text and comment nodes + if ( elem.nodeType === 3 || elem.nodeType === 8 ) { + return; + } + + // focus/blur morphs to focusin/out; ensure we're not firing them right now + if ( rfocusMorph.test( type + jQuery.event.triggered ) ) { + return; + } + + if ( type.indexOf( "." ) > -1 ) { + + // Namespaced trigger; create a regexp to match event type in handle() + namespaces = type.split( "." ); + type = namespaces.shift(); + namespaces.sort(); + } + ontype = type.indexOf( ":" ) < 0 && "on" + type; + + // Caller can pass in a jQuery.Event object, Object, or just an event type string + event = event[ jQuery.expando ] ? + event : + new jQuery.Event( type, typeof event === "object" && event ); + + // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true) + event.isTrigger = onlyHandlers ? 2 : 3; + event.namespace = namespaces.join( "." ); + event.rnamespace = event.namespace ? + new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ) : + null; + + // Clean up the event in case it is being reused + event.result = undefined; + if ( !event.target ) { + event.target = elem; + } + + // Clone any incoming data and prepend the event, creating the handler arg list + data = data == null ? + [ event ] : + jQuery.makeArray( data, [ event ] ); + + // Allow special events to draw outside the lines + special = jQuery.event.special[ type ] || {}; + if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) { + return; + } + + // Determine event propagation path in advance, per W3C events spec (#9951) + // Bubble up to document, then to window; watch for a global ownerDocument var (#9724) + if ( !onlyHandlers && !special.noBubble && !isWindow( elem ) ) { + + bubbleType = special.delegateType || type; + if ( !rfocusMorph.test( bubbleType + type ) ) { + cur = cur.parentNode; + } + for ( ; cur; cur = cur.parentNode ) { + eventPath.push( cur ); + tmp = cur; + } + + // Only add window if we got to document (e.g., not plain obj or detached DOM) + if ( tmp === ( elem.ownerDocument || document ) ) { + eventPath.push( tmp.defaultView || tmp.parentWindow || window ); + } + } + + // Fire handlers on the event path + i = 0; + while ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) { + lastElement = cur; + event.type = i > 1 ? + bubbleType : + special.bindType || type; + + // jQuery handler + handle = ( dataPriv.get( cur, "events" ) || {} )[ event.type ] && + dataPriv.get( cur, "handle" ); + if ( handle ) { + handle.apply( cur, data ); + } + + // Native handler + handle = ontype && cur[ ontype ]; + if ( handle && handle.apply && acceptData( cur ) ) { + event.result = handle.apply( cur, data ); + if ( event.result === false ) { + event.preventDefault(); + } + } + } + event.type = type; + + // If nobody prevented the default action, do it now + if ( !onlyHandlers && !event.isDefaultPrevented() ) { + + if ( ( !special._default || + special._default.apply( eventPath.pop(), data ) === false ) && + acceptData( elem ) ) { + + // Call a native DOM method on the target with the same name as the event. + // Don't do default actions on window, that's where global variables be (#6170) + if ( ontype && isFunction( elem[ type ] ) && !isWindow( elem ) ) { + + // Don't re-trigger an onFOO event when we call its FOO() method + tmp = elem[ ontype ]; + + if ( tmp ) { + elem[ ontype ] = null; + } + + // Prevent re-triggering of the same event, since we already bubbled it above + jQuery.event.triggered = type; + + if ( event.isPropagationStopped() ) { + lastElement.addEventListener( type, stopPropagationCallback ); + } + + elem[ type ](); + + if ( event.isPropagationStopped() ) { + lastElement.removeEventListener( type, stopPropagationCallback ); + } + + jQuery.event.triggered = undefined; + + if ( tmp ) { + elem[ ontype ] = tmp; + } + } + } + } + + return event.result; + }, + + // Piggyback on a donor event to simulate a different one + // Used only for `focus(in | out)` events + simulate: function( type, elem, event ) { + var e = jQuery.extend( + new jQuery.Event(), + event, + { + type: type, + isSimulated: true + } + ); + + jQuery.event.trigger( e, null, elem ); + } + +} ); + +jQuery.fn.extend( { + + trigger: function( type, data ) { + return this.each( function() { + jQuery.event.trigger( type, data, this ); + } ); + }, + triggerHandler: function( type, data ) { + var elem = this[ 0 ]; + if ( elem ) { + return jQuery.event.trigger( type, data, elem, true ); + } + } +} ); + + +// Support: Firefox <=44 +// Firefox doesn't have focus(in | out) events +// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787 +// +// Support: Chrome <=48 - 49, Safari <=9.0 - 9.1 +// focus(in | out) events fire after focus & blur events, +// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order +// Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857 +if ( !support.focusin ) { + jQuery.each( { focus: "focusin", blur: "focusout" }, function( orig, fix ) { + + // Attach a single capturing handler on the document while someone wants focusin/focusout + var handler = function( event ) { + jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) ); + }; + + jQuery.event.special[ fix ] = { + setup: function() { + var doc = this.ownerDocument || this, + attaches = dataPriv.access( doc, fix ); + + if ( !attaches ) { + doc.addEventListener( orig, handler, true ); + } + dataPriv.access( doc, fix, ( attaches || 0 ) + 1 ); + }, + teardown: function() { + var doc = this.ownerDocument || this, + attaches = dataPriv.access( doc, fix ) - 1; + + if ( !attaches ) { + doc.removeEventListener( orig, handler, true ); + dataPriv.remove( doc, fix ); + + } else { + dataPriv.access( doc, fix, attaches ); + } + } + }; + } ); +} +var location = window.location; + +var nonce = Date.now(); + +var rquery = ( /\?/ ); + + + +// Cross-browser xml parsing +jQuery.parseXML = function( data ) { + var xml; + if ( !data || typeof data !== "string" ) { + return null; + } + + // Support: IE 9 - 11 only + // IE throws on parseFromString with invalid input. + try { + xml = ( new window.DOMParser() ).parseFromString( data, "text/xml" ); + } catch ( e ) { + xml = undefined; + } + + if ( !xml || xml.getElementsByTagName( "parsererror" ).length ) { + jQuery.error( "Invalid XML: " + data ); + } + return xml; +}; + + +var + rbracket = /\[\]$/, + rCRLF = /\r?\n/g, + rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i, + rsubmittable = /^(?:input|select|textarea|keygen)/i; + +function buildParams( prefix, obj, traditional, add ) { + var name; + + if ( Array.isArray( obj ) ) { + + // Serialize array item. + jQuery.each( obj, function( i, v ) { + if ( traditional || rbracket.test( prefix ) ) { + + // Treat each array item as a scalar. + add( prefix, v ); + + } else { + + // Item is non-scalar (array or object), encode its numeric index. + buildParams( + prefix + "[" + ( typeof v === "object" && v != null ? i : "" ) + "]", + v, + traditional, + add + ); + } + } ); + + } else if ( !traditional && toType( obj ) === "object" ) { + + // Serialize object item. + for ( name in obj ) { + buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add ); + } + + } else { + + // Serialize scalar item. + add( prefix, obj ); + } +} + +// Serialize an array of form elements or a set of +// key/values into a query string +jQuery.param = function( a, traditional ) { + var prefix, + s = [], + add = function( key, valueOrFunction ) { + + // If value is a function, invoke it and use its return value + var value = isFunction( valueOrFunction ) ? + valueOrFunction() : + valueOrFunction; + + s[ s.length ] = encodeURIComponent( key ) + "=" + + encodeURIComponent( value == null ? "" : value ); + }; + + if ( a == null ) { + return ""; + } + + // If an array was passed in, assume that it is an array of form elements. + if ( Array.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) { + + // Serialize the form elements + jQuery.each( a, function() { + add( this.name, this.value ); + } ); + + } else { + + // If traditional, encode the "old" way (the way 1.3.2 or older + // did it), otherwise encode params recursively. + for ( prefix in a ) { + buildParams( prefix, a[ prefix ], traditional, add ); + } + } + + // Return the resulting serialization + return s.join( "&" ); +}; + +jQuery.fn.extend( { + serialize: function() { + return jQuery.param( this.serializeArray() ); + }, + serializeArray: function() { + return this.map( function() { + + // Can add propHook for "elements" to filter or add form elements + var elements = jQuery.prop( this, "elements" ); + return elements ? jQuery.makeArray( elements ) : this; + } ) + .filter( function() { + var type = this.type; + + // Use .is( ":disabled" ) so that fieldset[disabled] works + return this.name && !jQuery( this ).is( ":disabled" ) && + rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) && + ( this.checked || !rcheckableType.test( type ) ); + } ) + .map( function( i, elem ) { + var val = jQuery( this ).val(); + + if ( val == null ) { + return null; + } + + if ( Array.isArray( val ) ) { + return jQuery.map( val, function( val ) { + return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; + } ); + } + + return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; + } ).get(); + } +} ); + + +var + r20 = /%20/g, + rhash = /#.*$/, + rantiCache = /([?&])_=[^&]*/, + rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg, + + // #7653, #8125, #8152: local protocol detection + rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/, + rnoContent = /^(?:GET|HEAD)$/, + rprotocol = /^\/\//, + + /* Prefilters + * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example) + * 2) These are called: + * - BEFORE asking for a transport + * - AFTER param serialization (s.data is a string if s.processData is true) + * 3) key is the dataType + * 4) the catchall symbol "*" can be used + * 5) execution will start with transport dataType and THEN continue down to "*" if needed + */ + prefilters = {}, + + /* Transports bindings + * 1) key is the dataType + * 2) the catchall symbol "*" can be used + * 3) selection will start with transport dataType and THEN go to "*" if needed + */ + transports = {}, + + // Avoid comment-prolog char sequence (#10098); must appease lint and evade compression + allTypes = "*/".concat( "*" ), + + // Anchor tag for parsing the document origin + originAnchor = document.createElement( "a" ); + originAnchor.href = location.href; + +// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport +function addToPrefiltersOrTransports( structure ) { + + // dataTypeExpression is optional and defaults to "*" + return function( dataTypeExpression, func ) { + + if ( typeof dataTypeExpression !== "string" ) { + func = dataTypeExpression; + dataTypeExpression = "*"; + } + + var dataType, + i = 0, + dataTypes = dataTypeExpression.toLowerCase().match( rnothtmlwhite ) || []; + + if ( isFunction( func ) ) { + + // For each dataType in the dataTypeExpression + while ( ( dataType = dataTypes[ i++ ] ) ) { + + // Prepend if requested + if ( dataType[ 0 ] === "+" ) { + dataType = dataType.slice( 1 ) || "*"; + ( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func ); + + // Otherwise append + } else { + ( structure[ dataType ] = structure[ dataType ] || [] ).push( func ); + } + } + } + }; +} + +// Base inspection function for prefilters and transports +function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) { + + var inspected = {}, + seekingTransport = ( structure === transports ); + + function inspect( dataType ) { + var selected; + inspected[ dataType ] = true; + jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) { + var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR ); + if ( typeof dataTypeOrTransport === "string" && + !seekingTransport && !inspected[ dataTypeOrTransport ] ) { + + options.dataTypes.unshift( dataTypeOrTransport ); + inspect( dataTypeOrTransport ); + return false; + } else if ( seekingTransport ) { + return !( selected = dataTypeOrTransport ); + } + } ); + return selected; + } + + return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" ); +} + +// A special extend for ajax options +// that takes "flat" options (not to be deep extended) +// Fixes #9887 +function ajaxExtend( target, src ) { + var key, deep, + flatOptions = jQuery.ajaxSettings.flatOptions || {}; + + for ( key in src ) { + if ( src[ key ] !== undefined ) { + ( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ]; + } + } + if ( deep ) { + jQuery.extend( true, target, deep ); + } + + return target; +} + +/* Handles responses to an ajax request: + * - finds the right dataType (mediates between content-type and expected dataType) + * - returns the corresponding response + */ +function ajaxHandleResponses( s, jqXHR, responses ) { + + var ct, type, finalDataType, firstDataType, + contents = s.contents, + dataTypes = s.dataTypes; + + // Remove auto dataType and get content-type in the process + while ( dataTypes[ 0 ] === "*" ) { + dataTypes.shift(); + if ( ct === undefined ) { + ct = s.mimeType || jqXHR.getResponseHeader( "Content-Type" ); + } + } + + // Check if we're dealing with a known content-type + if ( ct ) { + for ( type in contents ) { + if ( contents[ type ] && contents[ type ].test( ct ) ) { + dataTypes.unshift( type ); + break; + } + } + } + + // Check to see if we have a response for the expected dataType + if ( dataTypes[ 0 ] in responses ) { + finalDataType = dataTypes[ 0 ]; + } else { + + // Try convertible dataTypes + for ( type in responses ) { + if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[ 0 ] ] ) { + finalDataType = type; + break; + } + if ( !firstDataType ) { + firstDataType = type; + } + } + + // Or just use first one + finalDataType = finalDataType || firstDataType; + } + + // If we found a dataType + // We add the dataType to the list if needed + // and return the corresponding response + if ( finalDataType ) { + if ( finalDataType !== dataTypes[ 0 ] ) { + dataTypes.unshift( finalDataType ); + } + return responses[ finalDataType ]; + } +} + +/* Chain conversions given the request and the original response + * Also sets the responseXXX fields on the jqXHR instance + */ +function ajaxConvert( s, response, jqXHR, isSuccess ) { + var conv2, current, conv, tmp, prev, + converters = {}, + + // Work with a copy of dataTypes in case we need to modify it for conversion + dataTypes = s.dataTypes.slice(); + + // Create converters map with lowercased keys + if ( dataTypes[ 1 ] ) { + for ( conv in s.converters ) { + converters[ conv.toLowerCase() ] = s.converters[ conv ]; + } + } + + current = dataTypes.shift(); + + // Convert to each sequential dataType + while ( current ) { + + if ( s.responseFields[ current ] ) { + jqXHR[ s.responseFields[ current ] ] = response; + } + + // Apply the dataFilter if provided + if ( !prev && isSuccess && s.dataFilter ) { + response = s.dataFilter( response, s.dataType ); + } + + prev = current; + current = dataTypes.shift(); + + if ( current ) { + + // There's only work to do if current dataType is non-auto + if ( current === "*" ) { + + current = prev; + + // Convert response if prev dataType is non-auto and differs from current + } else if ( prev !== "*" && prev !== current ) { + + // Seek a direct converter + conv = converters[ prev + " " + current ] || converters[ "* " + current ]; + + // If none found, seek a pair + if ( !conv ) { + for ( conv2 in converters ) { + + // If conv2 outputs current + tmp = conv2.split( " " ); + if ( tmp[ 1 ] === current ) { + + // If prev can be converted to accepted input + conv = converters[ prev + " " + tmp[ 0 ] ] || + converters[ "* " + tmp[ 0 ] ]; + if ( conv ) { + + // Condense equivalence converters + if ( conv === true ) { + conv = converters[ conv2 ]; + + // Otherwise, insert the intermediate dataType + } else if ( converters[ conv2 ] !== true ) { + current = tmp[ 0 ]; + dataTypes.unshift( tmp[ 1 ] ); + } + break; + } + } + } + } + + // Apply converter (if not an equivalence) + if ( conv !== true ) { + + // Unless errors are allowed to bubble, catch and return them + if ( conv && s.throws ) { + response = conv( response ); + } else { + try { + response = conv( response ); + } catch ( e ) { + return { + state: "parsererror", + error: conv ? e : "No conversion from " + prev + " to " + current + }; + } + } + } + } + } + } + + return { state: "success", data: response }; +} + +jQuery.extend( { + + // Counter for holding the number of active queries + active: 0, + + // Last-Modified header cache for next request + lastModified: {}, + etag: {}, + + ajaxSettings: { + url: location.href, + type: "GET", + isLocal: rlocalProtocol.test( location.protocol ), + global: true, + processData: true, + async: true, + contentType: "application/x-www-form-urlencoded; charset=UTF-8", + + /* + timeout: 0, + data: null, + dataType: null, + username: null, + password: null, + cache: null, + throws: false, + traditional: false, + headers: {}, + */ + + accepts: { + "*": allTypes, + 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" + }, + + // Data converters + // Keys separate source (or catchall "*") and destination types with a single space + converters: { + + // Convert anything to text + "* text": String, + + // Text to html (true = no transformation) + "text html": true, + + // Evaluate text as a json expression + "text json": JSON.parse, + + // Parse text as xml + "text xml": jQuery.parseXML + }, + + // For options that shouldn't be deep extended: + // you can add your own custom options here if + // and when you create one that shouldn't be + // deep extended (see ajaxExtend) + flatOptions: { + url: true, + context: true + } + }, + + // Creates a full fledged settings object into target + // with both ajaxSettings and settings fields. + // If target is omitted, writes into ajaxSettings. + ajaxSetup: function( target, settings ) { + return settings ? + + // Building a settings object + ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) : + + // Extending ajaxSettings + ajaxExtend( jQuery.ajaxSettings, target ); + }, + + ajaxPrefilter: addToPrefiltersOrTransports( prefilters ), + ajaxTransport: addToPrefiltersOrTransports( transports ), + + // Main method + ajax: function( url, options ) { + + // If url is an object, simulate pre-1.5 signature + if ( typeof url === "object" ) { + options = url; + url = undefined; + } + + // Force options to be an object + options = options || {}; + + var transport, + + // URL without anti-cache param + cacheURL, + + // Response headers + responseHeadersString, + responseHeaders, + + // timeout handle + timeoutTimer, + + // Url cleanup var + urlAnchor, + + // Request state (becomes false upon send and true upon completion) + completed, + + // To know if global events are to be dispatched + fireGlobals, + + // Loop variable + i, + + // uncached part of the url + uncached, + + // Create the final options object + s = jQuery.ajaxSetup( {}, options ), + + // Callbacks context + callbackContext = s.context || s, + + // Context for global events is callbackContext if it is a DOM node or jQuery collection + globalEventContext = s.context && + ( callbackContext.nodeType || callbackContext.jquery ) ? + jQuery( callbackContext ) : + jQuery.event, + + // Deferreds + deferred = jQuery.Deferred(), + completeDeferred = jQuery.Callbacks( "once memory" ), + + // Status-dependent callbacks + statusCode = s.statusCode || {}, + + // Headers (they are sent all at once) + requestHeaders = {}, + requestHeadersNames = {}, + + // Default abort message + strAbort = "canceled", + + // Fake xhr + jqXHR = { + readyState: 0, + + // Builds headers hashtable if needed + getResponseHeader: function( key ) { + var match; + if ( completed ) { + if ( !responseHeaders ) { + responseHeaders = {}; + while ( ( match = rheaders.exec( responseHeadersString ) ) ) { + responseHeaders[ match[ 1 ].toLowerCase() + " " ] = + ( responseHeaders[ match[ 1 ].toLowerCase() + " " ] || [] ) + .concat( match[ 2 ] ); + } + } + match = responseHeaders[ key.toLowerCase() + " " ]; + } + return match == null ? null : match.join( ", " ); + }, + + // Raw string + getAllResponseHeaders: function() { + return completed ? responseHeadersString : null; + }, + + // Caches the header + setRequestHeader: function( name, value ) { + if ( completed == null ) { + name = requestHeadersNames[ name.toLowerCase() ] = + requestHeadersNames[ name.toLowerCase() ] || name; + requestHeaders[ name ] = value; + } + return this; + }, + + // Overrides response content-type header + overrideMimeType: function( type ) { + if ( completed == null ) { + s.mimeType = type; + } + return this; + }, + + // Status-dependent callbacks + statusCode: function( map ) { + var code; + if ( map ) { + if ( completed ) { + + // Execute the appropriate callbacks + jqXHR.always( map[ jqXHR.status ] ); + } else { + + // Lazy-add the new callbacks in a way that preserves old ones + for ( code in map ) { + statusCode[ code ] = [ statusCode[ code ], map[ code ] ]; + } + } + } + return this; + }, + + // Cancel the request + abort: function( statusText ) { + var finalText = statusText || strAbort; + if ( transport ) { + transport.abort( finalText ); + } + done( 0, finalText ); + return this; + } + }; + + // Attach deferreds + deferred.promise( jqXHR ); + + // Add protocol if not provided (prefilters might expect it) + // Handle falsy url in the settings object (#10093: consistency with old signature) + // We also use the url parameter if available + s.url = ( ( url || s.url || location.href ) + "" ) + .replace( rprotocol, location.protocol + "//" ); + + // Alias method option to type as per ticket #12004 + s.type = options.method || options.type || s.method || s.type; + + // Extract dataTypes list + s.dataTypes = ( s.dataType || "*" ).toLowerCase().match( rnothtmlwhite ) || [ "" ]; + + // A cross-domain request is in order when the origin doesn't match the current origin. + if ( s.crossDomain == null ) { + urlAnchor = document.createElement( "a" ); + + // Support: IE <=8 - 11, Edge 12 - 15 + // IE throws exception on accessing the href property if url is malformed, + // e.g. http://example.com:80x/ + try { + urlAnchor.href = s.url; + + // Support: IE <=8 - 11 only + // Anchor's host property isn't correctly set when s.url is relative + urlAnchor.href = urlAnchor.href; + s.crossDomain = originAnchor.protocol + "//" + originAnchor.host !== + urlAnchor.protocol + "//" + urlAnchor.host; + } catch ( e ) { + + // If there is an error parsing the URL, assume it is crossDomain, + // it can be rejected by the transport if it is invalid + s.crossDomain = true; + } + } + + // Convert data if not already a string + if ( s.data && s.processData && typeof s.data !== "string" ) { + s.data = jQuery.param( s.data, s.traditional ); + } + + // Apply prefilters + inspectPrefiltersOrTransports( prefilters, s, options, jqXHR ); + + // If request was aborted inside a prefilter, stop there + if ( completed ) { + return jqXHR; + } + + // We can fire global events as of now if asked to + // Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118) + fireGlobals = jQuery.event && s.global; + + // Watch for a new set of requests + if ( fireGlobals && jQuery.active++ === 0 ) { + jQuery.event.trigger( "ajaxStart" ); + } + + // Uppercase the type + s.type = s.type.toUpperCase(); + + // Determine if request has content + s.hasContent = !rnoContent.test( s.type ); + + // Save the URL in case we're toying with the If-Modified-Since + // and/or If-None-Match header later on + // Remove hash to simplify url manipulation + cacheURL = s.url.replace( rhash, "" ); + + // More options handling for requests with no content + if ( !s.hasContent ) { + + // Remember the hash so we can put it back + uncached = s.url.slice( cacheURL.length ); + + // If data is available and should be processed, append data to url + if ( s.data && ( s.processData || typeof s.data === "string" ) ) { + cacheURL += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data; + + // #9682: remove data so that it's not used in an eventual retry + delete s.data; + } + + // Add or update anti-cache param if needed + if ( s.cache === false ) { + cacheURL = cacheURL.replace( rantiCache, "$1" ); + uncached = ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + ( nonce++ ) + uncached; + } + + // Put hash and anti-cache on the URL that will be requested (gh-1732) + s.url = cacheURL + uncached; + + // Change '%20' to '+' if this is encoded form body content (gh-2658) + } else if ( s.data && s.processData && + ( s.contentType || "" ).indexOf( "application/x-www-form-urlencoded" ) === 0 ) { + s.data = s.data.replace( r20, "+" ); + } + + // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. + if ( s.ifModified ) { + if ( jQuery.lastModified[ cacheURL ] ) { + jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] ); + } + if ( jQuery.etag[ cacheURL ] ) { + jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] ); + } + } + + // Set the correct header, if data is being sent + if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) { + jqXHR.setRequestHeader( "Content-Type", s.contentType ); + } + + // Set the Accepts header for the server, depending on the dataType + jqXHR.setRequestHeader( + "Accept", + s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ? + s.accepts[ s.dataTypes[ 0 ] ] + + ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) : + s.accepts[ "*" ] + ); + + // Check for headers option + for ( i in s.headers ) { + jqXHR.setRequestHeader( i, s.headers[ i ] ); + } + + // Allow custom headers/mimetypes and early abort + if ( s.beforeSend && + ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || completed ) ) { + + // Abort if not done already and return + return jqXHR.abort(); + } + + // Aborting is no longer a cancellation + strAbort = "abort"; + + // Install callbacks on deferreds + completeDeferred.add( s.complete ); + jqXHR.done( s.success ); + jqXHR.fail( s.error ); + + // Get transport + transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR ); + + // If no transport, we auto-abort + if ( !transport ) { + done( -1, "No Transport" ); + } else { + jqXHR.readyState = 1; + + // Send global event + if ( fireGlobals ) { + globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] ); + } + + // If request was aborted inside ajaxSend, stop there + if ( completed ) { + return jqXHR; + } + + // Timeout + if ( s.async && s.timeout > 0 ) { + timeoutTimer = window.setTimeout( function() { + jqXHR.abort( "timeout" ); + }, s.timeout ); + } + + try { + completed = false; + transport.send( requestHeaders, done ); + } catch ( e ) { + + // Rethrow post-completion exceptions + if ( completed ) { + throw e; + } + + // Propagate others as results + done( -1, e ); + } + } + + // Callback for when everything is done + function done( status, nativeStatusText, responses, headers ) { + var isSuccess, success, error, response, modified, + statusText = nativeStatusText; + + // Ignore repeat invocations + if ( completed ) { + return; + } + + completed = true; + + // Clear timeout if it exists + if ( timeoutTimer ) { + window.clearTimeout( timeoutTimer ); + } + + // Dereference transport for early garbage collection + // (no matter how long the jqXHR object will be used) + transport = undefined; + + // Cache response headers + responseHeadersString = headers || ""; + + // Set readyState + jqXHR.readyState = status > 0 ? 4 : 0; + + // Determine if successful + isSuccess = status >= 200 && status < 300 || status === 304; + + // Get response data + if ( responses ) { + response = ajaxHandleResponses( s, jqXHR, responses ); + } + + // Convert no matter what (that way responseXXX fields are always set) + response = ajaxConvert( s, response, jqXHR, isSuccess ); + + // If successful, handle type chaining + if ( isSuccess ) { + + // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. + if ( s.ifModified ) { + modified = jqXHR.getResponseHeader( "Last-Modified" ); + if ( modified ) { + jQuery.lastModified[ cacheURL ] = modified; + } + modified = jqXHR.getResponseHeader( "etag" ); + if ( modified ) { + jQuery.etag[ cacheURL ] = modified; + } + } + + // if no content + if ( status === 204 || s.type === "HEAD" ) { + statusText = "nocontent"; + + // if not modified + } else if ( status === 304 ) { + statusText = "notmodified"; + + // If we have data, let's convert it + } else { + statusText = response.state; + success = response.data; + error = response.error; + isSuccess = !error; + } + } else { + + // Extract error from statusText and normalize for non-aborts + error = statusText; + if ( status || !statusText ) { + statusText = "error"; + if ( status < 0 ) { + status = 0; + } + } + } + + // Set data for the fake xhr object + jqXHR.status = status; + jqXHR.statusText = ( nativeStatusText || statusText ) + ""; + + // Success/Error + if ( isSuccess ) { + deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] ); + } else { + deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] ); + } + + // Status-dependent callbacks + jqXHR.statusCode( statusCode ); + statusCode = undefined; + + if ( fireGlobals ) { + globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError", + [ jqXHR, s, isSuccess ? success : error ] ); + } + + // Complete + completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] ); + + if ( fireGlobals ) { + globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] ); + + // Handle the global AJAX counter + if ( !( --jQuery.active ) ) { + jQuery.event.trigger( "ajaxStop" ); + } + } + } + + return jqXHR; + }, + + getJSON: function( url, data, callback ) { + return jQuery.get( url, data, callback, "json" ); + }, + + getScript: function( url, callback ) { + return jQuery.get( url, undefined, callback, "script" ); + } +} ); + +jQuery.each( [ "get", "post" ], function( i, method ) { + jQuery[ method ] = function( url, data, callback, type ) { + + // Shift arguments if data argument was omitted + if ( isFunction( data ) ) { + type = type || callback; + callback = data; + data = undefined; + } + + // The url can be an options object (which then must have .url) + return jQuery.ajax( jQuery.extend( { + url: url, + type: method, + dataType: type, + data: data, + success: callback + }, jQuery.isPlainObject( url ) && url ) ); + }; +} ); + + +jQuery._evalUrl = function( url, options ) { + return jQuery.ajax( { + url: url, + + // Make this explicit, since user can override this through ajaxSetup (#11264) + type: "GET", + dataType: "script", + cache: true, + async: false, + global: false, + + // Only evaluate the response if it is successful (gh-4126) + // dataFilter is not invoked for failure responses, so using it instead + // of the default converter is kludgy but it works. + converters: { + "text script": function() {} + }, + dataFilter: function( response ) { + jQuery.globalEval( response, options ); + } + } ); +}; + + +jQuery.fn.extend( { + wrapAll: function( html ) { + var wrap; + + if ( this[ 0 ] ) { + if ( isFunction( html ) ) { + html = html.call( this[ 0 ] ); + } + + // The elements to wrap the target around + wrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true ); + + if ( this[ 0 ].parentNode ) { + wrap.insertBefore( this[ 0 ] ); + } + + wrap.map( function() { + var elem = this; + + while ( elem.firstElementChild ) { + elem = elem.firstElementChild; + } + + return elem; + } ).append( this ); + } + + return this; + }, + + wrapInner: function( html ) { + if ( isFunction( html ) ) { + return this.each( function( i ) { + jQuery( this ).wrapInner( html.call( this, i ) ); + } ); + } + + return this.each( function() { + var self = jQuery( this ), + contents = self.contents(); + + if ( contents.length ) { + contents.wrapAll( html ); + + } else { + self.append( html ); + } + } ); + }, + + wrap: function( html ) { + var htmlIsFunction = isFunction( html ); + + return this.each( function( i ) { + jQuery( this ).wrapAll( htmlIsFunction ? html.call( this, i ) : html ); + } ); + }, + + unwrap: function( selector ) { + this.parent( selector ).not( "body" ).each( function() { + jQuery( this ).replaceWith( this.childNodes ); + } ); + return this; + } +} ); + + +jQuery.expr.pseudos.hidden = function( elem ) { + return !jQuery.expr.pseudos.visible( elem ); +}; +jQuery.expr.pseudos.visible = function( elem ) { + return !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length ); +}; + + + + +jQuery.ajaxSettings.xhr = function() { + try { + return new window.XMLHttpRequest(); + } catch ( e ) {} +}; + +var xhrSuccessStatus = { + + // File protocol always yields status code 0, assume 200 + 0: 200, + + // Support: IE <=9 only + // #1450: sometimes IE returns 1223 when it should be 204 + 1223: 204 + }, + xhrSupported = jQuery.ajaxSettings.xhr(); + +support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported ); +support.ajax = xhrSupported = !!xhrSupported; + +jQuery.ajaxTransport( function( options ) { + var callback, errorCallback; + + // Cross domain only allowed if supported through XMLHttpRequest + if ( support.cors || xhrSupported && !options.crossDomain ) { + return { + send: function( headers, complete ) { + var i, + xhr = options.xhr(); + + xhr.open( + options.type, + options.url, + options.async, + options.username, + options.password + ); + + // Apply custom fields if provided + if ( options.xhrFields ) { + for ( i in options.xhrFields ) { + xhr[ i ] = options.xhrFields[ i ]; + } + } + + // Override mime type if needed + if ( options.mimeType && xhr.overrideMimeType ) { + xhr.overrideMimeType( options.mimeType ); + } + + // X-Requested-With header + // For cross-domain requests, seeing as conditions for a preflight are + // akin to a jigsaw puzzle, we simply never set it to be sure. + // (it can always be set on a per-request basis or even using ajaxSetup) + // For same-domain requests, won't change header if already provided. + if ( !options.crossDomain && !headers[ "X-Requested-With" ] ) { + headers[ "X-Requested-With" ] = "XMLHttpRequest"; + } + + // Set headers + for ( i in headers ) { + xhr.setRequestHeader( i, headers[ i ] ); + } + + // Callback + callback = function( type ) { + return function() { + if ( callback ) { + callback = errorCallback = xhr.onload = + xhr.onerror = xhr.onabort = xhr.ontimeout = + xhr.onreadystatechange = null; + + if ( type === "abort" ) { + xhr.abort(); + } else if ( type === "error" ) { + + // Support: IE <=9 only + // On a manual native abort, IE9 throws + // errors on any property access that is not readyState + if ( typeof xhr.status !== "number" ) { + complete( 0, "error" ); + } else { + complete( + + // File: protocol always yields status 0; see #8605, #14207 + xhr.status, + xhr.statusText + ); + } + } else { + complete( + xhrSuccessStatus[ xhr.status ] || xhr.status, + xhr.statusText, + + // Support: IE <=9 only + // IE9 has no XHR2 but throws on binary (trac-11426) + // For XHR2 non-text, let the caller handle it (gh-2498) + ( xhr.responseType || "text" ) !== "text" || + typeof xhr.responseText !== "string" ? + { binary: xhr.response } : + { text: xhr.responseText }, + xhr.getAllResponseHeaders() + ); + } + } + }; + }; + + // Listen to events + xhr.onload = callback(); + errorCallback = xhr.onerror = xhr.ontimeout = callback( "error" ); + + // Support: IE 9 only + // Use onreadystatechange to replace onabort + // to handle uncaught aborts + if ( xhr.onabort !== undefined ) { + xhr.onabort = errorCallback; + } else { + xhr.onreadystatechange = function() { + + // Check readyState before timeout as it changes + if ( xhr.readyState === 4 ) { + + // Allow onerror to be called first, + // but that will not handle a native abort + // Also, save errorCallback to a variable + // as xhr.onerror cannot be accessed + window.setTimeout( function() { + if ( callback ) { + errorCallback(); + } + } ); + } + }; + } + + // Create the abort callback + callback = callback( "abort" ); + + try { + + // Do send the request (this may raise an exception) + xhr.send( options.hasContent && options.data || null ); + } catch ( e ) { + + // #14683: Only rethrow if this hasn't been notified as an error yet + if ( callback ) { + throw e; + } + } + }, + + abort: function() { + if ( callback ) { + callback(); + } + } + }; + } +} ); + + + + +// Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432) +jQuery.ajaxPrefilter( function( s ) { + if ( s.crossDomain ) { + s.contents.script = false; + } +} ); + +// Install script dataType +jQuery.ajaxSetup( { + accepts: { + script: "text/javascript, application/javascript, " + + "application/ecmascript, application/x-ecmascript" + }, + contents: { + script: /\b(?:java|ecma)script\b/ + }, + converters: { + "text script": function( text ) { + jQuery.globalEval( text ); + return text; + } + } +} ); + +// Handle cache's special case and crossDomain +jQuery.ajaxPrefilter( "script", function( s ) { + if ( s.cache === undefined ) { + s.cache = false; + } + if ( s.crossDomain ) { + s.type = "GET"; + } +} ); + +// Bind script tag hack transport +jQuery.ajaxTransport( "script", function( s ) { + + // This transport only deals with cross domain or forced-by-attrs requests + if ( s.crossDomain || s.scriptAttrs ) { + var script, callback; + return { + send: function( _, complete ) { + script = jQuery( " + + + + + + + + + + + + +
+
+
+
+ + + +
+
+
+ +
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/examples.html b/docs/_build/html/examples.html new file mode 100644 index 0000000..6b1a059 --- /dev/null +++ b/docs/_build/html/examples.html @@ -0,0 +1,114 @@ + + + + + + + Simple test — Adafruit WSGI Library 1.0 documentation + + + + + + + + + + + + + + + + + +
+
+
+
+ +
+

Simple test

+

Ensure your device works with this simple test.

+
+
examples/wsgi_simpletest.py
+
1

+
+
+
+
+ + +
+
+
+ +
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/genindex.html b/docs/_build/html/genindex.html new file mode 100644 index 0000000..c37bc5a --- /dev/null +++ b/docs/_build/html/genindex.html @@ -0,0 +1,93 @@ + + + + + + + + Index — Adafruit WSGI Library 1.0 documentation + + + + + + + + + + + + + + + +
+
+
+
+ + +

Index

+ +
+ A + +
+

A

+ + +
+ + + +
+
+
+ +
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/index.html b/docs/_build/html/index.html new file mode 100644 index 0000000..de4d24b --- /dev/null +++ b/docs/_build/html/index.html @@ -0,0 +1,214 @@ + + + + + + + Introduction — Adafruit WSGI Library 1.0 documentation + + + + + + + + + + + + + + + + +
+
+
+
+ +
+

Introduction

+Documentation Status +Discord +Build Status +

CircuitPython framework for creating WSGI compatible web server applications.

+
+
+

Dependencies

+

This driver depends on:

+ +

Please ensure all dependencies are available on the CircuitPython filesystem. +This is easily achieved by downloading +the Adafruit library and driver bundle.

+
+
+

Installing from PyPI

+
+

Note

+

This library is not available on PyPI yet. Install documentation is included +as a standard element. Stay tuned for PyPI availability!

+
+

On supported GNU/Linux systems like the Raspberry Pi, you can install the driver locally from +PyPI. To install for current user:

+
pip3 install adafruit-circuitpython-wsgi
+
+
+

To install system-wide (this may be required in some cases):

+
sudo pip3 install adafruit-circuitpython-wsgi
+
+
+

To install in a virtual environment in your current project:

+
mkdir project-name && cd project-name
+python3 -m venv .env
+source .env/bin/activate
+pip3 install adafruit-circuitpython-wsgi
+
+
+
+
+

Usage Example

+
+
+

Contributing

+

Contributions are welcome! Please read our Code of Conduct +before contributing to help this project stay welcoming.

+
+

Sphinx documentation

+

Sphinx is used to build the documentation based on rST files and comments in the code. First, +install dependencies (feel free to reuse the virtual environment from above):

+
python3 -m venv .env
+source .env/bin/activate
+pip install Sphinx sphinx-rtd-theme
+
+
+

Now, once you have the virtual environment activated:

+
cd docs
+sphinx-build -E -W -b html . _build/html
+
+
+

This will output the documentation to docs/_build/html. Open the index.html in your browser to +view them. It will also (due to -W) error out on any warning like Travis will. This is a good way to +locally verify it will pass.

+
+
+ +
+

Indices and tables

+ +
+ + +
+
+
+ +
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/objects.inv b/docs/_build/html/objects.inv new file mode 100644 index 0000000000000000000000000000000000000000..58241a4c1ff1a2c7fd0df1ba3488d8519b72ba62 GIT binary patch literal 298 zcmY#Z2rkIT%&Sny%qvUHE6FdaR47X=D$dN$Q!wIERtPA{&q_@$u~KkMNlYs$%`8y} z4|exd@X1UnN-U}bDhPupwo)+EGXQc!GExQEG8ab{k+LRC&?k{(yZt=#^DT!##J+TPc8HNJMXLi|pv!^}%bw + + + + + Python Module Index — Adafruit WSGI Library 1.0 documentation + + + + + + + + + + + + + + + + + + + + +
+
+
+
+ + +

Python Module Index

+ +
+ a +
+ + + + + + + +
 
+ a
+ adafruit_wsgi +
+ + +
+
+
+ +
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/search.html b/docs/_build/html/search.html new file mode 100644 index 0000000..00113a4 --- /dev/null +++ b/docs/_build/html/search.html @@ -0,0 +1,94 @@ + + + + + + + Search — Adafruit WSGI Library 1.0 documentation + + + + + + + + + + + + + + + + + + + + +
+
+
+
+ +

Search

+
+ +

+ Please activate JavaScript to enable the search + functionality. +

+
+

+ From here you can search these documents. Enter your search + words into the box below and click "search". Note that the search + function will automatically search for all of the words. Pages + containing fewer words won't appear in the result list. +

+
+ + + +
+ +
+ +
+ +
+
+
+ +
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/searchindex.js b/docs/_build/html/searchindex.js new file mode 100644 index 0000000..0e3179e --- /dev/null +++ b/docs/_build/html/searchindex.js @@ -0,0 +1 @@ +Search.setIndex({docnames:["api","examples","index"],envversion:{"sphinx.domains.c":1,"sphinx.domains.changeset":1,"sphinx.domains.citation":1,"sphinx.domains.cpp":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.todo":2,sphinx:56},filenames:["api.rst","examples.rst","index.rst"],objects:{"":{adafruit_wsgi:[0,0,0,"-"]}},objnames:{"0":["py","module","Python module"]},objtypes:{"0":"py:module"},terms:{"case":2,_build:2,abov:2,achiev:2,activ:2,adafruit:2,add:2,all:2,also:2,ani:2,applic:2,avail:2,base:2,befor:2,bin:2,blog:2,browser:2,build:2,bundl:2,can:2,chat:2,circuitpython:2,code:2,comment:2,compat:2,conduct:2,creat:2,current:2,delet:2,devic:1,discord:2,doc:2,download:2,driver:2,due:2,easili:2,element:2,ensur:[1,2],entir:2,env:2,environ:2,error:2,exampl:1,feel:2,file:2,filesystem:2,first:2,folder:2,forum:2,framework:2,free:2,gnu:2,good:2,guid:2,have:2,help:2,here:2,html:2,includ:2,index:2,later:2,learn:2,leav:2,librari:2,like:2,link:2,linux:2,live:2,local:2,mai:2,mkdir:2,modul:2,name:2,none:2,note:2,now:2,onc:2,open:2,other:2,our:2,out:2,output:2,page:2,pass:2,pip3:2,pip:2,plan:2,pleas:2,product:2,project:2,python3:2,quick:2,raspberri:2,read:2,refer:2,releas:2,remov:2,requir:2,reus:2,rst:2,rtd:2,search:2,section:2,server:2,should:2,simpl:2,simpli:2,some:2,sourc:2,stai:2,standard:2,store:2,sudo:2,support:2,system:2,test:2,them:2,theme:2,thi:[1,2],time:2,toctre:2,travi:2,tune:2,use:2,used:2,user:2,venv:2,verifi:2,version:2,view:2,virtual:2,wai:2,warn:2,web:2,welcom:2,wide:2,work:1,wsgi:2,wsgi_simpletest:1,yet:2,you:2,your:[1,2]},titles:["<no title>","Simple test","Introduction"],titleterms:{content:2,contribut:2,depend:2,document:2,exampl:2,from:2,indic:2,instal:2,introduct:2,pypi:2,simpl:1,sphinx:2,tabl:2,test:1,todo:2,usag:2}}) \ No newline at end of file diff --git a/docs/_static/favicon.ico b/docs/_static/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..5aca98376a1f7e593ebd9cf41a808512c2135635 GIT binary patch literal 4414 zcmd^BX;4#F6n=SG-XmlONeGrD5E6J{RVh+e928U#MG!$jWvO+UsvWh`x&VqGNx*en zx=qox7Dqv{kPwo%fZC$dDwVpRtz{HzTkSs8QhG0)%Y=-3@Kt!4ag|JcIo?$-F|?bXVS9UDUyev>MVZQ(H8K4#;BQW-t2CPorj8^KJrMX}QK zp+e<;4ldpXz~=)2GxNy811&)gt-}Q*yVQpsxr@VMoA##{)$1~=bZ1MmjeFw?uT(`8 z^g=09<=zW%r%buwN%iHtuKSg|+r7HkT0PYN*_u9k1;^Ss-Z!RBfJ?Un4w(awqp2b3 z%+myoFis_lTlCrGx2z$0BQdh+7?!JK#9K9@Z!VrG zNj6gK5r(b4?YDOLw|DPRoN7bdP{(>GEG41YcN~4r_SUHU2hgVtUwZG@s%edC;k7Sn zC)RvEnlq~raE2mY2ko64^m1KQL}3riixh?#J{o)IT+K-RdHae2eRX91-+g!y`8^># z-zI0ir>P%Xon)!@xp-BK2bDYUB9k613NRrY6%lVjbFcQc*pRqiK~8xtkNPLxt}e?&QsTB}^!39t_%Qb)~Ukn0O%iC;zt z<&A-y;3h++)>c1br`5VFM~5(83!HKx$L+my8sW_c#@x*|*vB1yU)_dt3vH;2hqPWx zAl^6@?ipx&U7pf`a*>Yq6C85nb+B=Fnn+(id$W#WB^uHAcZVG`qg;rWB}ubvi(Y>D z$ei>REw$#xp0SHAd^|1hq&9HJ=jKK8^zTH~nk)G?yUcmTh9vUM6Y0LMw4(gYVY$D$ zGl&WY&H<)BbJ&3sYbKjx1j^=3-0Q#f^}(aP1?8^`&FUWMp|rmtpK)bLQ1Zo?^s4jqK=Lfg*9&geMGVQ z#^-*!V`fG@;H&{M9S8%+;|h&Qrxym0Ar>WT4BCVLR8cGXF=JmEYN(sNT(9vl+S|%g z8r7nXQ(95i^`=+XHo|){$vf2$?=`F$^&wFlYXyXg$B{a>$-Fp+V}+D;9k=~Xl~?C4 zAB-;RKXdUzBJE{V&d&%R>aEfFe;vxqI$0@hwVM}gFeQR@j}a>DDxR+n+-*6|_)k%% z*mSpDV|=5I9!&VC&9tD%fcVygWZV!iIo2qFtm#!*(s|@ZT33*Ad;+<|3^+yrp*;oH zBSYLV(H1zTU?2WjrCQoQW)Z>J2a=dTriuvezBmu16`tM2fm7Q@d4^iqII-xFpwHGI zn9CL}QE*1vdj2PX{PIuqOe5dracsciH6OlAZATvE8rj6ykqdIjal2 z0S0S~PwHb-5?OQ-tU-^KTG@XNrEVSvo|HIP?H;7ZhYeZkhSqh-{reE!5di;1zk$#Y zCe7rOnlzFYJ6Z#Hm$GoidKB=2HBCwm`BbZVeZY4ukmG%1uz7p2URs6c9j-Gjj^oQV zsdDb3@k2e`C$1I5ML5U0Qs0C1GAp^?!*`=|Nm(vWz3j*j*8ucum2;r0^-6Aca=Gv) zc%}&;!+_*S2tlnnJnz0EKeRmw-Y!@9ob!XQBwiv}^u9MkaXHvM=!<3YX;+2#5Cj5pp?FEK750S3BgeSDtaE^ zXUM@xoV6yBFKfzvY20V&Lr0yC + CircuitPython Reference Documentation + CircuitPython Support Forum + Discord Chat + Adafruit Learning System + Adafruit Blog + Adafruit Store + +Indices and tables +================== + +* :ref:`genindex` +* :ref:`modindex` +* :ref:`search` diff --git a/examples/wsgi_simpletest.py b/examples/wsgi_simpletest.py new file mode 100644 index 0000000..e69de29 diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..edf9394 --- /dev/null +++ b/requirements.txt @@ -0,0 +1 @@ +Adafruit-Blinka diff --git a/setup.py b/setup.py new file mode 100644 index 0000000..0356667 --- /dev/null +++ b/setup.py @@ -0,0 +1,64 @@ +"""A setuptools based setup module. + +See: +https://packaging.python.org/en/latest/distributing.html +https://github.com/pypa/sampleproject +""" + +from setuptools import setup, find_packages +# To use a consistent encoding +from codecs import open +from os import path + +here = path.abspath(path.dirname(__file__)) + +# Get the long description from the README file +with open(path.join(here, 'README.rst'), encoding='utf-8') as f: + long_description = f.read() + +setup( + name='adafruit-circuitpython-wsgi', + + use_scm_version=True, + setup_requires=['setuptools_scm'], + + description='CircuitPython framework for creating WSGI compatible web server applications.', + long_description=long_description, + long_description_content_type='text/x-rst', + + # The project's main homepage. + url='https://github.com/adafruit/Adafruit_CircuitPython_WSGI', + + # Author details + author='Adafruit Industries', + author_email='circuitpython@adafruit.com', + + install_requires=[ + 'Adafruit-Blinka' + ], + + # Choose your license + license='MIT', + + # See https://pypi.python.org/pypi?%3Aaction=list_classifiers + classifiers=[ + 'Development Status :: 3 - Alpha', + 'Intended Audience :: Developers', + 'Topic :: Software Development :: Libraries', + 'Topic :: System :: Hardware', + 'License :: OSI Approved :: MIT License', + 'Programming Language :: Python :: 3', + 'Programming Language :: Python :: 3.4', + 'Programming Language :: Python :: 3.5', + ], + + # What does your project relate to? + keywords='adafruit blinka circuitpython micropython wsgi web server webserver app webapp ' + 'framework http https flask', + + # You can just specify the packages manually here if your project is + # simple. Or you can use find_packages(). + # TODO: IF LIBRARY FILES ARE A PACKAGE FOLDER, + # CHANGE `py_modules=['...']` TO `packages=['...']` + py_modules=['adafruit_wsgi'], +) From 1b9879b608f5bb422ceffc7fd1cb8eebf05d4d91 Mon Sep 17 00:00:00 2001 From: Matt Costi Date: Mon, 14 Oct 2019 12:13:57 -0400 Subject: [PATCH 02/16] add . files accidentally removed --- .gitignore | 13 ++ .pylintrc | 433 +++++++++++++++++++++++++++++++++++++++++++++++ .readthedocs.yml | 3 + .travis.yml | 48 ++++++ 4 files changed, 497 insertions(+) create mode 100644 .gitignore create mode 100644 .pylintrc create mode 100644 .readthedocs.yml create mode 100644 .travis.yml diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..3573d73 --- /dev/null +++ b/.gitignore @@ -0,0 +1,13 @@ +*.mpy +.idea +__pycache__ +_build +*.pyc +.env +build* +bundles +*.DS_Store +.eggs +dist +**/*.egg-info +.vscode diff --git a/.pylintrc b/.pylintrc new file mode 100644 index 0000000..039eaec --- /dev/null +++ b/.pylintrc @@ -0,0 +1,433 @@ +[MASTER] + +# A comma-separated list of package or module names from where C extensions may +# be loaded. Extensions are loading into the active Python interpreter and may +# run arbitrary code +extension-pkg-whitelist= + +# Add files or directories to the blacklist. They should be base names, not +# paths. +ignore=CVS + +# Add files or directories matching the regex patterns to the blacklist. The +# regex matches against base names, not paths. +ignore-patterns= + +# Python code to execute, usually for sys.path manipulation such as +# pygtk.require(). +#init-hook= + +# Use multiple processes to speed up Pylint. +# jobs=1 +jobs=2 + +# List of plugins (as comma separated values of python modules names) to load, +# usually to register additional checkers. +load-plugins= + +# Pickle collected data for later comparisons. +persistent=yes + +# Specify a configuration file. +#rcfile= + +# Allow loading of arbitrary C extensions. Extensions are imported into the +# active Python interpreter and may run arbitrary code. +unsafe-load-any-extension=no + + +[MESSAGES CONTROL] + +# Only show warnings with the listed confidence levels. Leave empty to show +# all. Valid levels: HIGH, INFERENCE, INFERENCE_FAILURE, UNDEFINED +confidence= + +# Disable the message, report, category or checker with the given id(s). You +# can either give multiple identifiers separated by comma (,) or put this +# option multiple times (only on the command line, not in the configuration +# file where it should appear only once).You can also use "--disable=all" to +# disable everything first and then reenable specific checks. For example, if +# you want to run only the similarities checker, you can use "--disable=all +# --enable=similarities". If you want to run only the classes checker, but have +# no Warning level messages displayed, use"--disable=all --enable=classes +# --disable=W" +# disable=import-error,print-statement,parameter-unpacking,unpacking-in-except,old-raise-syntax,backtick,long-suffix,old-ne-operator,old-octal-literal,import-star-module-level,raw-checker-failed,bad-inline-option,locally-disabled,locally-enabled,file-ignored,suppressed-message,useless-suppression,deprecated-pragma,apply-builtin,basestring-builtin,buffer-builtin,cmp-builtin,coerce-builtin,execfile-builtin,file-builtin,long-builtin,raw_input-builtin,reduce-builtin,standarderror-builtin,unicode-builtin,xrange-builtin,coerce-method,delslice-method,getslice-method,setslice-method,no-absolute-import,old-division,dict-iter-method,dict-view-method,next-method-called,metaclass-assignment,indexing-exception,raising-string,reload-builtin,oct-method,hex-method,nonzero-method,cmp-method,input-builtin,round-builtin,intern-builtin,unichr-builtin,map-builtin-not-iterating,zip-builtin-not-iterating,range-builtin-not-iterating,filter-builtin-not-iterating,using-cmp-argument,eq-without-hash,div-method,idiv-method,rdiv-method,exception-message-attribute,invalid-str-codec,sys-max-int,bad-python3-import,deprecated-string-function,deprecated-str-translate-call +disable=print-statement,parameter-unpacking,unpacking-in-except,old-raise-syntax,backtick,long-suffix,old-ne-operator,old-octal-literal,import-star-module-level,raw-checker-failed,bad-inline-option,locally-disabled,locally-enabled,file-ignored,suppressed-message,useless-suppression,deprecated-pragma,apply-builtin,basestring-builtin,buffer-builtin,cmp-builtin,coerce-builtin,execfile-builtin,file-builtin,long-builtin,raw_input-builtin,reduce-builtin,standarderror-builtin,unicode-builtin,xrange-builtin,coerce-method,delslice-method,getslice-method,setslice-method,no-absolute-import,old-division,dict-iter-method,dict-view-method,next-method-called,metaclass-assignment,indexing-exception,raising-string,reload-builtin,oct-method,hex-method,nonzero-method,cmp-method,input-builtin,round-builtin,intern-builtin,unichr-builtin,map-builtin-not-iterating,zip-builtin-not-iterating,range-builtin-not-iterating,filter-builtin-not-iterating,using-cmp-argument,eq-without-hash,div-method,idiv-method,rdiv-method,exception-message-attribute,invalid-str-codec,sys-max-int,bad-python3-import,deprecated-string-function,deprecated-str-translate-call,import-error + +# Enable the message, report, category or checker with the given id(s). You can +# either give multiple identifier separated by comma (,) or put this option +# multiple time (only on the command line, not in the configuration file where +# it should appear only once). See also the "--disable" option for examples. +enable= + + +[REPORTS] + +# Python expression which should return a note less than 10 (10 is the highest +# note). You have access to the variables errors warning, statement which +# respectively contain the number of errors / warnings messages and the total +# number of statements analyzed. This is used by the global evaluation report +# (RP0004). +evaluation=10.0 - ((float(5 * error + warning + refactor + convention) / statement) * 10) + +# Template used to display messages. This is a python new-style format string +# used to format the message information. See doc for all details +#msg-template= + +# Set the output format. Available formats are text, parseable, colorized, json +# and msvs (visual studio).You can also give a reporter class, eg +# mypackage.mymodule.MyReporterClass. +output-format=text + +# Tells whether to display a full report or only the messages +reports=no + +# Activate the evaluation score. +score=yes + + +[REFACTORING] + +# Maximum number of nested blocks for function / method body +max-nested-blocks=5 + + +[LOGGING] + +# Logging modules to check that the string format arguments are in logging +# function parameter format +logging-modules=logging + + +[SPELLING] + +# Spelling dictionary name. Available dictionaries: none. To make it working +# install python-enchant package. +spelling-dict= + +# List of comma separated words that should not be checked. +spelling-ignore-words= + +# A path to a file that contains private dictionary; one word per line. +spelling-private-dict-file= + +# Tells whether to store unknown words to indicated private dictionary in +# --spelling-private-dict-file option instead of raising a message. +spelling-store-unknown-words=no + + +[MISCELLANEOUS] + +# List of note tags to take in consideration, separated by a comma. +# notes=FIXME,XXX,TODO +notes=FIXME,XXX + + +[TYPECHECK] + +# List of decorators that produce context managers, such as +# contextlib.contextmanager. Add to this list to register other decorators that +# produce valid context managers. +contextmanager-decorators=contextlib.contextmanager + +# List of members which are set dynamically and missed by pylint inference +# system, and so shouldn't trigger E1101 when accessed. Python regular +# expressions are accepted. +generated-members= + +# Tells whether missing members accessed in mixin class should be ignored. A +# mixin class is detected if its name ends with "mixin" (case insensitive). +ignore-mixin-members=yes + +# This flag controls whether pylint should warn about no-member and similar +# checks whenever an opaque object is returned when inferring. The inference +# can return multiple potential results while evaluating a Python object, but +# some branches might not be evaluated, which results in partial inference. In +# that case, it might be useful to still emit no-member and other checks for +# the rest of the inferred objects. +ignore-on-opaque-inference=yes + +# List of class names for which member attributes should not be checked (useful +# for classes with dynamically set attributes). This supports the use of +# qualified names. +ignored-classes=optparse.Values,thread._local,_thread._local + +# List of module names for which member attributes should not be checked +# (useful for modules/projects where namespaces are manipulated during runtime +# and thus existing member attributes cannot be deduced by static analysis. It +# supports qualified module names, as well as Unix pattern matching. +ignored-modules=board + +# Show a hint with possible names when a member name was not found. The aspect +# of finding the hint is based on edit distance. +missing-member-hint=yes + +# The minimum edit distance a name should have in order to be considered a +# similar match for a missing member name. +missing-member-hint-distance=1 + +# The total number of similar names that should be taken in consideration when +# showing a hint for a missing member. +missing-member-max-choices=1 + + +[VARIABLES] + +# List of additional names supposed to be defined in builtins. Remember that +# you should avoid to define new builtins when possible. +additional-builtins= + +# Tells whether unused global variables should be treated as a violation. +allow-global-unused-variables=yes + +# List of strings which can identify a callback function by name. A callback +# name must start or end with one of those strings. +callbacks=cb_,_cb + +# A regular expression matching the name of dummy variables (i.e. expectedly +# not used). +dummy-variables-rgx=_+$|(_[a-zA-Z0-9_]*[a-zA-Z0-9]+?$)|dummy|^ignored_|^unused_ + +# Argument names that match this expression will be ignored. Default to name +# with leading underscore +ignored-argument-names=_.*|^ignored_|^unused_ + +# Tells whether we should check for unused import in __init__ files. +init-import=no + +# List of qualified module names which can have objects that can redefine +# builtins. +redefining-builtins-modules=six.moves,future.builtins + + +[FORMAT] + +# Expected format of line ending, e.g. empty (any line ending), LF or CRLF. +# expected-line-ending-format= +expected-line-ending-format=LF + +# Regexp for a line that is allowed to be longer than the limit. +ignore-long-lines=^\s*(# )??$ + +# Number of spaces of indent required inside a hanging or continued line. +indent-after-paren=4 + +# String used as indentation unit. This is usually " " (4 spaces) or "\t" (1 +# tab). +indent-string=' ' + +# Maximum number of characters on a single line. +max-line-length=100 + +# Maximum number of lines in a module +max-module-lines=1000 + +# List of optional constructs for which whitespace checking is disabled. `dict- +# separator` is used to allow tabulation in dicts, etc.: {1 : 1,\n222: 2}. +# `trailing-comma` allows a space between comma and closing bracket: (a, ). +# `empty-line` allows space-only lines. +no-space-check=trailing-comma,dict-separator + +# Allow the body of a class to be on the same line as the declaration if body +# contains single statement. +single-line-class-stmt=no + +# Allow the body of an if to be on the same line as the test if there is no +# else. +single-line-if-stmt=no + + +[SIMILARITIES] + +# Ignore comments when computing similarities. +ignore-comments=yes + +# Ignore docstrings when computing similarities. +ignore-docstrings=yes + +# Ignore imports when computing similarities. +ignore-imports=no + +# Minimum lines number of a similarity. +min-similarity-lines=4 + + +[BASIC] + +# Naming hint for argument names +argument-name-hint=(([a-z][a-z0-9_]{2,30})|(_[a-z0-9_]*))$ + +# Regular expression matching correct argument names +argument-rgx=(([a-z][a-z0-9_]{2,30})|(_[a-z0-9_]*))$ + +# Naming hint for attribute names +attr-name-hint=(([a-z][a-z0-9_]{2,30})|(_[a-z0-9_]*))$ + +# Regular expression matching correct attribute names +attr-rgx=(([a-z][a-z0-9_]{2,30})|(_[a-z0-9_]*))$ + +# Bad variable names which should always be refused, separated by a comma +bad-names=foo,bar,baz,toto,tutu,tata + +# Naming hint for class attribute names +class-attribute-name-hint=([A-Za-z_][A-Za-z0-9_]{2,30}|(__.*__))$ + +# Regular expression matching correct class attribute names +class-attribute-rgx=([A-Za-z_][A-Za-z0-9_]{2,30}|(__.*__))$ + +# Naming hint for class names +# class-name-hint=[A-Z_][a-zA-Z0-9]+$ +class-name-hint=[A-Z_][a-zA-Z0-9_]+$ + +# Regular expression matching correct class names +# class-rgx=[A-Z_][a-zA-Z0-9]+$ +class-rgx=[A-Z_][a-zA-Z0-9_]+$ + +# Naming hint for constant names +const-name-hint=(([A-Z_][A-Z0-9_]*)|(__.*__))$ + +# Regular expression matching correct constant names +const-rgx=(([A-Z_][A-Z0-9_]*)|(__.*__))$ + +# Minimum line length for functions/classes that require docstrings, shorter +# ones are exempt. +docstring-min-length=-1 + +# Naming hint for function names +function-name-hint=(([a-z][a-z0-9_]{2,30})|(_[a-z0-9_]*))$ + +# Regular expression matching correct function names +function-rgx=(([a-z][a-z0-9_]{2,30})|(_[a-z0-9_]*))$ + +# Good variable names which should always be accepted, separated by a comma +# good-names=i,j,k,ex,Run,_ +good-names=r,g,b,w,i,j,k,n,x,y,z,ex,ok,Run,_ + +# Include a hint for the correct naming format with invalid-name +include-naming-hint=no + +# Naming hint for inline iteration names +inlinevar-name-hint=[A-Za-z_][A-Za-z0-9_]*$ + +# Regular expression matching correct inline iteration names +inlinevar-rgx=[A-Za-z_][A-Za-z0-9_]*$ + +# Naming hint for method names +method-name-hint=(([a-z][a-z0-9_]{2,30})|(_[a-z0-9_]*))$ + +# Regular expression matching correct method names +method-rgx=(([a-z][a-z0-9_]{2,30})|(_[a-z0-9_]*))$ + +# Naming hint for module names +module-name-hint=(([a-z_][a-z0-9_]*)|([A-Z][a-zA-Z0-9]+))$ + +# Regular expression matching correct module names +module-rgx=(([a-z_][a-z0-9_]*)|([A-Z][a-zA-Z0-9]+))$ + +# Colon-delimited sets of names that determine each other's naming style when +# the name regexes allow several styles. +name-group= + +# Regular expression which should only match function or class names that do +# not require a docstring. +no-docstring-rgx=^_ + +# List of decorators that produce properties, such as abc.abstractproperty. Add +# to this list to register other decorators that produce valid properties. +property-classes=abc.abstractproperty + +# Naming hint for variable names +variable-name-hint=(([a-z][a-z0-9_]{2,30})|(_[a-z0-9_]*))$ + +# Regular expression matching correct variable names +variable-rgx=(([a-z][a-z0-9_]{2,30})|(_[a-z0-9_]*))$ + + +[IMPORTS] + +# Allow wildcard imports from modules that define __all__. +allow-wildcard-with-all=no + +# Analyse import fallback blocks. This can be used to support both Python 2 and +# 3 compatible code, which means that the block might have code that exists +# only in one or another interpreter, leading to false positives when analysed. +analyse-fallback-blocks=no + +# Deprecated modules which should not be used, separated by a comma +deprecated-modules=optparse,tkinter.tix + +# Create a graph of external dependencies in the given file (report RP0402 must +# not be disabled) +ext-import-graph= + +# Create a graph of every (i.e. internal and external) dependencies in the +# given file (report RP0402 must not be disabled) +import-graph= + +# Create a graph of internal dependencies in the given file (report RP0402 must +# not be disabled) +int-import-graph= + +# Force import order to recognize a module as part of the standard +# compatibility libraries. +known-standard-library= + +# Force import order to recognize a module as part of a third party library. +known-third-party=enchant + + +[CLASSES] + +# List of method names used to declare (i.e. assign) instance attributes. +defining-attr-methods=__init__,__new__,setUp + +# List of member names, which should be excluded from the protected access +# warning. +exclude-protected=_asdict,_fields,_replace,_source,_make + +# List of valid names for the first argument in a class method. +valid-classmethod-first-arg=cls + +# List of valid names for the first argument in a metaclass class method. +valid-metaclass-classmethod-first-arg=mcs + + +[DESIGN] + +# Maximum number of arguments for function / method +max-args=5 + +# Maximum number of attributes for a class (see R0902). +# max-attributes=7 +max-attributes=11 + +# Maximum number of boolean expressions in a if statement +max-bool-expr=5 + +# Maximum number of branch for function / method body +max-branches=12 + +# Maximum number of locals for function / method body +max-locals=15 + +# Maximum number of parents for a class (see R0901). +max-parents=7 + +# Maximum number of public methods for a class (see R0904). +max-public-methods=20 + +# Maximum number of return / yield for function / method body +max-returns=6 + +# Maximum number of statements in function / method body +max-statements=50 + +# Minimum number of public methods for a class (see R0903). +min-public-methods=1 + + +[EXCEPTIONS] + +# Exceptions that will emit a warning when being caught. Defaults to +# "Exception" +overgeneral-exceptions=Exception diff --git a/.readthedocs.yml b/.readthedocs.yml new file mode 100644 index 0000000..f4243ad --- /dev/null +++ b/.readthedocs.yml @@ -0,0 +1,3 @@ +python: + version: 3 +requirements_file: requirements.txt diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..a19bfed --- /dev/null +++ b/.travis.yml @@ -0,0 +1,48 @@ +# This is a common .travis.yml for generating library release zip files for +# CircuitPython library releases using circuitpython-build-tools. +# See https://github.com/adafruit/circuitpython-build-tools for detailed setup +# instructions. + +dist: xenial +language: python +python: + - "3.6" + +cache: + pip: true + +# TODO: if deployment to PyPi is desired, change 'DEPLOY_PYPI' to "true", +# or remove the env block entirely and remove the condition in the +# deploy block. +env: + - DEPLOY_PYPI="false" + +deploy: + - provider: releases + api_key: "$GITHUB_TOKEN" + file_glob: true + file: "$TRAVIS_BUILD_DIR/bundles/*" + skip_cleanup: true + overwrite: true + on: + tags: true + # TODO: Use 'travis encrypt --com -r adafruit/' to generate + # the encrypted password for adafruit-travis. Paste result below. + - provider: pypi + user: adafruit-travis + password: + secure: #-- PASTE ENCRYPTED PASSWORD HERE --# + on: + tags: true + condition: $DEPLOY_PYPI = "true" + +install: + - pip install -r requirements.txt + - pip install circuitpython-build-tools Sphinx sphinx-rtd-theme + - pip install --force-reinstall pylint==1.9.2 + +script: + - pylint adafruit_wsgi.py + - ([[ ! -d "examples" ]] || pylint --disable=missing-docstring,invalid-name,bad-whitespace examples/*.py) + - circuitpython-build-bundles --filename_prefix adafruit-circuitpython-wsgi --library_location . + - cd docs && sphinx-build -E -W -b html . _build/html && cd .. From edd61463e89fd64f1dd1865d221142b3e0acd5e0 Mon Sep 17 00:00:00 2001 From: Matt Costi Date: Mon, 14 Oct 2019 12:14:39 -0400 Subject: [PATCH 03/16] remove auto generated docs build --- docs/_build/html/.buildinfo | 4 - docs/_build/html/.doctrees/api.doctree | Bin 3276 -> 0 bytes docs/_build/html/.doctrees/environment.pickle | Bin 1574809 -> 0 bytes docs/_build/html/.doctrees/examples.doctree | Bin 2977 -> 0 bytes docs/_build/html/.doctrees/index.doctree | Bin 20352 -> 0 bytes docs/_build/html/_sources/api.rst.txt | 8 - docs/_build/html/_sources/examples.rst.txt | 8 - docs/_build/html/_sources/index.rst.txt | 51 - docs/_build/html/_static/basic.css | 764 -- docs/_build/html/_static/classic.css | 266 - docs/_build/html/_static/default.css | 1 - docs/_build/html/_static/doctools.js | 314 - .../html/_static/documentation_options.js | 10 - docs/_build/html/_static/favicon.ico | Bin 4414 -> 0 bytes docs/_build/html/_static/file.png | Bin 286 -> 0 bytes docs/_build/html/_static/jquery-3.4.1.js | 10598 ---------------- docs/_build/html/_static/jquery.js | 2 - docs/_build/html/_static/language_data.js | 297 - docs/_build/html/_static/minus.png | Bin 90 -> 0 bytes docs/_build/html/_static/plus.png | Bin 90 -> 0 bytes docs/_build/html/_static/pygments.css | 69 - docs/_build/html/_static/searchtools.js | 506 - docs/_build/html/_static/sidebar.js | 159 - docs/_build/html/_static/underscore-1.3.1.js | 999 -- docs/_build/html/_static/underscore.js | 31 - docs/_build/html/api.html | 94 - docs/_build/html/examples.html | 114 - docs/_build/html/genindex.html | 93 - docs/_build/html/index.html | 214 - docs/_build/html/objects.inv | Bin 298 -> 0 bytes docs/_build/html/py-modindex.html | 101 - docs/_build/html/search.html | 94 - docs/_build/html/searchindex.js | 1 - 33 files changed, 14798 deletions(-) delete mode 100644 docs/_build/html/.buildinfo delete mode 100644 docs/_build/html/.doctrees/api.doctree delete mode 100644 docs/_build/html/.doctrees/environment.pickle delete mode 100644 docs/_build/html/.doctrees/examples.doctree delete mode 100644 docs/_build/html/.doctrees/index.doctree delete mode 100644 docs/_build/html/_sources/api.rst.txt delete mode 100644 docs/_build/html/_sources/examples.rst.txt delete mode 100644 docs/_build/html/_sources/index.rst.txt delete mode 100644 docs/_build/html/_static/basic.css delete mode 100644 docs/_build/html/_static/classic.css delete mode 100644 docs/_build/html/_static/default.css delete mode 100644 docs/_build/html/_static/doctools.js delete mode 100644 docs/_build/html/_static/documentation_options.js delete mode 100644 docs/_build/html/_static/favicon.ico delete mode 100644 docs/_build/html/_static/file.png delete mode 100644 docs/_build/html/_static/jquery-3.4.1.js delete mode 100644 docs/_build/html/_static/jquery.js delete mode 100644 docs/_build/html/_static/language_data.js delete mode 100644 docs/_build/html/_static/minus.png delete mode 100644 docs/_build/html/_static/plus.png delete mode 100644 docs/_build/html/_static/pygments.css delete mode 100644 docs/_build/html/_static/searchtools.js delete mode 100644 docs/_build/html/_static/sidebar.js delete mode 100644 docs/_build/html/_static/underscore-1.3.1.js delete mode 100644 docs/_build/html/_static/underscore.js delete mode 100644 docs/_build/html/api.html delete mode 100644 docs/_build/html/examples.html delete mode 100644 docs/_build/html/genindex.html delete mode 100644 docs/_build/html/index.html delete mode 100644 docs/_build/html/objects.inv delete mode 100644 docs/_build/html/py-modindex.html delete mode 100644 docs/_build/html/search.html delete mode 100644 docs/_build/html/searchindex.js diff --git a/docs/_build/html/.buildinfo b/docs/_build/html/.buildinfo deleted file mode 100644 index ec97753..0000000 --- a/docs/_build/html/.buildinfo +++ /dev/null @@ -1,4 +0,0 @@ -# Sphinx build info version 1 -# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. -config: e238659d11b1f69af7ecff38526d4a39 -tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/docs/_build/html/.doctrees/api.doctree b/docs/_build/html/.doctrees/api.doctree deleted file mode 100644 index d519f7d04f2a01eddab6bc969fe5ab8a5acad1ce..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3276 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�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 diff --git a/docs/_build/html/.doctrees/examples.doctree b/docs/_build/html/.doctrees/examples.doctree deleted file mode 100644 index 1f5243411c101c3e6122d7baab36947090134d5c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2977 zcmb7GTW=dh6wb|d9LH{&5*|pR8lj4|C^1MppdutFAcTUfN(K5=5h`18F`2boimy-ai{Z0`3- z5R1g+f94N<&tK&CecSM<)tL!I?zf;3NEL-fB>D4PZuyoKfm1rE^<_ggW$Sru^N+l64|B)9nQ}P9fg`yscYU)8XXy7Lm56+p zjkrJH&KWhzV7Ul;SA`ZK`c@EeYazsUBjIuRwI62baxvn;wGm^|$$ZQ432o)FC*PAD z@+eRJ7(0mJW{?{F3(~fOuR=aHnR4uFWdi(vGIvrZ?Ag=rz8|2Hb|7Y)^0k+S z@;$rS$wtVyjePjT@KmnWX7FudGb8$Q6uTda8x@HDRGVwtpDHK&PAc2C%ko{8^*ixz zeQsIW0W!QOGaSk@s-rwd&*fb-=6(D=!0#S@AEGewf&56G%7@5eZ&8>sn?NUyqY-8$ znx}tYye!5gt>42%%cpA~eDT?ZRro$z z-(?r-VLty^gnR&sy7v9n=9{^NV4(PaROqi5?I8z=n{C16n{ ziTXsvpmigjOfo(ZD0hfy+rhQw?-&ti6S7dG00-PCAYsUDs#*vX0A~^&k-=Mq1f@+Z^?oTzt;j;nKnTz}60=lW!B$Te z5D6T+QC5}syv0Ig`6!}9swi8FX^;>7A(FAcKQD+Fkg3$zSmAP_tFf1glp!a9ISPt= z4@olOa81DWed%0k9}Nc6=@cwY_uQp6lL0QO0W|FZTtX+vBAsAP;O4{B5S@wi;@-!f zqAWc#4mRA7Wa;K?;l^o=XNeMST)2@gj^Lv0_z3t9oy@QH{W;JSvwE=V@L9>Dul&13 zG%5j^Qsw|H)hGmtJ9yR9OHAF7o#PUlv6@@D+!{x!N z3Z4fNw|ap7mNSKp5&1BjzRprGI6bzC2T?WauK*GqsAP;*FNXh^=)h*9b-g1Ik3@)h zoWqwC!ok`}5NUqRM9fvhc!(ES@ydDWcSUkTPa?lx(g5ZTC{jtNfNRHaLrer{1wFqF zM?i(c3lOyl=>hZtM71U@A4w3y+PGdc3H^9qLEa)^`7Mpq*0)LE<|&HxB9~@pl2t=(R;*j{)o z4jr%A2R9b?s6W}XRqbr~eN23{*unI0gF(UL(t=D%gY{sqi95Bp=*vM!TvLrD-GABW F@?VYHk(dAg diff --git a/docs/_build/html/.doctrees/index.doctree b/docs/_build/html/.doctrees/index.doctree deleted file mode 100644 index a1e3506995a79fdff4d898d619bdd2c70031ccad..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20352 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�FG`X#VS&14g{CS$y@L^x2FbU0me{m!(3uF;!FgUMUc8N!One+hK8~^7#<~@% zSa8LMbF$Jg-Ka%P3^$uBA)y8~6SYt>h3{F^4FU>=WY%)A+@<2sAE{TkX;V?yC_hpT zEc`xDe5vx~Db<8a;UL2a+5t9f(O^5pqFJt&G2Tne?(BHe(Sq-+=uxY!ri=%~@&bG>!th;6p)IkUyad>F10sJ`)D8^nkyf$y z9JO}AqI-d%=38(KnnQbL-ae7)Kt@) z_-xx~tK>rPuP)Ja;6$~-u^64$o28#nA|G2U^Yb$?y0KbC&7c~yIch;YQVSJF&4Fkf zoW$mNqg}rDp`*aetly}23_~T^FbAY7A9^0Xp=B9igAYS1r5IugY6en(Z#cz^lk86L zR7*|8E1kY7cI{th`}l0I#lY|>#}B3>H0j{w9mr9qkC44x!G;@Z>uS1zKgMUUJYw?c zprt{iUWg#U0b1V9pT(of*HHP21G}?s;tMHtkXT3-h(;<%MeCKQ4VR3*48~Us5{bVK zKJn_7+W@tt3fMzRA&6?ldbU?fu2VC_&9o*@5l*KQ01t_YzMfg7DZ)rF5c?J1Pf?rvU;-Wurx zeOiIO1cvGpR49Hgn6ddK`v~ped zg5PfMr^~O=;}_|&j~;KQO9i&hevmHzNtd_D^sy-#nOtC+2gY9FLobGVh{(zGUtY(|^VMf%z|D?)zx6eC~7{&3>6KbYM|H z@q6@(LqR)K?IpUDp!)TM)jo3_{ z!#UDt;N){zCRq|Cq=;laLEU_bsE4&L@Oi7|IjPX_s(U*M)7n#o9;f7}ywRRQ|F9{3 zNJea~v#;b0d{?N+;&Vb!EnqI%zAHLRwPB%nM_SA|xulbVP81o%6ZnkF{{xH> B-5~$~ diff --git a/docs/_build/html/_sources/api.rst.txt b/docs/_build/html/_sources/api.rst.txt deleted file mode 100644 index f721834..0000000 --- a/docs/_build/html/_sources/api.rst.txt +++ /dev/null @@ -1,8 +0,0 @@ - -.. If you created a package, create one automodule per module in the package. - -.. If your library file(s) are nested in a directory (e.g. /adafruit_foo/foo.py) -.. use this format as the module name: "adafruit_foo.foo" - -.. automodule:: adafruit_wsgi - :members: diff --git a/docs/_build/html/_sources/examples.rst.txt b/docs/_build/html/_sources/examples.rst.txt deleted file mode 100644 index fbb2994..0000000 --- a/docs/_build/html/_sources/examples.rst.txt +++ /dev/null @@ -1,8 +0,0 @@ -Simple test ------------- - -Ensure your device works with this simple test. - -.. literalinclude:: ../examples/wsgi_simpletest.py - :caption: examples/wsgi_simpletest.py - :linenos: diff --git a/docs/_build/html/_sources/index.rst.txt b/docs/_build/html/_sources/index.rst.txt deleted file mode 100644 index 6e7c5fe..0000000 --- a/docs/_build/html/_sources/index.rst.txt +++ /dev/null @@ -1,51 +0,0 @@ -.. include:: ../README.rst - -Table of Contents -================= - -.. toctree:: - :maxdepth: 4 - :hidden: - - self - -.. toctree:: - :caption: Examples - - examples - -.. toctree:: - :caption: API Reference - :maxdepth: 3 - - api - -.. toctree:: - :caption: Tutorials - -.. todo:: Add any Learn guide links here. If there are none, then simply delete this todo and leave - the toctree above for use later. - -.. toctree:: - :caption: Related Products - -.. todo:: Add any product links here. If there are none, then simply delete this todo and leave - the toctree above for use later. - -.. toctree:: - :caption: Other Links - - Download - CircuitPython Reference Documentation - CircuitPython Support Forum - Discord Chat - Adafruit Learning System - Adafruit Blog - Adafruit Store - -Indices and tables -================== - -* :ref:`genindex` -* :ref:`modindex` -* :ref:`search` diff --git a/docs/_build/html/_static/basic.css b/docs/_build/html/_static/basic.css deleted file mode 100644 index ea6972d..0000000 --- a/docs/_build/html/_static/basic.css +++ /dev/null @@ -1,764 +0,0 @@ -/* - * basic.css - * ~~~~~~~~~ - * - * Sphinx stylesheet -- basic theme. - * - * :copyright: Copyright 2007-2019 by the Sphinx team, see AUTHORS. - * :license: BSD, see LICENSE for details. - * - */ - -/* -- main layout ----------------------------------------------------------- */ - -div.clearer { - clear: both; -} - -/* -- relbar ---------------------------------------------------------------- */ - -div.related { - width: 100%; - font-size: 90%; -} - -div.related h3 { - display: none; -} - -div.related ul { - margin: 0; - padding: 0 0 0 10px; - list-style: none; -} - -div.related li { - display: inline; -} - -div.related li.right { - float: right; - margin-right: 5px; -} - -/* -- sidebar --------------------------------------------------------------- */ - -div.sphinxsidebarwrapper { - padding: 10px 5px 0 10px; -} - -div.sphinxsidebar { - float: left; - width: 230px; - margin-left: -100%; - font-size: 90%; - word-wrap: break-word; - overflow-wrap : break-word; -} - -div.sphinxsidebar ul { - list-style: none; -} - -div.sphinxsidebar ul ul, -div.sphinxsidebar ul.want-points { - margin-left: 20px; - list-style: square; -} - -div.sphinxsidebar ul ul { - margin-top: 0; - margin-bottom: 0; -} - -div.sphinxsidebar form { - margin-top: 10px; -} - -div.sphinxsidebar input { - border: 1px solid #98dbcc; - font-family: sans-serif; - font-size: 1em; -} - -div.sphinxsidebar #searchbox form.search { - overflow: hidden; -} - -div.sphinxsidebar #searchbox input[type="text"] { - float: left; - width: 80%; - padding: 0.25em; - box-sizing: border-box; -} - -div.sphinxsidebar #searchbox input[type="submit"] { - float: left; - width: 20%; - border-left: none; - padding: 0.25em; - box-sizing: border-box; -} - - -img { - border: 0; - max-width: 100%; -} - -/* -- search page ----------------------------------------------------------- */ - -ul.search { - margin: 10px 0 0 20px; - padding: 0; -} - -ul.search li { - padding: 5px 0 5px 20px; - background-image: url(file.png); - background-repeat: no-repeat; - background-position: 0 7px; -} - -ul.search li a { - font-weight: bold; -} - -ul.search li div.context { - color: #888; - margin: 2px 0 0 30px; - text-align: left; -} - -ul.keywordmatches li.goodmatch a { - font-weight: bold; -} - -/* -- index page ------------------------------------------------------------ */ - -table.contentstable { - width: 90%; - margin-left: auto; - margin-right: auto; -} - -table.contentstable p.biglink { - line-height: 150%; -} - -a.biglink { - font-size: 1.3em; -} - -span.linkdescr { - font-style: italic; - padding-top: 5px; - font-size: 90%; -} - -/* -- general index --------------------------------------------------------- */ - -table.indextable { - width: 100%; -} - -table.indextable td { - text-align: left; - vertical-align: top; -} - -table.indextable ul { - margin-top: 0; - margin-bottom: 0; - list-style-type: none; -} - -table.indextable > tbody > tr > td > ul { - padding-left: 0em; -} - -table.indextable tr.pcap { - height: 10px; -} - -table.indextable tr.cap { - margin-top: 10px; - background-color: #f2f2f2; -} - -img.toggler { - margin-right: 3px; - margin-top: 3px; - cursor: pointer; -} - -div.modindex-jumpbox { - border-top: 1px solid #ddd; - border-bottom: 1px solid #ddd; - margin: 1em 0 1em 0; - padding: 0.4em; -} - -div.genindex-jumpbox { - border-top: 1px solid #ddd; - border-bottom: 1px solid #ddd; - margin: 1em 0 1em 0; - padding: 0.4em; -} - -/* -- domain module index --------------------------------------------------- */ - -table.modindextable td { - padding: 2px; - border-collapse: collapse; -} - -/* -- general body styles --------------------------------------------------- */ - -div.body { - min-width: 450px; - max-width: 800px; -} - -div.body p, div.body dd, div.body li, div.body blockquote { - -moz-hyphens: auto; - -ms-hyphens: auto; - -webkit-hyphens: auto; - hyphens: auto; -} - -a.headerlink { - visibility: hidden; -} - -a.brackets:before, -span.brackets > a:before{ - content: "["; -} - -a.brackets:after, -span.brackets > a:after { - content: "]"; -} - -h1:hover > a.headerlink, -h2:hover > a.headerlink, -h3:hover > a.headerlink, -h4:hover > a.headerlink, -h5:hover > a.headerlink, -h6:hover > a.headerlink, -dt:hover > a.headerlink, -caption:hover > a.headerlink, -p.caption:hover > a.headerlink, -div.code-block-caption:hover > a.headerlink { - visibility: visible; -} - -div.body p.caption { - text-align: inherit; -} - -div.body td { - text-align: left; -} - -.first { - margin-top: 0 !important; -} - -p.rubric { - margin-top: 30px; - font-weight: bold; -} - -img.align-left, .figure.align-left, object.align-left { - clear: left; - float: left; - margin-right: 1em; -} - -img.align-right, .figure.align-right, object.align-right { - clear: right; - float: right; - margin-left: 1em; -} - -img.align-center, .figure.align-center, object.align-center { - display: block; - margin-left: auto; - margin-right: auto; -} - -img.align-default, .figure.align-default { - display: block; - margin-left: auto; - margin-right: auto; -} - -.align-left { - text-align: left; -} - -.align-center { - text-align: center; -} - -.align-default { - text-align: center; -} - -.align-right { - text-align: right; -} - -/* -- sidebars -------------------------------------------------------------- */ - -div.sidebar { - margin: 0 0 0.5em 1em; - border: 1px solid #ddb; - padding: 7px 7px 0 7px; - background-color: #ffe; - width: 40%; - float: right; -} - -p.sidebar-title { - font-weight: bold; -} - -/* -- topics ---------------------------------------------------------------- */ - -div.topic { - border: 1px solid #ccc; - padding: 7px 7px 0 7px; - margin: 10px 0 10px 0; -} - -p.topic-title { - font-size: 1.1em; - font-weight: bold; - margin-top: 10px; -} - -/* -- admonitions ----------------------------------------------------------- */ - -div.admonition { - margin-top: 10px; - margin-bottom: 10px; - padding: 7px; -} - -div.admonition dt { - font-weight: bold; -} - -div.admonition dl { - margin-bottom: 0; -} - -p.admonition-title { - margin: 0px 10px 5px 0px; - font-weight: bold; -} - -div.body p.centered { - text-align: center; - margin-top: 25px; -} - -/* -- tables ---------------------------------------------------------------- */ - -table.docutils { - border: 0; - border-collapse: collapse; -} - -table.align-center { - margin-left: auto; - margin-right: auto; -} - -table.align-default { - margin-left: auto; - margin-right: auto; -} - -table caption span.caption-number { - font-style: italic; -} - -table caption span.caption-text { -} - -table.docutils td, table.docutils th { - padding: 1px 8px 1px 5px; - border-top: 0; - border-left: 0; - border-right: 0; - border-bottom: 1px solid #aaa; -} - -table.footnote td, table.footnote th { - border: 0 !important; -} - -th { - text-align: left; - padding-right: 5px; -} - -table.citation { - border-left: solid 1px gray; - margin-left: 1px; -} - -table.citation td { - border-bottom: none; -} - -th > p:first-child, -td > p:first-child { - margin-top: 0px; -} - -th > p:last-child, -td > p:last-child { - margin-bottom: 0px; -} - -/* -- figures --------------------------------------------------------------- */ - -div.figure { - margin: 0.5em; - padding: 0.5em; -} - -div.figure p.caption { - padding: 0.3em; -} - -div.figure p.caption span.caption-number { - font-style: italic; -} - -div.figure p.caption span.caption-text { -} - -/* -- field list styles ----------------------------------------------------- */ - -table.field-list td, table.field-list th { - border: 0 !important; -} - -.field-list ul { - margin: 0; - padding-left: 1em; -} - -.field-list p { - margin: 0; -} - -.field-name { - -moz-hyphens: manual; - -ms-hyphens: manual; - -webkit-hyphens: manual; - hyphens: manual; -} - -/* -- hlist styles ---------------------------------------------------------- */ - -table.hlist td { - vertical-align: top; -} - - -/* -- other body styles ----------------------------------------------------- */ - -ol.arabic { - list-style: decimal; -} - -ol.loweralpha { - list-style: lower-alpha; -} - -ol.upperalpha { - list-style: upper-alpha; -} - -ol.lowerroman { - list-style: lower-roman; -} - -ol.upperroman { - list-style: upper-roman; -} - -li > p:first-child { - margin-top: 0px; -} - -li > p:last-child { - margin-bottom: 0px; -} - -dl.footnote > dt, -dl.citation > dt { - float: left; -} - -dl.footnote > dd, -dl.citation > dd { - margin-bottom: 0em; -} - -dl.footnote > dd:after, -dl.citation > dd:after { - content: ""; - clear: both; -} - -dl.field-list { - display: grid; - grid-template-columns: fit-content(30%) auto; -} - -dl.field-list > dt { - font-weight: bold; - word-break: break-word; - padding-left: 0.5em; - padding-right: 5px; -} - -dl.field-list > dt:after { - content: ":"; -} - -dl.field-list > dd { - padding-left: 0.5em; - margin-top: 0em; - margin-left: 0em; - margin-bottom: 0em; -} - -dl { - margin-bottom: 15px; -} - -dd > p:first-child { - margin-top: 0px; -} - -dd ul, dd table { - margin-bottom: 10px; -} - -dd { - margin-top: 3px; - margin-bottom: 10px; - margin-left: 30px; -} - -dt:target, span.highlighted { - background-color: #fbe54e; -} - -rect.highlighted { - fill: #fbe54e; -} - -dl.glossary dt { - font-weight: bold; - font-size: 1.1em; -} - -.optional { - font-size: 1.3em; -} - -.sig-paren { - font-size: larger; -} - -.versionmodified { - font-style: italic; -} - -.system-message { - background-color: #fda; - padding: 5px; - border: 3px solid red; -} - -.footnote:target { - background-color: #ffa; -} - -.line-block { - display: block; - margin-top: 1em; - margin-bottom: 1em; -} - -.line-block .line-block { - margin-top: 0; - margin-bottom: 0; - margin-left: 1.5em; -} - -.guilabel, .menuselection { - font-family: sans-serif; -} - -.accelerator { - text-decoration: underline; -} - -.classifier { - font-style: oblique; -} - -.classifier:before { - font-style: normal; - margin: 0.5em; - content: ":"; -} - -abbr, acronym { - border-bottom: dotted 1px; - cursor: help; -} - -/* -- code displays --------------------------------------------------------- */ - -pre { - overflow: auto; - overflow-y: hidden; /* fixes display issues on Chrome browsers */ -} - -span.pre { - -moz-hyphens: none; - -ms-hyphens: none; - -webkit-hyphens: none; - hyphens: none; -} - -td.linenos pre { - padding: 5px 0px; - border: 0; - background-color: transparent; - color: #aaa; -} - -table.highlighttable { - margin-left: 0.5em; -} - -table.highlighttable td { - padding: 0 0.5em 0 0.5em; -} - -div.code-block-caption { - padding: 2px 5px; - font-size: small; -} - -div.code-block-caption code { - background-color: transparent; -} - -div.code-block-caption + div > div.highlight > pre { - margin-top: 0; -} - -div.code-block-caption span.caption-number { - padding: 0.1em 0.3em; - font-style: italic; -} - -div.code-block-caption span.caption-text { -} - -div.literal-block-wrapper { - padding: 1em 1em 0; -} - -div.literal-block-wrapper div.highlight { - margin: 0; -} - -code.descname { - background-color: transparent; - font-weight: bold; - font-size: 1.2em; -} - -code.descclassname { - background-color: transparent; -} - -code.xref, a code { - background-color: transparent; - font-weight: bold; -} - -h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { - background-color: transparent; -} - -.viewcode-link { - float: right; -} - -.viewcode-back { - float: right; - font-family: sans-serif; -} - -div.viewcode-block:target { - margin: -1px -10px; - padding: 0 10px; -} - -/* -- math display ---------------------------------------------------------- */ - -img.math { - vertical-align: middle; -} - -div.body div.math p { - text-align: center; -} - -span.eqno { - float: right; -} - -span.eqno a.headerlink { - position: relative; - left: 0px; - z-index: 1; -} - -div.math:hover a.headerlink { - visibility: visible; -} - -/* -- printout stylesheet --------------------------------------------------- */ - -@media print { - div.document, - div.documentwrapper, - div.bodywrapper { - margin: 0 !important; - width: 100%; - } - - div.sphinxsidebar, - div.related, - div.footer, - #top-link { - display: none; - } -} \ No newline at end of file diff --git a/docs/_build/html/_static/classic.css b/docs/_build/html/_static/classic.css deleted file mode 100644 index a414f1f..0000000 --- a/docs/_build/html/_static/classic.css +++ /dev/null @@ -1,266 +0,0 @@ -/* - * classic.css_t - * ~~~~~~~~~~~~~ - * - * Sphinx stylesheet -- classic theme. - * - * :copyright: Copyright 2007-2019 by the Sphinx team, see AUTHORS. - * :license: BSD, see LICENSE for details. - * - */ - -@import url("basic.css"); - -/* -- page layout ----------------------------------------------------------- */ - -html { - /* CSS hack for macOS's scrollbar (see #1125) */ - background-color: #FFFFFF; -} - -body { - font-family: sans-serif; - font-size: 100%; - background-color: #11303d; - color: #000; - margin: 0; - padding: 0; -} - -div.document { - background-color: #1c4e63; -} - -div.documentwrapper { - float: left; - width: 100%; -} - -div.bodywrapper { - margin: 0 0 0 230px; -} - -div.body { - background-color: #ffffff; - color: #000000; - padding: 0 20px 30px 20px; -} - -div.footer { - color: #ffffff; - width: 100%; - padding: 9px 0 9px 0; - text-align: center; - font-size: 75%; -} - -div.footer a { - color: #ffffff; - text-decoration: underline; -} - -div.related { - background-color: #133f52; - line-height: 30px; - color: #ffffff; -} - -div.related a { - color: #ffffff; -} - -div.sphinxsidebar { -} - -div.sphinxsidebar h3 { - font-family: 'Trebuchet MS', sans-serif; - color: #ffffff; - font-size: 1.4em; - font-weight: normal; - margin: 0; - padding: 0; -} - -div.sphinxsidebar h3 a { - color: #ffffff; -} - -div.sphinxsidebar h4 { - font-family: 'Trebuchet MS', sans-serif; - color: #ffffff; - font-size: 1.3em; - font-weight: normal; - margin: 5px 0 0 0; - padding: 0; -} - -div.sphinxsidebar p { - color: #ffffff; -} - -div.sphinxsidebar p.topless { - margin: 5px 10px 10px 10px; -} - -div.sphinxsidebar ul { - margin: 10px; - padding: 0; - color: #ffffff; -} - -div.sphinxsidebar a { - color: #98dbcc; -} - -div.sphinxsidebar input { - border: 1px solid #98dbcc; - font-family: sans-serif; - font-size: 1em; -} - - - -/* -- hyperlink styles ------------------------------------------------------ */ - -a { - color: #355f7c; - text-decoration: none; -} - -a:visited { - color: #355f7c; - text-decoration: none; -} - -a:hover { - text-decoration: underline; -} - - - -/* -- body styles ----------------------------------------------------------- */ - -div.body h1, -div.body h2, -div.body h3, -div.body h4, -div.body h5, -div.body h6 { - font-family: 'Trebuchet MS', sans-serif; - background-color: #f2f2f2; - font-weight: normal; - color: #20435c; - border-bottom: 1px solid #ccc; - margin: 20px -20px 10px -20px; - padding: 3px 0 3px 10px; -} - -div.body h1 { margin-top: 0; font-size: 200%; } -div.body h2 { font-size: 160%; } -div.body h3 { font-size: 140%; } -div.body h4 { font-size: 120%; } -div.body h5 { font-size: 110%; } -div.body h6 { font-size: 100%; } - -a.headerlink { - color: #c60f0f; - font-size: 0.8em; - padding: 0 4px 0 4px; - text-decoration: none; -} - -a.headerlink:hover { - background-color: #c60f0f; - color: white; -} - -div.body p, div.body dd, div.body li, div.body blockquote { - text-align: justify; - line-height: 130%; -} - -div.admonition p.admonition-title + p { - display: inline; -} - -div.admonition p { - margin-bottom: 5px; -} - -div.admonition pre { - margin-bottom: 5px; -} - -div.admonition ul, div.admonition ol { - margin-bottom: 5px; -} - -div.note { - background-color: #eee; - border: 1px solid #ccc; -} - -div.seealso { - background-color: #ffc; - border: 1px solid #ff6; -} - -div.topic { - background-color: #eee; -} - -div.warning { - background-color: #ffe4e4; - border: 1px solid #f66; -} - -p.admonition-title { - display: inline; -} - -p.admonition-title:after { - content: ":"; -} - -pre { - padding: 5px; - background-color: #eeffcc; - color: #333333; - line-height: 120%; - border: 1px solid #ac9; - border-left: none; - border-right: none; -} - -code { - background-color: #ecf0f3; - padding: 0 1px 0 1px; - font-size: 0.95em; -} - -th, dl.field-list > dt { - background-color: #ede; -} - -.warning code { - background: #efc2c2; -} - -.note code { - background: #d6d6d6; -} - -.viewcode-back { - font-family: sans-serif; -} - -div.viewcode-block:target { - background-color: #f4debf; - border-top: 1px solid #ac9; - border-bottom: 1px solid #ac9; -} - -div.code-block-caption { - color: #efefef; - background-color: #1c4e63; -} \ No newline at end of file diff --git a/docs/_build/html/_static/default.css b/docs/_build/html/_static/default.css deleted file mode 100644 index 81b9363..0000000 --- a/docs/_build/html/_static/default.css +++ /dev/null @@ -1 +0,0 @@ -@import url("classic.css"); diff --git a/docs/_build/html/_static/doctools.js b/docs/_build/html/_static/doctools.js deleted file mode 100644 index b33f87f..0000000 --- a/docs/_build/html/_static/doctools.js +++ /dev/null @@ -1,314 +0,0 @@ -/* - * doctools.js - * ~~~~~~~~~~~ - * - * Sphinx JavaScript utilities for all documentation. - * - * :copyright: Copyright 2007-2019 by the Sphinx team, see AUTHORS. - * :license: BSD, see LICENSE for details. - * - */ - -/** - * select a different prefix for underscore - */ -$u = _.noConflict(); - -/** - * make the code below compatible with browsers without - * an installed firebug like debugger -if (!window.console || !console.firebug) { - var names = ["log", "debug", "info", "warn", "error", "assert", "dir", - "dirxml", "group", "groupEnd", "time", "timeEnd", "count", "trace", - "profile", "profileEnd"]; - window.console = {}; - for (var i = 0; i < names.length; ++i) - window.console[names[i]] = function() {}; -} - */ - -/** - * small helper function to urldecode strings - */ -jQuery.urldecode = function(x) { - return decodeURIComponent(x).replace(/\+/g, ' '); -}; - -/** - * small helper function to urlencode strings - */ -jQuery.urlencode = encodeURIComponent; - -/** - * This function returns the parsed url parameters of the - * current request. Multiple values per key are supported, - * it will always return arrays of strings for the value parts. - */ -jQuery.getQueryParameters = function(s) { - if (typeof s === 'undefined') - s = document.location.search; - var parts = s.substr(s.indexOf('?') + 1).split('&'); - var result = {}; - for (var i = 0; i < parts.length; i++) { - var tmp = parts[i].split('=', 2); - var key = jQuery.urldecode(tmp[0]); - var value = jQuery.urldecode(tmp[1]); - if (key in result) - result[key].push(value); - else - result[key] = [value]; - } - return result; -}; - -/** - * highlight a given string on a jquery object by wrapping it in - * span elements with the given class name. - */ -jQuery.fn.highlightText = function(text, className) { - function highlight(node, addItems) { - if (node.nodeType === 3) { - var val = node.nodeValue; - var pos = val.toLowerCase().indexOf(text); - if (pos >= 0 && - !jQuery(node.parentNode).hasClass(className) && - !jQuery(node.parentNode).hasClass("nohighlight")) { - var span; - var isInSVG = jQuery(node).closest("body, svg, foreignObject").is("svg"); - if (isInSVG) { - span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); - } else { - span = document.createElement("span"); - span.className = className; - } - span.appendChild(document.createTextNode(val.substr(pos, text.length))); - node.parentNode.insertBefore(span, node.parentNode.insertBefore( - document.createTextNode(val.substr(pos + text.length)), - node.nextSibling)); - node.nodeValue = val.substr(0, pos); - if (isInSVG) { - var rect = document.createElementNS("http://www.w3.org/2000/svg", "rect"); - var bbox = node.parentElement.getBBox(); - rect.x.baseVal.value = bbox.x; - rect.y.baseVal.value = bbox.y; - rect.width.baseVal.value = bbox.width; - rect.height.baseVal.value = bbox.height; - rect.setAttribute('class', className); - addItems.push({ - "parent": node.parentNode, - "target": rect}); - } - } - } - else if (!jQuery(node).is("button, select, textarea")) { - jQuery.each(node.childNodes, function() { - highlight(this, addItems); - }); - } - } - var addItems = []; - var result = this.each(function() { - highlight(this, addItems); - }); - for (var i = 0; i < addItems.length; ++i) { - jQuery(addItems[i].parent).before(addItems[i].target); - } - return result; -}; - -/* - * backward compatibility for jQuery.browser - * This will be supported until firefox bug is fixed. - */ -if (!jQuery.browser) { - jQuery.uaMatch = function(ua) { - ua = ua.toLowerCase(); - - var match = /(chrome)[ \/]([\w.]+)/.exec(ua) || - /(webkit)[ \/]([\w.]+)/.exec(ua) || - /(opera)(?:.*version|)[ \/]([\w.]+)/.exec(ua) || - /(msie) ([\w.]+)/.exec(ua) || - ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec(ua) || - []; - - return { - browser: match[ 1 ] || "", - version: match[ 2 ] || "0" - }; - }; - jQuery.browser = {}; - jQuery.browser[jQuery.uaMatch(navigator.userAgent).browser] = true; -} - -/** - * Small JavaScript module for the documentation. - */ -var Documentation = { - - init : function() { - this.fixFirefoxAnchorBug(); - this.highlightSearchWords(); - this.initIndexTable(); - if (DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) { - this.initOnKeyListeners(); - } - }, - - /** - * i18n support - */ - TRANSLATIONS : {}, - PLURAL_EXPR : function(n) { return n === 1 ? 0 : 1; }, - LOCALE : 'unknown', - - // gettext and ngettext don't access this so that the functions - // can safely bound to a different name (_ = Documentation.gettext) - gettext : function(string) { - var translated = Documentation.TRANSLATIONS[string]; - if (typeof translated === 'undefined') - return string; - return (typeof translated === 'string') ? translated : translated[0]; - }, - - ngettext : function(singular, plural, n) { - var translated = Documentation.TRANSLATIONS[singular]; - if (typeof translated === 'undefined') - return (n == 1) ? singular : plural; - return translated[Documentation.PLURALEXPR(n)]; - }, - - addTranslations : function(catalog) { - for (var key in catalog.messages) - this.TRANSLATIONS[key] = catalog.messages[key]; - this.PLURAL_EXPR = new Function('n', 'return +(' + catalog.plural_expr + ')'); - this.LOCALE = catalog.locale; - }, - - /** - * add context elements like header anchor links - */ - addContextElements : function() { - $('div[id] > :header:first').each(function() { - $('\u00B6'). - attr('href', '#' + this.id). - attr('title', _('Permalink to this headline')). - appendTo(this); - }); - $('dt[id]').each(function() { - $('\u00B6'). - attr('href', '#' + this.id). - attr('title', _('Permalink to this definition')). - appendTo(this); - }); - }, - - /** - * workaround a firefox stupidity - * see: https://bugzilla.mozilla.org/show_bug.cgi?id=645075 - */ - fixFirefoxAnchorBug : function() { - if (document.location.hash && $.browser.mozilla) - window.setTimeout(function() { - document.location.href += ''; - }, 10); - }, - - /** - * highlight the search words provided in the url in the text - */ - highlightSearchWords : function() { - var params = $.getQueryParameters(); - var terms = (params.highlight) ? params.highlight[0].split(/\s+/) : []; - if (terms.length) { - var body = $('div.body'); - if (!body.length) { - body = $('body'); - } - window.setTimeout(function() { - $.each(terms, function() { - body.highlightText(this.toLowerCase(), 'highlighted'); - }); - }, 10); - $('') - .appendTo($('#searchbox')); - } - }, - - /** - * init the domain index toggle buttons - */ - initIndexTable : function() { - var togglers = $('img.toggler').click(function() { - var src = $(this).attr('src'); - var idnum = $(this).attr('id').substr(7); - $('tr.cg-' + idnum).toggle(); - if (src.substr(-9) === 'minus.png') - $(this).attr('src', src.substr(0, src.length-9) + 'plus.png'); - else - $(this).attr('src', src.substr(0, src.length-8) + 'minus.png'); - }).css('display', ''); - if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) { - togglers.click(); - } - }, - - /** - * helper function to hide the search marks again - */ - hideSearchWords : function() { - $('#searchbox .highlight-link').fadeOut(300); - $('span.highlighted').removeClass('highlighted'); - }, - - /** - * make the url absolute - */ - makeURL : function(relativeURL) { - return DOCUMENTATION_OPTIONS.URL_ROOT + '/' + relativeURL; - }, - - /** - * get the current relative url - */ - getCurrentURL : function() { - var path = document.location.pathname; - var parts = path.split(/\//); - $.each(DOCUMENTATION_OPTIONS.URL_ROOT.split(/\//), function() { - if (this === '..') - parts.pop(); - }); - var url = parts.join('/'); - return path.substring(url.lastIndexOf('/') + 1, path.length - 1); - }, - - initOnKeyListeners: function() { - $(document).keyup(function(event) { - var activeElementType = document.activeElement.tagName; - // don't navigate when in search box or textarea - if (activeElementType !== 'TEXTAREA' && activeElementType !== 'INPUT' && activeElementType !== 'SELECT') { - switch (event.keyCode) { - case 37: // left - var prevHref = $('link[rel="prev"]').prop('href'); - if (prevHref) { - window.location.href = prevHref; - return false; - } - case 39: // right - var nextHref = $('link[rel="next"]').prop('href'); - if (nextHref) { - window.location.href = nextHref; - return false; - } - } - } - }); - } -}; - -// quick alias for translations -_ = Documentation.gettext; - -$(document).ready(function() { - Documentation.init(); -}); diff --git a/docs/_build/html/_static/documentation_options.js b/docs/_build/html/_static/documentation_options.js deleted file mode 100644 index ad3a3d9..0000000 --- a/docs/_build/html/_static/documentation_options.js +++ /dev/null @@ -1,10 +0,0 @@ -var DOCUMENTATION_OPTIONS = { - URL_ROOT: document.getElementById("documentation_options").getAttribute('data-url_root'), - VERSION: '1.0', - LANGUAGE: 'None', - COLLAPSE_INDEX: false, - FILE_SUFFIX: '.html', - HAS_SOURCE: true, - SOURCELINK_SUFFIX: '.txt', - NAVIGATION_WITH_KEYS: false -}; \ No newline at end of file diff --git a/docs/_build/html/_static/favicon.ico b/docs/_build/html/_static/favicon.ico deleted file mode 100644 index 5aca98376a1f7e593ebd9cf41a808512c2135635..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4414 zcmd^BX;4#F6n=SG-XmlONeGrD5E6J{RVh+e928U#MG!$jWvO+UsvWh`x&VqGNx*en zx=qox7Dqv{kPwo%fZC$dDwVpRtz{HzTkSs8QhG0)%Y=-3@Kt!4ag|JcIo?$-F|?bXVS9UDUyev>MVZQ(H8K4#;BQW-t2CPorj8^KJrMX}QK zp+e<;4ldpXz~=)2GxNy811&)gt-}Q*yVQpsxr@VMoA##{)$1~=bZ1MmjeFw?uT(`8 z^g=09<=zW%r%buwN%iHtuKSg|+r7HkT0PYN*_u9k1;^Ss-Z!RBfJ?Un4w(awqp2b3 z%+myoFis_lTlCrGx2z$0BQdh+7?!JK#9K9@Z!VrG zNj6gK5r(b4?YDOLw|DPRoN7bdP{(>GEG41YcN~4r_SUHU2hgVtUwZG@s%edC;k7Sn zC)RvEnlq~raE2mY2ko64^m1KQL}3riixh?#J{o)IT+K-RdHae2eRX91-+g!y`8^># z-zI0ir>P%Xon)!@xp-BK2bDYUB9k613NRrY6%lVjbFcQc*pRqiK~8xtkNPLxt}e?&QsTB}^!39t_%Qb)~Ukn0O%iC;zt z<&A-y;3h++)>c1br`5VFM~5(83!HKx$L+my8sW_c#@x*|*vB1yU)_dt3vH;2hqPWx zAl^6@?ipx&U7pf`a*>Yq6C85nb+B=Fnn+(id$W#WB^uHAcZVG`qg;rWB}ubvi(Y>D z$ei>REw$#xp0SHAd^|1hq&9HJ=jKK8^zTH~nk)G?yUcmTh9vUM6Y0LMw4(gYVY$D$ zGl&WY&H<)BbJ&3sYbKjx1j^=3-0Q#f^}(aP1?8^`&FUWMp|rmtpK)bLQ1Zo?^s4jqK=Lfg*9&geMGVQ z#^-*!V`fG@;H&{M9S8%+;|h&Qrxym0Ar>WT4BCVLR8cGXF=JmEYN(sNT(9vl+S|%g z8r7nXQ(95i^`=+XHo|){$vf2$?=`F$^&wFlYXyXg$B{a>$-Fp+V}+D;9k=~Xl~?C4 zAB-;RKXdUzBJE{V&d&%R>aEfFe;vxqI$0@hwVM}gFeQR@j}a>DDxR+n+-*6|_)k%% z*mSpDV|=5I9!&VC&9tD%fcVygWZV!iIo2qFtm#!*(s|@ZT33*Ad;+<|3^+yrp*;oH zBSYLV(H1zTU?2WjrCQoQW)Z>J2a=dTriuvezBmu16`tM2fm7Q@d4^iqII-xFpwHGI zn9CL}QE*1vdj2PX{PIuqOe5dracsciH6OlAZATvE8rj6ykqdIjal2 z0S0S~PwHb-5?OQ-tU-^KTG@XNrEVSvo|HIP?H;7ZhYeZkhSqh-{reE!5di;1zk$#Y zCe7rOnlzFYJ6Z#Hm$GoidKB=2HBCwm`BbZVeZY4ukmG%1uz7p2URs6c9j-Gjj^oQV zsdDb3@k2e`C$1I5ML5U0Qs0C1GAp^?!*`=|Nm(vWz3j*j*8ucum2;r0^-6Aca=Gv) zc%}&;!+_*S2tlnnJnz0EKeRmw-Y!@9ob!XQBwiv}^u9MkaXHvM=!<3YX;+2#5Cj5pp?FEK750S3BgeSDtaE^ zXUM@xoV6yBFKfzvY20V&Lr0yCs`hMrGg#P~ix$^RISR_I47Y|r1 z_CyJOe}D1){SET-^Amu_i71Lt6eYfZjRyw@I6OQAIXXHDfiX^GbOlHe=Ae4>0m)d(f|Me07*qoM6N<$f}vM^LjV8( diff --git a/docs/_build/html/_static/jquery-3.4.1.js b/docs/_build/html/_static/jquery-3.4.1.js deleted file mode 100644 index 773ad95..0000000 --- a/docs/_build/html/_static/jquery-3.4.1.js +++ /dev/null @@ -1,10598 +0,0 @@ -/*! - * jQuery JavaScript Library v3.4.1 - * https://jquery.com/ - * - * Includes Sizzle.js - * https://sizzlejs.com/ - * - * Copyright JS Foundation and other contributors - * Released under the MIT license - * https://jquery.org/license - * - * Date: 2019-05-01T21:04Z - */ -( function( global, factory ) { - - "use strict"; - - if ( typeof module === "object" && typeof module.exports === "object" ) { - - // For CommonJS and CommonJS-like environments where a proper `window` - // is present, execute the factory and get jQuery. - // For environments that do not have a `window` with a `document` - // (such as Node.js), expose a factory as module.exports. - // This accentuates the need for the creation of a real `window`. - // e.g. var jQuery = require("jquery")(window); - // See ticket #14549 for more info. - module.exports = global.document ? - factory( global, true ) : - function( w ) { - if ( !w.document ) { - throw new Error( "jQuery requires a window with a document" ); - } - return factory( w ); - }; - } else { - factory( global ); - } - -// Pass this if window is not defined yet -} )( typeof window !== "undefined" ? window : this, function( window, noGlobal ) { - -// Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1 -// throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode -// arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), strict mode should be common -// enough that all such attempts are guarded in a try block. -"use strict"; - -var arr = []; - -var document = window.document; - -var getProto = Object.getPrototypeOf; - -var slice = arr.slice; - -var concat = arr.concat; - -var push = arr.push; - -var indexOf = arr.indexOf; - -var class2type = {}; - -var toString = class2type.toString; - -var hasOwn = class2type.hasOwnProperty; - -var fnToString = hasOwn.toString; - -var ObjectFunctionString = fnToString.call( Object ); - -var support = {}; - -var isFunction = function isFunction( obj ) { - - // Support: Chrome <=57, Firefox <=52 - // In some browsers, typeof returns "function" for HTML elements - // (i.e., `typeof document.createElement( "object" ) === "function"`). - // We don't want to classify *any* DOM node as a function. - return typeof obj === "function" && typeof obj.nodeType !== "number"; - }; - - -var isWindow = function isWindow( obj ) { - return obj != null && obj === obj.window; - }; - - - - - var preservedScriptAttributes = { - type: true, - src: true, - nonce: true, - noModule: true - }; - - function DOMEval( code, node, doc ) { - doc = doc || document; - - var i, val, - script = doc.createElement( "script" ); - - script.text = code; - if ( node ) { - for ( i in preservedScriptAttributes ) { - - // Support: Firefox 64+, Edge 18+ - // Some browsers don't support the "nonce" property on scripts. - // On the other hand, just using `getAttribute` is not enough as - // the `nonce` attribute is reset to an empty string whenever it - // becomes browsing-context connected. - // See https://github.com/whatwg/html/issues/2369 - // See https://html.spec.whatwg.org/#nonce-attributes - // The `node.getAttribute` check was added for the sake of - // `jQuery.globalEval` so that it can fake a nonce-containing node - // via an object. - val = node[ i ] || node.getAttribute && node.getAttribute( i ); - if ( val ) { - script.setAttribute( i, val ); - } - } - } - doc.head.appendChild( script ).parentNode.removeChild( script ); - } - - -function toType( obj ) { - if ( obj == null ) { - return obj + ""; - } - - // Support: Android <=2.3 only (functionish RegExp) - return typeof obj === "object" || typeof obj === "function" ? - class2type[ toString.call( obj ) ] || "object" : - typeof obj; -} -/* global Symbol */ -// Defining this global in .eslintrc.json would create a danger of using the global -// unguarded in another place, it seems safer to define global only for this module - - - -var - version = "3.4.1", - - // Define a local copy of jQuery - jQuery = function( selector, context ) { - - // The jQuery object is actually just the init constructor 'enhanced' - // Need init if jQuery is called (just allow error to be thrown if not included) - return new jQuery.fn.init( selector, context ); - }, - - // Support: Android <=4.0 only - // Make sure we trim BOM and NBSP - rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g; - -jQuery.fn = jQuery.prototype = { - - // The current version of jQuery being used - jquery: version, - - constructor: jQuery, - - // The default length of a jQuery object is 0 - length: 0, - - toArray: function() { - return slice.call( this ); - }, - - // Get the Nth element in the matched element set OR - // Get the whole matched element set as a clean array - get: function( num ) { - - // Return all the elements in a clean array - if ( num == null ) { - return slice.call( this ); - } - - // Return just the one element from the set - return num < 0 ? this[ num + this.length ] : this[ num ]; - }, - - // Take an array of elements and push it onto the stack - // (returning the new matched element set) - pushStack: function( elems ) { - - // Build a new jQuery matched element set - var ret = jQuery.merge( this.constructor(), elems ); - - // Add the old object onto the stack (as a reference) - ret.prevObject = this; - - // Return the newly-formed element set - return ret; - }, - - // Execute a callback for every element in the matched set. - each: function( callback ) { - return jQuery.each( this, callback ); - }, - - map: function( callback ) { - return this.pushStack( jQuery.map( this, function( elem, i ) { - return callback.call( elem, i, elem ); - } ) ); - }, - - slice: function() { - return this.pushStack( slice.apply( this, arguments ) ); - }, - - first: function() { - return this.eq( 0 ); - }, - - last: function() { - return this.eq( -1 ); - }, - - eq: function( i ) { - var len = this.length, - j = +i + ( i < 0 ? len : 0 ); - return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] ); - }, - - end: function() { - return this.prevObject || this.constructor(); - }, - - // For internal use only. - // Behaves like an Array's method, not like a jQuery method. - push: push, - sort: arr.sort, - splice: arr.splice -}; - -jQuery.extend = jQuery.fn.extend = function() { - var options, name, src, copy, copyIsArray, clone, - target = arguments[ 0 ] || {}, - i = 1, - length = arguments.length, - deep = false; - - // Handle a deep copy situation - if ( typeof target === "boolean" ) { - deep = target; - - // Skip the boolean and the target - target = arguments[ i ] || {}; - i++; - } - - // Handle case when target is a string or something (possible in deep copy) - if ( typeof target !== "object" && !isFunction( target ) ) { - target = {}; - } - - // Extend jQuery itself if only one argument is passed - if ( i === length ) { - target = this; - i--; - } - - for ( ; i < length; i++ ) { - - // Only deal with non-null/undefined values - if ( ( options = arguments[ i ] ) != null ) { - - // Extend the base object - for ( name in options ) { - copy = options[ name ]; - - // Prevent Object.prototype pollution - // Prevent never-ending loop - if ( name === "__proto__" || target === copy ) { - continue; - } - - // Recurse if we're merging plain objects or arrays - if ( deep && copy && ( jQuery.isPlainObject( copy ) || - ( copyIsArray = Array.isArray( copy ) ) ) ) { - src = target[ name ]; - - // Ensure proper type for the source value - if ( copyIsArray && !Array.isArray( src ) ) { - clone = []; - } else if ( !copyIsArray && !jQuery.isPlainObject( src ) ) { - clone = {}; - } else { - clone = src; - } - copyIsArray = false; - - // Never move original objects, clone them - target[ name ] = jQuery.extend( deep, clone, copy ); - - // Don't bring in undefined values - } else if ( copy !== undefined ) { - target[ name ] = copy; - } - } - } - } - - // Return the modified object - return target; -}; - -jQuery.extend( { - - // Unique for each copy of jQuery on the page - expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ), - - // Assume jQuery is ready without the ready module - isReady: true, - - error: function( msg ) { - throw new Error( msg ); - }, - - noop: function() {}, - - isPlainObject: function( obj ) { - var proto, Ctor; - - // Detect obvious negatives - // Use toString instead of jQuery.type to catch host objects - if ( !obj || toString.call( obj ) !== "[object Object]" ) { - return false; - } - - proto = getProto( obj ); - - // Objects with no prototype (e.g., `Object.create( null )`) are plain - if ( !proto ) { - return true; - } - - // Objects with prototype are plain iff they were constructed by a global Object function - Ctor = hasOwn.call( proto, "constructor" ) && proto.constructor; - return typeof Ctor === "function" && fnToString.call( Ctor ) === ObjectFunctionString; - }, - - isEmptyObject: function( obj ) { - var name; - - for ( name in obj ) { - return false; - } - return true; - }, - - // Evaluates a script in a global context - globalEval: function( code, options ) { - DOMEval( code, { nonce: options && options.nonce } ); - }, - - each: function( obj, callback ) { - var length, i = 0; - - if ( isArrayLike( obj ) ) { - length = obj.length; - for ( ; i < length; i++ ) { - if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { - break; - } - } - } else { - for ( i in obj ) { - if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { - break; - } - } - } - - return obj; - }, - - // Support: Android <=4.0 only - trim: function( text ) { - return text == null ? - "" : - ( text + "" ).replace( rtrim, "" ); - }, - - // results is for internal usage only - makeArray: function( arr, results ) { - var ret = results || []; - - if ( arr != null ) { - if ( isArrayLike( Object( arr ) ) ) { - jQuery.merge( ret, - typeof arr === "string" ? - [ arr ] : arr - ); - } else { - push.call( ret, arr ); - } - } - - return ret; - }, - - inArray: function( elem, arr, i ) { - return arr == null ? -1 : indexOf.call( arr, elem, i ); - }, - - // Support: Android <=4.0 only, PhantomJS 1 only - // push.apply(_, arraylike) throws on ancient WebKit - merge: function( first, second ) { - var len = +second.length, - j = 0, - i = first.length; - - for ( ; j < len; j++ ) { - first[ i++ ] = second[ j ]; - } - - first.length = i; - - return first; - }, - - grep: function( elems, callback, invert ) { - var callbackInverse, - matches = [], - i = 0, - length = elems.length, - callbackExpect = !invert; - - // Go through the array, only saving the items - // that pass the validator function - for ( ; i < length; i++ ) { - callbackInverse = !callback( elems[ i ], i ); - if ( callbackInverse !== callbackExpect ) { - matches.push( elems[ i ] ); - } - } - - return matches; - }, - - // arg is for internal usage only - map: function( elems, callback, arg ) { - var length, value, - i = 0, - ret = []; - - // Go through the array, translating each of the items to their new values - if ( isArrayLike( elems ) ) { - length = elems.length; - for ( ; i < length; i++ ) { - value = callback( elems[ i ], i, arg ); - - if ( value != null ) { - ret.push( value ); - } - } - - // Go through every key on the object, - } else { - for ( i in elems ) { - value = callback( elems[ i ], i, arg ); - - if ( value != null ) { - ret.push( value ); - } - } - } - - // Flatten any nested arrays - return concat.apply( [], ret ); - }, - - // A global GUID counter for objects - guid: 1, - - // jQuery.support is not used in Core but other projects attach their - // properties to it so it needs to exist. - support: support -} ); - -if ( typeof Symbol === "function" ) { - jQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ]; -} - -// Populate the class2type map -jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ), -function( i, name ) { - class2type[ "[object " + name + "]" ] = name.toLowerCase(); -} ); - -function isArrayLike( obj ) { - - // Support: real iOS 8.2 only (not reproducible in simulator) - // `in` check used to prevent JIT error (gh-2145) - // hasOwn isn't used here due to false negatives - // regarding Nodelist length in IE - var length = !!obj && "length" in obj && obj.length, - type = toType( obj ); - - if ( isFunction( obj ) || isWindow( obj ) ) { - return false; - } - - return type === "array" || length === 0 || - typeof length === "number" && length > 0 && ( length - 1 ) in obj; -} -var Sizzle = -/*! - * Sizzle CSS Selector Engine v2.3.4 - * https://sizzlejs.com/ - * - * Copyright JS Foundation and other contributors - * Released under the MIT license - * https://js.foundation/ - * - * Date: 2019-04-08 - */ -(function( window ) { - -var i, - support, - Expr, - getText, - isXML, - tokenize, - compile, - select, - outermostContext, - sortInput, - hasDuplicate, - - // Local document vars - setDocument, - document, - docElem, - documentIsHTML, - rbuggyQSA, - rbuggyMatches, - matches, - contains, - - // Instance-specific data - expando = "sizzle" + 1 * new Date(), - preferredDoc = window.document, - dirruns = 0, - done = 0, - classCache = createCache(), - tokenCache = createCache(), - compilerCache = createCache(), - nonnativeSelectorCache = createCache(), - sortOrder = function( a, b ) { - if ( a === b ) { - hasDuplicate = true; - } - return 0; - }, - - // Instance methods - hasOwn = ({}).hasOwnProperty, - arr = [], - pop = arr.pop, - push_native = arr.push, - push = arr.push, - slice = arr.slice, - // Use a stripped-down indexOf as it's faster than native - // https://jsperf.com/thor-indexof-vs-for/5 - indexOf = function( list, elem ) { - var i = 0, - len = list.length; - for ( ; i < len; i++ ) { - if ( list[i] === elem ) { - return i; - } - } - return -1; - }, - - booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped", - - // Regular expressions - - // http://www.w3.org/TR/css3-selectors/#whitespace - whitespace = "[\\x20\\t\\r\\n\\f]", - - // http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier - identifier = "(?:\\\\.|[\\w-]|[^\0-\\xa0])+", - - // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors - attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace + - // Operator (capture 2) - "*([*^$|!~]?=)" + whitespace + - // "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]" - "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace + - "*\\]", - - pseudos = ":(" + identifier + ")(?:\\((" + - // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments: - // 1. quoted (capture 3; capture 4 or capture 5) - "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" + - // 2. simple (capture 6) - "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" + - // 3. anything else (capture 2) - ".*" + - ")\\)|)", - - // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter - rwhitespace = new RegExp( whitespace + "+", "g" ), - rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ), - - rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ), - rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ), - rdescend = new RegExp( whitespace + "|>" ), - - rpseudo = new RegExp( pseudos ), - ridentifier = new RegExp( "^" + identifier + "$" ), - - matchExpr = { - "ID": new RegExp( "^#(" + identifier + ")" ), - "CLASS": new RegExp( "^\\.(" + identifier + ")" ), - "TAG": new RegExp( "^(" + identifier + "|[*])" ), - "ATTR": new RegExp( "^" + attributes ), - "PSEUDO": new RegExp( "^" + pseudos ), - "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace + - "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace + - "*(\\d+)|))" + whitespace + "*\\)|)", "i" ), - "bool": new RegExp( "^(?:" + booleans + ")$", "i" ), - // For use in libraries implementing .is() - // We use this for POS matching in `select` - "needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + - whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" ) - }, - - rhtml = /HTML$/i, - rinputs = /^(?:input|select|textarea|button)$/i, - rheader = /^h\d$/i, - - rnative = /^[^{]+\{\s*\[native \w/, - - // Easily-parseable/retrievable ID or TAG or CLASS selectors - rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, - - rsibling = /[+~]/, - - // CSS escapes - // http://www.w3.org/TR/CSS21/syndata.html#escaped-characters - runescape = new RegExp( "\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ), - funescape = function( _, escaped, escapedWhitespace ) { - var high = "0x" + escaped - 0x10000; - // NaN means non-codepoint - // Support: Firefox<24 - // Workaround erroneous numeric interpretation of +"0x" - return high !== high || escapedWhitespace ? - escaped : - high < 0 ? - // BMP codepoint - String.fromCharCode( high + 0x10000 ) : - // Supplemental Plane codepoint (surrogate pair) - String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 ); - }, - - // CSS string/identifier serialization - // https://drafts.csswg.org/cssom/#common-serializing-idioms - rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g, - fcssescape = function( ch, asCodePoint ) { - if ( asCodePoint ) { - - // U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER - if ( ch === "\0" ) { - return "\uFFFD"; - } - - // Control characters and (dependent upon position) numbers get escaped as code points - return ch.slice( 0, -1 ) + "\\" + ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " "; - } - - // Other potentially-special ASCII characters get backslash-escaped - return "\\" + ch; - }, - - // Used for iframes - // See setDocument() - // Removing the function wrapper causes a "Permission Denied" - // error in IE - unloadHandler = function() { - setDocument(); - }, - - inDisabledFieldset = addCombinator( - function( elem ) { - return elem.disabled === true && elem.nodeName.toLowerCase() === "fieldset"; - }, - { dir: "parentNode", next: "legend" } - ); - -// Optimize for push.apply( _, NodeList ) -try { - push.apply( - (arr = slice.call( preferredDoc.childNodes )), - preferredDoc.childNodes - ); - // Support: Android<4.0 - // Detect silently failing push.apply - arr[ preferredDoc.childNodes.length ].nodeType; -} catch ( e ) { - push = { apply: arr.length ? - - // Leverage slice if possible - function( target, els ) { - push_native.apply( target, slice.call(els) ); - } : - - // Support: IE<9 - // Otherwise append directly - function( target, els ) { - var j = target.length, - i = 0; - // Can't trust NodeList.length - while ( (target[j++] = els[i++]) ) {} - target.length = j - 1; - } - }; -} - -function Sizzle( selector, context, results, seed ) { - var m, i, elem, nid, match, groups, newSelector, - newContext = context && context.ownerDocument, - - // nodeType defaults to 9, since context defaults to document - nodeType = context ? context.nodeType : 9; - - results = results || []; - - // Return early from calls with invalid selector or context - if ( typeof selector !== "string" || !selector || - nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) { - - return results; - } - - // Try to shortcut find operations (as opposed to filters) in HTML documents - if ( !seed ) { - - if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) { - setDocument( context ); - } - context = context || document; - - if ( documentIsHTML ) { - - // If the selector is sufficiently simple, try using a "get*By*" DOM method - // (excepting DocumentFragment context, where the methods don't exist) - if ( nodeType !== 11 && (match = rquickExpr.exec( selector )) ) { - - // ID selector - if ( (m = match[1]) ) { - - // Document context - if ( nodeType === 9 ) { - if ( (elem = context.getElementById( m )) ) { - - // Support: IE, Opera, Webkit - // TODO: identify versions - // getElementById can match elements by name instead of ID - if ( elem.id === m ) { - results.push( elem ); - return results; - } - } else { - return results; - } - - // Element context - } else { - - // Support: IE, Opera, Webkit - // TODO: identify versions - // getElementById can match elements by name instead of ID - if ( newContext && (elem = newContext.getElementById( m )) && - contains( context, elem ) && - elem.id === m ) { - - results.push( elem ); - return results; - } - } - - // Type selector - } else if ( match[2] ) { - push.apply( results, context.getElementsByTagName( selector ) ); - return results; - - // Class selector - } else if ( (m = match[3]) && support.getElementsByClassName && - context.getElementsByClassName ) { - - push.apply( results, context.getElementsByClassName( m ) ); - return results; - } - } - - // Take advantage of querySelectorAll - if ( support.qsa && - !nonnativeSelectorCache[ selector + " " ] && - (!rbuggyQSA || !rbuggyQSA.test( selector )) && - - // Support: IE 8 only - // Exclude object elements - (nodeType !== 1 || context.nodeName.toLowerCase() !== "object") ) { - - newSelector = selector; - newContext = context; - - // qSA considers elements outside a scoping root when evaluating child or - // descendant combinators, which is not what we want. - // In such cases, we work around the behavior by prefixing every selector in the - // list with an ID selector referencing the scope context. - // Thanks to Andrew Dupont for this technique. - if ( nodeType === 1 && rdescend.test( selector ) ) { - - // Capture the context ID, setting it first if necessary - if ( (nid = context.getAttribute( "id" )) ) { - nid = nid.replace( rcssescape, fcssescape ); - } else { - context.setAttribute( "id", (nid = expando) ); - } - - // Prefix every selector in the list - groups = tokenize( selector ); - i = groups.length; - while ( i-- ) { - groups[i] = "#" + nid + " " + toSelector( groups[i] ); - } - newSelector = groups.join( "," ); - - // Expand context for sibling selectors - newContext = rsibling.test( selector ) && testContext( context.parentNode ) || - context; - } - - try { - push.apply( results, - newContext.querySelectorAll( newSelector ) - ); - return results; - } catch ( qsaError ) { - nonnativeSelectorCache( selector, true ); - } finally { - if ( nid === expando ) { - context.removeAttribute( "id" ); - } - } - } - } - } - - // All others - return select( selector.replace( rtrim, "$1" ), context, results, seed ); -} - -/** - * Create key-value caches of limited size - * @returns {function(string, object)} Returns the Object data after storing it on itself with - * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength) - * deleting the oldest entry - */ -function createCache() { - var keys = []; - - function cache( key, value ) { - // Use (key + " ") to avoid collision with native prototype properties (see Issue #157) - if ( keys.push( key + " " ) > Expr.cacheLength ) { - // Only keep the most recent entries - delete cache[ keys.shift() ]; - } - return (cache[ key + " " ] = value); - } - return cache; -} - -/** - * Mark a function for special use by Sizzle - * @param {Function} fn The function to mark - */ -function markFunction( fn ) { - fn[ expando ] = true; - return fn; -} - -/** - * Support testing using an element - * @param {Function} fn Passed the created element and returns a boolean result - */ -function assert( fn ) { - var el = document.createElement("fieldset"); - - try { - return !!fn( el ); - } catch (e) { - return false; - } finally { - // Remove from its parent by default - if ( el.parentNode ) { - el.parentNode.removeChild( el ); - } - // release memory in IE - el = null; - } -} - -/** - * Adds the same handler for all of the specified attrs - * @param {String} attrs Pipe-separated list of attributes - * @param {Function} handler The method that will be applied - */ -function addHandle( attrs, handler ) { - var arr = attrs.split("|"), - i = arr.length; - - while ( i-- ) { - Expr.attrHandle[ arr[i] ] = handler; - } -} - -/** - * Checks document order of two siblings - * @param {Element} a - * @param {Element} b - * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b - */ -function siblingCheck( a, b ) { - var cur = b && a, - diff = cur && a.nodeType === 1 && b.nodeType === 1 && - a.sourceIndex - b.sourceIndex; - - // Use IE sourceIndex if available on both nodes - if ( diff ) { - return diff; - } - - // Check if b follows a - if ( cur ) { - while ( (cur = cur.nextSibling) ) { - if ( cur === b ) { - return -1; - } - } - } - - return a ? 1 : -1; -} - -/** - * Returns a function to use in pseudos for input types - * @param {String} type - */ -function createInputPseudo( type ) { - return function( elem ) { - var name = elem.nodeName.toLowerCase(); - return name === "input" && elem.type === type; - }; -} - -/** - * Returns a function to use in pseudos for buttons - * @param {String} type - */ -function createButtonPseudo( type ) { - return function( elem ) { - var name = elem.nodeName.toLowerCase(); - return (name === "input" || name === "button") && elem.type === type; - }; -} - -/** - * Returns a function to use in pseudos for :enabled/:disabled - * @param {Boolean} disabled true for :disabled; false for :enabled - */ -function createDisabledPseudo( disabled ) { - - // Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable - return function( elem ) { - - // Only certain elements can match :enabled or :disabled - // https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled - // https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled - if ( "form" in elem ) { - - // Check for inherited disabledness on relevant non-disabled elements: - // * listed form-associated elements in a disabled fieldset - // https://html.spec.whatwg.org/multipage/forms.html#category-listed - // https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled - // * option elements in a disabled optgroup - // https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled - // All such elements have a "form" property. - if ( elem.parentNode && elem.disabled === false ) { - - // Option elements defer to a parent optgroup if present - if ( "label" in elem ) { - if ( "label" in elem.parentNode ) { - return elem.parentNode.disabled === disabled; - } else { - return elem.disabled === disabled; - } - } - - // Support: IE 6 - 11 - // Use the isDisabled shortcut property to check for disabled fieldset ancestors - return elem.isDisabled === disabled || - - // Where there is no isDisabled, check manually - /* jshint -W018 */ - elem.isDisabled !== !disabled && - inDisabledFieldset( elem ) === disabled; - } - - return elem.disabled === disabled; - - // Try to winnow out elements that can't be disabled before trusting the disabled property. - // Some victims get caught in our net (label, legend, menu, track), but it shouldn't - // even exist on them, let alone have a boolean value. - } else if ( "label" in elem ) { - return elem.disabled === disabled; - } - - // Remaining elements are neither :enabled nor :disabled - return false; - }; -} - -/** - * Returns a function to use in pseudos for positionals - * @param {Function} fn - */ -function createPositionalPseudo( fn ) { - return markFunction(function( argument ) { - argument = +argument; - return markFunction(function( seed, matches ) { - var j, - matchIndexes = fn( [], seed.length, argument ), - i = matchIndexes.length; - - // Match elements found at the specified indexes - while ( i-- ) { - if ( seed[ (j = matchIndexes[i]) ] ) { - seed[j] = !(matches[j] = seed[j]); - } - } - }); - }); -} - -/** - * Checks a node for validity as a Sizzle context - * @param {Element|Object=} context - * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value - */ -function testContext( context ) { - return context && typeof context.getElementsByTagName !== "undefined" && context; -} - -// Expose support vars for convenience -support = Sizzle.support = {}; - -/** - * Detects XML nodes - * @param {Element|Object} elem An element or a document - * @returns {Boolean} True iff elem is a non-HTML XML node - */ -isXML = Sizzle.isXML = function( elem ) { - var namespace = elem.namespaceURI, - docElem = (elem.ownerDocument || elem).documentElement; - - // Support: IE <=8 - // Assume HTML when documentElement doesn't yet exist, such as inside loading iframes - // https://bugs.jquery.com/ticket/4833 - return !rhtml.test( namespace || docElem && docElem.nodeName || "HTML" ); -}; - -/** - * Sets document-related variables once based on the current document - * @param {Element|Object} [doc] An element or document object to use to set the document - * @returns {Object} Returns the current document - */ -setDocument = Sizzle.setDocument = function( node ) { - var hasCompare, subWindow, - doc = node ? node.ownerDocument || node : preferredDoc; - - // Return early if doc is invalid or already selected - if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) { - return document; - } - - // Update global variables - document = doc; - docElem = document.documentElement; - documentIsHTML = !isXML( document ); - - // Support: IE 9-11, Edge - // Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936) - if ( preferredDoc !== document && - (subWindow = document.defaultView) && subWindow.top !== subWindow ) { - - // Support: IE 11, Edge - if ( subWindow.addEventListener ) { - subWindow.addEventListener( "unload", unloadHandler, false ); - - // Support: IE 9 - 10 only - } else if ( subWindow.attachEvent ) { - subWindow.attachEvent( "onunload", unloadHandler ); - } - } - - /* Attributes - ---------------------------------------------------------------------- */ - - // Support: IE<8 - // Verify that getAttribute really returns attributes and not properties - // (excepting IE8 booleans) - support.attributes = assert(function( el ) { - el.className = "i"; - return !el.getAttribute("className"); - }); - - /* getElement(s)By* - ---------------------------------------------------------------------- */ - - // Check if getElementsByTagName("*") returns only elements - support.getElementsByTagName = assert(function( el ) { - el.appendChild( document.createComment("") ); - return !el.getElementsByTagName("*").length; - }); - - // Support: IE<9 - support.getElementsByClassName = rnative.test( document.getElementsByClassName ); - - // Support: IE<10 - // Check if getElementById returns elements by name - // The broken getElementById methods don't pick up programmatically-set names, - // so use a roundabout getElementsByName test - support.getById = assert(function( el ) { - docElem.appendChild( el ).id = expando; - return !document.getElementsByName || !document.getElementsByName( expando ).length; - }); - - // ID filter and find - if ( support.getById ) { - Expr.filter["ID"] = function( id ) { - var attrId = id.replace( runescape, funescape ); - return function( elem ) { - return elem.getAttribute("id") === attrId; - }; - }; - Expr.find["ID"] = function( id, context ) { - if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { - var elem = context.getElementById( id ); - return elem ? [ elem ] : []; - } - }; - } else { - Expr.filter["ID"] = function( id ) { - var attrId = id.replace( runescape, funescape ); - return function( elem ) { - var node = typeof elem.getAttributeNode !== "undefined" && - elem.getAttributeNode("id"); - return node && node.value === attrId; - }; - }; - - // Support: IE 6 - 7 only - // getElementById is not reliable as a find shortcut - Expr.find["ID"] = function( id, context ) { - if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { - var node, i, elems, - elem = context.getElementById( id ); - - if ( elem ) { - - // Verify the id attribute - node = elem.getAttributeNode("id"); - if ( node && node.value === id ) { - return [ elem ]; - } - - // Fall back on getElementsByName - elems = context.getElementsByName( id ); - i = 0; - while ( (elem = elems[i++]) ) { - node = elem.getAttributeNode("id"); - if ( node && node.value === id ) { - return [ elem ]; - } - } - } - - return []; - } - }; - } - - // Tag - Expr.find["TAG"] = support.getElementsByTagName ? - function( tag, context ) { - if ( typeof context.getElementsByTagName !== "undefined" ) { - return context.getElementsByTagName( tag ); - - // DocumentFragment nodes don't have gEBTN - } else if ( support.qsa ) { - return context.querySelectorAll( tag ); - } - } : - - function( tag, context ) { - var elem, - tmp = [], - i = 0, - // By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too - results = context.getElementsByTagName( tag ); - - // Filter out possible comments - if ( tag === "*" ) { - while ( (elem = results[i++]) ) { - if ( elem.nodeType === 1 ) { - tmp.push( elem ); - } - } - - return tmp; - } - return results; - }; - - // Class - Expr.find["CLASS"] = support.getElementsByClassName && function( className, context ) { - if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) { - return context.getElementsByClassName( className ); - } - }; - - /* QSA/matchesSelector - ---------------------------------------------------------------------- */ - - // QSA and matchesSelector support - - // matchesSelector(:active) reports false when true (IE9/Opera 11.5) - rbuggyMatches = []; - - // qSa(:focus) reports false when true (Chrome 21) - // We allow this because of a bug in IE8/9 that throws an error - // whenever `document.activeElement` is accessed on an iframe - // So, we allow :focus to pass through QSA all the time to avoid the IE error - // See https://bugs.jquery.com/ticket/13378 - rbuggyQSA = []; - - if ( (support.qsa = rnative.test( document.querySelectorAll )) ) { - // Build QSA regex - // Regex strategy adopted from Diego Perini - assert(function( el ) { - // Select is set to empty string on purpose - // This is to test IE's treatment of not explicitly - // setting a boolean content attribute, - // since its presence should be enough - // https://bugs.jquery.com/ticket/12359 - docElem.appendChild( el ).innerHTML = "" + - ""; - - // Support: IE8, Opera 11-12.16 - // Nothing should be selected when empty strings follow ^= or $= or *= - // The test attribute must be unknown in Opera but "safe" for WinRT - // https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section - if ( el.querySelectorAll("[msallowcapture^='']").length ) { - rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" ); - } - - // Support: IE8 - // Boolean attributes and "value" are not treated correctly - if ( !el.querySelectorAll("[selected]").length ) { - rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" ); - } - - // Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+ - if ( !el.querySelectorAll( "[id~=" + expando + "-]" ).length ) { - rbuggyQSA.push("~="); - } - - // Webkit/Opera - :checked should return selected option elements - // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked - // IE8 throws error here and will not see later tests - if ( !el.querySelectorAll(":checked").length ) { - rbuggyQSA.push(":checked"); - } - - // Support: Safari 8+, iOS 8+ - // https://bugs.webkit.org/show_bug.cgi?id=136851 - // In-page `selector#id sibling-combinator selector` fails - if ( !el.querySelectorAll( "a#" + expando + "+*" ).length ) { - rbuggyQSA.push(".#.+[+~]"); - } - }); - - assert(function( el ) { - el.innerHTML = "" + - ""; - - // Support: Windows 8 Native Apps - // The type and name attributes are restricted during .innerHTML assignment - var input = document.createElement("input"); - input.setAttribute( "type", "hidden" ); - el.appendChild( input ).setAttribute( "name", "D" ); - - // Support: IE8 - // Enforce case-sensitivity of name attribute - if ( el.querySelectorAll("[name=d]").length ) { - rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" ); - } - - // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled) - // IE8 throws error here and will not see later tests - if ( el.querySelectorAll(":enabled").length !== 2 ) { - rbuggyQSA.push( ":enabled", ":disabled" ); - } - - // Support: IE9-11+ - // IE's :disabled selector does not pick up the children of disabled fieldsets - docElem.appendChild( el ).disabled = true; - if ( el.querySelectorAll(":disabled").length !== 2 ) { - rbuggyQSA.push( ":enabled", ":disabled" ); - } - - // Opera 10-11 does not throw on post-comma invalid pseudos - el.querySelectorAll("*,:x"); - rbuggyQSA.push(",.*:"); - }); - } - - if ( (support.matchesSelector = rnative.test( (matches = docElem.matches || - docElem.webkitMatchesSelector || - docElem.mozMatchesSelector || - docElem.oMatchesSelector || - docElem.msMatchesSelector) )) ) { - - assert(function( el ) { - // Check to see if it's possible to do matchesSelector - // on a disconnected node (IE 9) - support.disconnectedMatch = matches.call( el, "*" ); - - // This should fail with an exception - // Gecko does not error, returns false instead - matches.call( el, "[s!='']:x" ); - rbuggyMatches.push( "!=", pseudos ); - }); - } - - rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") ); - rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join("|") ); - - /* Contains - ---------------------------------------------------------------------- */ - hasCompare = rnative.test( docElem.compareDocumentPosition ); - - // Element contains another - // Purposefully self-exclusive - // As in, an element does not contain itself - contains = hasCompare || rnative.test( docElem.contains ) ? - function( a, b ) { - var adown = a.nodeType === 9 ? a.documentElement : a, - bup = b && b.parentNode; - return a === bup || !!( bup && bup.nodeType === 1 && ( - adown.contains ? - adown.contains( bup ) : - a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16 - )); - } : - function( a, b ) { - if ( b ) { - while ( (b = b.parentNode) ) { - if ( b === a ) { - return true; - } - } - } - return false; - }; - - /* Sorting - ---------------------------------------------------------------------- */ - - // Document order sorting - sortOrder = hasCompare ? - function( a, b ) { - - // Flag for duplicate removal - if ( a === b ) { - hasDuplicate = true; - return 0; - } - - // Sort on method existence if only one input has compareDocumentPosition - var compare = !a.compareDocumentPosition - !b.compareDocumentPosition; - if ( compare ) { - return compare; - } - - // Calculate position if both inputs belong to the same document - compare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ? - a.compareDocumentPosition( b ) : - - // Otherwise we know they are disconnected - 1; - - // Disconnected nodes - if ( compare & 1 || - (!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) { - - // Choose the first element that is related to our preferred document - if ( a === document || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) { - return -1; - } - if ( b === document || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) { - return 1; - } - - // Maintain original order - return sortInput ? - ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : - 0; - } - - return compare & 4 ? -1 : 1; - } : - function( a, b ) { - // Exit early if the nodes are identical - if ( a === b ) { - hasDuplicate = true; - return 0; - } - - var cur, - i = 0, - aup = a.parentNode, - bup = b.parentNode, - ap = [ a ], - bp = [ b ]; - - // Parentless nodes are either documents or disconnected - if ( !aup || !bup ) { - return a === document ? -1 : - b === document ? 1 : - aup ? -1 : - bup ? 1 : - sortInput ? - ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : - 0; - - // If the nodes are siblings, we can do a quick check - } else if ( aup === bup ) { - return siblingCheck( a, b ); - } - - // Otherwise we need full lists of their ancestors for comparison - cur = a; - while ( (cur = cur.parentNode) ) { - ap.unshift( cur ); - } - cur = b; - while ( (cur = cur.parentNode) ) { - bp.unshift( cur ); - } - - // Walk down the tree looking for a discrepancy - while ( ap[i] === bp[i] ) { - i++; - } - - return i ? - // Do a sibling check if the nodes have a common ancestor - siblingCheck( ap[i], bp[i] ) : - - // Otherwise nodes in our document sort first - ap[i] === preferredDoc ? -1 : - bp[i] === preferredDoc ? 1 : - 0; - }; - - return document; -}; - -Sizzle.matches = function( expr, elements ) { - return Sizzle( expr, null, null, elements ); -}; - -Sizzle.matchesSelector = function( elem, expr ) { - // Set document vars if needed - if ( ( elem.ownerDocument || elem ) !== document ) { - setDocument( elem ); - } - - if ( support.matchesSelector && documentIsHTML && - !nonnativeSelectorCache[ expr + " " ] && - ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) && - ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) { - - try { - var ret = matches.call( elem, expr ); - - // IE 9's matchesSelector returns false on disconnected nodes - if ( ret || support.disconnectedMatch || - // As well, disconnected nodes are said to be in a document - // fragment in IE 9 - elem.document && elem.document.nodeType !== 11 ) { - return ret; - } - } catch (e) { - nonnativeSelectorCache( expr, true ); - } - } - - return Sizzle( expr, document, null, [ elem ] ).length > 0; -}; - -Sizzle.contains = function( context, elem ) { - // Set document vars if needed - if ( ( context.ownerDocument || context ) !== document ) { - setDocument( context ); - } - return contains( context, elem ); -}; - -Sizzle.attr = function( elem, name ) { - // Set document vars if needed - if ( ( elem.ownerDocument || elem ) !== document ) { - setDocument( elem ); - } - - var fn = Expr.attrHandle[ name.toLowerCase() ], - // Don't get fooled by Object.prototype properties (jQuery #13807) - val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ? - fn( elem, name, !documentIsHTML ) : - undefined; - - return val !== undefined ? - val : - support.attributes || !documentIsHTML ? - elem.getAttribute( name ) : - (val = elem.getAttributeNode(name)) && val.specified ? - val.value : - null; -}; - -Sizzle.escape = function( sel ) { - return (sel + "").replace( rcssescape, fcssescape ); -}; - -Sizzle.error = function( msg ) { - throw new Error( "Syntax error, unrecognized expression: " + msg ); -}; - -/** - * Document sorting and removing duplicates - * @param {ArrayLike} results - */ -Sizzle.uniqueSort = function( results ) { - var elem, - duplicates = [], - j = 0, - i = 0; - - // Unless we *know* we can detect duplicates, assume their presence - hasDuplicate = !support.detectDuplicates; - sortInput = !support.sortStable && results.slice( 0 ); - results.sort( sortOrder ); - - if ( hasDuplicate ) { - while ( (elem = results[i++]) ) { - if ( elem === results[ i ] ) { - j = duplicates.push( i ); - } - } - while ( j-- ) { - results.splice( duplicates[ j ], 1 ); - } - } - - // Clear input after sorting to release objects - // See https://github.com/jquery/sizzle/pull/225 - sortInput = null; - - return results; -}; - -/** - * Utility function for retrieving the text value of an array of DOM nodes - * @param {Array|Element} elem - */ -getText = Sizzle.getText = function( elem ) { - var node, - ret = "", - i = 0, - nodeType = elem.nodeType; - - if ( !nodeType ) { - // If no nodeType, this is expected to be an array - while ( (node = elem[i++]) ) { - // Do not traverse comment nodes - ret += getText( node ); - } - } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) { - // Use textContent for elements - // innerText usage removed for consistency of new lines (jQuery #11153) - if ( typeof elem.textContent === "string" ) { - return elem.textContent; - } else { - // Traverse its children - for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { - ret += getText( elem ); - } - } - } else if ( nodeType === 3 || nodeType === 4 ) { - return elem.nodeValue; - } - // Do not include comment or processing instruction nodes - - return ret; -}; - -Expr = Sizzle.selectors = { - - // Can be adjusted by the user - cacheLength: 50, - - createPseudo: markFunction, - - match: matchExpr, - - attrHandle: {}, - - find: {}, - - relative: { - ">": { dir: "parentNode", first: true }, - " ": { dir: "parentNode" }, - "+": { dir: "previousSibling", first: true }, - "~": { dir: "previousSibling" } - }, - - preFilter: { - "ATTR": function( match ) { - match[1] = match[1].replace( runescape, funescape ); - - // Move the given value to match[3] whether quoted or unquoted - match[3] = ( match[3] || match[4] || match[5] || "" ).replace( runescape, funescape ); - - if ( match[2] === "~=" ) { - match[3] = " " + match[3] + " "; - } - - return match.slice( 0, 4 ); - }, - - "CHILD": function( match ) { - /* matches from matchExpr["CHILD"] - 1 type (only|nth|...) - 2 what (child|of-type) - 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...) - 4 xn-component of xn+y argument ([+-]?\d*n|) - 5 sign of xn-component - 6 x of xn-component - 7 sign of y-component - 8 y of y-component - */ - match[1] = match[1].toLowerCase(); - - if ( match[1].slice( 0, 3 ) === "nth" ) { - // nth-* requires argument - if ( !match[3] ) { - Sizzle.error( match[0] ); - } - - // numeric x and y parameters for Expr.filter.CHILD - // remember that false/true cast respectively to 0/1 - match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) ); - match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" ); - - // other types prohibit arguments - } else if ( match[3] ) { - Sizzle.error( match[0] ); - } - - return match; - }, - - "PSEUDO": function( match ) { - var excess, - unquoted = !match[6] && match[2]; - - if ( matchExpr["CHILD"].test( match[0] ) ) { - return null; - } - - // Accept quoted arguments as-is - if ( match[3] ) { - match[2] = match[4] || match[5] || ""; - - // Strip excess characters from unquoted arguments - } else if ( unquoted && rpseudo.test( unquoted ) && - // Get excess from tokenize (recursively) - (excess = tokenize( unquoted, true )) && - // advance to the next closing parenthesis - (excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) { - - // excess is a negative index - match[0] = match[0].slice( 0, excess ); - match[2] = unquoted.slice( 0, excess ); - } - - // Return only captures needed by the pseudo filter method (type and argument) - return match.slice( 0, 3 ); - } - }, - - filter: { - - "TAG": function( nodeNameSelector ) { - var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase(); - return nodeNameSelector === "*" ? - function() { return true; } : - function( elem ) { - return elem.nodeName && elem.nodeName.toLowerCase() === nodeName; - }; - }, - - "CLASS": function( className ) { - var pattern = classCache[ className + " " ]; - - return pattern || - (pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) && - classCache( className, function( elem ) { - return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== "undefined" && elem.getAttribute("class") || "" ); - }); - }, - - "ATTR": function( name, operator, check ) { - return function( elem ) { - var result = Sizzle.attr( elem, name ); - - if ( result == null ) { - return operator === "!="; - } - if ( !operator ) { - return true; - } - - result += ""; - - return operator === "=" ? result === check : - operator === "!=" ? result !== check : - operator === "^=" ? check && result.indexOf( check ) === 0 : - operator === "*=" ? check && result.indexOf( check ) > -1 : - operator === "$=" ? check && result.slice( -check.length ) === check : - operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 : - operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" : - false; - }; - }, - - "CHILD": function( type, what, argument, first, last ) { - var simple = type.slice( 0, 3 ) !== "nth", - forward = type.slice( -4 ) !== "last", - ofType = what === "of-type"; - - return first === 1 && last === 0 ? - - // Shortcut for :nth-*(n) - function( elem ) { - return !!elem.parentNode; - } : - - function( elem, context, xml ) { - var cache, uniqueCache, outerCache, node, nodeIndex, start, - dir = simple !== forward ? "nextSibling" : "previousSibling", - parent = elem.parentNode, - name = ofType && elem.nodeName.toLowerCase(), - useCache = !xml && !ofType, - diff = false; - - if ( parent ) { - - // :(first|last|only)-(child|of-type) - if ( simple ) { - while ( dir ) { - node = elem; - while ( (node = node[ dir ]) ) { - if ( ofType ? - node.nodeName.toLowerCase() === name : - node.nodeType === 1 ) { - - return false; - } - } - // Reverse direction for :only-* (if we haven't yet done so) - start = dir = type === "only" && !start && "nextSibling"; - } - return true; - } - - start = [ forward ? parent.firstChild : parent.lastChild ]; - - // non-xml :nth-child(...) stores cache data on `parent` - if ( forward && useCache ) { - - // Seek `elem` from a previously-cached index - - // ...in a gzip-friendly way - node = parent; - outerCache = node[ expando ] || (node[ expando ] = {}); - - // Support: IE <9 only - // Defend against cloned attroperties (jQuery gh-1709) - uniqueCache = outerCache[ node.uniqueID ] || - (outerCache[ node.uniqueID ] = {}); - - cache = uniqueCache[ type ] || []; - nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; - diff = nodeIndex && cache[ 2 ]; - node = nodeIndex && parent.childNodes[ nodeIndex ]; - - while ( (node = ++nodeIndex && node && node[ dir ] || - - // Fallback to seeking `elem` from the start - (diff = nodeIndex = 0) || start.pop()) ) { - - // When found, cache indexes on `parent` and break - if ( node.nodeType === 1 && ++diff && node === elem ) { - uniqueCache[ type ] = [ dirruns, nodeIndex, diff ]; - break; - } - } - - } else { - // Use previously-cached element index if available - if ( useCache ) { - // ...in a gzip-friendly way - node = elem; - outerCache = node[ expando ] || (node[ expando ] = {}); - - // Support: IE <9 only - // Defend against cloned attroperties (jQuery gh-1709) - uniqueCache = outerCache[ node.uniqueID ] || - (outerCache[ node.uniqueID ] = {}); - - cache = uniqueCache[ type ] || []; - nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; - diff = nodeIndex; - } - - // xml :nth-child(...) - // or :nth-last-child(...) or :nth(-last)?-of-type(...) - if ( diff === false ) { - // Use the same loop as above to seek `elem` from the start - while ( (node = ++nodeIndex && node && node[ dir ] || - (diff = nodeIndex = 0) || start.pop()) ) { - - if ( ( ofType ? - node.nodeName.toLowerCase() === name : - node.nodeType === 1 ) && - ++diff ) { - - // Cache the index of each encountered element - if ( useCache ) { - outerCache = node[ expando ] || (node[ expando ] = {}); - - // Support: IE <9 only - // Defend against cloned attroperties (jQuery gh-1709) - uniqueCache = outerCache[ node.uniqueID ] || - (outerCache[ node.uniqueID ] = {}); - - uniqueCache[ type ] = [ dirruns, diff ]; - } - - if ( node === elem ) { - break; - } - } - } - } - } - - // Incorporate the offset, then check against cycle size - diff -= last; - return diff === first || ( diff % first === 0 && diff / first >= 0 ); - } - }; - }, - - "PSEUDO": function( pseudo, argument ) { - // pseudo-class names are case-insensitive - // http://www.w3.org/TR/selectors/#pseudo-classes - // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters - // Remember that setFilters inherits from pseudos - var args, - fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] || - Sizzle.error( "unsupported pseudo: " + pseudo ); - - // The user may use createPseudo to indicate that - // arguments are needed to create the filter function - // just as Sizzle does - if ( fn[ expando ] ) { - return fn( argument ); - } - - // But maintain support for old signatures - if ( fn.length > 1 ) { - args = [ pseudo, pseudo, "", argument ]; - return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ? - markFunction(function( seed, matches ) { - var idx, - matched = fn( seed, argument ), - i = matched.length; - while ( i-- ) { - idx = indexOf( seed, matched[i] ); - seed[ idx ] = !( matches[ idx ] = matched[i] ); - } - }) : - function( elem ) { - return fn( elem, 0, args ); - }; - } - - return fn; - } - }, - - pseudos: { - // Potentially complex pseudos - "not": markFunction(function( selector ) { - // Trim the selector passed to compile - // to avoid treating leading and trailing - // spaces as combinators - var input = [], - results = [], - matcher = compile( selector.replace( rtrim, "$1" ) ); - - return matcher[ expando ] ? - markFunction(function( seed, matches, context, xml ) { - var elem, - unmatched = matcher( seed, null, xml, [] ), - i = seed.length; - - // Match elements unmatched by `matcher` - while ( i-- ) { - if ( (elem = unmatched[i]) ) { - seed[i] = !(matches[i] = elem); - } - } - }) : - function( elem, context, xml ) { - input[0] = elem; - matcher( input, null, xml, results ); - // Don't keep the element (issue #299) - input[0] = null; - return !results.pop(); - }; - }), - - "has": markFunction(function( selector ) { - return function( elem ) { - return Sizzle( selector, elem ).length > 0; - }; - }), - - "contains": markFunction(function( text ) { - text = text.replace( runescape, funescape ); - return function( elem ) { - return ( elem.textContent || getText( elem ) ).indexOf( text ) > -1; - }; - }), - - // "Whether an element is represented by a :lang() selector - // is based solely on the element's language value - // being equal to the identifier C, - // or beginning with the identifier C immediately followed by "-". - // The matching of C against the element's language value is performed case-insensitively. - // The identifier C does not have to be a valid language name." - // http://www.w3.org/TR/selectors/#lang-pseudo - "lang": markFunction( function( lang ) { - // lang value must be a valid identifier - if ( !ridentifier.test(lang || "") ) { - Sizzle.error( "unsupported lang: " + lang ); - } - lang = lang.replace( runescape, funescape ).toLowerCase(); - return function( elem ) { - var elemLang; - do { - if ( (elemLang = documentIsHTML ? - elem.lang : - elem.getAttribute("xml:lang") || elem.getAttribute("lang")) ) { - - elemLang = elemLang.toLowerCase(); - return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0; - } - } while ( (elem = elem.parentNode) && elem.nodeType === 1 ); - return false; - }; - }), - - // Miscellaneous - "target": function( elem ) { - var hash = window.location && window.location.hash; - return hash && hash.slice( 1 ) === elem.id; - }, - - "root": function( elem ) { - return elem === docElem; - }, - - "focus": function( elem ) { - return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex); - }, - - // Boolean properties - "enabled": createDisabledPseudo( false ), - "disabled": createDisabledPseudo( true ), - - "checked": function( elem ) { - // In CSS3, :checked should return both checked and selected elements - // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked - var nodeName = elem.nodeName.toLowerCase(); - return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected); - }, - - "selected": function( elem ) { - // Accessing this property makes selected-by-default - // options in Safari work properly - if ( elem.parentNode ) { - elem.parentNode.selectedIndex; - } - - return elem.selected === true; - }, - - // Contents - "empty": function( elem ) { - // http://www.w3.org/TR/selectors/#empty-pseudo - // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5), - // but not by others (comment: 8; processing instruction: 7; etc.) - // nodeType < 6 works because attributes (2) do not appear as children - for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { - if ( elem.nodeType < 6 ) { - return false; - } - } - return true; - }, - - "parent": function( elem ) { - return !Expr.pseudos["empty"]( elem ); - }, - - // Element/input types - "header": function( elem ) { - return rheader.test( elem.nodeName ); - }, - - "input": function( elem ) { - return rinputs.test( elem.nodeName ); - }, - - "button": function( elem ) { - var name = elem.nodeName.toLowerCase(); - return name === "input" && elem.type === "button" || name === "button"; - }, - - "text": function( elem ) { - var attr; - return elem.nodeName.toLowerCase() === "input" && - elem.type === "text" && - - // Support: IE<8 - // New HTML5 attribute values (e.g., "search") appear with elem.type === "text" - ( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === "text" ); - }, - - // Position-in-collection - "first": createPositionalPseudo(function() { - return [ 0 ]; - }), - - "last": createPositionalPseudo(function( matchIndexes, length ) { - return [ length - 1 ]; - }), - - "eq": createPositionalPseudo(function( matchIndexes, length, argument ) { - return [ argument < 0 ? argument + length : argument ]; - }), - - "even": createPositionalPseudo(function( matchIndexes, length ) { - var i = 0; - for ( ; i < length; i += 2 ) { - matchIndexes.push( i ); - } - return matchIndexes; - }), - - "odd": createPositionalPseudo(function( matchIndexes, length ) { - var i = 1; - for ( ; i < length; i += 2 ) { - matchIndexes.push( i ); - } - return matchIndexes; - }), - - "lt": createPositionalPseudo(function( matchIndexes, length, argument ) { - var i = argument < 0 ? - argument + length : - argument > length ? - length : - argument; - for ( ; --i >= 0; ) { - matchIndexes.push( i ); - } - return matchIndexes; - }), - - "gt": createPositionalPseudo(function( matchIndexes, length, argument ) { - var i = argument < 0 ? argument + length : argument; - for ( ; ++i < length; ) { - matchIndexes.push( i ); - } - return matchIndexes; - }) - } -}; - -Expr.pseudos["nth"] = Expr.pseudos["eq"]; - -// Add button/input type pseudos -for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) { - Expr.pseudos[ i ] = createInputPseudo( i ); -} -for ( i in { submit: true, reset: true } ) { - Expr.pseudos[ i ] = createButtonPseudo( i ); -} - -// Easy API for creating new setFilters -function setFilters() {} -setFilters.prototype = Expr.filters = Expr.pseudos; -Expr.setFilters = new setFilters(); - -tokenize = Sizzle.tokenize = function( selector, parseOnly ) { - var matched, match, tokens, type, - soFar, groups, preFilters, - cached = tokenCache[ selector + " " ]; - - if ( cached ) { - return parseOnly ? 0 : cached.slice( 0 ); - } - - soFar = selector; - groups = []; - preFilters = Expr.preFilter; - - while ( soFar ) { - - // Comma and first run - if ( !matched || (match = rcomma.exec( soFar )) ) { - if ( match ) { - // Don't consume trailing commas as valid - soFar = soFar.slice( match[0].length ) || soFar; - } - groups.push( (tokens = []) ); - } - - matched = false; - - // Combinators - if ( (match = rcombinators.exec( soFar )) ) { - matched = match.shift(); - tokens.push({ - value: matched, - // Cast descendant combinators to space - type: match[0].replace( rtrim, " " ) - }); - soFar = soFar.slice( matched.length ); - } - - // Filters - for ( type in Expr.filter ) { - if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] || - (match = preFilters[ type ]( match ))) ) { - matched = match.shift(); - tokens.push({ - value: matched, - type: type, - matches: match - }); - soFar = soFar.slice( matched.length ); - } - } - - if ( !matched ) { - break; - } - } - - // Return the length of the invalid excess - // if we're just parsing - // Otherwise, throw an error or return tokens - return parseOnly ? - soFar.length : - soFar ? - Sizzle.error( selector ) : - // Cache the tokens - tokenCache( selector, groups ).slice( 0 ); -}; - -function toSelector( tokens ) { - var i = 0, - len = tokens.length, - selector = ""; - for ( ; i < len; i++ ) { - selector += tokens[i].value; - } - return selector; -} - -function addCombinator( matcher, combinator, base ) { - var dir = combinator.dir, - skip = combinator.next, - key = skip || dir, - checkNonElements = base && key === "parentNode", - doneName = done++; - - return combinator.first ? - // Check against closest ancestor/preceding element - function( elem, context, xml ) { - while ( (elem = elem[ dir ]) ) { - if ( elem.nodeType === 1 || checkNonElements ) { - return matcher( elem, context, xml ); - } - } - return false; - } : - - // Check against all ancestor/preceding elements - function( elem, context, xml ) { - var oldCache, uniqueCache, outerCache, - newCache = [ dirruns, doneName ]; - - // We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching - if ( xml ) { - while ( (elem = elem[ dir ]) ) { - if ( elem.nodeType === 1 || checkNonElements ) { - if ( matcher( elem, context, xml ) ) { - return true; - } - } - } - } else { - while ( (elem = elem[ dir ]) ) { - if ( elem.nodeType === 1 || checkNonElements ) { - outerCache = elem[ expando ] || (elem[ expando ] = {}); - - // Support: IE <9 only - // Defend against cloned attroperties (jQuery gh-1709) - uniqueCache = outerCache[ elem.uniqueID ] || (outerCache[ elem.uniqueID ] = {}); - - if ( skip && skip === elem.nodeName.toLowerCase() ) { - elem = elem[ dir ] || elem; - } else if ( (oldCache = uniqueCache[ key ]) && - oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) { - - // Assign to newCache so results back-propagate to previous elements - return (newCache[ 2 ] = oldCache[ 2 ]); - } else { - // Reuse newcache so results back-propagate to previous elements - uniqueCache[ key ] = newCache; - - // A match means we're done; a fail means we have to keep checking - if ( (newCache[ 2 ] = matcher( elem, context, xml )) ) { - return true; - } - } - } - } - } - return false; - }; -} - -function elementMatcher( matchers ) { - return matchers.length > 1 ? - function( elem, context, xml ) { - var i = matchers.length; - while ( i-- ) { - if ( !matchers[i]( elem, context, xml ) ) { - return false; - } - } - return true; - } : - matchers[0]; -} - -function multipleContexts( selector, contexts, results ) { - var i = 0, - len = contexts.length; - for ( ; i < len; i++ ) { - Sizzle( selector, contexts[i], results ); - } - return results; -} - -function condense( unmatched, map, filter, context, xml ) { - var elem, - newUnmatched = [], - i = 0, - len = unmatched.length, - mapped = map != null; - - for ( ; i < len; i++ ) { - if ( (elem = unmatched[i]) ) { - if ( !filter || filter( elem, context, xml ) ) { - newUnmatched.push( elem ); - if ( mapped ) { - map.push( i ); - } - } - } - } - - return newUnmatched; -} - -function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) { - if ( postFilter && !postFilter[ expando ] ) { - postFilter = setMatcher( postFilter ); - } - if ( postFinder && !postFinder[ expando ] ) { - postFinder = setMatcher( postFinder, postSelector ); - } - return markFunction(function( seed, results, context, xml ) { - var temp, i, elem, - preMap = [], - postMap = [], - preexisting = results.length, - - // Get initial elements from seed or context - elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ), - - // Prefilter to get matcher input, preserving a map for seed-results synchronization - matcherIn = preFilter && ( seed || !selector ) ? - condense( elems, preMap, preFilter, context, xml ) : - elems, - - matcherOut = matcher ? - // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results, - postFinder || ( seed ? preFilter : preexisting || postFilter ) ? - - // ...intermediate processing is necessary - [] : - - // ...otherwise use results directly - results : - matcherIn; - - // Find primary matches - if ( matcher ) { - matcher( matcherIn, matcherOut, context, xml ); - } - - // Apply postFilter - if ( postFilter ) { - temp = condense( matcherOut, postMap ); - postFilter( temp, [], context, xml ); - - // Un-match failing elements by moving them back to matcherIn - i = temp.length; - while ( i-- ) { - if ( (elem = temp[i]) ) { - matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem); - } - } - } - - if ( seed ) { - if ( postFinder || preFilter ) { - if ( postFinder ) { - // Get the final matcherOut by condensing this intermediate into postFinder contexts - temp = []; - i = matcherOut.length; - while ( i-- ) { - if ( (elem = matcherOut[i]) ) { - // Restore matcherIn since elem is not yet a final match - temp.push( (matcherIn[i] = elem) ); - } - } - postFinder( null, (matcherOut = []), temp, xml ); - } - - // Move matched elements from seed to results to keep them synchronized - i = matcherOut.length; - while ( i-- ) { - if ( (elem = matcherOut[i]) && - (temp = postFinder ? indexOf( seed, elem ) : preMap[i]) > -1 ) { - - seed[temp] = !(results[temp] = elem); - } - } - } - - // Add elements to results, through postFinder if defined - } else { - matcherOut = condense( - matcherOut === results ? - matcherOut.splice( preexisting, matcherOut.length ) : - matcherOut - ); - if ( postFinder ) { - postFinder( null, results, matcherOut, xml ); - } else { - push.apply( results, matcherOut ); - } - } - }); -} - -function matcherFromTokens( tokens ) { - var checkContext, matcher, j, - len = tokens.length, - leadingRelative = Expr.relative[ tokens[0].type ], - implicitRelative = leadingRelative || Expr.relative[" "], - i = leadingRelative ? 1 : 0, - - // The foundational matcher ensures that elements are reachable from top-level context(s) - matchContext = addCombinator( function( elem ) { - return elem === checkContext; - }, implicitRelative, true ), - matchAnyContext = addCombinator( function( elem ) { - return indexOf( checkContext, elem ) > -1; - }, implicitRelative, true ), - matchers = [ function( elem, context, xml ) { - var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || ( - (checkContext = context).nodeType ? - matchContext( elem, context, xml ) : - matchAnyContext( elem, context, xml ) ); - // Avoid hanging onto element (issue #299) - checkContext = null; - return ret; - } ]; - - for ( ; i < len; i++ ) { - if ( (matcher = Expr.relative[ tokens[i].type ]) ) { - matchers = [ addCombinator(elementMatcher( matchers ), matcher) ]; - } else { - matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches ); - - // Return special upon seeing a positional matcher - if ( matcher[ expando ] ) { - // Find the next relative operator (if any) for proper handling - j = ++i; - for ( ; j < len; j++ ) { - if ( Expr.relative[ tokens[j].type ] ) { - break; - } - } - return setMatcher( - i > 1 && elementMatcher( matchers ), - i > 1 && toSelector( - // If the preceding token was a descendant combinator, insert an implicit any-element `*` - tokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === " " ? "*" : "" }) - ).replace( rtrim, "$1" ), - matcher, - i < j && matcherFromTokens( tokens.slice( i, j ) ), - j < len && matcherFromTokens( (tokens = tokens.slice( j )) ), - j < len && toSelector( tokens ) - ); - } - matchers.push( matcher ); - } - } - - return elementMatcher( matchers ); -} - -function matcherFromGroupMatchers( elementMatchers, setMatchers ) { - var bySet = setMatchers.length > 0, - byElement = elementMatchers.length > 0, - superMatcher = function( seed, context, xml, results, outermost ) { - var elem, j, matcher, - matchedCount = 0, - i = "0", - unmatched = seed && [], - setMatched = [], - contextBackup = outermostContext, - // We must always have either seed elements or outermost context - elems = seed || byElement && Expr.find["TAG"]( "*", outermost ), - // Use integer dirruns iff this is the outermost matcher - dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1), - len = elems.length; - - if ( outermost ) { - outermostContext = context === document || context || outermost; - } - - // Add elements passing elementMatchers directly to results - // Support: IE<9, Safari - // Tolerate NodeList properties (IE: "length"; Safari: ) matching elements by id - for ( ; i !== len && (elem = elems[i]) != null; i++ ) { - if ( byElement && elem ) { - j = 0; - if ( !context && elem.ownerDocument !== document ) { - setDocument( elem ); - xml = !documentIsHTML; - } - while ( (matcher = elementMatchers[j++]) ) { - if ( matcher( elem, context || document, xml) ) { - results.push( elem ); - break; - } - } - if ( outermost ) { - dirruns = dirrunsUnique; - } - } - - // Track unmatched elements for set filters - if ( bySet ) { - // They will have gone through all possible matchers - if ( (elem = !matcher && elem) ) { - matchedCount--; - } - - // Lengthen the array for every element, matched or not - if ( seed ) { - unmatched.push( elem ); - } - } - } - - // `i` is now the count of elements visited above, and adding it to `matchedCount` - // makes the latter nonnegative. - matchedCount += i; - - // Apply set filters to unmatched elements - // NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount` - // equals `i`), unless we didn't visit _any_ elements in the above loop because we have - // no element matchers and no seed. - // Incrementing an initially-string "0" `i` allows `i` to remain a string only in that - // case, which will result in a "00" `matchedCount` that differs from `i` but is also - // numerically zero. - if ( bySet && i !== matchedCount ) { - j = 0; - while ( (matcher = setMatchers[j++]) ) { - matcher( unmatched, setMatched, context, xml ); - } - - if ( seed ) { - // Reintegrate element matches to eliminate the need for sorting - if ( matchedCount > 0 ) { - while ( i-- ) { - if ( !(unmatched[i] || setMatched[i]) ) { - setMatched[i] = pop.call( results ); - } - } - } - - // Discard index placeholder values to get only actual matches - setMatched = condense( setMatched ); - } - - // Add matches to results - push.apply( results, setMatched ); - - // Seedless set matches succeeding multiple successful matchers stipulate sorting - if ( outermost && !seed && setMatched.length > 0 && - ( matchedCount + setMatchers.length ) > 1 ) { - - Sizzle.uniqueSort( results ); - } - } - - // Override manipulation of globals by nested matchers - if ( outermost ) { - dirruns = dirrunsUnique; - outermostContext = contextBackup; - } - - return unmatched; - }; - - return bySet ? - markFunction( superMatcher ) : - superMatcher; -} - -compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) { - var i, - setMatchers = [], - elementMatchers = [], - cached = compilerCache[ selector + " " ]; - - if ( !cached ) { - // Generate a function of recursive functions that can be used to check each element - if ( !match ) { - match = tokenize( selector ); - } - i = match.length; - while ( i-- ) { - cached = matcherFromTokens( match[i] ); - if ( cached[ expando ] ) { - setMatchers.push( cached ); - } else { - elementMatchers.push( cached ); - } - } - - // Cache the compiled function - cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) ); - - // Save selector and tokenization - cached.selector = selector; - } - return cached; -}; - -/** - * A low-level selection function that works with Sizzle's compiled - * selector functions - * @param {String|Function} selector A selector or a pre-compiled - * selector function built with Sizzle.compile - * @param {Element} context - * @param {Array} [results] - * @param {Array} [seed] A set of elements to match against - */ -select = Sizzle.select = function( selector, context, results, seed ) { - var i, tokens, token, type, find, - compiled = typeof selector === "function" && selector, - match = !seed && tokenize( (selector = compiled.selector || selector) ); - - results = results || []; - - // Try to minimize operations if there is only one selector in the list and no seed - // (the latter of which guarantees us context) - if ( match.length === 1 ) { - - // Reduce context if the leading compound selector is an ID - tokens = match[0] = match[0].slice( 0 ); - if ( tokens.length > 2 && (token = tokens[0]).type === "ID" && - context.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[1].type ] ) { - - context = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0]; - if ( !context ) { - return results; - - // Precompiled matchers will still verify ancestry, so step up a level - } else if ( compiled ) { - context = context.parentNode; - } - - selector = selector.slice( tokens.shift().value.length ); - } - - // Fetch a seed set for right-to-left matching - i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length; - while ( i-- ) { - token = tokens[i]; - - // Abort if we hit a combinator - if ( Expr.relative[ (type = token.type) ] ) { - break; - } - if ( (find = Expr.find[ type ]) ) { - // Search, expanding context for leading sibling combinators - if ( (seed = find( - token.matches[0].replace( runescape, funescape ), - rsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context - )) ) { - - // If seed is empty or no tokens remain, we can return early - tokens.splice( i, 1 ); - selector = seed.length && toSelector( tokens ); - if ( !selector ) { - push.apply( results, seed ); - return results; - } - - break; - } - } - } - } - - // Compile and execute a filtering function if one is not provided - // Provide `match` to avoid retokenization if we modified the selector above - ( compiled || compile( selector, match ) )( - seed, - context, - !documentIsHTML, - results, - !context || rsibling.test( selector ) && testContext( context.parentNode ) || context - ); - return results; -}; - -// One-time assignments - -// Sort stability -support.sortStable = expando.split("").sort( sortOrder ).join("") === expando; - -// Support: Chrome 14-35+ -// Always assume duplicates if they aren't passed to the comparison function -support.detectDuplicates = !!hasDuplicate; - -// Initialize against the default document -setDocument(); - -// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27) -// Detached nodes confoundingly follow *each other* -support.sortDetached = assert(function( el ) { - // Should return 1, but returns 4 (following) - return el.compareDocumentPosition( document.createElement("fieldset") ) & 1; -}); - -// Support: IE<8 -// Prevent attribute/property "interpolation" -// https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx -if ( !assert(function( el ) { - el.innerHTML = ""; - return el.firstChild.getAttribute("href") === "#" ; -}) ) { - addHandle( "type|href|height|width", function( elem, name, isXML ) { - if ( !isXML ) { - return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 ); - } - }); -} - -// Support: IE<9 -// Use defaultValue in place of getAttribute("value") -if ( !support.attributes || !assert(function( el ) { - el.innerHTML = ""; - el.firstChild.setAttribute( "value", "" ); - return el.firstChild.getAttribute( "value" ) === ""; -}) ) { - addHandle( "value", function( elem, name, isXML ) { - if ( !isXML && elem.nodeName.toLowerCase() === "input" ) { - return elem.defaultValue; - } - }); -} - -// Support: IE<9 -// Use getAttributeNode to fetch booleans when getAttribute lies -if ( !assert(function( el ) { - return el.getAttribute("disabled") == null; -}) ) { - addHandle( booleans, function( elem, name, isXML ) { - var val; - if ( !isXML ) { - return elem[ name ] === true ? name.toLowerCase() : - (val = elem.getAttributeNode( name )) && val.specified ? - val.value : - null; - } - }); -} - -return Sizzle; - -})( window ); - - - -jQuery.find = Sizzle; -jQuery.expr = Sizzle.selectors; - -// Deprecated -jQuery.expr[ ":" ] = jQuery.expr.pseudos; -jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort; -jQuery.text = Sizzle.getText; -jQuery.isXMLDoc = Sizzle.isXML; -jQuery.contains = Sizzle.contains; -jQuery.escapeSelector = Sizzle.escape; - - - - -var dir = function( elem, dir, until ) { - var matched = [], - truncate = until !== undefined; - - while ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) { - if ( elem.nodeType === 1 ) { - if ( truncate && jQuery( elem ).is( until ) ) { - break; - } - matched.push( elem ); - } - } - return matched; -}; - - -var siblings = function( n, elem ) { - var matched = []; - - for ( ; n; n = n.nextSibling ) { - if ( n.nodeType === 1 && n !== elem ) { - matched.push( n ); - } - } - - return matched; -}; - - -var rneedsContext = jQuery.expr.match.needsContext; - - - -function nodeName( elem, name ) { - - return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); - -}; -var rsingleTag = ( /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i ); - - - -// Implement the identical functionality for filter and not -function winnow( elements, qualifier, not ) { - if ( isFunction( qualifier ) ) { - return jQuery.grep( elements, function( elem, i ) { - return !!qualifier.call( elem, i, elem ) !== not; - } ); - } - - // Single element - if ( qualifier.nodeType ) { - return jQuery.grep( elements, function( elem ) { - return ( elem === qualifier ) !== not; - } ); - } - - // Arraylike of elements (jQuery, arguments, Array) - if ( typeof qualifier !== "string" ) { - return jQuery.grep( elements, function( elem ) { - return ( indexOf.call( qualifier, elem ) > -1 ) !== not; - } ); - } - - // Filtered directly for both simple and complex selectors - return jQuery.filter( qualifier, elements, not ); -} - -jQuery.filter = function( expr, elems, not ) { - var elem = elems[ 0 ]; - - if ( not ) { - expr = ":not(" + expr + ")"; - } - - if ( elems.length === 1 && elem.nodeType === 1 ) { - return jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : []; - } - - return jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) { - return elem.nodeType === 1; - } ) ); -}; - -jQuery.fn.extend( { - find: function( selector ) { - var i, ret, - len = this.length, - self = this; - - if ( typeof selector !== "string" ) { - return this.pushStack( jQuery( selector ).filter( function() { - for ( i = 0; i < len; i++ ) { - if ( jQuery.contains( self[ i ], this ) ) { - return true; - } - } - } ) ); - } - - ret = this.pushStack( [] ); - - for ( i = 0; i < len; i++ ) { - jQuery.find( selector, self[ i ], ret ); - } - - return len > 1 ? jQuery.uniqueSort( ret ) : ret; - }, - filter: function( selector ) { - return this.pushStack( winnow( this, selector || [], false ) ); - }, - not: function( selector ) { - return this.pushStack( winnow( this, selector || [], true ) ); - }, - is: function( selector ) { - return !!winnow( - this, - - // If this is a positional/relative selector, check membership in the returned set - // so $("p:first").is("p:last") won't return true for a doc with two "p". - typeof selector === "string" && rneedsContext.test( selector ) ? - jQuery( selector ) : - selector || [], - false - ).length; - } -} ); - - -// Initialize a jQuery object - - -// A central reference to the root jQuery(document) -var rootjQuery, - - // A simple way to check for HTML strings - // Prioritize #id over to avoid XSS via location.hash (#9521) - // Strict HTML recognition (#11290: must start with <) - // Shortcut simple #id case for speed - rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/, - - init = jQuery.fn.init = function( selector, context, root ) { - var match, elem; - - // HANDLE: $(""), $(null), $(undefined), $(false) - if ( !selector ) { - return this; - } - - // Method init() accepts an alternate rootjQuery - // so migrate can support jQuery.sub (gh-2101) - root = root || rootjQuery; - - // Handle HTML strings - if ( typeof selector === "string" ) { - if ( selector[ 0 ] === "<" && - selector[ selector.length - 1 ] === ">" && - selector.length >= 3 ) { - - // Assume that strings that start and end with <> are HTML and skip the regex check - match = [ null, selector, null ]; - - } else { - match = rquickExpr.exec( selector ); - } - - // Match html or make sure no context is specified for #id - if ( match && ( match[ 1 ] || !context ) ) { - - // HANDLE: $(html) -> $(array) - if ( match[ 1 ] ) { - context = context instanceof jQuery ? context[ 0 ] : context; - - // Option to run scripts is true for back-compat - // Intentionally let the error be thrown if parseHTML is not present - jQuery.merge( this, jQuery.parseHTML( - match[ 1 ], - context && context.nodeType ? context.ownerDocument || context : document, - true - ) ); - - // HANDLE: $(html, props) - if ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) { - for ( match in context ) { - - // Properties of context are called as methods if possible - if ( isFunction( this[ match ] ) ) { - this[ match ]( context[ match ] ); - - // ...and otherwise set as attributes - } else { - this.attr( match, context[ match ] ); - } - } - } - - return this; - - // HANDLE: $(#id) - } else { - elem = document.getElementById( match[ 2 ] ); - - if ( elem ) { - - // Inject the element directly into the jQuery object - this[ 0 ] = elem; - this.length = 1; - } - return this; - } - - // HANDLE: $(expr, $(...)) - } else if ( !context || context.jquery ) { - return ( context || root ).find( selector ); - - // HANDLE: $(expr, context) - // (which is just equivalent to: $(context).find(expr) - } else { - return this.constructor( context ).find( selector ); - } - - // HANDLE: $(DOMElement) - } else if ( selector.nodeType ) { - this[ 0 ] = selector; - this.length = 1; - return this; - - // HANDLE: $(function) - // Shortcut for document ready - } else if ( isFunction( selector ) ) { - return root.ready !== undefined ? - root.ready( selector ) : - - // Execute immediately if ready is not present - selector( jQuery ); - } - - return jQuery.makeArray( selector, this ); - }; - -// Give the init function the jQuery prototype for later instantiation -init.prototype = jQuery.fn; - -// Initialize central reference -rootjQuery = jQuery( document ); - - -var rparentsprev = /^(?:parents|prev(?:Until|All))/, - - // Methods guaranteed to produce a unique set when starting from a unique set - guaranteedUnique = { - children: true, - contents: true, - next: true, - prev: true - }; - -jQuery.fn.extend( { - has: function( target ) { - var targets = jQuery( target, this ), - l = targets.length; - - return this.filter( function() { - var i = 0; - for ( ; i < l; i++ ) { - if ( jQuery.contains( this, targets[ i ] ) ) { - return true; - } - } - } ); - }, - - closest: function( selectors, context ) { - var cur, - i = 0, - l = this.length, - matched = [], - targets = typeof selectors !== "string" && jQuery( selectors ); - - // Positional selectors never match, since there's no _selection_ context - if ( !rneedsContext.test( selectors ) ) { - for ( ; i < l; i++ ) { - for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) { - - // Always skip document fragments - if ( cur.nodeType < 11 && ( targets ? - targets.index( cur ) > -1 : - - // Don't pass non-elements to Sizzle - cur.nodeType === 1 && - jQuery.find.matchesSelector( cur, selectors ) ) ) { - - matched.push( cur ); - break; - } - } - } - } - - return this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched ); - }, - - // Determine the position of an element within the set - index: function( elem ) { - - // No argument, return index in parent - if ( !elem ) { - return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1; - } - - // Index in selector - if ( typeof elem === "string" ) { - return indexOf.call( jQuery( elem ), this[ 0 ] ); - } - - // Locate the position of the desired element - return indexOf.call( this, - - // If it receives a jQuery object, the first element is used - elem.jquery ? elem[ 0 ] : elem - ); - }, - - add: function( selector, context ) { - return this.pushStack( - jQuery.uniqueSort( - jQuery.merge( this.get(), jQuery( selector, context ) ) - ) - ); - }, - - addBack: function( selector ) { - return this.add( selector == null ? - this.prevObject : this.prevObject.filter( selector ) - ); - } -} ); - -function sibling( cur, dir ) { - while ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {} - return cur; -} - -jQuery.each( { - parent: function( elem ) { - var parent = elem.parentNode; - return parent && parent.nodeType !== 11 ? parent : null; - }, - parents: function( elem ) { - return dir( elem, "parentNode" ); - }, - parentsUntil: function( elem, i, until ) { - return dir( elem, "parentNode", until ); - }, - next: function( elem ) { - return sibling( elem, "nextSibling" ); - }, - prev: function( elem ) { - return sibling( elem, "previousSibling" ); - }, - nextAll: function( elem ) { - return dir( elem, "nextSibling" ); - }, - prevAll: function( elem ) { - return dir( elem, "previousSibling" ); - }, - nextUntil: function( elem, i, until ) { - return dir( elem, "nextSibling", until ); - }, - prevUntil: function( elem, i, until ) { - return dir( elem, "previousSibling", until ); - }, - siblings: function( elem ) { - return siblings( ( elem.parentNode || {} ).firstChild, elem ); - }, - children: function( elem ) { - return siblings( elem.firstChild ); - }, - contents: function( elem ) { - if ( typeof elem.contentDocument !== "undefined" ) { - return elem.contentDocument; - } - - // Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only - // Treat the template element as a regular one in browsers that - // don't support it. - if ( nodeName( elem, "template" ) ) { - elem = elem.content || elem; - } - - return jQuery.merge( [], elem.childNodes ); - } -}, function( name, fn ) { - jQuery.fn[ name ] = function( until, selector ) { - var matched = jQuery.map( this, fn, until ); - - if ( name.slice( -5 ) !== "Until" ) { - selector = until; - } - - if ( selector && typeof selector === "string" ) { - matched = jQuery.filter( selector, matched ); - } - - if ( this.length > 1 ) { - - // Remove duplicates - if ( !guaranteedUnique[ name ] ) { - jQuery.uniqueSort( matched ); - } - - // Reverse order for parents* and prev-derivatives - if ( rparentsprev.test( name ) ) { - matched.reverse(); - } - } - - return this.pushStack( matched ); - }; -} ); -var rnothtmlwhite = ( /[^\x20\t\r\n\f]+/g ); - - - -// Convert String-formatted options into Object-formatted ones -function createOptions( options ) { - var object = {}; - jQuery.each( options.match( rnothtmlwhite ) || [], function( _, flag ) { - object[ flag ] = true; - } ); - return object; -} - -/* - * Create a callback list using the following parameters: - * - * options: an optional list of space-separated options that will change how - * the callback list behaves or a more traditional option object - * - * By default a callback list will act like an event callback list and can be - * "fired" multiple times. - * - * Possible options: - * - * once: will ensure the callback list can only be fired once (like a Deferred) - * - * memory: will keep track of previous values and will call any callback added - * after the list has been fired right away with the latest "memorized" - * values (like a Deferred) - * - * unique: will ensure a callback can only be added once (no duplicate in the list) - * - * stopOnFalse: interrupt callings when a callback returns false - * - */ -jQuery.Callbacks = function( options ) { - - // Convert options from String-formatted to Object-formatted if needed - // (we check in cache first) - options = typeof options === "string" ? - createOptions( options ) : - jQuery.extend( {}, options ); - - var // Flag to know if list is currently firing - firing, - - // Last fire value for non-forgettable lists - memory, - - // Flag to know if list was already fired - fired, - - // Flag to prevent firing - locked, - - // Actual callback list - list = [], - - // Queue of execution data for repeatable lists - queue = [], - - // Index of currently firing callback (modified by add/remove as needed) - firingIndex = -1, - - // Fire callbacks - fire = function() { - - // Enforce single-firing - locked = locked || options.once; - - // Execute callbacks for all pending executions, - // respecting firingIndex overrides and runtime changes - fired = firing = true; - for ( ; queue.length; firingIndex = -1 ) { - memory = queue.shift(); - while ( ++firingIndex < list.length ) { - - // Run callback and check for early termination - if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false && - options.stopOnFalse ) { - - // Jump to end and forget the data so .add doesn't re-fire - firingIndex = list.length; - memory = false; - } - } - } - - // Forget the data if we're done with it - if ( !options.memory ) { - memory = false; - } - - firing = false; - - // Clean up if we're done firing for good - if ( locked ) { - - // Keep an empty list if we have data for future add calls - if ( memory ) { - list = []; - - // Otherwise, this object is spent - } else { - list = ""; - } - } - }, - - // Actual Callbacks object - self = { - - // Add a callback or a collection of callbacks to the list - add: function() { - if ( list ) { - - // If we have memory from a past run, we should fire after adding - if ( memory && !firing ) { - firingIndex = list.length - 1; - queue.push( memory ); - } - - ( function add( args ) { - jQuery.each( args, function( _, arg ) { - if ( isFunction( arg ) ) { - if ( !options.unique || !self.has( arg ) ) { - list.push( arg ); - } - } else if ( arg && arg.length && toType( arg ) !== "string" ) { - - // Inspect recursively - add( arg ); - } - } ); - } )( arguments ); - - if ( memory && !firing ) { - fire(); - } - } - return this; - }, - - // Remove a callback from the list - remove: function() { - jQuery.each( arguments, function( _, arg ) { - var index; - while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) { - list.splice( index, 1 ); - - // Handle firing indexes - if ( index <= firingIndex ) { - firingIndex--; - } - } - } ); - return this; - }, - - // Check if a given callback is in the list. - // If no argument is given, return whether or not list has callbacks attached. - has: function( fn ) { - return fn ? - jQuery.inArray( fn, list ) > -1 : - list.length > 0; - }, - - // Remove all callbacks from the list - empty: function() { - if ( list ) { - list = []; - } - return this; - }, - - // Disable .fire and .add - // Abort any current/pending executions - // Clear all callbacks and values - disable: function() { - locked = queue = []; - list = memory = ""; - return this; - }, - disabled: function() { - return !list; - }, - - // Disable .fire - // Also disable .add unless we have memory (since it would have no effect) - // Abort any pending executions - lock: function() { - locked = queue = []; - if ( !memory && !firing ) { - list = memory = ""; - } - return this; - }, - locked: function() { - return !!locked; - }, - - // Call all callbacks with the given context and arguments - fireWith: function( context, args ) { - if ( !locked ) { - args = args || []; - args = [ context, args.slice ? args.slice() : args ]; - queue.push( args ); - if ( !firing ) { - fire(); - } - } - return this; - }, - - // Call all the callbacks with the given arguments - fire: function() { - self.fireWith( this, arguments ); - return this; - }, - - // To know if the callbacks have already been called at least once - fired: function() { - return !!fired; - } - }; - - return self; -}; - - -function Identity( v ) { - return v; -} -function Thrower( ex ) { - throw ex; -} - -function adoptValue( value, resolve, reject, noValue ) { - var method; - - try { - - // Check for promise aspect first to privilege synchronous behavior - if ( value && isFunction( ( method = value.promise ) ) ) { - method.call( value ).done( resolve ).fail( reject ); - - // Other thenables - } else if ( value && isFunction( ( method = value.then ) ) ) { - method.call( value, resolve, reject ); - - // Other non-thenables - } else { - - // Control `resolve` arguments by letting Array#slice cast boolean `noValue` to integer: - // * false: [ value ].slice( 0 ) => resolve( value ) - // * true: [ value ].slice( 1 ) => resolve() - resolve.apply( undefined, [ value ].slice( noValue ) ); - } - - // For Promises/A+, convert exceptions into rejections - // Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in - // Deferred#then to conditionally suppress rejection. - } catch ( value ) { - - // Support: Android 4.0 only - // Strict mode functions invoked without .call/.apply get global-object context - reject.apply( undefined, [ value ] ); - } -} - -jQuery.extend( { - - Deferred: function( func ) { - var tuples = [ - - // action, add listener, callbacks, - // ... .then handlers, argument index, [final state] - [ "notify", "progress", jQuery.Callbacks( "memory" ), - jQuery.Callbacks( "memory" ), 2 ], - [ "resolve", "done", jQuery.Callbacks( "once memory" ), - jQuery.Callbacks( "once memory" ), 0, "resolved" ], - [ "reject", "fail", jQuery.Callbacks( "once memory" ), - jQuery.Callbacks( "once memory" ), 1, "rejected" ] - ], - state = "pending", - promise = { - state: function() { - return state; - }, - always: function() { - deferred.done( arguments ).fail( arguments ); - return this; - }, - "catch": function( fn ) { - return promise.then( null, fn ); - }, - - // Keep pipe for back-compat - pipe: function( /* fnDone, fnFail, fnProgress */ ) { - var fns = arguments; - - return jQuery.Deferred( function( newDefer ) { - jQuery.each( tuples, function( i, tuple ) { - - // Map tuples (progress, done, fail) to arguments (done, fail, progress) - var fn = isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ]; - - // deferred.progress(function() { bind to newDefer or newDefer.notify }) - // deferred.done(function() { bind to newDefer or newDefer.resolve }) - // deferred.fail(function() { bind to newDefer or newDefer.reject }) - deferred[ tuple[ 1 ] ]( function() { - var returned = fn && fn.apply( this, arguments ); - if ( returned && isFunction( returned.promise ) ) { - returned.promise() - .progress( newDefer.notify ) - .done( newDefer.resolve ) - .fail( newDefer.reject ); - } else { - newDefer[ tuple[ 0 ] + "With" ]( - this, - fn ? [ returned ] : arguments - ); - } - } ); - } ); - fns = null; - } ).promise(); - }, - then: function( onFulfilled, onRejected, onProgress ) { - var maxDepth = 0; - function resolve( depth, deferred, handler, special ) { - return function() { - var that = this, - args = arguments, - mightThrow = function() { - var returned, then; - - // Support: Promises/A+ section 2.3.3.3.3 - // https://promisesaplus.com/#point-59 - // Ignore double-resolution attempts - if ( depth < maxDepth ) { - return; - } - - returned = handler.apply( that, args ); - - // Support: Promises/A+ section 2.3.1 - // https://promisesaplus.com/#point-48 - if ( returned === deferred.promise() ) { - throw new TypeError( "Thenable self-resolution" ); - } - - // Support: Promises/A+ sections 2.3.3.1, 3.5 - // https://promisesaplus.com/#point-54 - // https://promisesaplus.com/#point-75 - // Retrieve `then` only once - then = returned && - - // Support: Promises/A+ section 2.3.4 - // https://promisesaplus.com/#point-64 - // Only check objects and functions for thenability - ( typeof returned === "object" || - typeof returned === "function" ) && - returned.then; - - // Handle a returned thenable - if ( isFunction( then ) ) { - - // Special processors (notify) just wait for resolution - if ( special ) { - then.call( - returned, - resolve( maxDepth, deferred, Identity, special ), - resolve( maxDepth, deferred, Thrower, special ) - ); - - // Normal processors (resolve) also hook into progress - } else { - - // ...and disregard older resolution values - maxDepth++; - - then.call( - returned, - resolve( maxDepth, deferred, Identity, special ), - resolve( maxDepth, deferred, Thrower, special ), - resolve( maxDepth, deferred, Identity, - deferred.notifyWith ) - ); - } - - // Handle all other returned values - } else { - - // Only substitute handlers pass on context - // and multiple values (non-spec behavior) - if ( handler !== Identity ) { - that = undefined; - args = [ returned ]; - } - - // Process the value(s) - // Default process is resolve - ( special || deferred.resolveWith )( that, args ); - } - }, - - // Only normal processors (resolve) catch and reject exceptions - process = special ? - mightThrow : - function() { - try { - mightThrow(); - } catch ( e ) { - - if ( jQuery.Deferred.exceptionHook ) { - jQuery.Deferred.exceptionHook( e, - process.stackTrace ); - } - - // Support: Promises/A+ section 2.3.3.3.4.1 - // https://promisesaplus.com/#point-61 - // Ignore post-resolution exceptions - if ( depth + 1 >= maxDepth ) { - - // Only substitute handlers pass on context - // and multiple values (non-spec behavior) - if ( handler !== Thrower ) { - that = undefined; - args = [ e ]; - } - - deferred.rejectWith( that, args ); - } - } - }; - - // Support: Promises/A+ section 2.3.3.3.1 - // https://promisesaplus.com/#point-57 - // Re-resolve promises immediately to dodge false rejection from - // subsequent errors - if ( depth ) { - process(); - } else { - - // Call an optional hook to record the stack, in case of exception - // since it's otherwise lost when execution goes async - if ( jQuery.Deferred.getStackHook ) { - process.stackTrace = jQuery.Deferred.getStackHook(); - } - window.setTimeout( process ); - } - }; - } - - return jQuery.Deferred( function( newDefer ) { - - // progress_handlers.add( ... ) - tuples[ 0 ][ 3 ].add( - resolve( - 0, - newDefer, - isFunction( onProgress ) ? - onProgress : - Identity, - newDefer.notifyWith - ) - ); - - // fulfilled_handlers.add( ... ) - tuples[ 1 ][ 3 ].add( - resolve( - 0, - newDefer, - isFunction( onFulfilled ) ? - onFulfilled : - Identity - ) - ); - - // rejected_handlers.add( ... ) - tuples[ 2 ][ 3 ].add( - resolve( - 0, - newDefer, - isFunction( onRejected ) ? - onRejected : - Thrower - ) - ); - } ).promise(); - }, - - // Get a promise for this deferred - // If obj is provided, the promise aspect is added to the object - promise: function( obj ) { - return obj != null ? jQuery.extend( obj, promise ) : promise; - } - }, - deferred = {}; - - // Add list-specific methods - jQuery.each( tuples, function( i, tuple ) { - var list = tuple[ 2 ], - stateString = tuple[ 5 ]; - - // promise.progress = list.add - // promise.done = list.add - // promise.fail = list.add - promise[ tuple[ 1 ] ] = list.add; - - // Handle state - if ( stateString ) { - list.add( - function() { - - // state = "resolved" (i.e., fulfilled) - // state = "rejected" - state = stateString; - }, - - // rejected_callbacks.disable - // fulfilled_callbacks.disable - tuples[ 3 - i ][ 2 ].disable, - - // rejected_handlers.disable - // fulfilled_handlers.disable - tuples[ 3 - i ][ 3 ].disable, - - // progress_callbacks.lock - tuples[ 0 ][ 2 ].lock, - - // progress_handlers.lock - tuples[ 0 ][ 3 ].lock - ); - } - - // progress_handlers.fire - // fulfilled_handlers.fire - // rejected_handlers.fire - list.add( tuple[ 3 ].fire ); - - // deferred.notify = function() { deferred.notifyWith(...) } - // deferred.resolve = function() { deferred.resolveWith(...) } - // deferred.reject = function() { deferred.rejectWith(...) } - deferred[ tuple[ 0 ] ] = function() { - deferred[ tuple[ 0 ] + "With" ]( this === deferred ? undefined : this, arguments ); - return this; - }; - - // deferred.notifyWith = list.fireWith - // deferred.resolveWith = list.fireWith - // deferred.rejectWith = list.fireWith - deferred[ tuple[ 0 ] + "With" ] = list.fireWith; - } ); - - // Make the deferred a promise - promise.promise( deferred ); - - // Call given func if any - if ( func ) { - func.call( deferred, deferred ); - } - - // All done! - return deferred; - }, - - // Deferred helper - when: function( singleValue ) { - var - - // count of uncompleted subordinates - remaining = arguments.length, - - // count of unprocessed arguments - i = remaining, - - // subordinate fulfillment data - resolveContexts = Array( i ), - resolveValues = slice.call( arguments ), - - // the master Deferred - master = jQuery.Deferred(), - - // subordinate callback factory - updateFunc = function( i ) { - return function( value ) { - resolveContexts[ i ] = this; - resolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value; - if ( !( --remaining ) ) { - master.resolveWith( resolveContexts, resolveValues ); - } - }; - }; - - // Single- and empty arguments are adopted like Promise.resolve - if ( remaining <= 1 ) { - adoptValue( singleValue, master.done( updateFunc( i ) ).resolve, master.reject, - !remaining ); - - // Use .then() to unwrap secondary thenables (cf. gh-3000) - if ( master.state() === "pending" || - isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) { - - return master.then(); - } - } - - // Multiple arguments are aggregated like Promise.all array elements - while ( i-- ) { - adoptValue( resolveValues[ i ], updateFunc( i ), master.reject ); - } - - return master.promise(); - } -} ); - - -// These usually indicate a programmer mistake during development, -// warn about them ASAP rather than swallowing them by default. -var rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/; - -jQuery.Deferred.exceptionHook = function( error, stack ) { - - // Support: IE 8 - 9 only - // Console exists when dev tools are open, which can happen at any time - if ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) { - window.console.warn( "jQuery.Deferred exception: " + error.message, error.stack, stack ); - } -}; - - - - -jQuery.readyException = function( error ) { - window.setTimeout( function() { - throw error; - } ); -}; - - - - -// The deferred used on DOM ready -var readyList = jQuery.Deferred(); - -jQuery.fn.ready = function( fn ) { - - readyList - .then( fn ) - - // Wrap jQuery.readyException in a function so that the lookup - // happens at the time of error handling instead of callback - // registration. - .catch( function( error ) { - jQuery.readyException( error ); - } ); - - return this; -}; - -jQuery.extend( { - - // Is the DOM ready to be used? Set to true once it occurs. - isReady: false, - - // A counter to track how many items to wait for before - // the ready event fires. See #6781 - readyWait: 1, - - // Handle when the DOM is ready - ready: function( wait ) { - - // Abort if there are pending holds or we're already ready - if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) { - return; - } - - // Remember that the DOM is ready - jQuery.isReady = true; - - // If a normal DOM Ready event fired, decrement, and wait if need be - if ( wait !== true && --jQuery.readyWait > 0 ) { - return; - } - - // If there are functions bound, to execute - readyList.resolveWith( document, [ jQuery ] ); - } -} ); - -jQuery.ready.then = readyList.then; - -// The ready event handler and self cleanup method -function completed() { - document.removeEventListener( "DOMContentLoaded", completed ); - window.removeEventListener( "load", completed ); - jQuery.ready(); -} - -// Catch cases where $(document).ready() is called -// after the browser event has already occurred. -// Support: IE <=9 - 10 only -// Older IE sometimes signals "interactive" too soon -if ( document.readyState === "complete" || - ( document.readyState !== "loading" && !document.documentElement.doScroll ) ) { - - // Handle it asynchronously to allow scripts the opportunity to delay ready - window.setTimeout( jQuery.ready ); - -} else { - - // Use the handy event callback - document.addEventListener( "DOMContentLoaded", completed ); - - // A fallback to window.onload, that will always work - window.addEventListener( "load", completed ); -} - - - - -// Multifunctional method to get and set values of a collection -// The value/s can optionally be executed if it's a function -var access = function( elems, fn, key, value, chainable, emptyGet, raw ) { - var i = 0, - len = elems.length, - bulk = key == null; - - // Sets many values - if ( toType( key ) === "object" ) { - chainable = true; - for ( i in key ) { - access( elems, fn, i, key[ i ], true, emptyGet, raw ); - } - - // Sets one value - } else if ( value !== undefined ) { - chainable = true; - - if ( !isFunction( value ) ) { - raw = true; - } - - if ( bulk ) { - - // Bulk operations run against the entire set - if ( raw ) { - fn.call( elems, value ); - fn = null; - - // ...except when executing function values - } else { - bulk = fn; - fn = function( elem, key, value ) { - return bulk.call( jQuery( elem ), value ); - }; - } - } - - if ( fn ) { - for ( ; i < len; i++ ) { - fn( - elems[ i ], key, raw ? - value : - value.call( elems[ i ], i, fn( elems[ i ], key ) ) - ); - } - } - } - - if ( chainable ) { - return elems; - } - - // Gets - if ( bulk ) { - return fn.call( elems ); - } - - return len ? fn( elems[ 0 ], key ) : emptyGet; -}; - - -// Matches dashed string for camelizing -var rmsPrefix = /^-ms-/, - rdashAlpha = /-([a-z])/g; - -// Used by camelCase as callback to replace() -function fcamelCase( all, letter ) { - return letter.toUpperCase(); -} - -// Convert dashed to camelCase; used by the css and data modules -// Support: IE <=9 - 11, Edge 12 - 15 -// Microsoft forgot to hump their vendor prefix (#9572) -function camelCase( string ) { - return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); -} -var acceptData = function( owner ) { - - // Accepts only: - // - Node - // - Node.ELEMENT_NODE - // - Node.DOCUMENT_NODE - // - Object - // - Any - return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType ); -}; - - - - -function Data() { - this.expando = jQuery.expando + Data.uid++; -} - -Data.uid = 1; - -Data.prototype = { - - cache: function( owner ) { - - // Check if the owner object already has a cache - var value = owner[ this.expando ]; - - // If not, create one - if ( !value ) { - value = {}; - - // We can accept data for non-element nodes in modern browsers, - // but we should not, see #8335. - // Always return an empty object. - if ( acceptData( owner ) ) { - - // If it is a node unlikely to be stringify-ed or looped over - // use plain assignment - if ( owner.nodeType ) { - owner[ this.expando ] = value; - - // Otherwise secure it in a non-enumerable property - // configurable must be true to allow the property to be - // deleted when data is removed - } else { - Object.defineProperty( owner, this.expando, { - value: value, - configurable: true - } ); - } - } - } - - return value; - }, - set: function( owner, data, value ) { - var prop, - cache = this.cache( owner ); - - // Handle: [ owner, key, value ] args - // Always use camelCase key (gh-2257) - if ( typeof data === "string" ) { - cache[ camelCase( data ) ] = value; - - // Handle: [ owner, { properties } ] args - } else { - - // Copy the properties one-by-one to the cache object - for ( prop in data ) { - cache[ camelCase( prop ) ] = data[ prop ]; - } - } - return cache; - }, - get: function( owner, key ) { - return key === undefined ? - this.cache( owner ) : - - // Always use camelCase key (gh-2257) - owner[ this.expando ] && owner[ this.expando ][ camelCase( key ) ]; - }, - access: function( owner, key, value ) { - - // In cases where either: - // - // 1. No key was specified - // 2. A string key was specified, but no value provided - // - // Take the "read" path and allow the get method to determine - // which value to return, respectively either: - // - // 1. The entire cache object - // 2. The data stored at the key - // - if ( key === undefined || - ( ( key && typeof key === "string" ) && value === undefined ) ) { - - return this.get( owner, key ); - } - - // When the key is not a string, or both a key and value - // are specified, set or extend (existing objects) with either: - // - // 1. An object of properties - // 2. A key and value - // - this.set( owner, key, value ); - - // Since the "set" path can have two possible entry points - // return the expected data based on which path was taken[*] - return value !== undefined ? value : key; - }, - remove: function( owner, key ) { - var i, - cache = owner[ this.expando ]; - - if ( cache === undefined ) { - return; - } - - if ( key !== undefined ) { - - // Support array or space separated string of keys - if ( Array.isArray( key ) ) { - - // If key is an array of keys... - // We always set camelCase keys, so remove that. - key = key.map( camelCase ); - } else { - key = camelCase( key ); - - // If a key with the spaces exists, use it. - // Otherwise, create an array by matching non-whitespace - key = key in cache ? - [ key ] : - ( key.match( rnothtmlwhite ) || [] ); - } - - i = key.length; - - while ( i-- ) { - delete cache[ key[ i ] ]; - } - } - - // Remove the expando if there's no more data - if ( key === undefined || jQuery.isEmptyObject( cache ) ) { - - // Support: Chrome <=35 - 45 - // Webkit & Blink performance suffers when deleting properties - // from DOM nodes, so set to undefined instead - // https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted) - if ( owner.nodeType ) { - owner[ this.expando ] = undefined; - } else { - delete owner[ this.expando ]; - } - } - }, - hasData: function( owner ) { - var cache = owner[ this.expando ]; - return cache !== undefined && !jQuery.isEmptyObject( cache ); - } -}; -var dataPriv = new Data(); - -var dataUser = new Data(); - - - -// Implementation Summary -// -// 1. Enforce API surface and semantic compatibility with 1.9.x branch -// 2. Improve the module's maintainability by reducing the storage -// paths to a single mechanism. -// 3. Use the same single mechanism to support "private" and "user" data. -// 4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData) -// 5. Avoid exposing implementation details on user objects (eg. expando properties) -// 6. Provide a clear path for implementation upgrade to WeakMap in 2014 - -var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/, - rmultiDash = /[A-Z]/g; - -function getData( data ) { - if ( data === "true" ) { - return true; - } - - if ( data === "false" ) { - return false; - } - - if ( data === "null" ) { - return null; - } - - // Only convert to a number if it doesn't change the string - if ( data === +data + "" ) { - return +data; - } - - if ( rbrace.test( data ) ) { - return JSON.parse( data ); - } - - return data; -} - -function dataAttr( elem, key, data ) { - var name; - - // If nothing was found internally, try to fetch any - // data from the HTML5 data-* attribute - if ( data === undefined && elem.nodeType === 1 ) { - name = "data-" + key.replace( rmultiDash, "-$&" ).toLowerCase(); - data = elem.getAttribute( name ); - - if ( typeof data === "string" ) { - try { - data = getData( data ); - } catch ( e ) {} - - // Make sure we set the data so it isn't changed later - dataUser.set( elem, key, data ); - } else { - data = undefined; - } - } - return data; -} - -jQuery.extend( { - hasData: function( elem ) { - return dataUser.hasData( elem ) || dataPriv.hasData( elem ); - }, - - data: function( elem, name, data ) { - return dataUser.access( elem, name, data ); - }, - - removeData: function( elem, name ) { - dataUser.remove( elem, name ); - }, - - // TODO: Now that all calls to _data and _removeData have been replaced - // with direct calls to dataPriv methods, these can be deprecated. - _data: function( elem, name, data ) { - return dataPriv.access( elem, name, data ); - }, - - _removeData: function( elem, name ) { - dataPriv.remove( elem, name ); - } -} ); - -jQuery.fn.extend( { - data: function( key, value ) { - var i, name, data, - elem = this[ 0 ], - attrs = elem && elem.attributes; - - // Gets all values - if ( key === undefined ) { - if ( this.length ) { - data = dataUser.get( elem ); - - if ( elem.nodeType === 1 && !dataPriv.get( elem, "hasDataAttrs" ) ) { - i = attrs.length; - while ( i-- ) { - - // Support: IE 11 only - // The attrs elements can be null (#14894) - if ( attrs[ i ] ) { - name = attrs[ i ].name; - if ( name.indexOf( "data-" ) === 0 ) { - name = camelCase( name.slice( 5 ) ); - dataAttr( elem, name, data[ name ] ); - } - } - } - dataPriv.set( elem, "hasDataAttrs", true ); - } - } - - return data; - } - - // Sets multiple values - if ( typeof key === "object" ) { - return this.each( function() { - dataUser.set( this, key ); - } ); - } - - return access( this, function( value ) { - var data; - - // The calling jQuery object (element matches) is not empty - // (and therefore has an element appears at this[ 0 ]) and the - // `value` parameter was not undefined. An empty jQuery object - // will result in `undefined` for elem = this[ 0 ] which will - // throw an exception if an attempt to read a data cache is made. - if ( elem && value === undefined ) { - - // Attempt to get data from the cache - // The key will always be camelCased in Data - data = dataUser.get( elem, key ); - if ( data !== undefined ) { - return data; - } - - // Attempt to "discover" the data in - // HTML5 custom data-* attrs - data = dataAttr( elem, key ); - if ( data !== undefined ) { - return data; - } - - // We tried really hard, but the data doesn't exist. - return; - } - - // Set the data... - this.each( function() { - - // We always store the camelCased key - dataUser.set( this, key, value ); - } ); - }, null, value, arguments.length > 1, null, true ); - }, - - removeData: function( key ) { - return this.each( function() { - dataUser.remove( this, key ); - } ); - } -} ); - - -jQuery.extend( { - queue: function( elem, type, data ) { - var queue; - - if ( elem ) { - type = ( type || "fx" ) + "queue"; - queue = dataPriv.get( elem, type ); - - // Speed up dequeue by getting out quickly if this is just a lookup - if ( data ) { - if ( !queue || Array.isArray( data ) ) { - queue = dataPriv.access( elem, type, jQuery.makeArray( data ) ); - } else { - queue.push( data ); - } - } - return queue || []; - } - }, - - dequeue: function( elem, type ) { - type = type || "fx"; - - var queue = jQuery.queue( elem, type ), - startLength = queue.length, - fn = queue.shift(), - hooks = jQuery._queueHooks( elem, type ), - next = function() { - jQuery.dequeue( elem, type ); - }; - - // If the fx queue is dequeued, always remove the progress sentinel - if ( fn === "inprogress" ) { - fn = queue.shift(); - startLength--; - } - - if ( fn ) { - - // Add a progress sentinel to prevent the fx queue from being - // automatically dequeued - if ( type === "fx" ) { - queue.unshift( "inprogress" ); - } - - // Clear up the last queue stop function - delete hooks.stop; - fn.call( elem, next, hooks ); - } - - if ( !startLength && hooks ) { - hooks.empty.fire(); - } - }, - - // Not public - generate a queueHooks object, or return the current one - _queueHooks: function( elem, type ) { - var key = type + "queueHooks"; - return dataPriv.get( elem, key ) || dataPriv.access( elem, key, { - empty: jQuery.Callbacks( "once memory" ).add( function() { - dataPriv.remove( elem, [ type + "queue", key ] ); - } ) - } ); - } -} ); - -jQuery.fn.extend( { - queue: function( type, data ) { - var setter = 2; - - if ( typeof type !== "string" ) { - data = type; - type = "fx"; - setter--; - } - - if ( arguments.length < setter ) { - return jQuery.queue( this[ 0 ], type ); - } - - return data === undefined ? - this : - this.each( function() { - var queue = jQuery.queue( this, type, data ); - - // Ensure a hooks for this queue - jQuery._queueHooks( this, type ); - - if ( type === "fx" && queue[ 0 ] !== "inprogress" ) { - jQuery.dequeue( this, type ); - } - } ); - }, - dequeue: function( type ) { - return this.each( function() { - jQuery.dequeue( this, type ); - } ); - }, - clearQueue: function( type ) { - return this.queue( type || "fx", [] ); - }, - - // Get a promise resolved when queues of a certain type - // are emptied (fx is the type by default) - promise: function( type, obj ) { - var tmp, - count = 1, - defer = jQuery.Deferred(), - elements = this, - i = this.length, - resolve = function() { - if ( !( --count ) ) { - defer.resolveWith( elements, [ elements ] ); - } - }; - - if ( typeof type !== "string" ) { - obj = type; - type = undefined; - } - type = type || "fx"; - - while ( i-- ) { - tmp = dataPriv.get( elements[ i ], type + "queueHooks" ); - if ( tmp && tmp.empty ) { - count++; - tmp.empty.add( resolve ); - } - } - resolve(); - return defer.promise( obj ); - } -} ); -var pnum = ( /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/ ).source; - -var rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" ); - - -var cssExpand = [ "Top", "Right", "Bottom", "Left" ]; - -var documentElement = document.documentElement; - - - - var isAttached = function( elem ) { - return jQuery.contains( elem.ownerDocument, elem ); - }, - composed = { composed: true }; - - // Support: IE 9 - 11+, Edge 12 - 18+, iOS 10.0 - 10.2 only - // Check attachment across shadow DOM boundaries when possible (gh-3504) - // Support: iOS 10.0-10.2 only - // Early iOS 10 versions support `attachShadow` but not `getRootNode`, - // leading to errors. We need to check for `getRootNode`. - if ( documentElement.getRootNode ) { - isAttached = function( elem ) { - return jQuery.contains( elem.ownerDocument, elem ) || - elem.getRootNode( composed ) === elem.ownerDocument; - }; - } -var isHiddenWithinTree = function( elem, el ) { - - // isHiddenWithinTree might be called from jQuery#filter function; - // in that case, element will be second argument - elem = el || elem; - - // Inline style trumps all - return elem.style.display === "none" || - elem.style.display === "" && - - // Otherwise, check computed style - // Support: Firefox <=43 - 45 - // Disconnected elements can have computed display: none, so first confirm that elem is - // in the document. - isAttached( elem ) && - - jQuery.css( elem, "display" ) === "none"; - }; - -var swap = function( elem, options, callback, args ) { - var ret, name, - old = {}; - - // Remember the old values, and insert the new ones - for ( name in options ) { - old[ name ] = elem.style[ name ]; - elem.style[ name ] = options[ name ]; - } - - ret = callback.apply( elem, args || [] ); - - // Revert the old values - for ( name in options ) { - elem.style[ name ] = old[ name ]; - } - - return ret; -}; - - - - -function adjustCSS( elem, prop, valueParts, tween ) { - var adjusted, scale, - maxIterations = 20, - currentValue = tween ? - function() { - return tween.cur(); - } : - function() { - return jQuery.css( elem, prop, "" ); - }, - initial = currentValue(), - unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ), - - // Starting value computation is required for potential unit mismatches - initialInUnit = elem.nodeType && - ( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) && - rcssNum.exec( jQuery.css( elem, prop ) ); - - if ( initialInUnit && initialInUnit[ 3 ] !== unit ) { - - // Support: Firefox <=54 - // Halve the iteration target value to prevent interference from CSS upper bounds (gh-2144) - initial = initial / 2; - - // Trust units reported by jQuery.css - unit = unit || initialInUnit[ 3 ]; - - // Iteratively approximate from a nonzero starting point - initialInUnit = +initial || 1; - - while ( maxIterations-- ) { - - // Evaluate and update our best guess (doubling guesses that zero out). - // Finish if the scale equals or crosses 1 (making the old*new product non-positive). - jQuery.style( elem, prop, initialInUnit + unit ); - if ( ( 1 - scale ) * ( 1 - ( scale = currentValue() / initial || 0.5 ) ) <= 0 ) { - maxIterations = 0; - } - initialInUnit = initialInUnit / scale; - - } - - initialInUnit = initialInUnit * 2; - jQuery.style( elem, prop, initialInUnit + unit ); - - // Make sure we update the tween properties later on - valueParts = valueParts || []; - } - - if ( valueParts ) { - initialInUnit = +initialInUnit || +initial || 0; - - // Apply relative offset (+=/-=) if specified - adjusted = valueParts[ 1 ] ? - initialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] : - +valueParts[ 2 ]; - if ( tween ) { - tween.unit = unit; - tween.start = initialInUnit; - tween.end = adjusted; - } - } - return adjusted; -} - - -var defaultDisplayMap = {}; - -function getDefaultDisplay( elem ) { - var temp, - doc = elem.ownerDocument, - nodeName = elem.nodeName, - display = defaultDisplayMap[ nodeName ]; - - if ( display ) { - return display; - } - - temp = doc.body.appendChild( doc.createElement( nodeName ) ); - display = jQuery.css( temp, "display" ); - - temp.parentNode.removeChild( temp ); - - if ( display === "none" ) { - display = "block"; - } - defaultDisplayMap[ nodeName ] = display; - - return display; -} - -function showHide( elements, show ) { - var display, elem, - values = [], - index = 0, - length = elements.length; - - // Determine new display value for elements that need to change - for ( ; index < length; index++ ) { - elem = elements[ index ]; - if ( !elem.style ) { - continue; - } - - display = elem.style.display; - if ( show ) { - - // Since we force visibility upon cascade-hidden elements, an immediate (and slow) - // check is required in this first loop unless we have a nonempty display value (either - // inline or about-to-be-restored) - if ( display === "none" ) { - values[ index ] = dataPriv.get( elem, "display" ) || null; - if ( !values[ index ] ) { - elem.style.display = ""; - } - } - if ( elem.style.display === "" && isHiddenWithinTree( elem ) ) { - values[ index ] = getDefaultDisplay( elem ); - } - } else { - if ( display !== "none" ) { - values[ index ] = "none"; - - // Remember what we're overwriting - dataPriv.set( elem, "display", display ); - } - } - } - - // Set the display of the elements in a second loop to avoid constant reflow - for ( index = 0; index < length; index++ ) { - if ( values[ index ] != null ) { - elements[ index ].style.display = values[ index ]; - } - } - - return elements; -} - -jQuery.fn.extend( { - show: function() { - return showHide( this, true ); - }, - hide: function() { - return showHide( this ); - }, - toggle: function( state ) { - if ( typeof state === "boolean" ) { - return state ? this.show() : this.hide(); - } - - return this.each( function() { - if ( isHiddenWithinTree( this ) ) { - jQuery( this ).show(); - } else { - jQuery( this ).hide(); - } - } ); - } -} ); -var rcheckableType = ( /^(?:checkbox|radio)$/i ); - -var rtagName = ( /<([a-z][^\/\0>\x20\t\r\n\f]*)/i ); - -var rscriptType = ( /^$|^module$|\/(?:java|ecma)script/i ); - - - -// We have to close these tags to support XHTML (#13200) -var wrapMap = { - - // Support: IE <=9 only - option: [ 1, "" ], - - // XHTML parsers do not magically insert elements in the - // same way that tag soup parsers do. So we cannot shorten - // this by omitting or other required elements. - thead: [ 1, "", "
" ], - col: [ 2, "", "
" ], - tr: [ 2, "", "
" ], - td: [ 3, "", "
" ], - - _default: [ 0, "", "" ] -}; - -// Support: IE <=9 only -wrapMap.optgroup = wrapMap.option; - -wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; -wrapMap.th = wrapMap.td; - - -function getAll( context, tag ) { - - // Support: IE <=9 - 11 only - // Use typeof to avoid zero-argument method invocation on host objects (#15151) - var ret; - - if ( typeof context.getElementsByTagName !== "undefined" ) { - ret = context.getElementsByTagName( tag || "*" ); - - } else if ( typeof context.querySelectorAll !== "undefined" ) { - ret = context.querySelectorAll( tag || "*" ); - - } else { - ret = []; - } - - if ( tag === undefined || tag && nodeName( context, tag ) ) { - return jQuery.merge( [ context ], ret ); - } - - return ret; -} - - -// Mark scripts as having already been evaluated -function setGlobalEval( elems, refElements ) { - var i = 0, - l = elems.length; - - for ( ; i < l; i++ ) { - dataPriv.set( - elems[ i ], - "globalEval", - !refElements || dataPriv.get( refElements[ i ], "globalEval" ) - ); - } -} - - -var rhtml = /<|&#?\w+;/; - -function buildFragment( elems, context, scripts, selection, ignored ) { - var elem, tmp, tag, wrap, attached, j, - fragment = context.createDocumentFragment(), - nodes = [], - i = 0, - l = elems.length; - - for ( ; i < l; i++ ) { - elem = elems[ i ]; - - if ( elem || elem === 0 ) { - - // Add nodes directly - if ( toType( elem ) === "object" ) { - - // Support: Android <=4.0 only, PhantomJS 1 only - // push.apply(_, arraylike) throws on ancient WebKit - jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem ); - - // Convert non-html into a text node - } else if ( !rhtml.test( elem ) ) { - nodes.push( context.createTextNode( elem ) ); - - // Convert html into DOM nodes - } else { - tmp = tmp || fragment.appendChild( context.createElement( "div" ) ); - - // Deserialize a standard representation - tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase(); - wrap = wrapMap[ tag ] || wrapMap._default; - tmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ]; - - // Descend through wrappers to the right content - j = wrap[ 0 ]; - while ( j-- ) { - tmp = tmp.lastChild; - } - - // Support: Android <=4.0 only, PhantomJS 1 only - // push.apply(_, arraylike) throws on ancient WebKit - jQuery.merge( nodes, tmp.childNodes ); - - // Remember the top-level container - tmp = fragment.firstChild; - - // Ensure the created nodes are orphaned (#12392) - tmp.textContent = ""; - } - } - } - - // Remove wrapper from fragment - fragment.textContent = ""; - - i = 0; - while ( ( elem = nodes[ i++ ] ) ) { - - // Skip elements already in the context collection (trac-4087) - if ( selection && jQuery.inArray( elem, selection ) > -1 ) { - if ( ignored ) { - ignored.push( elem ); - } - continue; - } - - attached = isAttached( elem ); - - // Append to fragment - tmp = getAll( fragment.appendChild( elem ), "script" ); - - // Preserve script evaluation history - if ( attached ) { - setGlobalEval( tmp ); - } - - // Capture executables - if ( scripts ) { - j = 0; - while ( ( elem = tmp[ j++ ] ) ) { - if ( rscriptType.test( elem.type || "" ) ) { - scripts.push( elem ); - } - } - } - } - - return fragment; -} - - -( function() { - var fragment = document.createDocumentFragment(), - div = fragment.appendChild( document.createElement( "div" ) ), - input = document.createElement( "input" ); - - // Support: Android 4.0 - 4.3 only - // Check state lost if the name is set (#11217) - // Support: Windows Web Apps (WWA) - // `name` and `type` must use .setAttribute for WWA (#14901) - input.setAttribute( "type", "radio" ); - input.setAttribute( "checked", "checked" ); - input.setAttribute( "name", "t" ); - - div.appendChild( input ); - - // Support: Android <=4.1 only - // Older WebKit doesn't clone checked state correctly in fragments - support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked; - - // Support: IE <=11 only - // Make sure textarea (and checkbox) defaultValue is properly cloned - div.innerHTML = ""; - support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue; -} )(); - - -var - rkeyEvent = /^key/, - rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/, - rtypenamespace = /^([^.]*)(?:\.(.+)|)/; - -function returnTrue() { - return true; -} - -function returnFalse() { - return false; -} - -// Support: IE <=9 - 11+ -// focus() and blur() are asynchronous, except when they are no-op. -// So expect focus to be synchronous when the element is already active, -// and blur to be synchronous when the element is not already active. -// (focus and blur are always synchronous in other supported browsers, -// this just defines when we can count on it). -function expectSync( elem, type ) { - return ( elem === safeActiveElement() ) === ( type === "focus" ); -} - -// Support: IE <=9 only -// Accessing document.activeElement can throw unexpectedly -// https://bugs.jquery.com/ticket/13393 -function safeActiveElement() { - try { - return document.activeElement; - } catch ( err ) { } -} - -function on( elem, types, selector, data, fn, one ) { - var origFn, type; - - // Types can be a map of types/handlers - if ( typeof types === "object" ) { - - // ( types-Object, selector, data ) - if ( typeof selector !== "string" ) { - - // ( types-Object, data ) - data = data || selector; - selector = undefined; - } - for ( type in types ) { - on( elem, type, selector, data, types[ type ], one ); - } - return elem; - } - - if ( data == null && fn == null ) { - - // ( types, fn ) - fn = selector; - data = selector = undefined; - } else if ( fn == null ) { - if ( typeof selector === "string" ) { - - // ( types, selector, fn ) - fn = data; - data = undefined; - } else { - - // ( types, data, fn ) - fn = data; - data = selector; - selector = undefined; - } - } - if ( fn === false ) { - fn = returnFalse; - } else if ( !fn ) { - return elem; - } - - if ( one === 1 ) { - origFn = fn; - fn = function( event ) { - - // Can use an empty set, since event contains the info - jQuery().off( event ); - return origFn.apply( this, arguments ); - }; - - // Use same guid so caller can remove using origFn - fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); - } - return elem.each( function() { - jQuery.event.add( this, types, fn, data, selector ); - } ); -} - -/* - * Helper functions for managing events -- not part of the public interface. - * Props to Dean Edwards' addEvent library for many of the ideas. - */ -jQuery.event = { - - global: {}, - - add: function( elem, types, handler, data, selector ) { - - var handleObjIn, eventHandle, tmp, - events, t, handleObj, - special, handlers, type, namespaces, origType, - elemData = dataPriv.get( elem ); - - // Don't attach events to noData or text/comment nodes (but allow plain objects) - if ( !elemData ) { - return; - } - - // Caller can pass in an object of custom data in lieu of the handler - if ( handler.handler ) { - handleObjIn = handler; - handler = handleObjIn.handler; - selector = handleObjIn.selector; - } - - // Ensure that invalid selectors throw exceptions at attach time - // Evaluate against documentElement in case elem is a non-element node (e.g., document) - if ( selector ) { - jQuery.find.matchesSelector( documentElement, selector ); - } - - // Make sure that the handler has a unique ID, used to find/remove it later - if ( !handler.guid ) { - handler.guid = jQuery.guid++; - } - - // Init the element's event structure and main handler, if this is the first - if ( !( events = elemData.events ) ) { - events = elemData.events = {}; - } - if ( !( eventHandle = elemData.handle ) ) { - eventHandle = elemData.handle = function( e ) { - - // Discard the second event of a jQuery.event.trigger() and - // when an event is called after a page has unloaded - return typeof jQuery !== "undefined" && jQuery.event.triggered !== e.type ? - jQuery.event.dispatch.apply( elem, arguments ) : undefined; - }; - } - - // Handle multiple events separated by a space - types = ( types || "" ).match( rnothtmlwhite ) || [ "" ]; - t = types.length; - while ( t-- ) { - tmp = rtypenamespace.exec( types[ t ] ) || []; - type = origType = tmp[ 1 ]; - namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); - - // There *must* be a type, no attaching namespace-only handlers - if ( !type ) { - continue; - } - - // If event changes its type, use the special event handlers for the changed type - special = jQuery.event.special[ type ] || {}; - - // If selector defined, determine special event api type, otherwise given type - type = ( selector ? special.delegateType : special.bindType ) || type; - - // Update special based on newly reset type - special = jQuery.event.special[ type ] || {}; - - // handleObj is passed to all event handlers - handleObj = jQuery.extend( { - type: type, - origType: origType, - data: data, - handler: handler, - guid: handler.guid, - selector: selector, - needsContext: selector && jQuery.expr.match.needsContext.test( selector ), - namespace: namespaces.join( "." ) - }, handleObjIn ); - - // Init the event handler queue if we're the first - if ( !( handlers = events[ type ] ) ) { - handlers = events[ type ] = []; - handlers.delegateCount = 0; - - // Only use addEventListener if the special events handler returns false - if ( !special.setup || - special.setup.call( elem, data, namespaces, eventHandle ) === false ) { - - if ( elem.addEventListener ) { - elem.addEventListener( type, eventHandle ); - } - } - } - - if ( special.add ) { - special.add.call( elem, handleObj ); - - if ( !handleObj.handler.guid ) { - handleObj.handler.guid = handler.guid; - } - } - - // Add to the element's handler list, delegates in front - if ( selector ) { - handlers.splice( handlers.delegateCount++, 0, handleObj ); - } else { - handlers.push( handleObj ); - } - - // Keep track of which events have ever been used, for event optimization - jQuery.event.global[ type ] = true; - } - - }, - - // Detach an event or set of events from an element - remove: function( elem, types, handler, selector, mappedTypes ) { - - var j, origCount, tmp, - events, t, handleObj, - special, handlers, type, namespaces, origType, - elemData = dataPriv.hasData( elem ) && dataPriv.get( elem ); - - if ( !elemData || !( events = elemData.events ) ) { - return; - } - - // Once for each type.namespace in types; type may be omitted - types = ( types || "" ).match( rnothtmlwhite ) || [ "" ]; - t = types.length; - while ( t-- ) { - tmp = rtypenamespace.exec( types[ t ] ) || []; - type = origType = tmp[ 1 ]; - namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); - - // Unbind all events (on this namespace, if provided) for the element - if ( !type ) { - for ( type in events ) { - jQuery.event.remove( elem, type + types[ t ], handler, selector, true ); - } - continue; - } - - special = jQuery.event.special[ type ] || {}; - type = ( selector ? special.delegateType : special.bindType ) || type; - handlers = events[ type ] || []; - tmp = tmp[ 2 ] && - new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ); - - // Remove matching events - origCount = j = handlers.length; - while ( j-- ) { - handleObj = handlers[ j ]; - - if ( ( mappedTypes || origType === handleObj.origType ) && - ( !handler || handler.guid === handleObj.guid ) && - ( !tmp || tmp.test( handleObj.namespace ) ) && - ( !selector || selector === handleObj.selector || - selector === "**" && handleObj.selector ) ) { - handlers.splice( j, 1 ); - - if ( handleObj.selector ) { - handlers.delegateCount--; - } - if ( special.remove ) { - special.remove.call( elem, handleObj ); - } - } - } - - // Remove generic event handler if we removed something and no more handlers exist - // (avoids potential for endless recursion during removal of special event handlers) - if ( origCount && !handlers.length ) { - if ( !special.teardown || - special.teardown.call( elem, namespaces, elemData.handle ) === false ) { - - jQuery.removeEvent( elem, type, elemData.handle ); - } - - delete events[ type ]; - } - } - - // Remove data and the expando if it's no longer used - if ( jQuery.isEmptyObject( events ) ) { - dataPriv.remove( elem, "handle events" ); - } - }, - - dispatch: function( nativeEvent ) { - - // Make a writable jQuery.Event from the native event object - var event = jQuery.event.fix( nativeEvent ); - - var i, j, ret, matched, handleObj, handlerQueue, - args = new Array( arguments.length ), - handlers = ( dataPriv.get( this, "events" ) || {} )[ event.type ] || [], - special = jQuery.event.special[ event.type ] || {}; - - // Use the fix-ed jQuery.Event rather than the (read-only) native event - args[ 0 ] = event; - - for ( i = 1; i < arguments.length; i++ ) { - args[ i ] = arguments[ i ]; - } - - event.delegateTarget = this; - - // Call the preDispatch hook for the mapped type, and let it bail if desired - if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) { - return; - } - - // Determine handlers - handlerQueue = jQuery.event.handlers.call( this, event, handlers ); - - // Run delegates first; they may want to stop propagation beneath us - i = 0; - while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) { - event.currentTarget = matched.elem; - - j = 0; - while ( ( handleObj = matched.handlers[ j++ ] ) && - !event.isImmediatePropagationStopped() ) { - - // If the event is namespaced, then each handler is only invoked if it is - // specially universal or its namespaces are a superset of the event's. - if ( !event.rnamespace || handleObj.namespace === false || - event.rnamespace.test( handleObj.namespace ) ) { - - event.handleObj = handleObj; - event.data = handleObj.data; - - ret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle || - handleObj.handler ).apply( matched.elem, args ); - - if ( ret !== undefined ) { - if ( ( event.result = ret ) === false ) { - event.preventDefault(); - event.stopPropagation(); - } - } - } - } - } - - // Call the postDispatch hook for the mapped type - if ( special.postDispatch ) { - special.postDispatch.call( this, event ); - } - - return event.result; - }, - - handlers: function( event, handlers ) { - var i, handleObj, sel, matchedHandlers, matchedSelectors, - handlerQueue = [], - delegateCount = handlers.delegateCount, - cur = event.target; - - // Find delegate handlers - if ( delegateCount && - - // Support: IE <=9 - // Black-hole SVG instance trees (trac-13180) - cur.nodeType && - - // Support: Firefox <=42 - // Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861) - // https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click - // Support: IE 11 only - // ...but not arrow key "clicks" of radio inputs, which can have `button` -1 (gh-2343) - !( event.type === "click" && event.button >= 1 ) ) { - - for ( ; cur !== this; cur = cur.parentNode || this ) { - - // Don't check non-elements (#13208) - // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764) - if ( cur.nodeType === 1 && !( event.type === "click" && cur.disabled === true ) ) { - matchedHandlers = []; - matchedSelectors = {}; - for ( i = 0; i < delegateCount; i++ ) { - handleObj = handlers[ i ]; - - // Don't conflict with Object.prototype properties (#13203) - sel = handleObj.selector + " "; - - if ( matchedSelectors[ sel ] === undefined ) { - matchedSelectors[ sel ] = handleObj.needsContext ? - jQuery( sel, this ).index( cur ) > -1 : - jQuery.find( sel, this, null, [ cur ] ).length; - } - if ( matchedSelectors[ sel ] ) { - matchedHandlers.push( handleObj ); - } - } - if ( matchedHandlers.length ) { - handlerQueue.push( { elem: cur, handlers: matchedHandlers } ); - } - } - } - } - - // Add the remaining (directly-bound) handlers - cur = this; - if ( delegateCount < handlers.length ) { - handlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } ); - } - - return handlerQueue; - }, - - addProp: function( name, hook ) { - Object.defineProperty( jQuery.Event.prototype, name, { - enumerable: true, - configurable: true, - - get: isFunction( hook ) ? - function() { - if ( this.originalEvent ) { - return hook( this.originalEvent ); - } - } : - function() { - if ( this.originalEvent ) { - return this.originalEvent[ name ]; - } - }, - - set: function( value ) { - Object.defineProperty( this, name, { - enumerable: true, - configurable: true, - writable: true, - value: value - } ); - } - } ); - }, - - fix: function( originalEvent ) { - return originalEvent[ jQuery.expando ] ? - originalEvent : - new jQuery.Event( originalEvent ); - }, - - special: { - load: { - - // Prevent triggered image.load events from bubbling to window.load - noBubble: true - }, - click: { - - // Utilize native event to ensure correct state for checkable inputs - setup: function( data ) { - - // For mutual compressibility with _default, replace `this` access with a local var. - // `|| data` is dead code meant only to preserve the variable through minification. - var el = this || data; - - // Claim the first handler - if ( rcheckableType.test( el.type ) && - el.click && nodeName( el, "input" ) ) { - - // dataPriv.set( el, "click", ... ) - leverageNative( el, "click", returnTrue ); - } - - // Return false to allow normal processing in the caller - return false; - }, - trigger: function( data ) { - - // For mutual compressibility with _default, replace `this` access with a local var. - // `|| data` is dead code meant only to preserve the variable through minification. - var el = this || data; - - // Force setup before triggering a click - if ( rcheckableType.test( el.type ) && - el.click && nodeName( el, "input" ) ) { - - leverageNative( el, "click" ); - } - - // Return non-false to allow normal event-path propagation - return true; - }, - - // For cross-browser consistency, suppress native .click() on links - // Also prevent it if we're currently inside a leveraged native-event stack - _default: function( event ) { - var target = event.target; - return rcheckableType.test( target.type ) && - target.click && nodeName( target, "input" ) && - dataPriv.get( target, "click" ) || - nodeName( target, "a" ); - } - }, - - beforeunload: { - postDispatch: function( event ) { - - // Support: Firefox 20+ - // Firefox doesn't alert if the returnValue field is not set. - if ( event.result !== undefined && event.originalEvent ) { - event.originalEvent.returnValue = event.result; - } - } - } - } -}; - -// Ensure the presence of an event listener that handles manually-triggered -// synthetic events by interrupting progress until reinvoked in response to -// *native* events that it fires directly, ensuring that state changes have -// already occurred before other listeners are invoked. -function leverageNative( el, type, expectSync ) { - - // Missing expectSync indicates a trigger call, which must force setup through jQuery.event.add - if ( !expectSync ) { - if ( dataPriv.get( el, type ) === undefined ) { - jQuery.event.add( el, type, returnTrue ); - } - return; - } - - // Register the controller as a special universal handler for all event namespaces - dataPriv.set( el, type, false ); - jQuery.event.add( el, type, { - namespace: false, - handler: function( event ) { - var notAsync, result, - saved = dataPriv.get( this, type ); - - if ( ( event.isTrigger & 1 ) && this[ type ] ) { - - // Interrupt processing of the outer synthetic .trigger()ed event - // Saved data should be false in such cases, but might be a leftover capture object - // from an async native handler (gh-4350) - if ( !saved.length ) { - - // Store arguments for use when handling the inner native event - // There will always be at least one argument (an event object), so this array - // will not be confused with a leftover capture object. - saved = slice.call( arguments ); - dataPriv.set( this, type, saved ); - - // Trigger the native event and capture its result - // Support: IE <=9 - 11+ - // focus() and blur() are asynchronous - notAsync = expectSync( this, type ); - this[ type ](); - result = dataPriv.get( this, type ); - if ( saved !== result || notAsync ) { - dataPriv.set( this, type, false ); - } else { - result = {}; - } - if ( saved !== result ) { - - // Cancel the outer synthetic event - event.stopImmediatePropagation(); - event.preventDefault(); - return result.value; - } - - // If this is an inner synthetic event for an event with a bubbling surrogate - // (focus or blur), assume that the surrogate already propagated from triggering the - // native event and prevent that from happening again here. - // This technically gets the ordering wrong w.r.t. to `.trigger()` (in which the - // bubbling surrogate propagates *after* the non-bubbling base), but that seems - // less bad than duplication. - } else if ( ( jQuery.event.special[ type ] || {} ).delegateType ) { - event.stopPropagation(); - } - - // If this is a native event triggered above, everything is now in order - // Fire an inner synthetic event with the original arguments - } else if ( saved.length ) { - - // ...and capture the result - dataPriv.set( this, type, { - value: jQuery.event.trigger( - - // Support: IE <=9 - 11+ - // Extend with the prototype to reset the above stopImmediatePropagation() - jQuery.extend( saved[ 0 ], jQuery.Event.prototype ), - saved.slice( 1 ), - this - ) - } ); - - // Abort handling of the native event - event.stopImmediatePropagation(); - } - } - } ); -} - -jQuery.removeEvent = function( elem, type, handle ) { - - // This "if" is needed for plain objects - if ( elem.removeEventListener ) { - elem.removeEventListener( type, handle ); - } -}; - -jQuery.Event = function( src, props ) { - - // Allow instantiation without the 'new' keyword - if ( !( this instanceof jQuery.Event ) ) { - return new jQuery.Event( src, props ); - } - - // Event object - if ( src && src.type ) { - this.originalEvent = src; - this.type = src.type; - - // Events bubbling up the document may have been marked as prevented - // by a handler lower down the tree; reflect the correct value. - this.isDefaultPrevented = src.defaultPrevented || - src.defaultPrevented === undefined && - - // Support: Android <=2.3 only - src.returnValue === false ? - returnTrue : - returnFalse; - - // Create target properties - // Support: Safari <=6 - 7 only - // Target should not be a text node (#504, #13143) - this.target = ( src.target && src.target.nodeType === 3 ) ? - src.target.parentNode : - src.target; - - this.currentTarget = src.currentTarget; - this.relatedTarget = src.relatedTarget; - - // Event type - } else { - this.type = src; - } - - // Put explicitly provided properties onto the event object - if ( props ) { - jQuery.extend( this, props ); - } - - // Create a timestamp if incoming event doesn't have one - this.timeStamp = src && src.timeStamp || Date.now(); - - // Mark it as fixed - this[ jQuery.expando ] = true; -}; - -// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding -// https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html -jQuery.Event.prototype = { - constructor: jQuery.Event, - isDefaultPrevented: returnFalse, - isPropagationStopped: returnFalse, - isImmediatePropagationStopped: returnFalse, - isSimulated: false, - - preventDefault: function() { - var e = this.originalEvent; - - this.isDefaultPrevented = returnTrue; - - if ( e && !this.isSimulated ) { - e.preventDefault(); - } - }, - stopPropagation: function() { - var e = this.originalEvent; - - this.isPropagationStopped = returnTrue; - - if ( e && !this.isSimulated ) { - e.stopPropagation(); - } - }, - stopImmediatePropagation: function() { - var e = this.originalEvent; - - this.isImmediatePropagationStopped = returnTrue; - - if ( e && !this.isSimulated ) { - e.stopImmediatePropagation(); - } - - this.stopPropagation(); - } -}; - -// Includes all common event props including KeyEvent and MouseEvent specific props -jQuery.each( { - altKey: true, - bubbles: true, - cancelable: true, - changedTouches: true, - ctrlKey: true, - detail: true, - eventPhase: true, - metaKey: true, - pageX: true, - pageY: true, - shiftKey: true, - view: true, - "char": true, - code: true, - charCode: true, - key: true, - keyCode: true, - button: true, - buttons: true, - clientX: true, - clientY: true, - offsetX: true, - offsetY: true, - pointerId: true, - pointerType: true, - screenX: true, - screenY: true, - targetTouches: true, - toElement: true, - touches: true, - - which: function( event ) { - var button = event.button; - - // Add which for key events - if ( event.which == null && rkeyEvent.test( event.type ) ) { - return event.charCode != null ? event.charCode : event.keyCode; - } - - // Add which for click: 1 === left; 2 === middle; 3 === right - if ( !event.which && button !== undefined && rmouseEvent.test( event.type ) ) { - if ( button & 1 ) { - return 1; - } - - if ( button & 2 ) { - return 3; - } - - if ( button & 4 ) { - return 2; - } - - return 0; - } - - return event.which; - } -}, jQuery.event.addProp ); - -jQuery.each( { focus: "focusin", blur: "focusout" }, function( type, delegateType ) { - jQuery.event.special[ type ] = { - - // Utilize native event if possible so blur/focus sequence is correct - setup: function() { - - // Claim the first handler - // dataPriv.set( this, "focus", ... ) - // dataPriv.set( this, "blur", ... ) - leverageNative( this, type, expectSync ); - - // Return false to allow normal processing in the caller - return false; - }, - trigger: function() { - - // Force setup before trigger - leverageNative( this, type ); - - // Return non-false to allow normal event-path propagation - return true; - }, - - delegateType: delegateType - }; -} ); - -// Create mouseenter/leave events using mouseover/out and event-time checks -// so that event delegation works in jQuery. -// Do the same for pointerenter/pointerleave and pointerover/pointerout -// -// Support: Safari 7 only -// Safari sends mouseenter too often; see: -// https://bugs.chromium.org/p/chromium/issues/detail?id=470258 -// for the description of the bug (it existed in older Chrome versions as well). -jQuery.each( { - mouseenter: "mouseover", - mouseleave: "mouseout", - pointerenter: "pointerover", - pointerleave: "pointerout" -}, function( orig, fix ) { - jQuery.event.special[ orig ] = { - delegateType: fix, - bindType: fix, - - handle: function( event ) { - var ret, - target = this, - related = event.relatedTarget, - handleObj = event.handleObj; - - // For mouseenter/leave call the handler if related is outside the target. - // NB: No relatedTarget if the mouse left/entered the browser window - if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) { - event.type = handleObj.origType; - ret = handleObj.handler.apply( this, arguments ); - event.type = fix; - } - return ret; - } - }; -} ); - -jQuery.fn.extend( { - - on: function( types, selector, data, fn ) { - return on( this, types, selector, data, fn ); - }, - one: function( types, selector, data, fn ) { - return on( this, types, selector, data, fn, 1 ); - }, - off: function( types, selector, fn ) { - var handleObj, type; - if ( types && types.preventDefault && types.handleObj ) { - - // ( event ) dispatched jQuery.Event - handleObj = types.handleObj; - jQuery( types.delegateTarget ).off( - handleObj.namespace ? - handleObj.origType + "." + handleObj.namespace : - handleObj.origType, - handleObj.selector, - handleObj.handler - ); - return this; - } - if ( typeof types === "object" ) { - - // ( types-object [, selector] ) - for ( type in types ) { - this.off( type, selector, types[ type ] ); - } - return this; - } - if ( selector === false || typeof selector === "function" ) { - - // ( types [, fn] ) - fn = selector; - selector = undefined; - } - if ( fn === false ) { - fn = returnFalse; - } - return this.each( function() { - jQuery.event.remove( this, types, fn, selector ); - } ); - } -} ); - - -var - - /* eslint-disable max-len */ - - // See https://github.com/eslint/eslint/issues/3229 - rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\/\0>\x20\t\r\n\f]*)[^>]*)\/>/gi, - - /* eslint-enable */ - - // Support: IE <=10 - 11, Edge 12 - 13 only - // In IE/Edge using regex groups here causes severe slowdowns. - // See https://connect.microsoft.com/IE/feedback/details/1736512/ - rnoInnerhtml = /\s*$/g; - -// Prefer a tbody over its parent table for containing new rows -function manipulationTarget( elem, content ) { - if ( nodeName( elem, "table" ) && - nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ) { - - return jQuery( elem ).children( "tbody" )[ 0 ] || elem; - } - - return elem; -} - -// Replace/restore the type attribute of script elements for safe DOM manipulation -function disableScript( elem ) { - elem.type = ( elem.getAttribute( "type" ) !== null ) + "/" + elem.type; - return elem; -} -function restoreScript( elem ) { - if ( ( elem.type || "" ).slice( 0, 5 ) === "true/" ) { - elem.type = elem.type.slice( 5 ); - } else { - elem.removeAttribute( "type" ); - } - - return elem; -} - -function cloneCopyEvent( src, dest ) { - var i, l, type, pdataOld, pdataCur, udataOld, udataCur, events; - - if ( dest.nodeType !== 1 ) { - return; - } - - // 1. Copy private data: events, handlers, etc. - if ( dataPriv.hasData( src ) ) { - pdataOld = dataPriv.access( src ); - pdataCur = dataPriv.set( dest, pdataOld ); - events = pdataOld.events; - - if ( events ) { - delete pdataCur.handle; - pdataCur.events = {}; - - for ( type in events ) { - for ( i = 0, l = events[ type ].length; i < l; i++ ) { - jQuery.event.add( dest, type, events[ type ][ i ] ); - } - } - } - } - - // 2. Copy user data - if ( dataUser.hasData( src ) ) { - udataOld = dataUser.access( src ); - udataCur = jQuery.extend( {}, udataOld ); - - dataUser.set( dest, udataCur ); - } -} - -// Fix IE bugs, see support tests -function fixInput( src, dest ) { - var nodeName = dest.nodeName.toLowerCase(); - - // Fails to persist the checked state of a cloned checkbox or radio button. - if ( nodeName === "input" && rcheckableType.test( src.type ) ) { - dest.checked = src.checked; - - // Fails to return the selected option to the default selected state when cloning options - } else if ( nodeName === "input" || nodeName === "textarea" ) { - dest.defaultValue = src.defaultValue; - } -} - -function domManip( collection, args, callback, ignored ) { - - // Flatten any nested arrays - args = concat.apply( [], args ); - - var fragment, first, scripts, hasScripts, node, doc, - i = 0, - l = collection.length, - iNoClone = l - 1, - value = args[ 0 ], - valueIsFunction = isFunction( value ); - - // We can't cloneNode fragments that contain checked, in WebKit - if ( valueIsFunction || - ( l > 1 && typeof value === "string" && - !support.checkClone && rchecked.test( value ) ) ) { - return collection.each( function( index ) { - var self = collection.eq( index ); - if ( valueIsFunction ) { - args[ 0 ] = value.call( this, index, self.html() ); - } - domManip( self, args, callback, ignored ); - } ); - } - - if ( l ) { - fragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored ); - first = fragment.firstChild; - - if ( fragment.childNodes.length === 1 ) { - fragment = first; - } - - // Require either new content or an interest in ignored elements to invoke the callback - if ( first || ignored ) { - scripts = jQuery.map( getAll( fragment, "script" ), disableScript ); - hasScripts = scripts.length; - - // Use the original fragment for the last item - // instead of the first because it can end up - // being emptied incorrectly in certain situations (#8070). - for ( ; i < l; i++ ) { - node = fragment; - - if ( i !== iNoClone ) { - node = jQuery.clone( node, true, true ); - - // Keep references to cloned scripts for later restoration - if ( hasScripts ) { - - // Support: Android <=4.0 only, PhantomJS 1 only - // push.apply(_, arraylike) throws on ancient WebKit - jQuery.merge( scripts, getAll( node, "script" ) ); - } - } - - callback.call( collection[ i ], node, i ); - } - - if ( hasScripts ) { - doc = scripts[ scripts.length - 1 ].ownerDocument; - - // Reenable scripts - jQuery.map( scripts, restoreScript ); - - // Evaluate executable scripts on first document insertion - for ( i = 0; i < hasScripts; i++ ) { - node = scripts[ i ]; - if ( rscriptType.test( node.type || "" ) && - !dataPriv.access( node, "globalEval" ) && - jQuery.contains( doc, node ) ) { - - if ( node.src && ( node.type || "" ).toLowerCase() !== "module" ) { - - // Optional AJAX dependency, but won't run scripts if not present - if ( jQuery._evalUrl && !node.noModule ) { - jQuery._evalUrl( node.src, { - nonce: node.nonce || node.getAttribute( "nonce" ) - } ); - } - } else { - DOMEval( node.textContent.replace( rcleanScript, "" ), node, doc ); - } - } - } - } - } - } - - return collection; -} - -function remove( elem, selector, keepData ) { - var node, - nodes = selector ? jQuery.filter( selector, elem ) : elem, - i = 0; - - for ( ; ( node = nodes[ i ] ) != null; i++ ) { - if ( !keepData && node.nodeType === 1 ) { - jQuery.cleanData( getAll( node ) ); - } - - if ( node.parentNode ) { - if ( keepData && isAttached( node ) ) { - setGlobalEval( getAll( node, "script" ) ); - } - node.parentNode.removeChild( node ); - } - } - - return elem; -} - -jQuery.extend( { - htmlPrefilter: function( html ) { - return html.replace( rxhtmlTag, "<$1>" ); - }, - - clone: function( elem, dataAndEvents, deepDataAndEvents ) { - var i, l, srcElements, destElements, - clone = elem.cloneNode( true ), - inPage = isAttached( elem ); - - // Fix IE cloning issues - if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) && - !jQuery.isXMLDoc( elem ) ) { - - // We eschew Sizzle here for performance reasons: https://jsperf.com/getall-vs-sizzle/2 - destElements = getAll( clone ); - srcElements = getAll( elem ); - - for ( i = 0, l = srcElements.length; i < l; i++ ) { - fixInput( srcElements[ i ], destElements[ i ] ); - } - } - - // Copy the events from the original to the clone - if ( dataAndEvents ) { - if ( deepDataAndEvents ) { - srcElements = srcElements || getAll( elem ); - destElements = destElements || getAll( clone ); - - for ( i = 0, l = srcElements.length; i < l; i++ ) { - cloneCopyEvent( srcElements[ i ], destElements[ i ] ); - } - } else { - cloneCopyEvent( elem, clone ); - } - } - - // Preserve script evaluation history - destElements = getAll( clone, "script" ); - if ( destElements.length > 0 ) { - setGlobalEval( destElements, !inPage && getAll( elem, "script" ) ); - } - - // Return the cloned set - return clone; - }, - - cleanData: function( elems ) { - var data, elem, type, - special = jQuery.event.special, - i = 0; - - for ( ; ( elem = elems[ i ] ) !== undefined; i++ ) { - if ( acceptData( elem ) ) { - if ( ( data = elem[ dataPriv.expando ] ) ) { - if ( data.events ) { - for ( type in data.events ) { - if ( special[ type ] ) { - jQuery.event.remove( elem, type ); - - // This is a shortcut to avoid jQuery.event.remove's overhead - } else { - jQuery.removeEvent( elem, type, data.handle ); - } - } - } - - // Support: Chrome <=35 - 45+ - // Assign undefined instead of using delete, see Data#remove - elem[ dataPriv.expando ] = undefined; - } - if ( elem[ dataUser.expando ] ) { - - // Support: Chrome <=35 - 45+ - // Assign undefined instead of using delete, see Data#remove - elem[ dataUser.expando ] = undefined; - } - } - } - } -} ); - -jQuery.fn.extend( { - detach: function( selector ) { - return remove( this, selector, true ); - }, - - remove: function( selector ) { - return remove( this, selector ); - }, - - text: function( value ) { - return access( this, function( value ) { - return value === undefined ? - jQuery.text( this ) : - this.empty().each( function() { - if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { - this.textContent = value; - } - } ); - }, null, value, arguments.length ); - }, - - append: function() { - return domManip( this, arguments, function( elem ) { - if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { - var target = manipulationTarget( this, elem ); - target.appendChild( elem ); - } - } ); - }, - - prepend: function() { - return domManip( this, arguments, function( elem ) { - if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { - var target = manipulationTarget( this, elem ); - target.insertBefore( elem, target.firstChild ); - } - } ); - }, - - before: function() { - return domManip( this, arguments, function( elem ) { - if ( this.parentNode ) { - this.parentNode.insertBefore( elem, this ); - } - } ); - }, - - after: function() { - return domManip( this, arguments, function( elem ) { - if ( this.parentNode ) { - this.parentNode.insertBefore( elem, this.nextSibling ); - } - } ); - }, - - empty: function() { - var elem, - i = 0; - - for ( ; ( elem = this[ i ] ) != null; i++ ) { - if ( elem.nodeType === 1 ) { - - // Prevent memory leaks - jQuery.cleanData( getAll( elem, false ) ); - - // Remove any remaining nodes - elem.textContent = ""; - } - } - - return this; - }, - - clone: function( dataAndEvents, deepDataAndEvents ) { - dataAndEvents = dataAndEvents == null ? false : dataAndEvents; - deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents; - - return this.map( function() { - return jQuery.clone( this, dataAndEvents, deepDataAndEvents ); - } ); - }, - - html: function( value ) { - return access( this, function( value ) { - var elem = this[ 0 ] || {}, - i = 0, - l = this.length; - - if ( value === undefined && elem.nodeType === 1 ) { - return elem.innerHTML; - } - - // See if we can take a shortcut and just use innerHTML - if ( typeof value === "string" && !rnoInnerhtml.test( value ) && - !wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) { - - value = jQuery.htmlPrefilter( value ); - - try { - for ( ; i < l; i++ ) { - elem = this[ i ] || {}; - - // Remove element nodes and prevent memory leaks - if ( elem.nodeType === 1 ) { - jQuery.cleanData( getAll( elem, false ) ); - elem.innerHTML = value; - } - } - - elem = 0; - - // If using innerHTML throws an exception, use the fallback method - } catch ( e ) {} - } - - if ( elem ) { - this.empty().append( value ); - } - }, null, value, arguments.length ); - }, - - replaceWith: function() { - var ignored = []; - - // Make the changes, replacing each non-ignored context element with the new content - return domManip( this, arguments, function( elem ) { - var parent = this.parentNode; - - if ( jQuery.inArray( this, ignored ) < 0 ) { - jQuery.cleanData( getAll( this ) ); - if ( parent ) { - parent.replaceChild( elem, this ); - } - } - - // Force callback invocation - }, ignored ); - } -} ); - -jQuery.each( { - appendTo: "append", - prependTo: "prepend", - insertBefore: "before", - insertAfter: "after", - replaceAll: "replaceWith" -}, function( name, original ) { - jQuery.fn[ name ] = function( selector ) { - var elems, - ret = [], - insert = jQuery( selector ), - last = insert.length - 1, - i = 0; - - for ( ; i <= last; i++ ) { - elems = i === last ? this : this.clone( true ); - jQuery( insert[ i ] )[ original ]( elems ); - - // Support: Android <=4.0 only, PhantomJS 1 only - // .get() because push.apply(_, arraylike) throws on ancient WebKit - push.apply( ret, elems.get() ); - } - - return this.pushStack( ret ); - }; -} ); -var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" ); - -var getStyles = function( elem ) { - - // Support: IE <=11 only, Firefox <=30 (#15098, #14150) - // IE throws on elements created in popups - // FF meanwhile throws on frame elements through "defaultView.getComputedStyle" - var view = elem.ownerDocument.defaultView; - - if ( !view || !view.opener ) { - view = window; - } - - return view.getComputedStyle( elem ); - }; - -var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" ); - - - -( function() { - - // Executing both pixelPosition & boxSizingReliable tests require only one layout - // so they're executed at the same time to save the second computation. - function computeStyleTests() { - - // This is a singleton, we need to execute it only once - if ( !div ) { - return; - } - - container.style.cssText = "position:absolute;left:-11111px;width:60px;" + - "margin-top:1px;padding:0;border:0"; - div.style.cssText = - "position:relative;display:block;box-sizing:border-box;overflow:scroll;" + - "margin:auto;border:1px;padding:1px;" + - "width:60%;top:1%"; - documentElement.appendChild( container ).appendChild( div ); - - var divStyle = window.getComputedStyle( div ); - pixelPositionVal = divStyle.top !== "1%"; - - // Support: Android 4.0 - 4.3 only, Firefox <=3 - 44 - reliableMarginLeftVal = roundPixelMeasures( divStyle.marginLeft ) === 12; - - // Support: Android 4.0 - 4.3 only, Safari <=9.1 - 10.1, iOS <=7.0 - 9.3 - // Some styles come back with percentage values, even though they shouldn't - div.style.right = "60%"; - pixelBoxStylesVal = roundPixelMeasures( divStyle.right ) === 36; - - // Support: IE 9 - 11 only - // Detect misreporting of content dimensions for box-sizing:border-box elements - boxSizingReliableVal = roundPixelMeasures( divStyle.width ) === 36; - - // Support: IE 9 only - // Detect overflow:scroll screwiness (gh-3699) - // Support: Chrome <=64 - // Don't get tricked when zoom affects offsetWidth (gh-4029) - div.style.position = "absolute"; - scrollboxSizeVal = roundPixelMeasures( div.offsetWidth / 3 ) === 12; - - documentElement.removeChild( container ); - - // Nullify the div so it wouldn't be stored in the memory and - // it will also be a sign that checks already performed - div = null; - } - - function roundPixelMeasures( measure ) { - return Math.round( parseFloat( measure ) ); - } - - var pixelPositionVal, boxSizingReliableVal, scrollboxSizeVal, pixelBoxStylesVal, - reliableMarginLeftVal, - container = document.createElement( "div" ), - div = document.createElement( "div" ); - - // Finish early in limited (non-browser) environments - if ( !div.style ) { - return; - } - - // Support: IE <=9 - 11 only - // Style of cloned element affects source element cloned (#8908) - div.style.backgroundClip = "content-box"; - div.cloneNode( true ).style.backgroundClip = ""; - support.clearCloneStyle = div.style.backgroundClip === "content-box"; - - jQuery.extend( support, { - boxSizingReliable: function() { - computeStyleTests(); - return boxSizingReliableVal; - }, - pixelBoxStyles: function() { - computeStyleTests(); - return pixelBoxStylesVal; - }, - pixelPosition: function() { - computeStyleTests(); - return pixelPositionVal; - }, - reliableMarginLeft: function() { - computeStyleTests(); - return reliableMarginLeftVal; - }, - scrollboxSize: function() { - computeStyleTests(); - return scrollboxSizeVal; - } - } ); -} )(); - - -function curCSS( elem, name, computed ) { - var width, minWidth, maxWidth, ret, - - // Support: Firefox 51+ - // Retrieving style before computed somehow - // fixes an issue with getting wrong values - // on detached elements - style = elem.style; - - computed = computed || getStyles( elem ); - - // getPropertyValue is needed for: - // .css('filter') (IE 9 only, #12537) - // .css('--customProperty) (#3144) - if ( computed ) { - ret = computed.getPropertyValue( name ) || computed[ name ]; - - if ( ret === "" && !isAttached( elem ) ) { - ret = jQuery.style( elem, name ); - } - - // A tribute to the "awesome hack by Dean Edwards" - // Android Browser returns percentage for some values, - // but width seems to be reliably pixels. - // This is against the CSSOM draft spec: - // https://drafts.csswg.org/cssom/#resolved-values - if ( !support.pixelBoxStyles() && rnumnonpx.test( ret ) && rboxStyle.test( name ) ) { - - // Remember the original values - width = style.width; - minWidth = style.minWidth; - maxWidth = style.maxWidth; - - // Put in the new values to get a computed value out - style.minWidth = style.maxWidth = style.width = ret; - ret = computed.width; - - // Revert the changed values - style.width = width; - style.minWidth = minWidth; - style.maxWidth = maxWidth; - } - } - - return ret !== undefined ? - - // Support: IE <=9 - 11 only - // IE returns zIndex value as an integer. - ret + "" : - ret; -} - - -function addGetHookIf( conditionFn, hookFn ) { - - // Define the hook, we'll check on the first run if it's really needed. - return { - get: function() { - if ( conditionFn() ) { - - // Hook not needed (or it's not possible to use it due - // to missing dependency), remove it. - delete this.get; - return; - } - - // Hook needed; redefine it so that the support test is not executed again. - return ( this.get = hookFn ).apply( this, arguments ); - } - }; -} - - -var cssPrefixes = [ "Webkit", "Moz", "ms" ], - emptyStyle = document.createElement( "div" ).style, - vendorProps = {}; - -// Return a vendor-prefixed property or undefined -function vendorPropName( name ) { - - // Check for vendor prefixed names - var capName = name[ 0 ].toUpperCase() + name.slice( 1 ), - i = cssPrefixes.length; - - while ( i-- ) { - name = cssPrefixes[ i ] + capName; - if ( name in emptyStyle ) { - return name; - } - } -} - -// Return a potentially-mapped jQuery.cssProps or vendor prefixed property -function finalPropName( name ) { - var final = jQuery.cssProps[ name ] || vendorProps[ name ]; - - if ( final ) { - return final; - } - if ( name in emptyStyle ) { - return name; - } - return vendorProps[ name ] = vendorPropName( name ) || name; -} - - -var - - // Swappable if display is none or starts with table - // except "table", "table-cell", or "table-caption" - // See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display - rdisplayswap = /^(none|table(?!-c[ea]).+)/, - rcustomProp = /^--/, - cssShow = { position: "absolute", visibility: "hidden", display: "block" }, - cssNormalTransform = { - letterSpacing: "0", - fontWeight: "400" - }; - -function setPositiveNumber( elem, value, subtract ) { - - // Any relative (+/-) values have already been - // normalized at this point - var matches = rcssNum.exec( value ); - return matches ? - - // Guard against undefined "subtract", e.g., when used as in cssHooks - Math.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || "px" ) : - value; -} - -function boxModelAdjustment( elem, dimension, box, isBorderBox, styles, computedVal ) { - var i = dimension === "width" ? 1 : 0, - extra = 0, - delta = 0; - - // Adjustment may not be necessary - if ( box === ( isBorderBox ? "border" : "content" ) ) { - return 0; - } - - for ( ; i < 4; i += 2 ) { - - // Both box models exclude margin - if ( box === "margin" ) { - delta += jQuery.css( elem, box + cssExpand[ i ], true, styles ); - } - - // If we get here with a content-box, we're seeking "padding" or "border" or "margin" - if ( !isBorderBox ) { - - // Add padding - delta += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); - - // For "border" or "margin", add border - if ( box !== "padding" ) { - delta += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); - - // But still keep track of it otherwise - } else { - extra += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); - } - - // If we get here with a border-box (content + padding + border), we're seeking "content" or - // "padding" or "margin" - } else { - - // For "content", subtract padding - if ( box === "content" ) { - delta -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); - } - - // For "content" or "padding", subtract border - if ( box !== "margin" ) { - delta -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); - } - } - } - - // Account for positive content-box scroll gutter when requested by providing computedVal - if ( !isBorderBox && computedVal >= 0 ) { - - // offsetWidth/offsetHeight is a rounded sum of content, padding, scroll gutter, and border - // Assuming integer scroll gutter, subtract the rest and round down - delta += Math.max( 0, Math.ceil( - elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] - - computedVal - - delta - - extra - - 0.5 - - // If offsetWidth/offsetHeight is unknown, then we can't determine content-box scroll gutter - // Use an explicit zero to avoid NaN (gh-3964) - ) ) || 0; - } - - return delta; -} - -function getWidthOrHeight( elem, dimension, extra ) { - - // Start with computed style - var styles = getStyles( elem ), - - // To avoid forcing a reflow, only fetch boxSizing if we need it (gh-4322). - // Fake content-box until we know it's needed to know the true value. - boxSizingNeeded = !support.boxSizingReliable() || extra, - isBorderBox = boxSizingNeeded && - jQuery.css( elem, "boxSizing", false, styles ) === "border-box", - valueIsBorderBox = isBorderBox, - - val = curCSS( elem, dimension, styles ), - offsetProp = "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ); - - // Support: Firefox <=54 - // Return a confounding non-pixel value or feign ignorance, as appropriate. - if ( rnumnonpx.test( val ) ) { - if ( !extra ) { - return val; - } - val = "auto"; - } - - - // Fall back to offsetWidth/offsetHeight when value is "auto" - // This happens for inline elements with no explicit setting (gh-3571) - // Support: Android <=4.1 - 4.3 only - // Also use offsetWidth/offsetHeight for misreported inline dimensions (gh-3602) - // Support: IE 9-11 only - // Also use offsetWidth/offsetHeight for when box sizing is unreliable - // We use getClientRects() to check for hidden/disconnected. - // In those cases, the computed value can be trusted to be border-box - if ( ( !support.boxSizingReliable() && isBorderBox || - val === "auto" || - !parseFloat( val ) && jQuery.css( elem, "display", false, styles ) === "inline" ) && - elem.getClientRects().length ) { - - isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box"; - - // Where available, offsetWidth/offsetHeight approximate border box dimensions. - // Where not available (e.g., SVG), assume unreliable box-sizing and interpret the - // retrieved value as a content box dimension. - valueIsBorderBox = offsetProp in elem; - if ( valueIsBorderBox ) { - val = elem[ offsetProp ]; - } - } - - // Normalize "" and auto - val = parseFloat( val ) || 0; - - // Adjust for the element's box model - return ( val + - boxModelAdjustment( - elem, - dimension, - extra || ( isBorderBox ? "border" : "content" ), - valueIsBorderBox, - styles, - - // Provide the current computed size to request scroll gutter calculation (gh-3589) - val - ) - ) + "px"; -} - -jQuery.extend( { - - // Add in style property hooks for overriding the default - // behavior of getting and setting a style property - cssHooks: { - opacity: { - get: function( elem, computed ) { - if ( computed ) { - - // We should always get a number back from opacity - var ret = curCSS( elem, "opacity" ); - return ret === "" ? "1" : ret; - } - } - } - }, - - // Don't automatically add "px" to these possibly-unitless properties - cssNumber: { - "animationIterationCount": true, - "columnCount": true, - "fillOpacity": true, - "flexGrow": true, - "flexShrink": true, - "fontWeight": true, - "gridArea": true, - "gridColumn": true, - "gridColumnEnd": true, - "gridColumnStart": true, - "gridRow": true, - "gridRowEnd": true, - "gridRowStart": true, - "lineHeight": true, - "opacity": true, - "order": true, - "orphans": true, - "widows": true, - "zIndex": true, - "zoom": true - }, - - // Add in properties whose names you wish to fix before - // setting or getting the value - cssProps: {}, - - // Get and set the style property on a DOM Node - style: function( elem, name, value, extra ) { - - // Don't set styles on text and comment nodes - if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) { - return; - } - - // Make sure that we're working with the right name - var ret, type, hooks, - origName = camelCase( name ), - isCustomProp = rcustomProp.test( name ), - style = elem.style; - - // Make sure that we're working with the right name. We don't - // want to query the value if it is a CSS custom property - // since they are user-defined. - if ( !isCustomProp ) { - name = finalPropName( origName ); - } - - // Gets hook for the prefixed version, then unprefixed version - hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; - - // Check if we're setting a value - if ( value !== undefined ) { - type = typeof value; - - // Convert "+=" or "-=" to relative numbers (#7345) - if ( type === "string" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) { - value = adjustCSS( elem, name, ret ); - - // Fixes bug #9237 - type = "number"; - } - - // Make sure that null and NaN values aren't set (#7116) - if ( value == null || value !== value ) { - return; - } - - // If a number was passed in, add the unit (except for certain CSS properties) - // The isCustomProp check can be removed in jQuery 4.0 when we only auto-append - // "px" to a few hardcoded values. - if ( type === "number" && !isCustomProp ) { - value += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? "" : "px" ); - } - - // background-* props affect original clone's values - if ( !support.clearCloneStyle && value === "" && name.indexOf( "background" ) === 0 ) { - style[ name ] = "inherit"; - } - - // If a hook was provided, use that value, otherwise just set the specified value - if ( !hooks || !( "set" in hooks ) || - ( value = hooks.set( elem, value, extra ) ) !== undefined ) { - - if ( isCustomProp ) { - style.setProperty( name, value ); - } else { - style[ name ] = value; - } - } - - } else { - - // If a hook was provided get the non-computed value from there - if ( hooks && "get" in hooks && - ( ret = hooks.get( elem, false, extra ) ) !== undefined ) { - - return ret; - } - - // Otherwise just get the value from the style object - return style[ name ]; - } - }, - - css: function( elem, name, extra, styles ) { - var val, num, hooks, - origName = camelCase( name ), - isCustomProp = rcustomProp.test( name ); - - // Make sure that we're working with the right name. We don't - // want to modify the value if it is a CSS custom property - // since they are user-defined. - if ( !isCustomProp ) { - name = finalPropName( origName ); - } - - // Try prefixed name followed by the unprefixed name - hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; - - // If a hook was provided get the computed value from there - if ( hooks && "get" in hooks ) { - val = hooks.get( elem, true, extra ); - } - - // Otherwise, if a way to get the computed value exists, use that - if ( val === undefined ) { - val = curCSS( elem, name, styles ); - } - - // Convert "normal" to computed value - if ( val === "normal" && name in cssNormalTransform ) { - val = cssNormalTransform[ name ]; - } - - // Make numeric if forced or a qualifier was provided and val looks numeric - if ( extra === "" || extra ) { - num = parseFloat( val ); - return extra === true || isFinite( num ) ? num || 0 : val; - } - - return val; - } -} ); - -jQuery.each( [ "height", "width" ], function( i, dimension ) { - jQuery.cssHooks[ dimension ] = { - get: function( elem, computed, extra ) { - if ( computed ) { - - // Certain elements can have dimension info if we invisibly show them - // but it must have a current display style that would benefit - return rdisplayswap.test( jQuery.css( elem, "display" ) ) && - - // Support: Safari 8+ - // Table columns in Safari have non-zero offsetWidth & zero - // getBoundingClientRect().width unless display is changed. - // Support: IE <=11 only - // Running getBoundingClientRect on a disconnected node - // in IE throws an error. - ( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ? - swap( elem, cssShow, function() { - return getWidthOrHeight( elem, dimension, extra ); - } ) : - getWidthOrHeight( elem, dimension, extra ); - } - }, - - set: function( elem, value, extra ) { - var matches, - styles = getStyles( elem ), - - // Only read styles.position if the test has a chance to fail - // to avoid forcing a reflow. - scrollboxSizeBuggy = !support.scrollboxSize() && - styles.position === "absolute", - - // To avoid forcing a reflow, only fetch boxSizing if we need it (gh-3991) - boxSizingNeeded = scrollboxSizeBuggy || extra, - isBorderBox = boxSizingNeeded && - jQuery.css( elem, "boxSizing", false, styles ) === "border-box", - subtract = extra ? - boxModelAdjustment( - elem, - dimension, - extra, - isBorderBox, - styles - ) : - 0; - - // Account for unreliable border-box dimensions by comparing offset* to computed and - // faking a content-box to get border and padding (gh-3699) - if ( isBorderBox && scrollboxSizeBuggy ) { - subtract -= Math.ceil( - elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] - - parseFloat( styles[ dimension ] ) - - boxModelAdjustment( elem, dimension, "border", false, styles ) - - 0.5 - ); - } - - // Convert to pixels if value adjustment is needed - if ( subtract && ( matches = rcssNum.exec( value ) ) && - ( matches[ 3 ] || "px" ) !== "px" ) { - - elem.style[ dimension ] = value; - value = jQuery.css( elem, dimension ); - } - - return setPositiveNumber( elem, value, subtract ); - } - }; -} ); - -jQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft, - function( elem, computed ) { - if ( computed ) { - return ( parseFloat( curCSS( elem, "marginLeft" ) ) || - elem.getBoundingClientRect().left - - swap( elem, { marginLeft: 0 }, function() { - return elem.getBoundingClientRect().left; - } ) - ) + "px"; - } - } -); - -// These hooks are used by animate to expand properties -jQuery.each( { - margin: "", - padding: "", - border: "Width" -}, function( prefix, suffix ) { - jQuery.cssHooks[ prefix + suffix ] = { - expand: function( value ) { - var i = 0, - expanded = {}, - - // Assumes a single number if not a string - parts = typeof value === "string" ? value.split( " " ) : [ value ]; - - for ( ; i < 4; i++ ) { - expanded[ prefix + cssExpand[ i ] + suffix ] = - parts[ i ] || parts[ i - 2 ] || parts[ 0 ]; - } - - return expanded; - } - }; - - if ( prefix !== "margin" ) { - jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber; - } -} ); - -jQuery.fn.extend( { - css: function( name, value ) { - return access( this, function( elem, name, value ) { - var styles, len, - map = {}, - i = 0; - - if ( Array.isArray( name ) ) { - styles = getStyles( elem ); - len = name.length; - - for ( ; i < len; i++ ) { - map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles ); - } - - return map; - } - - return value !== undefined ? - jQuery.style( elem, name, value ) : - jQuery.css( elem, name ); - }, name, value, arguments.length > 1 ); - } -} ); - - -function Tween( elem, options, prop, end, easing ) { - return new Tween.prototype.init( elem, options, prop, end, easing ); -} -jQuery.Tween = Tween; - -Tween.prototype = { - constructor: Tween, - init: function( elem, options, prop, end, easing, unit ) { - this.elem = elem; - this.prop = prop; - this.easing = easing || jQuery.easing._default; - this.options = options; - this.start = this.now = this.cur(); - this.end = end; - this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" ); - }, - cur: function() { - var hooks = Tween.propHooks[ this.prop ]; - - return hooks && hooks.get ? - hooks.get( this ) : - Tween.propHooks._default.get( this ); - }, - run: function( percent ) { - var eased, - hooks = Tween.propHooks[ this.prop ]; - - if ( this.options.duration ) { - this.pos = eased = jQuery.easing[ this.easing ]( - percent, this.options.duration * percent, 0, 1, this.options.duration - ); - } else { - this.pos = eased = percent; - } - this.now = ( this.end - this.start ) * eased + this.start; - - if ( this.options.step ) { - this.options.step.call( this.elem, this.now, this ); - } - - if ( hooks && hooks.set ) { - hooks.set( this ); - } else { - Tween.propHooks._default.set( this ); - } - return this; - } -}; - -Tween.prototype.init.prototype = Tween.prototype; - -Tween.propHooks = { - _default: { - get: function( tween ) { - var result; - - // Use a property on the element directly when it is not a DOM element, - // or when there is no matching style property that exists. - if ( tween.elem.nodeType !== 1 || - tween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) { - return tween.elem[ tween.prop ]; - } - - // Passing an empty string as a 3rd parameter to .css will automatically - // attempt a parseFloat and fallback to a string if the parse fails. - // Simple values such as "10px" are parsed to Float; - // complex values such as "rotate(1rad)" are returned as-is. - result = jQuery.css( tween.elem, tween.prop, "" ); - - // Empty strings, null, undefined and "auto" are converted to 0. - return !result || result === "auto" ? 0 : result; - }, - set: function( tween ) { - - // Use step hook for back compat. - // Use cssHook if its there. - // Use .style if available and use plain properties where available. - if ( jQuery.fx.step[ tween.prop ] ) { - jQuery.fx.step[ tween.prop ]( tween ); - } else if ( tween.elem.nodeType === 1 && ( - jQuery.cssHooks[ tween.prop ] || - tween.elem.style[ finalPropName( tween.prop ) ] != null ) ) { - jQuery.style( tween.elem, tween.prop, tween.now + tween.unit ); - } else { - tween.elem[ tween.prop ] = tween.now; - } - } - } -}; - -// Support: IE <=9 only -// Panic based approach to setting things on disconnected nodes -Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = { - set: function( tween ) { - if ( tween.elem.nodeType && tween.elem.parentNode ) { - tween.elem[ tween.prop ] = tween.now; - } - } -}; - -jQuery.easing = { - linear: function( p ) { - return p; - }, - swing: function( p ) { - return 0.5 - Math.cos( p * Math.PI ) / 2; - }, - _default: "swing" -}; - -jQuery.fx = Tween.prototype.init; - -// Back compat <1.8 extension point -jQuery.fx.step = {}; - - - - -var - fxNow, inProgress, - rfxtypes = /^(?:toggle|show|hide)$/, - rrun = /queueHooks$/; - -function schedule() { - if ( inProgress ) { - if ( document.hidden === false && window.requestAnimationFrame ) { - window.requestAnimationFrame( schedule ); - } else { - window.setTimeout( schedule, jQuery.fx.interval ); - } - - jQuery.fx.tick(); - } -} - -// Animations created synchronously will run synchronously -function createFxNow() { - window.setTimeout( function() { - fxNow = undefined; - } ); - return ( fxNow = Date.now() ); -} - -// Generate parameters to create a standard animation -function genFx( type, includeWidth ) { - var which, - i = 0, - attrs = { height: type }; - - // If we include width, step value is 1 to do all cssExpand values, - // otherwise step value is 2 to skip over Left and Right - includeWidth = includeWidth ? 1 : 0; - for ( ; i < 4; i += 2 - includeWidth ) { - which = cssExpand[ i ]; - attrs[ "margin" + which ] = attrs[ "padding" + which ] = type; - } - - if ( includeWidth ) { - attrs.opacity = attrs.width = type; - } - - return attrs; -} - -function createTween( value, prop, animation ) { - var tween, - collection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ "*" ] ), - index = 0, - length = collection.length; - for ( ; index < length; index++ ) { - if ( ( tween = collection[ index ].call( animation, prop, value ) ) ) { - - // We're done with this property - return tween; - } - } -} - -function defaultPrefilter( elem, props, opts ) { - var prop, value, toggle, hooks, oldfire, propTween, restoreDisplay, display, - isBox = "width" in props || "height" in props, - anim = this, - orig = {}, - style = elem.style, - hidden = elem.nodeType && isHiddenWithinTree( elem ), - dataShow = dataPriv.get( elem, "fxshow" ); - - // Queue-skipping animations hijack the fx hooks - if ( !opts.queue ) { - hooks = jQuery._queueHooks( elem, "fx" ); - if ( hooks.unqueued == null ) { - hooks.unqueued = 0; - oldfire = hooks.empty.fire; - hooks.empty.fire = function() { - if ( !hooks.unqueued ) { - oldfire(); - } - }; - } - hooks.unqueued++; - - anim.always( function() { - - // Ensure the complete handler is called before this completes - anim.always( function() { - hooks.unqueued--; - if ( !jQuery.queue( elem, "fx" ).length ) { - hooks.empty.fire(); - } - } ); - } ); - } - - // Detect show/hide animations - for ( prop in props ) { - value = props[ prop ]; - if ( rfxtypes.test( value ) ) { - delete props[ prop ]; - toggle = toggle || value === "toggle"; - if ( value === ( hidden ? "hide" : "show" ) ) { - - // Pretend to be hidden if this is a "show" and - // there is still data from a stopped show/hide - if ( value === "show" && dataShow && dataShow[ prop ] !== undefined ) { - hidden = true; - - // Ignore all other no-op show/hide data - } else { - continue; - } - } - orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop ); - } - } - - // Bail out if this is a no-op like .hide().hide() - propTween = !jQuery.isEmptyObject( props ); - if ( !propTween && jQuery.isEmptyObject( orig ) ) { - return; - } - - // Restrict "overflow" and "display" styles during box animations - if ( isBox && elem.nodeType === 1 ) { - - // Support: IE <=9 - 11, Edge 12 - 15 - // Record all 3 overflow attributes because IE does not infer the shorthand - // from identically-valued overflowX and overflowY and Edge just mirrors - // the overflowX value there. - opts.overflow = [ style.overflow, style.overflowX, style.overflowY ]; - - // Identify a display type, preferring old show/hide data over the CSS cascade - restoreDisplay = dataShow && dataShow.display; - if ( restoreDisplay == null ) { - restoreDisplay = dataPriv.get( elem, "display" ); - } - display = jQuery.css( elem, "display" ); - if ( display === "none" ) { - if ( restoreDisplay ) { - display = restoreDisplay; - } else { - - // Get nonempty value(s) by temporarily forcing visibility - showHide( [ elem ], true ); - restoreDisplay = elem.style.display || restoreDisplay; - display = jQuery.css( elem, "display" ); - showHide( [ elem ] ); - } - } - - // Animate inline elements as inline-block - if ( display === "inline" || display === "inline-block" && restoreDisplay != null ) { - if ( jQuery.css( elem, "float" ) === "none" ) { - - // Restore the original display value at the end of pure show/hide animations - if ( !propTween ) { - anim.done( function() { - style.display = restoreDisplay; - } ); - if ( restoreDisplay == null ) { - display = style.display; - restoreDisplay = display === "none" ? "" : display; - } - } - style.display = "inline-block"; - } - } - } - - if ( opts.overflow ) { - style.overflow = "hidden"; - anim.always( function() { - style.overflow = opts.overflow[ 0 ]; - style.overflowX = opts.overflow[ 1 ]; - style.overflowY = opts.overflow[ 2 ]; - } ); - } - - // Implement show/hide animations - propTween = false; - for ( prop in orig ) { - - // General show/hide setup for this element animation - if ( !propTween ) { - if ( dataShow ) { - if ( "hidden" in dataShow ) { - hidden = dataShow.hidden; - } - } else { - dataShow = dataPriv.access( elem, "fxshow", { display: restoreDisplay } ); - } - - // Store hidden/visible for toggle so `.stop().toggle()` "reverses" - if ( toggle ) { - dataShow.hidden = !hidden; - } - - // Show elements before animating them - if ( hidden ) { - showHide( [ elem ], true ); - } - - /* eslint-disable no-loop-func */ - - anim.done( function() { - - /* eslint-enable no-loop-func */ - - // The final step of a "hide" animation is actually hiding the element - if ( !hidden ) { - showHide( [ elem ] ); - } - dataPriv.remove( elem, "fxshow" ); - for ( prop in orig ) { - jQuery.style( elem, prop, orig[ prop ] ); - } - } ); - } - - // Per-property setup - propTween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim ); - if ( !( prop in dataShow ) ) { - dataShow[ prop ] = propTween.start; - if ( hidden ) { - propTween.end = propTween.start; - propTween.start = 0; - } - } - } -} - -function propFilter( props, specialEasing ) { - var index, name, easing, value, hooks; - - // camelCase, specialEasing and expand cssHook pass - for ( index in props ) { - name = camelCase( index ); - easing = specialEasing[ name ]; - value = props[ index ]; - if ( Array.isArray( value ) ) { - easing = value[ 1 ]; - value = props[ index ] = value[ 0 ]; - } - - if ( index !== name ) { - props[ name ] = value; - delete props[ index ]; - } - - hooks = jQuery.cssHooks[ name ]; - if ( hooks && "expand" in hooks ) { - value = hooks.expand( value ); - delete props[ name ]; - - // Not quite $.extend, this won't overwrite existing keys. - // Reusing 'index' because we have the correct "name" - for ( index in value ) { - if ( !( index in props ) ) { - props[ index ] = value[ index ]; - specialEasing[ index ] = easing; - } - } - } else { - specialEasing[ name ] = easing; - } - } -} - -function Animation( elem, properties, options ) { - var result, - stopped, - index = 0, - length = Animation.prefilters.length, - deferred = jQuery.Deferred().always( function() { - - // Don't match elem in the :animated selector - delete tick.elem; - } ), - tick = function() { - if ( stopped ) { - return false; - } - var currentTime = fxNow || createFxNow(), - remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ), - - // Support: Android 2.3 only - // Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497) - temp = remaining / animation.duration || 0, - percent = 1 - temp, - index = 0, - length = animation.tweens.length; - - for ( ; index < length; index++ ) { - animation.tweens[ index ].run( percent ); - } - - deferred.notifyWith( elem, [ animation, percent, remaining ] ); - - // If there's more to do, yield - if ( percent < 1 && length ) { - return remaining; - } - - // If this was an empty animation, synthesize a final progress notification - if ( !length ) { - deferred.notifyWith( elem, [ animation, 1, 0 ] ); - } - - // Resolve the animation and report its conclusion - deferred.resolveWith( elem, [ animation ] ); - return false; - }, - animation = deferred.promise( { - elem: elem, - props: jQuery.extend( {}, properties ), - opts: jQuery.extend( true, { - specialEasing: {}, - easing: jQuery.easing._default - }, options ), - originalProperties: properties, - originalOptions: options, - startTime: fxNow || createFxNow(), - duration: options.duration, - tweens: [], - createTween: function( prop, end ) { - var tween = jQuery.Tween( elem, animation.opts, prop, end, - animation.opts.specialEasing[ prop ] || animation.opts.easing ); - animation.tweens.push( tween ); - return tween; - }, - stop: function( gotoEnd ) { - var index = 0, - - // If we are going to the end, we want to run all the tweens - // otherwise we skip this part - length = gotoEnd ? animation.tweens.length : 0; - if ( stopped ) { - return this; - } - stopped = true; - for ( ; index < length; index++ ) { - animation.tweens[ index ].run( 1 ); - } - - // Resolve when we played the last frame; otherwise, reject - if ( gotoEnd ) { - deferred.notifyWith( elem, [ animation, 1, 0 ] ); - deferred.resolveWith( elem, [ animation, gotoEnd ] ); - } else { - deferred.rejectWith( elem, [ animation, gotoEnd ] ); - } - return this; - } - } ), - props = animation.props; - - propFilter( props, animation.opts.specialEasing ); - - for ( ; index < length; index++ ) { - result = Animation.prefilters[ index ].call( animation, elem, props, animation.opts ); - if ( result ) { - if ( isFunction( result.stop ) ) { - jQuery._queueHooks( animation.elem, animation.opts.queue ).stop = - result.stop.bind( result ); - } - return result; - } - } - - jQuery.map( props, createTween, animation ); - - if ( isFunction( animation.opts.start ) ) { - animation.opts.start.call( elem, animation ); - } - - // Attach callbacks from options - animation - .progress( animation.opts.progress ) - .done( animation.opts.done, animation.opts.complete ) - .fail( animation.opts.fail ) - .always( animation.opts.always ); - - jQuery.fx.timer( - jQuery.extend( tick, { - elem: elem, - anim: animation, - queue: animation.opts.queue - } ) - ); - - return animation; -} - -jQuery.Animation = jQuery.extend( Animation, { - - tweeners: { - "*": [ function( prop, value ) { - var tween = this.createTween( prop, value ); - adjustCSS( tween.elem, prop, rcssNum.exec( value ), tween ); - return tween; - } ] - }, - - tweener: function( props, callback ) { - if ( isFunction( props ) ) { - callback = props; - props = [ "*" ]; - } else { - props = props.match( rnothtmlwhite ); - } - - var prop, - index = 0, - length = props.length; - - for ( ; index < length; index++ ) { - prop = props[ index ]; - Animation.tweeners[ prop ] = Animation.tweeners[ prop ] || []; - Animation.tweeners[ prop ].unshift( callback ); - } - }, - - prefilters: [ defaultPrefilter ], - - prefilter: function( callback, prepend ) { - if ( prepend ) { - Animation.prefilters.unshift( callback ); - } else { - Animation.prefilters.push( callback ); - } - } -} ); - -jQuery.speed = function( speed, easing, fn ) { - var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : { - complete: fn || !fn && easing || - isFunction( speed ) && speed, - duration: speed, - easing: fn && easing || easing && !isFunction( easing ) && easing - }; - - // Go to the end state if fx are off - if ( jQuery.fx.off ) { - opt.duration = 0; - - } else { - if ( typeof opt.duration !== "number" ) { - if ( opt.duration in jQuery.fx.speeds ) { - opt.duration = jQuery.fx.speeds[ opt.duration ]; - - } else { - opt.duration = jQuery.fx.speeds._default; - } - } - } - - // Normalize opt.queue - true/undefined/null -> "fx" - if ( opt.queue == null || opt.queue === true ) { - opt.queue = "fx"; - } - - // Queueing - opt.old = opt.complete; - - opt.complete = function() { - if ( isFunction( opt.old ) ) { - opt.old.call( this ); - } - - if ( opt.queue ) { - jQuery.dequeue( this, opt.queue ); - } - }; - - return opt; -}; - -jQuery.fn.extend( { - fadeTo: function( speed, to, easing, callback ) { - - // Show any hidden elements after setting opacity to 0 - return this.filter( isHiddenWithinTree ).css( "opacity", 0 ).show() - - // Animate to the value specified - .end().animate( { opacity: to }, speed, easing, callback ); - }, - animate: function( prop, speed, easing, callback ) { - var empty = jQuery.isEmptyObject( prop ), - optall = jQuery.speed( speed, easing, callback ), - doAnimation = function() { - - // Operate on a copy of prop so per-property easing won't be lost - var anim = Animation( this, jQuery.extend( {}, prop ), optall ); - - // Empty animations, or finishing resolves immediately - if ( empty || dataPriv.get( this, "finish" ) ) { - anim.stop( true ); - } - }; - doAnimation.finish = doAnimation; - - return empty || optall.queue === false ? - this.each( doAnimation ) : - this.queue( optall.queue, doAnimation ); - }, - stop: function( type, clearQueue, gotoEnd ) { - var stopQueue = function( hooks ) { - var stop = hooks.stop; - delete hooks.stop; - stop( gotoEnd ); - }; - - if ( typeof type !== "string" ) { - gotoEnd = clearQueue; - clearQueue = type; - type = undefined; - } - if ( clearQueue && type !== false ) { - this.queue( type || "fx", [] ); - } - - return this.each( function() { - var dequeue = true, - index = type != null && type + "queueHooks", - timers = jQuery.timers, - data = dataPriv.get( this ); - - if ( index ) { - if ( data[ index ] && data[ index ].stop ) { - stopQueue( data[ index ] ); - } - } else { - for ( index in data ) { - if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) { - stopQueue( data[ index ] ); - } - } - } - - for ( index = timers.length; index--; ) { - if ( timers[ index ].elem === this && - ( type == null || timers[ index ].queue === type ) ) { - - timers[ index ].anim.stop( gotoEnd ); - dequeue = false; - timers.splice( index, 1 ); - } - } - - // Start the next in the queue if the last step wasn't forced. - // Timers currently will call their complete callbacks, which - // will dequeue but only if they were gotoEnd. - if ( dequeue || !gotoEnd ) { - jQuery.dequeue( this, type ); - } - } ); - }, - finish: function( type ) { - if ( type !== false ) { - type = type || "fx"; - } - return this.each( function() { - var index, - data = dataPriv.get( this ), - queue = data[ type + "queue" ], - hooks = data[ type + "queueHooks" ], - timers = jQuery.timers, - length = queue ? queue.length : 0; - - // Enable finishing flag on private data - data.finish = true; - - // Empty the queue first - jQuery.queue( this, type, [] ); - - if ( hooks && hooks.stop ) { - hooks.stop.call( this, true ); - } - - // Look for any active animations, and finish them - for ( index = timers.length; index--; ) { - if ( timers[ index ].elem === this && timers[ index ].queue === type ) { - timers[ index ].anim.stop( true ); - timers.splice( index, 1 ); - } - } - - // Look for any animations in the old queue and finish them - for ( index = 0; index < length; index++ ) { - if ( queue[ index ] && queue[ index ].finish ) { - queue[ index ].finish.call( this ); - } - } - - // Turn off finishing flag - delete data.finish; - } ); - } -} ); - -jQuery.each( [ "toggle", "show", "hide" ], function( i, name ) { - var cssFn = jQuery.fn[ name ]; - jQuery.fn[ name ] = function( speed, easing, callback ) { - return speed == null || typeof speed === "boolean" ? - cssFn.apply( this, arguments ) : - this.animate( genFx( name, true ), speed, easing, callback ); - }; -} ); - -// Generate shortcuts for custom animations -jQuery.each( { - slideDown: genFx( "show" ), - slideUp: genFx( "hide" ), - slideToggle: genFx( "toggle" ), - fadeIn: { opacity: "show" }, - fadeOut: { opacity: "hide" }, - fadeToggle: { opacity: "toggle" } -}, function( name, props ) { - jQuery.fn[ name ] = function( speed, easing, callback ) { - return this.animate( props, speed, easing, callback ); - }; -} ); - -jQuery.timers = []; -jQuery.fx.tick = function() { - var timer, - i = 0, - timers = jQuery.timers; - - fxNow = Date.now(); - - for ( ; i < timers.length; i++ ) { - timer = timers[ i ]; - - // Run the timer and safely remove it when done (allowing for external removal) - if ( !timer() && timers[ i ] === timer ) { - timers.splice( i--, 1 ); - } - } - - if ( !timers.length ) { - jQuery.fx.stop(); - } - fxNow = undefined; -}; - -jQuery.fx.timer = function( timer ) { - jQuery.timers.push( timer ); - jQuery.fx.start(); -}; - -jQuery.fx.interval = 13; -jQuery.fx.start = function() { - if ( inProgress ) { - return; - } - - inProgress = true; - schedule(); -}; - -jQuery.fx.stop = function() { - inProgress = null; -}; - -jQuery.fx.speeds = { - slow: 600, - fast: 200, - - // Default speed - _default: 400 -}; - - -// Based off of the plugin by Clint Helfers, with permission. -// https://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/ -jQuery.fn.delay = function( time, type ) { - time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time; - type = type || "fx"; - - return this.queue( type, function( next, hooks ) { - var timeout = window.setTimeout( next, time ); - hooks.stop = function() { - window.clearTimeout( timeout ); - }; - } ); -}; - - -( function() { - var input = document.createElement( "input" ), - select = document.createElement( "select" ), - opt = select.appendChild( document.createElement( "option" ) ); - - input.type = "checkbox"; - - // Support: Android <=4.3 only - // Default value for a checkbox should be "on" - support.checkOn = input.value !== ""; - - // Support: IE <=11 only - // Must access selectedIndex to make default options select - support.optSelected = opt.selected; - - // Support: IE <=11 only - // An input loses its value after becoming a radio - input = document.createElement( "input" ); - input.value = "t"; - input.type = "radio"; - support.radioValue = input.value === "t"; -} )(); - - -var boolHook, - attrHandle = jQuery.expr.attrHandle; - -jQuery.fn.extend( { - attr: function( name, value ) { - return access( this, jQuery.attr, name, value, arguments.length > 1 ); - }, - - removeAttr: function( name ) { - return this.each( function() { - jQuery.removeAttr( this, name ); - } ); - } -} ); - -jQuery.extend( { - attr: function( elem, name, value ) { - var ret, hooks, - nType = elem.nodeType; - - // Don't get/set attributes on text, comment and attribute nodes - if ( nType === 3 || nType === 8 || nType === 2 ) { - return; - } - - // Fallback to prop when attributes are not supported - if ( typeof elem.getAttribute === "undefined" ) { - return jQuery.prop( elem, name, value ); - } - - // Attribute hooks are determined by the lowercase version - // Grab necessary hook if one is defined - if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { - hooks = jQuery.attrHooks[ name.toLowerCase() ] || - ( jQuery.expr.match.bool.test( name ) ? boolHook : undefined ); - } - - if ( value !== undefined ) { - if ( value === null ) { - jQuery.removeAttr( elem, name ); - return; - } - - if ( hooks && "set" in hooks && - ( ret = hooks.set( elem, value, name ) ) !== undefined ) { - return ret; - } - - elem.setAttribute( name, value + "" ); - return value; - } - - if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { - return ret; - } - - ret = jQuery.find.attr( elem, name ); - - // Non-existent attributes return null, we normalize to undefined - return ret == null ? undefined : ret; - }, - - attrHooks: { - type: { - set: function( elem, value ) { - if ( !support.radioValue && value === "radio" && - nodeName( elem, "input" ) ) { - var val = elem.value; - elem.setAttribute( "type", value ); - if ( val ) { - elem.value = val; - } - return value; - } - } - } - }, - - removeAttr: function( elem, value ) { - var name, - i = 0, - - // Attribute names can contain non-HTML whitespace characters - // https://html.spec.whatwg.org/multipage/syntax.html#attributes-2 - attrNames = value && value.match( rnothtmlwhite ); - - if ( attrNames && elem.nodeType === 1 ) { - while ( ( name = attrNames[ i++ ] ) ) { - elem.removeAttribute( name ); - } - } - } -} ); - -// Hooks for boolean attributes -boolHook = { - set: function( elem, value, name ) { - if ( value === false ) { - - // Remove boolean attributes when set to false - jQuery.removeAttr( elem, name ); - } else { - elem.setAttribute( name, name ); - } - return name; - } -}; - -jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( i, name ) { - var getter = attrHandle[ name ] || jQuery.find.attr; - - attrHandle[ name ] = function( elem, name, isXML ) { - var ret, handle, - lowercaseName = name.toLowerCase(); - - if ( !isXML ) { - - // Avoid an infinite loop by temporarily removing this function from the getter - handle = attrHandle[ lowercaseName ]; - attrHandle[ lowercaseName ] = ret; - ret = getter( elem, name, isXML ) != null ? - lowercaseName : - null; - attrHandle[ lowercaseName ] = handle; - } - return ret; - }; -} ); - - - - -var rfocusable = /^(?:input|select|textarea|button)$/i, - rclickable = /^(?:a|area)$/i; - -jQuery.fn.extend( { - prop: function( name, value ) { - return access( this, jQuery.prop, name, value, arguments.length > 1 ); - }, - - removeProp: function( name ) { - return this.each( function() { - delete this[ jQuery.propFix[ name ] || name ]; - } ); - } -} ); - -jQuery.extend( { - prop: function( elem, name, value ) { - var ret, hooks, - nType = elem.nodeType; - - // Don't get/set properties on text, comment and attribute nodes - if ( nType === 3 || nType === 8 || nType === 2 ) { - return; - } - - if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { - - // Fix name and attach hooks - name = jQuery.propFix[ name ] || name; - hooks = jQuery.propHooks[ name ]; - } - - if ( value !== undefined ) { - if ( hooks && "set" in hooks && - ( ret = hooks.set( elem, value, name ) ) !== undefined ) { - return ret; - } - - return ( elem[ name ] = value ); - } - - if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { - return ret; - } - - return elem[ name ]; - }, - - propHooks: { - tabIndex: { - get: function( elem ) { - - // Support: IE <=9 - 11 only - // elem.tabIndex doesn't always return the - // correct value when it hasn't been explicitly set - // https://web.archive.org/web/20141116233347/http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/ - // Use proper attribute retrieval(#12072) - var tabindex = jQuery.find.attr( elem, "tabindex" ); - - if ( tabindex ) { - return parseInt( tabindex, 10 ); - } - - if ( - rfocusable.test( elem.nodeName ) || - rclickable.test( elem.nodeName ) && - elem.href - ) { - return 0; - } - - return -1; - } - } - }, - - propFix: { - "for": "htmlFor", - "class": "className" - } -} ); - -// Support: IE <=11 only -// Accessing the selectedIndex property -// forces the browser to respect setting selected -// on the option -// The getter ensures a default option is selected -// when in an optgroup -// eslint rule "no-unused-expressions" is disabled for this code -// since it considers such accessions noop -if ( !support.optSelected ) { - jQuery.propHooks.selected = { - get: function( elem ) { - - /* eslint no-unused-expressions: "off" */ - - var parent = elem.parentNode; - if ( parent && parent.parentNode ) { - parent.parentNode.selectedIndex; - } - return null; - }, - set: function( elem ) { - - /* eslint no-unused-expressions: "off" */ - - var parent = elem.parentNode; - if ( parent ) { - parent.selectedIndex; - - if ( parent.parentNode ) { - parent.parentNode.selectedIndex; - } - } - } - }; -} - -jQuery.each( [ - "tabIndex", - "readOnly", - "maxLength", - "cellSpacing", - "cellPadding", - "rowSpan", - "colSpan", - "useMap", - "frameBorder", - "contentEditable" -], function() { - jQuery.propFix[ this.toLowerCase() ] = this; -} ); - - - - - // Strip and collapse whitespace according to HTML spec - // https://infra.spec.whatwg.org/#strip-and-collapse-ascii-whitespace - function stripAndCollapse( value ) { - var tokens = value.match( rnothtmlwhite ) || []; - return tokens.join( " " ); - } - - -function getClass( elem ) { - return elem.getAttribute && elem.getAttribute( "class" ) || ""; -} - -function classesToArray( value ) { - if ( Array.isArray( value ) ) { - return value; - } - if ( typeof value === "string" ) { - return value.match( rnothtmlwhite ) || []; - } - return []; -} - -jQuery.fn.extend( { - addClass: function( value ) { - var classes, elem, cur, curValue, clazz, j, finalValue, - i = 0; - - if ( isFunction( value ) ) { - return this.each( function( j ) { - jQuery( this ).addClass( value.call( this, j, getClass( this ) ) ); - } ); - } - - classes = classesToArray( value ); - - if ( classes.length ) { - while ( ( elem = this[ i++ ] ) ) { - curValue = getClass( elem ); - cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); - - if ( cur ) { - j = 0; - while ( ( clazz = classes[ j++ ] ) ) { - if ( cur.indexOf( " " + clazz + " " ) < 0 ) { - cur += clazz + " "; - } - } - - // Only assign if different to avoid unneeded rendering. - finalValue = stripAndCollapse( cur ); - if ( curValue !== finalValue ) { - elem.setAttribute( "class", finalValue ); - } - } - } - } - - return this; - }, - - removeClass: function( value ) { - var classes, elem, cur, curValue, clazz, j, finalValue, - i = 0; - - if ( isFunction( value ) ) { - return this.each( function( j ) { - jQuery( this ).removeClass( value.call( this, j, getClass( this ) ) ); - } ); - } - - if ( !arguments.length ) { - return this.attr( "class", "" ); - } - - classes = classesToArray( value ); - - if ( classes.length ) { - while ( ( elem = this[ i++ ] ) ) { - curValue = getClass( elem ); - - // This expression is here for better compressibility (see addClass) - cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); - - if ( cur ) { - j = 0; - while ( ( clazz = classes[ j++ ] ) ) { - - // Remove *all* instances - while ( cur.indexOf( " " + clazz + " " ) > -1 ) { - cur = cur.replace( " " + clazz + " ", " " ); - } - } - - // Only assign if different to avoid unneeded rendering. - finalValue = stripAndCollapse( cur ); - if ( curValue !== finalValue ) { - elem.setAttribute( "class", finalValue ); - } - } - } - } - - return this; - }, - - toggleClass: function( value, stateVal ) { - var type = typeof value, - isValidValue = type === "string" || Array.isArray( value ); - - if ( typeof stateVal === "boolean" && isValidValue ) { - return stateVal ? this.addClass( value ) : this.removeClass( value ); - } - - if ( isFunction( value ) ) { - return this.each( function( i ) { - jQuery( this ).toggleClass( - value.call( this, i, getClass( this ), stateVal ), - stateVal - ); - } ); - } - - return this.each( function() { - var className, i, self, classNames; - - if ( isValidValue ) { - - // Toggle individual class names - i = 0; - self = jQuery( this ); - classNames = classesToArray( value ); - - while ( ( className = classNames[ i++ ] ) ) { - - // Check each className given, space separated list - if ( self.hasClass( className ) ) { - self.removeClass( className ); - } else { - self.addClass( className ); - } - } - - // Toggle whole class name - } else if ( value === undefined || type === "boolean" ) { - className = getClass( this ); - if ( className ) { - - // Store className if set - dataPriv.set( this, "__className__", className ); - } - - // If the element has a class name or if we're passed `false`, - // then remove the whole classname (if there was one, the above saved it). - // Otherwise bring back whatever was previously saved (if anything), - // falling back to the empty string if nothing was stored. - if ( this.setAttribute ) { - this.setAttribute( "class", - className || value === false ? - "" : - dataPriv.get( this, "__className__" ) || "" - ); - } - } - } ); - }, - - hasClass: function( selector ) { - var className, elem, - i = 0; - - className = " " + selector + " "; - while ( ( elem = this[ i++ ] ) ) { - if ( elem.nodeType === 1 && - ( " " + stripAndCollapse( getClass( elem ) ) + " " ).indexOf( className ) > -1 ) { - return true; - } - } - - return false; - } -} ); - - - - -var rreturn = /\r/g; - -jQuery.fn.extend( { - val: function( value ) { - var hooks, ret, valueIsFunction, - elem = this[ 0 ]; - - if ( !arguments.length ) { - if ( elem ) { - hooks = jQuery.valHooks[ elem.type ] || - jQuery.valHooks[ elem.nodeName.toLowerCase() ]; - - if ( hooks && - "get" in hooks && - ( ret = hooks.get( elem, "value" ) ) !== undefined - ) { - return ret; - } - - ret = elem.value; - - // Handle most common string cases - if ( typeof ret === "string" ) { - return ret.replace( rreturn, "" ); - } - - // Handle cases where value is null/undef or number - return ret == null ? "" : ret; - } - - return; - } - - valueIsFunction = isFunction( value ); - - return this.each( function( i ) { - var val; - - if ( this.nodeType !== 1 ) { - return; - } - - if ( valueIsFunction ) { - val = value.call( this, i, jQuery( this ).val() ); - } else { - val = value; - } - - // Treat null/undefined as ""; convert numbers to string - if ( val == null ) { - val = ""; - - } else if ( typeof val === "number" ) { - val += ""; - - } else if ( Array.isArray( val ) ) { - val = jQuery.map( val, function( value ) { - return value == null ? "" : value + ""; - } ); - } - - hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ]; - - // If set returns undefined, fall back to normal setting - if ( !hooks || !( "set" in hooks ) || hooks.set( this, val, "value" ) === undefined ) { - this.value = val; - } - } ); - } -} ); - -jQuery.extend( { - valHooks: { - option: { - get: function( elem ) { - - var val = jQuery.find.attr( elem, "value" ); - return val != null ? - val : - - // Support: IE <=10 - 11 only - // option.text throws exceptions (#14686, #14858) - // Strip and collapse whitespace - // https://html.spec.whatwg.org/#strip-and-collapse-whitespace - stripAndCollapse( jQuery.text( elem ) ); - } - }, - select: { - get: function( elem ) { - var value, option, i, - options = elem.options, - index = elem.selectedIndex, - one = elem.type === "select-one", - values = one ? null : [], - max = one ? index + 1 : options.length; - - if ( index < 0 ) { - i = max; - - } else { - i = one ? index : 0; - } - - // Loop through all the selected options - for ( ; i < max; i++ ) { - option = options[ i ]; - - // Support: IE <=9 only - // IE8-9 doesn't update selected after form reset (#2551) - if ( ( option.selected || i === index ) && - - // Don't return options that are disabled or in a disabled optgroup - !option.disabled && - ( !option.parentNode.disabled || - !nodeName( option.parentNode, "optgroup" ) ) ) { - - // Get the specific value for the option - value = jQuery( option ).val(); - - // We don't need an array for one selects - if ( one ) { - return value; - } - - // Multi-Selects return an array - values.push( value ); - } - } - - return values; - }, - - set: function( elem, value ) { - var optionSet, option, - options = elem.options, - values = jQuery.makeArray( value ), - i = options.length; - - while ( i-- ) { - option = options[ i ]; - - /* eslint-disable no-cond-assign */ - - if ( option.selected = - jQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1 - ) { - optionSet = true; - } - - /* eslint-enable no-cond-assign */ - } - - // Force browsers to behave consistently when non-matching value is set - if ( !optionSet ) { - elem.selectedIndex = -1; - } - return values; - } - } - } -} ); - -// Radios and checkboxes getter/setter -jQuery.each( [ "radio", "checkbox" ], function() { - jQuery.valHooks[ this ] = { - set: function( elem, value ) { - if ( Array.isArray( value ) ) { - return ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 ); - } - } - }; - if ( !support.checkOn ) { - jQuery.valHooks[ this ].get = function( elem ) { - return elem.getAttribute( "value" ) === null ? "on" : elem.value; - }; - } -} ); - - - - -// Return jQuery for attributes-only inclusion - - -support.focusin = "onfocusin" in window; - - -var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/, - stopPropagationCallback = function( e ) { - e.stopPropagation(); - }; - -jQuery.extend( jQuery.event, { - - trigger: function( event, data, elem, onlyHandlers ) { - - var i, cur, tmp, bubbleType, ontype, handle, special, lastElement, - eventPath = [ elem || document ], - type = hasOwn.call( event, "type" ) ? event.type : event, - namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split( "." ) : []; - - cur = lastElement = tmp = elem = elem || document; - - // Don't do events on text and comment nodes - if ( elem.nodeType === 3 || elem.nodeType === 8 ) { - return; - } - - // focus/blur morphs to focusin/out; ensure we're not firing them right now - if ( rfocusMorph.test( type + jQuery.event.triggered ) ) { - return; - } - - if ( type.indexOf( "." ) > -1 ) { - - // Namespaced trigger; create a regexp to match event type in handle() - namespaces = type.split( "." ); - type = namespaces.shift(); - namespaces.sort(); - } - ontype = type.indexOf( ":" ) < 0 && "on" + type; - - // Caller can pass in a jQuery.Event object, Object, or just an event type string - event = event[ jQuery.expando ] ? - event : - new jQuery.Event( type, typeof event === "object" && event ); - - // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true) - event.isTrigger = onlyHandlers ? 2 : 3; - event.namespace = namespaces.join( "." ); - event.rnamespace = event.namespace ? - new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ) : - null; - - // Clean up the event in case it is being reused - event.result = undefined; - if ( !event.target ) { - event.target = elem; - } - - // Clone any incoming data and prepend the event, creating the handler arg list - data = data == null ? - [ event ] : - jQuery.makeArray( data, [ event ] ); - - // Allow special events to draw outside the lines - special = jQuery.event.special[ type ] || {}; - if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) { - return; - } - - // Determine event propagation path in advance, per W3C events spec (#9951) - // Bubble up to document, then to window; watch for a global ownerDocument var (#9724) - if ( !onlyHandlers && !special.noBubble && !isWindow( elem ) ) { - - bubbleType = special.delegateType || type; - if ( !rfocusMorph.test( bubbleType + type ) ) { - cur = cur.parentNode; - } - for ( ; cur; cur = cur.parentNode ) { - eventPath.push( cur ); - tmp = cur; - } - - // Only add window if we got to document (e.g., not plain obj or detached DOM) - if ( tmp === ( elem.ownerDocument || document ) ) { - eventPath.push( tmp.defaultView || tmp.parentWindow || window ); - } - } - - // Fire handlers on the event path - i = 0; - while ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) { - lastElement = cur; - event.type = i > 1 ? - bubbleType : - special.bindType || type; - - // jQuery handler - handle = ( dataPriv.get( cur, "events" ) || {} )[ event.type ] && - dataPriv.get( cur, "handle" ); - if ( handle ) { - handle.apply( cur, data ); - } - - // Native handler - handle = ontype && cur[ ontype ]; - if ( handle && handle.apply && acceptData( cur ) ) { - event.result = handle.apply( cur, data ); - if ( event.result === false ) { - event.preventDefault(); - } - } - } - event.type = type; - - // If nobody prevented the default action, do it now - if ( !onlyHandlers && !event.isDefaultPrevented() ) { - - if ( ( !special._default || - special._default.apply( eventPath.pop(), data ) === false ) && - acceptData( elem ) ) { - - // Call a native DOM method on the target with the same name as the event. - // Don't do default actions on window, that's where global variables be (#6170) - if ( ontype && isFunction( elem[ type ] ) && !isWindow( elem ) ) { - - // Don't re-trigger an onFOO event when we call its FOO() method - tmp = elem[ ontype ]; - - if ( tmp ) { - elem[ ontype ] = null; - } - - // Prevent re-triggering of the same event, since we already bubbled it above - jQuery.event.triggered = type; - - if ( event.isPropagationStopped() ) { - lastElement.addEventListener( type, stopPropagationCallback ); - } - - elem[ type ](); - - if ( event.isPropagationStopped() ) { - lastElement.removeEventListener( type, stopPropagationCallback ); - } - - jQuery.event.triggered = undefined; - - if ( tmp ) { - elem[ ontype ] = tmp; - } - } - } - } - - return event.result; - }, - - // Piggyback on a donor event to simulate a different one - // Used only for `focus(in | out)` events - simulate: function( type, elem, event ) { - var e = jQuery.extend( - new jQuery.Event(), - event, - { - type: type, - isSimulated: true - } - ); - - jQuery.event.trigger( e, null, elem ); - } - -} ); - -jQuery.fn.extend( { - - trigger: function( type, data ) { - return this.each( function() { - jQuery.event.trigger( type, data, this ); - } ); - }, - triggerHandler: function( type, data ) { - var elem = this[ 0 ]; - if ( elem ) { - return jQuery.event.trigger( type, data, elem, true ); - } - } -} ); - - -// Support: Firefox <=44 -// Firefox doesn't have focus(in | out) events -// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787 -// -// Support: Chrome <=48 - 49, Safari <=9.0 - 9.1 -// focus(in | out) events fire after focus & blur events, -// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order -// Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857 -if ( !support.focusin ) { - jQuery.each( { focus: "focusin", blur: "focusout" }, function( orig, fix ) { - - // Attach a single capturing handler on the document while someone wants focusin/focusout - var handler = function( event ) { - jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) ); - }; - - jQuery.event.special[ fix ] = { - setup: function() { - var doc = this.ownerDocument || this, - attaches = dataPriv.access( doc, fix ); - - if ( !attaches ) { - doc.addEventListener( orig, handler, true ); - } - dataPriv.access( doc, fix, ( attaches || 0 ) + 1 ); - }, - teardown: function() { - var doc = this.ownerDocument || this, - attaches = dataPriv.access( doc, fix ) - 1; - - if ( !attaches ) { - doc.removeEventListener( orig, handler, true ); - dataPriv.remove( doc, fix ); - - } else { - dataPriv.access( doc, fix, attaches ); - } - } - }; - } ); -} -var location = window.location; - -var nonce = Date.now(); - -var rquery = ( /\?/ ); - - - -// Cross-browser xml parsing -jQuery.parseXML = function( data ) { - var xml; - if ( !data || typeof data !== "string" ) { - return null; - } - - // Support: IE 9 - 11 only - // IE throws on parseFromString with invalid input. - try { - xml = ( new window.DOMParser() ).parseFromString( data, "text/xml" ); - } catch ( e ) { - xml = undefined; - } - - if ( !xml || xml.getElementsByTagName( "parsererror" ).length ) { - jQuery.error( "Invalid XML: " + data ); - } - return xml; -}; - - -var - rbracket = /\[\]$/, - rCRLF = /\r?\n/g, - rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i, - rsubmittable = /^(?:input|select|textarea|keygen)/i; - -function buildParams( prefix, obj, traditional, add ) { - var name; - - if ( Array.isArray( obj ) ) { - - // Serialize array item. - jQuery.each( obj, function( i, v ) { - if ( traditional || rbracket.test( prefix ) ) { - - // Treat each array item as a scalar. - add( prefix, v ); - - } else { - - // Item is non-scalar (array or object), encode its numeric index. - buildParams( - prefix + "[" + ( typeof v === "object" && v != null ? i : "" ) + "]", - v, - traditional, - add - ); - } - } ); - - } else if ( !traditional && toType( obj ) === "object" ) { - - // Serialize object item. - for ( name in obj ) { - buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add ); - } - - } else { - - // Serialize scalar item. - add( prefix, obj ); - } -} - -// Serialize an array of form elements or a set of -// key/values into a query string -jQuery.param = function( a, traditional ) { - var prefix, - s = [], - add = function( key, valueOrFunction ) { - - // If value is a function, invoke it and use its return value - var value = isFunction( valueOrFunction ) ? - valueOrFunction() : - valueOrFunction; - - s[ s.length ] = encodeURIComponent( key ) + "=" + - encodeURIComponent( value == null ? "" : value ); - }; - - if ( a == null ) { - return ""; - } - - // If an array was passed in, assume that it is an array of form elements. - if ( Array.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) { - - // Serialize the form elements - jQuery.each( a, function() { - add( this.name, this.value ); - } ); - - } else { - - // If traditional, encode the "old" way (the way 1.3.2 or older - // did it), otherwise encode params recursively. - for ( prefix in a ) { - buildParams( prefix, a[ prefix ], traditional, add ); - } - } - - // Return the resulting serialization - return s.join( "&" ); -}; - -jQuery.fn.extend( { - serialize: function() { - return jQuery.param( this.serializeArray() ); - }, - serializeArray: function() { - return this.map( function() { - - // Can add propHook for "elements" to filter or add form elements - var elements = jQuery.prop( this, "elements" ); - return elements ? jQuery.makeArray( elements ) : this; - } ) - .filter( function() { - var type = this.type; - - // Use .is( ":disabled" ) so that fieldset[disabled] works - return this.name && !jQuery( this ).is( ":disabled" ) && - rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) && - ( this.checked || !rcheckableType.test( type ) ); - } ) - .map( function( i, elem ) { - var val = jQuery( this ).val(); - - if ( val == null ) { - return null; - } - - if ( Array.isArray( val ) ) { - return jQuery.map( val, function( val ) { - return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; - } ); - } - - return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; - } ).get(); - } -} ); - - -var - r20 = /%20/g, - rhash = /#.*$/, - rantiCache = /([?&])_=[^&]*/, - rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg, - - // #7653, #8125, #8152: local protocol detection - rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/, - rnoContent = /^(?:GET|HEAD)$/, - rprotocol = /^\/\//, - - /* Prefilters - * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example) - * 2) These are called: - * - BEFORE asking for a transport - * - AFTER param serialization (s.data is a string if s.processData is true) - * 3) key is the dataType - * 4) the catchall symbol "*" can be used - * 5) execution will start with transport dataType and THEN continue down to "*" if needed - */ - prefilters = {}, - - /* Transports bindings - * 1) key is the dataType - * 2) the catchall symbol "*" can be used - * 3) selection will start with transport dataType and THEN go to "*" if needed - */ - transports = {}, - - // Avoid comment-prolog char sequence (#10098); must appease lint and evade compression - allTypes = "*/".concat( "*" ), - - // Anchor tag for parsing the document origin - originAnchor = document.createElement( "a" ); - originAnchor.href = location.href; - -// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport -function addToPrefiltersOrTransports( structure ) { - - // dataTypeExpression is optional and defaults to "*" - return function( dataTypeExpression, func ) { - - if ( typeof dataTypeExpression !== "string" ) { - func = dataTypeExpression; - dataTypeExpression = "*"; - } - - var dataType, - i = 0, - dataTypes = dataTypeExpression.toLowerCase().match( rnothtmlwhite ) || []; - - if ( isFunction( func ) ) { - - // For each dataType in the dataTypeExpression - while ( ( dataType = dataTypes[ i++ ] ) ) { - - // Prepend if requested - if ( dataType[ 0 ] === "+" ) { - dataType = dataType.slice( 1 ) || "*"; - ( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func ); - - // Otherwise append - } else { - ( structure[ dataType ] = structure[ dataType ] || [] ).push( func ); - } - } - } - }; -} - -// Base inspection function for prefilters and transports -function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) { - - var inspected = {}, - seekingTransport = ( structure === transports ); - - function inspect( dataType ) { - var selected; - inspected[ dataType ] = true; - jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) { - var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR ); - if ( typeof dataTypeOrTransport === "string" && - !seekingTransport && !inspected[ dataTypeOrTransport ] ) { - - options.dataTypes.unshift( dataTypeOrTransport ); - inspect( dataTypeOrTransport ); - return false; - } else if ( seekingTransport ) { - return !( selected = dataTypeOrTransport ); - } - } ); - return selected; - } - - return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" ); -} - -// A special extend for ajax options -// that takes "flat" options (not to be deep extended) -// Fixes #9887 -function ajaxExtend( target, src ) { - var key, deep, - flatOptions = jQuery.ajaxSettings.flatOptions || {}; - - for ( key in src ) { - if ( src[ key ] !== undefined ) { - ( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ]; - } - } - if ( deep ) { - jQuery.extend( true, target, deep ); - } - - return target; -} - -/* Handles responses to an ajax request: - * - finds the right dataType (mediates between content-type and expected dataType) - * - returns the corresponding response - */ -function ajaxHandleResponses( s, jqXHR, responses ) { - - var ct, type, finalDataType, firstDataType, - contents = s.contents, - dataTypes = s.dataTypes; - - // Remove auto dataType and get content-type in the process - while ( dataTypes[ 0 ] === "*" ) { - dataTypes.shift(); - if ( ct === undefined ) { - ct = s.mimeType || jqXHR.getResponseHeader( "Content-Type" ); - } - } - - // Check if we're dealing with a known content-type - if ( ct ) { - for ( type in contents ) { - if ( contents[ type ] && contents[ type ].test( ct ) ) { - dataTypes.unshift( type ); - break; - } - } - } - - // Check to see if we have a response for the expected dataType - if ( dataTypes[ 0 ] in responses ) { - finalDataType = dataTypes[ 0 ]; - } else { - - // Try convertible dataTypes - for ( type in responses ) { - if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[ 0 ] ] ) { - finalDataType = type; - break; - } - if ( !firstDataType ) { - firstDataType = type; - } - } - - // Or just use first one - finalDataType = finalDataType || firstDataType; - } - - // If we found a dataType - // We add the dataType to the list if needed - // and return the corresponding response - if ( finalDataType ) { - if ( finalDataType !== dataTypes[ 0 ] ) { - dataTypes.unshift( finalDataType ); - } - return responses[ finalDataType ]; - } -} - -/* Chain conversions given the request and the original response - * Also sets the responseXXX fields on the jqXHR instance - */ -function ajaxConvert( s, response, jqXHR, isSuccess ) { - var conv2, current, conv, tmp, prev, - converters = {}, - - // Work with a copy of dataTypes in case we need to modify it for conversion - dataTypes = s.dataTypes.slice(); - - // Create converters map with lowercased keys - if ( dataTypes[ 1 ] ) { - for ( conv in s.converters ) { - converters[ conv.toLowerCase() ] = s.converters[ conv ]; - } - } - - current = dataTypes.shift(); - - // Convert to each sequential dataType - while ( current ) { - - if ( s.responseFields[ current ] ) { - jqXHR[ s.responseFields[ current ] ] = response; - } - - // Apply the dataFilter if provided - if ( !prev && isSuccess && s.dataFilter ) { - response = s.dataFilter( response, s.dataType ); - } - - prev = current; - current = dataTypes.shift(); - - if ( current ) { - - // There's only work to do if current dataType is non-auto - if ( current === "*" ) { - - current = prev; - - // Convert response if prev dataType is non-auto and differs from current - } else if ( prev !== "*" && prev !== current ) { - - // Seek a direct converter - conv = converters[ prev + " " + current ] || converters[ "* " + current ]; - - // If none found, seek a pair - if ( !conv ) { - for ( conv2 in converters ) { - - // If conv2 outputs current - tmp = conv2.split( " " ); - if ( tmp[ 1 ] === current ) { - - // If prev can be converted to accepted input - conv = converters[ prev + " " + tmp[ 0 ] ] || - converters[ "* " + tmp[ 0 ] ]; - if ( conv ) { - - // Condense equivalence converters - if ( conv === true ) { - conv = converters[ conv2 ]; - - // Otherwise, insert the intermediate dataType - } else if ( converters[ conv2 ] !== true ) { - current = tmp[ 0 ]; - dataTypes.unshift( tmp[ 1 ] ); - } - break; - } - } - } - } - - // Apply converter (if not an equivalence) - if ( conv !== true ) { - - // Unless errors are allowed to bubble, catch and return them - if ( conv && s.throws ) { - response = conv( response ); - } else { - try { - response = conv( response ); - } catch ( e ) { - return { - state: "parsererror", - error: conv ? e : "No conversion from " + prev + " to " + current - }; - } - } - } - } - } - } - - return { state: "success", data: response }; -} - -jQuery.extend( { - - // Counter for holding the number of active queries - active: 0, - - // Last-Modified header cache for next request - lastModified: {}, - etag: {}, - - ajaxSettings: { - url: location.href, - type: "GET", - isLocal: rlocalProtocol.test( location.protocol ), - global: true, - processData: true, - async: true, - contentType: "application/x-www-form-urlencoded; charset=UTF-8", - - /* - timeout: 0, - data: null, - dataType: null, - username: null, - password: null, - cache: null, - throws: false, - traditional: false, - headers: {}, - */ - - accepts: { - "*": allTypes, - 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" - }, - - // Data converters - // Keys separate source (or catchall "*") and destination types with a single space - converters: { - - // Convert anything to text - "* text": String, - - // Text to html (true = no transformation) - "text html": true, - - // Evaluate text as a json expression - "text json": JSON.parse, - - // Parse text as xml - "text xml": jQuery.parseXML - }, - - // For options that shouldn't be deep extended: - // you can add your own custom options here if - // and when you create one that shouldn't be - // deep extended (see ajaxExtend) - flatOptions: { - url: true, - context: true - } - }, - - // Creates a full fledged settings object into target - // with both ajaxSettings and settings fields. - // If target is omitted, writes into ajaxSettings. - ajaxSetup: function( target, settings ) { - return settings ? - - // Building a settings object - ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) : - - // Extending ajaxSettings - ajaxExtend( jQuery.ajaxSettings, target ); - }, - - ajaxPrefilter: addToPrefiltersOrTransports( prefilters ), - ajaxTransport: addToPrefiltersOrTransports( transports ), - - // Main method - ajax: function( url, options ) { - - // If url is an object, simulate pre-1.5 signature - if ( typeof url === "object" ) { - options = url; - url = undefined; - } - - // Force options to be an object - options = options || {}; - - var transport, - - // URL without anti-cache param - cacheURL, - - // Response headers - responseHeadersString, - responseHeaders, - - // timeout handle - timeoutTimer, - - // Url cleanup var - urlAnchor, - - // Request state (becomes false upon send and true upon completion) - completed, - - // To know if global events are to be dispatched - fireGlobals, - - // Loop variable - i, - - // uncached part of the url - uncached, - - // Create the final options object - s = jQuery.ajaxSetup( {}, options ), - - // Callbacks context - callbackContext = s.context || s, - - // Context for global events is callbackContext if it is a DOM node or jQuery collection - globalEventContext = s.context && - ( callbackContext.nodeType || callbackContext.jquery ) ? - jQuery( callbackContext ) : - jQuery.event, - - // Deferreds - deferred = jQuery.Deferred(), - completeDeferred = jQuery.Callbacks( "once memory" ), - - // Status-dependent callbacks - statusCode = s.statusCode || {}, - - // Headers (they are sent all at once) - requestHeaders = {}, - requestHeadersNames = {}, - - // Default abort message - strAbort = "canceled", - - // Fake xhr - jqXHR = { - readyState: 0, - - // Builds headers hashtable if needed - getResponseHeader: function( key ) { - var match; - if ( completed ) { - if ( !responseHeaders ) { - responseHeaders = {}; - while ( ( match = rheaders.exec( responseHeadersString ) ) ) { - responseHeaders[ match[ 1 ].toLowerCase() + " " ] = - ( responseHeaders[ match[ 1 ].toLowerCase() + " " ] || [] ) - .concat( match[ 2 ] ); - } - } - match = responseHeaders[ key.toLowerCase() + " " ]; - } - return match == null ? null : match.join( ", " ); - }, - - // Raw string - getAllResponseHeaders: function() { - return completed ? responseHeadersString : null; - }, - - // Caches the header - setRequestHeader: function( name, value ) { - if ( completed == null ) { - name = requestHeadersNames[ name.toLowerCase() ] = - requestHeadersNames[ name.toLowerCase() ] || name; - requestHeaders[ name ] = value; - } - return this; - }, - - // Overrides response content-type header - overrideMimeType: function( type ) { - if ( completed == null ) { - s.mimeType = type; - } - return this; - }, - - // Status-dependent callbacks - statusCode: function( map ) { - var code; - if ( map ) { - if ( completed ) { - - // Execute the appropriate callbacks - jqXHR.always( map[ jqXHR.status ] ); - } else { - - // Lazy-add the new callbacks in a way that preserves old ones - for ( code in map ) { - statusCode[ code ] = [ statusCode[ code ], map[ code ] ]; - } - } - } - return this; - }, - - // Cancel the request - abort: function( statusText ) { - var finalText = statusText || strAbort; - if ( transport ) { - transport.abort( finalText ); - } - done( 0, finalText ); - return this; - } - }; - - // Attach deferreds - deferred.promise( jqXHR ); - - // Add protocol if not provided (prefilters might expect it) - // Handle falsy url in the settings object (#10093: consistency with old signature) - // We also use the url parameter if available - s.url = ( ( url || s.url || location.href ) + "" ) - .replace( rprotocol, location.protocol + "//" ); - - // Alias method option to type as per ticket #12004 - s.type = options.method || options.type || s.method || s.type; - - // Extract dataTypes list - s.dataTypes = ( s.dataType || "*" ).toLowerCase().match( rnothtmlwhite ) || [ "" ]; - - // A cross-domain request is in order when the origin doesn't match the current origin. - if ( s.crossDomain == null ) { - urlAnchor = document.createElement( "a" ); - - // Support: IE <=8 - 11, Edge 12 - 15 - // IE throws exception on accessing the href property if url is malformed, - // e.g. http://example.com:80x/ - try { - urlAnchor.href = s.url; - - // Support: IE <=8 - 11 only - // Anchor's host property isn't correctly set when s.url is relative - urlAnchor.href = urlAnchor.href; - s.crossDomain = originAnchor.protocol + "//" + originAnchor.host !== - urlAnchor.protocol + "//" + urlAnchor.host; - } catch ( e ) { - - // If there is an error parsing the URL, assume it is crossDomain, - // it can be rejected by the transport if it is invalid - s.crossDomain = true; - } - } - - // Convert data if not already a string - if ( s.data && s.processData && typeof s.data !== "string" ) { - s.data = jQuery.param( s.data, s.traditional ); - } - - // Apply prefilters - inspectPrefiltersOrTransports( prefilters, s, options, jqXHR ); - - // If request was aborted inside a prefilter, stop there - if ( completed ) { - return jqXHR; - } - - // We can fire global events as of now if asked to - // Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118) - fireGlobals = jQuery.event && s.global; - - // Watch for a new set of requests - if ( fireGlobals && jQuery.active++ === 0 ) { - jQuery.event.trigger( "ajaxStart" ); - } - - // Uppercase the type - s.type = s.type.toUpperCase(); - - // Determine if request has content - s.hasContent = !rnoContent.test( s.type ); - - // Save the URL in case we're toying with the If-Modified-Since - // and/or If-None-Match header later on - // Remove hash to simplify url manipulation - cacheURL = s.url.replace( rhash, "" ); - - // More options handling for requests with no content - if ( !s.hasContent ) { - - // Remember the hash so we can put it back - uncached = s.url.slice( cacheURL.length ); - - // If data is available and should be processed, append data to url - if ( s.data && ( s.processData || typeof s.data === "string" ) ) { - cacheURL += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data; - - // #9682: remove data so that it's not used in an eventual retry - delete s.data; - } - - // Add or update anti-cache param if needed - if ( s.cache === false ) { - cacheURL = cacheURL.replace( rantiCache, "$1" ); - uncached = ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + ( nonce++ ) + uncached; - } - - // Put hash and anti-cache on the URL that will be requested (gh-1732) - s.url = cacheURL + uncached; - - // Change '%20' to '+' if this is encoded form body content (gh-2658) - } else if ( s.data && s.processData && - ( s.contentType || "" ).indexOf( "application/x-www-form-urlencoded" ) === 0 ) { - s.data = s.data.replace( r20, "+" ); - } - - // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. - if ( s.ifModified ) { - if ( jQuery.lastModified[ cacheURL ] ) { - jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] ); - } - if ( jQuery.etag[ cacheURL ] ) { - jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] ); - } - } - - // Set the correct header, if data is being sent - if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) { - jqXHR.setRequestHeader( "Content-Type", s.contentType ); - } - - // Set the Accepts header for the server, depending on the dataType - jqXHR.setRequestHeader( - "Accept", - s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ? - s.accepts[ s.dataTypes[ 0 ] ] + - ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) : - s.accepts[ "*" ] - ); - - // Check for headers option - for ( i in s.headers ) { - jqXHR.setRequestHeader( i, s.headers[ i ] ); - } - - // Allow custom headers/mimetypes and early abort - if ( s.beforeSend && - ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || completed ) ) { - - // Abort if not done already and return - return jqXHR.abort(); - } - - // Aborting is no longer a cancellation - strAbort = "abort"; - - // Install callbacks on deferreds - completeDeferred.add( s.complete ); - jqXHR.done( s.success ); - jqXHR.fail( s.error ); - - // Get transport - transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR ); - - // If no transport, we auto-abort - if ( !transport ) { - done( -1, "No Transport" ); - } else { - jqXHR.readyState = 1; - - // Send global event - if ( fireGlobals ) { - globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] ); - } - - // If request was aborted inside ajaxSend, stop there - if ( completed ) { - return jqXHR; - } - - // Timeout - if ( s.async && s.timeout > 0 ) { - timeoutTimer = window.setTimeout( function() { - jqXHR.abort( "timeout" ); - }, s.timeout ); - } - - try { - completed = false; - transport.send( requestHeaders, done ); - } catch ( e ) { - - // Rethrow post-completion exceptions - if ( completed ) { - throw e; - } - - // Propagate others as results - done( -1, e ); - } - } - - // Callback for when everything is done - function done( status, nativeStatusText, responses, headers ) { - var isSuccess, success, error, response, modified, - statusText = nativeStatusText; - - // Ignore repeat invocations - if ( completed ) { - return; - } - - completed = true; - - // Clear timeout if it exists - if ( timeoutTimer ) { - window.clearTimeout( timeoutTimer ); - } - - // Dereference transport for early garbage collection - // (no matter how long the jqXHR object will be used) - transport = undefined; - - // Cache response headers - responseHeadersString = headers || ""; - - // Set readyState - jqXHR.readyState = status > 0 ? 4 : 0; - - // Determine if successful - isSuccess = status >= 200 && status < 300 || status === 304; - - // Get response data - if ( responses ) { - response = ajaxHandleResponses( s, jqXHR, responses ); - } - - // Convert no matter what (that way responseXXX fields are always set) - response = ajaxConvert( s, response, jqXHR, isSuccess ); - - // If successful, handle type chaining - if ( isSuccess ) { - - // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. - if ( s.ifModified ) { - modified = jqXHR.getResponseHeader( "Last-Modified" ); - if ( modified ) { - jQuery.lastModified[ cacheURL ] = modified; - } - modified = jqXHR.getResponseHeader( "etag" ); - if ( modified ) { - jQuery.etag[ cacheURL ] = modified; - } - } - - // if no content - if ( status === 204 || s.type === "HEAD" ) { - statusText = "nocontent"; - - // if not modified - } else if ( status === 304 ) { - statusText = "notmodified"; - - // If we have data, let's convert it - } else { - statusText = response.state; - success = response.data; - error = response.error; - isSuccess = !error; - } - } else { - - // Extract error from statusText and normalize for non-aborts - error = statusText; - if ( status || !statusText ) { - statusText = "error"; - if ( status < 0 ) { - status = 0; - } - } - } - - // Set data for the fake xhr object - jqXHR.status = status; - jqXHR.statusText = ( nativeStatusText || statusText ) + ""; - - // Success/Error - if ( isSuccess ) { - deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] ); - } else { - deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] ); - } - - // Status-dependent callbacks - jqXHR.statusCode( statusCode ); - statusCode = undefined; - - if ( fireGlobals ) { - globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError", - [ jqXHR, s, isSuccess ? success : error ] ); - } - - // Complete - completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] ); - - if ( fireGlobals ) { - globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] ); - - // Handle the global AJAX counter - if ( !( --jQuery.active ) ) { - jQuery.event.trigger( "ajaxStop" ); - } - } - } - - return jqXHR; - }, - - getJSON: function( url, data, callback ) { - return jQuery.get( url, data, callback, "json" ); - }, - - getScript: function( url, callback ) { - return jQuery.get( url, undefined, callback, "script" ); - } -} ); - -jQuery.each( [ "get", "post" ], function( i, method ) { - jQuery[ method ] = function( url, data, callback, type ) { - - // Shift arguments if data argument was omitted - if ( isFunction( data ) ) { - type = type || callback; - callback = data; - data = undefined; - } - - // The url can be an options object (which then must have .url) - return jQuery.ajax( jQuery.extend( { - url: url, - type: method, - dataType: type, - data: data, - success: callback - }, jQuery.isPlainObject( url ) && url ) ); - }; -} ); - - -jQuery._evalUrl = function( url, options ) { - return jQuery.ajax( { - url: url, - - // Make this explicit, since user can override this through ajaxSetup (#11264) - type: "GET", - dataType: "script", - cache: true, - async: false, - global: false, - - // Only evaluate the response if it is successful (gh-4126) - // dataFilter is not invoked for failure responses, so using it instead - // of the default converter is kludgy but it works. - converters: { - "text script": function() {} - }, - dataFilter: function( response ) { - jQuery.globalEval( response, options ); - } - } ); -}; - - -jQuery.fn.extend( { - wrapAll: function( html ) { - var wrap; - - if ( this[ 0 ] ) { - if ( isFunction( html ) ) { - html = html.call( this[ 0 ] ); - } - - // The elements to wrap the target around - wrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true ); - - if ( this[ 0 ].parentNode ) { - wrap.insertBefore( this[ 0 ] ); - } - - wrap.map( function() { - var elem = this; - - while ( elem.firstElementChild ) { - elem = elem.firstElementChild; - } - - return elem; - } ).append( this ); - } - - return this; - }, - - wrapInner: function( html ) { - if ( isFunction( html ) ) { - return this.each( function( i ) { - jQuery( this ).wrapInner( html.call( this, i ) ); - } ); - } - - return this.each( function() { - var self = jQuery( this ), - contents = self.contents(); - - if ( contents.length ) { - contents.wrapAll( html ); - - } else { - self.append( html ); - } - } ); - }, - - wrap: function( html ) { - var htmlIsFunction = isFunction( html ); - - return this.each( function( i ) { - jQuery( this ).wrapAll( htmlIsFunction ? html.call( this, i ) : html ); - } ); - }, - - unwrap: function( selector ) { - this.parent( selector ).not( "body" ).each( function() { - jQuery( this ).replaceWith( this.childNodes ); - } ); - return this; - } -} ); - - -jQuery.expr.pseudos.hidden = function( elem ) { - return !jQuery.expr.pseudos.visible( elem ); -}; -jQuery.expr.pseudos.visible = function( elem ) { - return !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length ); -}; - - - - -jQuery.ajaxSettings.xhr = function() { - try { - return new window.XMLHttpRequest(); - } catch ( e ) {} -}; - -var xhrSuccessStatus = { - - // File protocol always yields status code 0, assume 200 - 0: 200, - - // Support: IE <=9 only - // #1450: sometimes IE returns 1223 when it should be 204 - 1223: 204 - }, - xhrSupported = jQuery.ajaxSettings.xhr(); - -support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported ); -support.ajax = xhrSupported = !!xhrSupported; - -jQuery.ajaxTransport( function( options ) { - var callback, errorCallback; - - // Cross domain only allowed if supported through XMLHttpRequest - if ( support.cors || xhrSupported && !options.crossDomain ) { - return { - send: function( headers, complete ) { - var i, - xhr = options.xhr(); - - xhr.open( - options.type, - options.url, - options.async, - options.username, - options.password - ); - - // Apply custom fields if provided - if ( options.xhrFields ) { - for ( i in options.xhrFields ) { - xhr[ i ] = options.xhrFields[ i ]; - } - } - - // Override mime type if needed - if ( options.mimeType && xhr.overrideMimeType ) { - xhr.overrideMimeType( options.mimeType ); - } - - // X-Requested-With header - // For cross-domain requests, seeing as conditions for a preflight are - // akin to a jigsaw puzzle, we simply never set it to be sure. - // (it can always be set on a per-request basis or even using ajaxSetup) - // For same-domain requests, won't change header if already provided. - if ( !options.crossDomain && !headers[ "X-Requested-With" ] ) { - headers[ "X-Requested-With" ] = "XMLHttpRequest"; - } - - // Set headers - for ( i in headers ) { - xhr.setRequestHeader( i, headers[ i ] ); - } - - // Callback - callback = function( type ) { - return function() { - if ( callback ) { - callback = errorCallback = xhr.onload = - xhr.onerror = xhr.onabort = xhr.ontimeout = - xhr.onreadystatechange = null; - - if ( type === "abort" ) { - xhr.abort(); - } else if ( type === "error" ) { - - // Support: IE <=9 only - // On a manual native abort, IE9 throws - // errors on any property access that is not readyState - if ( typeof xhr.status !== "number" ) { - complete( 0, "error" ); - } else { - complete( - - // File: protocol always yields status 0; see #8605, #14207 - xhr.status, - xhr.statusText - ); - } - } else { - complete( - xhrSuccessStatus[ xhr.status ] || xhr.status, - xhr.statusText, - - // Support: IE <=9 only - // IE9 has no XHR2 but throws on binary (trac-11426) - // For XHR2 non-text, let the caller handle it (gh-2498) - ( xhr.responseType || "text" ) !== "text" || - typeof xhr.responseText !== "string" ? - { binary: xhr.response } : - { text: xhr.responseText }, - xhr.getAllResponseHeaders() - ); - } - } - }; - }; - - // Listen to events - xhr.onload = callback(); - errorCallback = xhr.onerror = xhr.ontimeout = callback( "error" ); - - // Support: IE 9 only - // Use onreadystatechange to replace onabort - // to handle uncaught aborts - if ( xhr.onabort !== undefined ) { - xhr.onabort = errorCallback; - } else { - xhr.onreadystatechange = function() { - - // Check readyState before timeout as it changes - if ( xhr.readyState === 4 ) { - - // Allow onerror to be called first, - // but that will not handle a native abort - // Also, save errorCallback to a variable - // as xhr.onerror cannot be accessed - window.setTimeout( function() { - if ( callback ) { - errorCallback(); - } - } ); - } - }; - } - - // Create the abort callback - callback = callback( "abort" ); - - try { - - // Do send the request (this may raise an exception) - xhr.send( options.hasContent && options.data || null ); - } catch ( e ) { - - // #14683: Only rethrow if this hasn't been notified as an error yet - if ( callback ) { - throw e; - } - } - }, - - abort: function() { - if ( callback ) { - callback(); - } - } - }; - } -} ); - - - - -// Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432) -jQuery.ajaxPrefilter( function( s ) { - if ( s.crossDomain ) { - s.contents.script = false; - } -} ); - -// Install script dataType -jQuery.ajaxSetup( { - accepts: { - script: "text/javascript, application/javascript, " + - "application/ecmascript, application/x-ecmascript" - }, - contents: { - script: /\b(?:java|ecma)script\b/ - }, - converters: { - "text script": function( text ) { - jQuery.globalEval( text ); - return text; - } - } -} ); - -// Handle cache's special case and crossDomain -jQuery.ajaxPrefilter( "script", function( s ) { - if ( s.cache === undefined ) { - s.cache = false; - } - if ( s.crossDomain ) { - s.type = "GET"; - } -} ); - -// Bind script tag hack transport -jQuery.ajaxTransport( "script", function( s ) { - - // This transport only deals with cross domain or forced-by-attrs requests - if ( s.crossDomain || s.scriptAttrs ) { - var script, callback; - return { - send: function( _, complete ) { - script = jQuery( " - - - - - - - - - - - - -
-
-
-
- - - -
-
-
- -
-
- - - - \ No newline at end of file diff --git a/docs/_build/html/examples.html b/docs/_build/html/examples.html deleted file mode 100644 index 6b1a059..0000000 --- a/docs/_build/html/examples.html +++ /dev/null @@ -1,114 +0,0 @@ - - - - - - - Simple test — Adafruit WSGI Library 1.0 documentation - - - - - - - - - - - - - - - - - -
-
-
-
- -
-

Simple test

-

Ensure your device works with this simple test.

-
-
examples/wsgi_simpletest.py
-
1

-
-
-
-
- - -
-
-
- -
-
- - - - \ No newline at end of file diff --git a/docs/_build/html/genindex.html b/docs/_build/html/genindex.html deleted file mode 100644 index c37bc5a..0000000 --- a/docs/_build/html/genindex.html +++ /dev/null @@ -1,93 +0,0 @@ - - - - - - - - Index — Adafruit WSGI Library 1.0 documentation - - - - - - - - - - - - - - - -
-
-
-
- - -

Index

- -
- A - -
-

A

- - -
- - - -
-
-
- -
-
- - - - \ No newline at end of file diff --git a/docs/_build/html/index.html b/docs/_build/html/index.html deleted file mode 100644 index de4d24b..0000000 --- a/docs/_build/html/index.html +++ /dev/null @@ -1,214 +0,0 @@ - - - - - - - Introduction — Adafruit WSGI Library 1.0 documentation - - - - - - - - - - - - - - - - -
-
-
-
- -
-

Introduction

-Documentation Status -Discord -Build Status -

CircuitPython framework for creating WSGI compatible web server applications.

-
-
-

Dependencies

-

This driver depends on:

- -

Please ensure all dependencies are available on the CircuitPython filesystem. -This is easily achieved by downloading -the Adafruit library and driver bundle.

-
-
-

Installing from PyPI

-
-

Note

-

This library is not available on PyPI yet. Install documentation is included -as a standard element. Stay tuned for PyPI availability!

-
-

On supported GNU/Linux systems like the Raspberry Pi, you can install the driver locally from -PyPI. To install for current user:

-
pip3 install adafruit-circuitpython-wsgi
-
-
-

To install system-wide (this may be required in some cases):

-
sudo pip3 install adafruit-circuitpython-wsgi
-
-
-

To install in a virtual environment in your current project:

-
mkdir project-name && cd project-name
-python3 -m venv .env
-source .env/bin/activate
-pip3 install adafruit-circuitpython-wsgi
-
-
-
-
-

Usage Example

-
-
-

Contributing

-

Contributions are welcome! Please read our Code of Conduct -before contributing to help this project stay welcoming.

-
-

Sphinx documentation

-

Sphinx is used to build the documentation based on rST files and comments in the code. First, -install dependencies (feel free to reuse the virtual environment from above):

-
python3 -m venv .env
-source .env/bin/activate
-pip install Sphinx sphinx-rtd-theme
-
-
-

Now, once you have the virtual environment activated:

-
cd docs
-sphinx-build -E -W -b html . _build/html
-
-
-

This will output the documentation to docs/_build/html. Open the index.html in your browser to -view them. It will also (due to -W) error out on any warning like Travis will. This is a good way to -locally verify it will pass.

-
-
- -
-

Indices and tables

- -
- - -
-
-
- -
-
- - - - \ No newline at end of file diff --git a/docs/_build/html/objects.inv b/docs/_build/html/objects.inv deleted file mode 100644 index 58241a4c1ff1a2c7fd0df1ba3488d8519b72ba62..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 298 zcmY#Z2rkIT%&Sny%qvUHE6FdaR47X=D$dN$Q!wIERtPA{&q_@$u~KkMNlYs$%`8y} z4|exd@X1UnN-U}bDhPupwo)+EGXQc!GExQEG8ab{k+LRC&?k{(yZt=#^DT!##J+TPc8HNJMXLi|pv!^}%bw - - - - - Python Module Index — Adafruit WSGI Library 1.0 documentation - - - - - - - - - - - - - - - - - - - - -
-
-
-
- - -

Python Module Index

- -
- a -
- - - - - - - -
 
- a
- adafruit_wsgi -
- - -
-
-
- -
-
- - - - \ No newline at end of file diff --git a/docs/_build/html/search.html b/docs/_build/html/search.html deleted file mode 100644 index 00113a4..0000000 --- a/docs/_build/html/search.html +++ /dev/null @@ -1,94 +0,0 @@ - - - - - - - Search — Adafruit WSGI Library 1.0 documentation - - - - - - - - - - - - - - - - - - - - -
-
-
-
- -

Search

-
- -

- Please activate JavaScript to enable the search - functionality. -

-
-

- From here you can search these documents. Enter your search - words into the box below and click "search". Note that the search - function will automatically search for all of the words. Pages - containing fewer words won't appear in the result list. -

-
- - - -
- -
- -
- -
-
-
- -
-
- - - - \ No newline at end of file diff --git a/docs/_build/html/searchindex.js b/docs/_build/html/searchindex.js deleted file mode 100644 index 0e3179e..0000000 --- a/docs/_build/html/searchindex.js +++ /dev/null @@ -1 +0,0 @@ -Search.setIndex({docnames:["api","examples","index"],envversion:{"sphinx.domains.c":1,"sphinx.domains.changeset":1,"sphinx.domains.citation":1,"sphinx.domains.cpp":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.todo":2,sphinx:56},filenames:["api.rst","examples.rst","index.rst"],objects:{"":{adafruit_wsgi:[0,0,0,"-"]}},objnames:{"0":["py","module","Python module"]},objtypes:{"0":"py:module"},terms:{"case":2,_build:2,abov:2,achiev:2,activ:2,adafruit:2,add:2,all:2,also:2,ani:2,applic:2,avail:2,base:2,befor:2,bin:2,blog:2,browser:2,build:2,bundl:2,can:2,chat:2,circuitpython:2,code:2,comment:2,compat:2,conduct:2,creat:2,current:2,delet:2,devic:1,discord:2,doc:2,download:2,driver:2,due:2,easili:2,element:2,ensur:[1,2],entir:2,env:2,environ:2,error:2,exampl:1,feel:2,file:2,filesystem:2,first:2,folder:2,forum:2,framework:2,free:2,gnu:2,good:2,guid:2,have:2,help:2,here:2,html:2,includ:2,index:2,later:2,learn:2,leav:2,librari:2,like:2,link:2,linux:2,live:2,local:2,mai:2,mkdir:2,modul:2,name:2,none:2,note:2,now:2,onc:2,open:2,other:2,our:2,out:2,output:2,page:2,pass:2,pip3:2,pip:2,plan:2,pleas:2,product:2,project:2,python3:2,quick:2,raspberri:2,read:2,refer:2,releas:2,remov:2,requir:2,reus:2,rst:2,rtd:2,search:2,section:2,server:2,should:2,simpl:2,simpli:2,some:2,sourc:2,stai:2,standard:2,store:2,sudo:2,support:2,system:2,test:2,them:2,theme:2,thi:[1,2],time:2,toctre:2,travi:2,tune:2,use:2,used:2,user:2,venv:2,verifi:2,version:2,view:2,virtual:2,wai:2,warn:2,web:2,welcom:2,wide:2,work:1,wsgi:2,wsgi_simpletest:1,yet:2,you:2,your:[1,2]},titles:["<no title>","Simple test","Introduction"],titleterms:{content:2,contribut:2,depend:2,document:2,exampl:2,from:2,indic:2,instal:2,introduct:2,pypi:2,simpl:1,sphinx:2,tabl:2,test:1,todo:2,usag:2}}) \ No newline at end of file From 46b957708b17cbedc8124b483b41ee4c05418724 Mon Sep 17 00:00:00 2001 From: Matt Costi Date: Mon, 14 Oct 2019 12:29:26 -0400 Subject: [PATCH 04/16] lint the project directory --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index a19bfed..493fd98 100644 --- a/.travis.yml +++ b/.travis.yml @@ -42,7 +42,7 @@ install: - pip install --force-reinstall pylint==1.9.2 script: - - pylint adafruit_wsgi.py + - pylint adafruit_wsgi/*.py - ([[ ! -d "examples" ]] || pylint --disable=missing-docstring,invalid-name,bad-whitespace examples/*.py) - circuitpython-build-bundles --filename_prefix adafruit-circuitpython-wsgi --library_location . - cd docs && sphinx-build -E -W -b html . _build/html && cd .. From 41c8389820045a3b1155cec727bf2940ccf826d7 Mon Sep 17 00:00:00 2001 From: Matt Costi Date: Mon, 14 Oct 2019 12:41:04 -0400 Subject: [PATCH 05/16] Remove todos --- README.rst | 7 ------- adafruit_wsgi/wsgi_app.py | 15 +++++---------- docs/index.rst | 5 ----- 3 files changed, 5 insertions(+), 22 deletions(-) diff --git a/README.rst b/README.rst index 9d0084e..5d1295a 100644 --- a/README.rst +++ b/README.rst @@ -31,9 +31,6 @@ Installing from PyPI .. note:: This library is not available on PyPI yet. Install documentation is included as a standard element. Stay tuned for PyPI availability! -.. todo:: Remove the above note if PyPI version is/will be available at time of release. - If the library is not planned for PyPI, remove the entire 'Installing from PyPI' section. - On supported GNU/Linux systems like the Raspberry Pi, you can install the driver locally `from PyPI `_. To install for current user: @@ -56,10 +53,6 @@ To install in a virtual environment in your current project: source .env/bin/activate pip3 install adafruit-circuitpython-wsgi -Usage Example -============= - -.. todo:: Add a quick, simple example. It and other examples should live in the examples folder and be included in docs/examples.rst. Contributing ============ diff --git a/adafruit_wsgi/wsgi_app.py b/adafruit_wsgi/wsgi_app.py index f9bb139..0729137 100644 --- a/adafruit_wsgi/wsgi_app.py +++ b/adafruit_wsgi/wsgi_app.py @@ -24,7 +24,11 @@ ================================================================================ CircuitPython framework for creating WSGI server compatible web applications. -This does *not* include server implementation, and must +This does *not* include server implementation, which is necessary in order +to create a web application with this library. + +* Circuit Python implementation of an WSGI Server for ESP32 devices: + https://github.com/adafruit/Adafruit_CircuitPython_ESP32SPI.git * Author(s): Matthew Costi @@ -32,20 +36,11 @@ Implementation Notes -------------------- -**Hardware:** - -.. todo:: Add links to any specific hardware product page(s), or category page(s). Use unordered list & hyperlink rST - inline format: "* `Link Text `_" - **Software and Dependencies:** * Adafruit CircuitPython firmware for the supported boards: https://github.com/adafruit/circuitpython/releases -.. todo:: Uncomment or remove the Bus Device and/or the Register library dependencies based on the library's use of either. - -# * Adafruit's Bus Device library: https://github.com/adafruit/Adafruit_CircuitPython_BusDevice -# * Adafruit's Register library: https://github.com/adafruit/Adafruit_CircuitPython_Register """ # imports diff --git a/docs/index.rst b/docs/index.rst index 6e7c5fe..c2962d6 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -23,14 +23,9 @@ Table of Contents .. toctree:: :caption: Tutorials -.. todo:: Add any Learn guide links here. If there are none, then simply delete this todo and leave - the toctree above for use later. - .. toctree:: :caption: Related Products -.. todo:: Add any product links here. If there are none, then simply delete this todo and leave - the toctree above for use later. .. toctree:: :caption: Other Links From 63ea6c5d0b5127b54636d1e0984763d6c872bccc Mon Sep 17 00:00:00 2001 From: Matt Costi Date: Mon, 14 Oct 2019 12:45:33 -0400 Subject: [PATCH 06/16] appease pylint --- adafruit_wsgi/wsgi_app.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/adafruit_wsgi/wsgi_app.py b/adafruit_wsgi/wsgi_app.py index 0729137..b2adb12 100644 --- a/adafruit_wsgi/wsgi_app.py +++ b/adafruit_wsgi/wsgi_app.py @@ -64,7 +64,6 @@ def __call__(self, environ, start_response): Return a single item list with the item being your response data string. """ - self._start_response = start_response status = "" headers = [] resp_data = [] @@ -73,7 +72,7 @@ def __call__(self, environ, start_response): if key in self._listeners: status, headers, resp_data = self._listeners[key](environ) - self._start_response(status, headers) + start_response(status, headers) return resp_data def on_request(self, method, path, request_handler): @@ -94,4 +93,3 @@ def on_request(self, method, path, request_handler): def _get_listener_key(self, method, path): # pylint: disable=no-self-use return "{0}|{1}".format(method.lower(), path) - From 182619b49f645b318c6bb1524f1f61f429db1911 Mon Sep 17 00:00:00 2001 From: Matt Costi Date: Mon, 14 Oct 2019 12:57:26 -0400 Subject: [PATCH 07/16] fix sphinx build --- adafruit_wsgi/wsgi_app.py | 2 +- docs/api.rst | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/adafruit_wsgi/wsgi_app.py b/adafruit_wsgi/wsgi_app.py index b2adb12..4518bc4 100644 --- a/adafruit_wsgi/wsgi_app.py +++ b/adafruit_wsgi/wsgi_app.py @@ -20,7 +20,7 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. """ -`adafruit_wsgi` +`wsgi_app` ================================================================================ CircuitPython framework for creating WSGI server compatible web applications. diff --git a/docs/api.rst b/docs/api.rst index f721834..1a3e115 100644 --- a/docs/api.rst +++ b/docs/api.rst @@ -4,5 +4,5 @@ .. If your library file(s) are nested in a directory (e.g. /adafruit_foo/foo.py) .. use this format as the module name: "adafruit_foo.foo" -.. automodule:: adafruit_wsgi +.. automodule:: adafruit_wsgi.wsgi_app :members: From 9cda070596255c7d0ceb215e8da21528d7c458b9 Mon Sep 17 00:00:00 2001 From: Matt Costi Date: Sat, 19 Oct 2019 12:37:53 -0400 Subject: [PATCH 08/16] Add simple test --- adafruit_wsgi/wsgi_app.py | 2 +- examples/wsgi_simpletest.py | 96 +++++++++++++++++++++++++++++++++++++ 2 files changed, 97 insertions(+), 1 deletion(-) diff --git a/adafruit_wsgi/wsgi_app.py b/adafruit_wsgi/wsgi_app.py index 4518bc4..f89c2ef 100644 --- a/adafruit_wsgi/wsgi_app.py +++ b/adafruit_wsgi/wsgi_app.py @@ -50,7 +50,7 @@ class WSGIApp: """ - TODO + The base WSGI Application class. """ def __init__(self): diff --git a/examples/wsgi_simpletest.py b/examples/wsgi_simpletest.py index e69de29..7c1e125 100644 --- a/examples/wsgi_simpletest.py +++ b/examples/wsgi_simpletest.py @@ -0,0 +1,96 @@ +import os +import board +import busio +from digitalio import DigitalInOut +import neopixel + +from adafruit_esp32spi import adafruit_esp32spi +import adafruit_esp32spi.adafruit_esp32spi_wifimanager as wifimanager +import adafruit_esp32spi.adafruit_esp32spi_wsgiserver as server +from adafruit_wsgi.wsgi_app import WSGIApp + +# Get wifi details and more from a secrets.py file +try: + from secrets import secrets +except ImportError: + print("WiFi secrets are kept in secrets.py, please add them there!") + raise + +# This example depends on a WSGI Server to run. +# We are using the wsgi server made for the ESP32 + +print("ESP32 SPI simple web app test!") + + +# If you are using a board with pre-defined ESP32 Pins: +esp32_cs = DigitalInOut(board.ESP_CS) +esp32_ready = DigitalInOut(board.ESP_BUSY) +esp32_reset = DigitalInOut(board.ESP_RESET) + +# If you have an externally connected ESP32: +# esp32_cs = DigitalInOut(board.D9) +# esp32_ready = DigitalInOut(board.D10) +# esp32_reset = DigitalInOut(board.D5) + +spi = busio.SPI(board.SCK, board.MOSI, board.MISO) +esp = adafruit_esp32spi.ESP_SPIcontrol(spi, esp32_cs, esp32_ready, esp32_reset) # pylint: disable=line-too-long + +"""Use below for Most Boards""" +status_light = neopixel.NeoPixel(board.NEOPIXEL, 1, brightness=0.2) # Uncomment for Most Boards +"""Uncomment below for ItsyBitsy M4""" +# import adafruit_dotstar as dotstar +# status_light = dotstar.DotStar(board.APA102_SCK, board.APA102_MOSI, 1, brightness=1) + +## If you want to connect to wifi with secrets: +wifi = wifimanager.ESPSPI_WiFiManager(esp, secrets, status_light,debug=True) +wifi.connect() + +## If you want to create a WIFI hotspot to connect to with secrets: +# secrets = {"ssid": "My ESP32 AP!", "password": "supersecret"} +# wifi = wifimanager.ESPSPI_WiFiManager(esp, secrets, status_light) +# wifi.create_ap() + +## To you want to create an un-protected WIFI hotspot to connect to with secrets:" +# secrets = {"ssid": "My ESP32 AP!"} +# wifi = wifimanager.ESPSPI_WiFiManager(esp, secrets, status_light) +# wifi.create_ap() + + +# Our HTTP Request handlers +def led_on(environ): # pylint: disable=unused-argument + print("led on!") + status_light.fill((0, 0, 100)) + return ("200 OK", [], "led on!") + +def led_off(environ): # pylint: disable=unused-argument + print("led off!") + status_light.fill(0) + return ("200 OK", [], "led off!") + + +# Here we create our application, registering the +# above request_handlers for specific HTTP requests +# we want to listen and respond to. + +web_app = WSGIApp() +web_app.on_request("GET", "/led_on", led_on) +web_app.on_request("GET", "/led_off", led_off) + +# Here we setup our server, passing in our web_app as the application +server.set_interface(esp) +wsgiServer = server.WSGIServer(80, application=web_app) + +print("open this IP in your browser: ", esp.pretty_ip(esp.ip_address)) + +# print(esp.get_time()) +# Start the server +wsgiServer.start() +while True: + # Our main loop where we have the server poll for incoming requests + try: + wsgiServer.update_poll() + # Could do any other background tasks here, like reading sensors + except (ValueError, RuntimeError) as e: + print("Failed to update server, restarting ESP32\n", e) + wifi.reset() + continue From 3b8faeaa49a247ffe1b5827ae4e336363cf4898c Mon Sep 17 00:00:00 2001 From: Matt Costi Date: Sat, 19 Oct 2019 12:41:31 -0400 Subject: [PATCH 09/16] remove unused import --- examples/wsgi_simpletest.py | 1 - 1 file changed, 1 deletion(-) diff --git a/examples/wsgi_simpletest.py b/examples/wsgi_simpletest.py index 7c1e125..9453b9b 100644 --- a/examples/wsgi_simpletest.py +++ b/examples/wsgi_simpletest.py @@ -1,4 +1,3 @@ -import os import board import busio from digitalio import DigitalInOut From 3aa1248d4dfe95f12624e6ed174c0a0d1de14cf0 Mon Sep 17 00:00:00 2001 From: Matt Costi Date: Sat, 26 Oct 2019 16:13:40 -0400 Subject: [PATCH 10/16] Add in Route Decorator for registering request handlers --- adafruit_wsgi/wsgi_app.py | 13 +++++++++++++ examples/wsgi_simpletest.py | 15 ++++++--------- 2 files changed, 19 insertions(+), 9 deletions(-) diff --git a/adafruit_wsgi/wsgi_app.py b/adafruit_wsgi/wsgi_app.py index f89c2ef..6c566a7 100644 --- a/adafruit_wsgi/wsgi_app.py +++ b/adafruit_wsgi/wsgi_app.py @@ -91,5 +91,18 @@ def on_request(self, method, path, request_handler): """ self._listeners[self._get_listener_key(method, path)] = request_handler + def route(self, rule, methods=None): + """ + A decorator to register a route rule with an endpoint function. + if no methods are provided, default to GET + """ + if not methods: + methods = ['GET'] + + def decorate(func): + for method in methods: + self._listeners[self._get_listener_key(method, rule)] = func + return decorate + def _get_listener_key(self, method, path): # pylint: disable=no-self-use return "{0}|{1}".format(method.lower(), path) diff --git a/examples/wsgi_simpletest.py b/examples/wsgi_simpletest.py index 9453b9b..40ca9ff 100644 --- a/examples/wsgi_simpletest.py +++ b/examples/wsgi_simpletest.py @@ -54,27 +54,24 @@ # wifi = wifimanager.ESPSPI_WiFiManager(esp, secrets, status_light) # wifi.create_ap() +# Here we create our application, registering the +# following functions to be called on specific HTTP GET requests routes + +web_app = WSGIApp() -# Our HTTP Request handlers +@web_app.route('/led_on') def led_on(environ): # pylint: disable=unused-argument print("led on!") status_light.fill((0, 0, 100)) return ("200 OK", [], "led on!") +@web_app.route('/led_off') def led_off(environ): # pylint: disable=unused-argument print("led off!") status_light.fill(0) return ("200 OK", [], "led off!") -# Here we create our application, registering the -# above request_handlers for specific HTTP requests -# we want to listen and respond to. - -web_app = WSGIApp() -web_app.on_request("GET", "/led_on", led_on) -web_app.on_request("GET", "/led_off", led_off) - # Here we setup our server, passing in our web_app as the application server.set_interface(esp) wsgiServer = server.WSGIServer(80, application=web_app) From 249d3c026bfc6f8a0c44d6ca510fa0febf711d95 Mon Sep 17 00:00:00 2001 From: Mathew Costi Date: Mon, 28 Oct 2019 18:29:16 -0400 Subject: [PATCH 11/16] Add in support for route variables (#2) --- adafruit_wsgi/wsgi_app.py | 44 +++++++++++++++++++++++++------------ examples/wsgi_simpletest.py | 6 ++--- 2 files changed, 33 insertions(+), 17 deletions(-) diff --git a/adafruit_wsgi/wsgi_app.py b/adafruit_wsgi/wsgi_app.py index 6c566a7..f81fa76 100644 --- a/adafruit_wsgi/wsgi_app.py +++ b/adafruit_wsgi/wsgi_app.py @@ -43,7 +43,7 @@ """ -# imports +import re __version__ = "0.0.0-auto.0" __repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_WSGI.git" @@ -54,7 +54,8 @@ class WSGIApp: """ def __init__(self): - self._listeners = {} + self._routes = [] + self._variable_re = re.compile("<([a-zA-Z]*)>") def __call__(self, environ, start_response): """ @@ -68,14 +69,16 @@ def __call__(self, environ, start_response): headers = [] resp_data = [] - key = self._get_listener_key(environ["REQUEST_METHOD"].lower(), environ["PATH_INFO"]) - if key in self._listeners: - status, headers, resp_data = self._listeners[key](environ) + match = self._match_route(environ["PATH_INFO"], environ["REQUEST_METHOD"].upper()) + + if match: + args, route = match + status, headers, resp_data = route["func"](environ, *args) start_response(status, headers) return resp_data - def on_request(self, method, path, request_handler): + def on_request(self, methods, rule, request_handler): """ Register a Request Handler for a particular HTTP method and path. request_handler will be called whenever a matching HTTP request is received. @@ -85,11 +88,22 @@ def on_request(self, method, path, request_handler): request_handler should return a tuple in the shape of: (status, header_list, data_iterable) - :param str method: the method of the HTTP request - :param str path: the path of the HTTP request + :param list methods: the methods of the HTTP request to handle + :param str rule: the path rule of the HTTP request :param func request_handler: the function to call """ - self._listeners[self._get_listener_key(method, path)] = request_handler + regex = "" + rule_parts = rule.split("/") + for part in rule_parts: + var = self._variable_re.match(part) + if var: + # If named capture groups ever become a thing, use this regex instead + # regex += "(?P<" + var.group("var") + r">[a-zA-Z0-9_-]*)\/" + regex += r"([a-zA-Z0-9_-]*)\/" + else: + regex += part + r"\/" + regex += "?" # make last slash optional + self._routes.append((re.compile(regex), {"methods": methods, "func": request_handler})) def route(self, rule, methods=None): """ @@ -98,11 +112,13 @@ def route(self, rule, methods=None): """ if not methods: methods = ['GET'] - def decorate(func): - for method in methods: - self._listeners[self._get_listener_key(method, rule)] = func + self.on_request(methods, rule, func) return decorate - def _get_listener_key(self, method, path): # pylint: disable=no-self-use - return "{0}|{1}".format(method.lower(), path) + def _match_route(self, path, method): + for matcher, route in self._routes: + match = matcher.match(path) + if match and method in route["methods"]: + return (match.groups(), route) + return None \ No newline at end of file diff --git a/examples/wsgi_simpletest.py b/examples/wsgi_simpletest.py index 40ca9ff..da02c40 100644 --- a/examples/wsgi_simpletest.py +++ b/examples/wsgi_simpletest.py @@ -59,10 +59,10 @@ web_app = WSGIApp() -@web_app.route('/led_on') -def led_on(environ): # pylint: disable=unused-argument +@web_app.route('/led_on///') +def led_on(environ, r, g, b): # pylint: disable=unused-argument print("led on!") - status_light.fill((0, 0, 100)) + status_light.fill((int(r), int(g), int(b))) return ("200 OK", [], "led on!") @web_app.route('/led_off') From 8935b8bd3c4bf3f14265ef31e3eac37be6e0a6dd Mon Sep 17 00:00:00 2001 From: Mathew Costi Date: Mon, 28 Oct 2019 20:54:55 -0400 Subject: [PATCH 12/16] Fix case where we execute a handler for a partial match (#3) * Fix case where variable part of path would match with 0 characters as value instead of requiring minimum of 1 --- adafruit_wsgi/wsgi_app.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/adafruit_wsgi/wsgi_app.py b/adafruit_wsgi/wsgi_app.py index f81fa76..15454c4 100644 --- a/adafruit_wsgi/wsgi_app.py +++ b/adafruit_wsgi/wsgi_app.py @@ -55,7 +55,7 @@ class WSGIApp: def __init__(self): self._routes = [] - self._variable_re = re.compile("<([a-zA-Z]*)>") + self._variable_re = re.compile("^<([a-zA-Z]*)>$") def __call__(self, environ, start_response): """ @@ -92,17 +92,17 @@ def on_request(self, methods, rule, request_handler): :param str rule: the path rule of the HTTP request :param func request_handler: the function to call """ - regex = "" + regex = "^" rule_parts = rule.split("/") for part in rule_parts: var = self._variable_re.match(part) if var: # If named capture groups ever become a thing, use this regex instead # regex += "(?P<" + var.group("var") + r">[a-zA-Z0-9_-]*)\/" - regex += r"([a-zA-Z0-9_-]*)\/" + regex += r"([a-zA-Z0-9_-]+)\/" else: regex += part + r"\/" - regex += "?" # make last slash optional + regex += "?$" # make last slash optional and that we only allow full matches self._routes.append((re.compile(regex), {"methods": methods, "func": request_handler})) def route(self, rule, methods=None): From 610365fa51af2a38fee95e4689cf7612ee3bec0c Mon Sep 17 00:00:00 2001 From: Mathew Costi Date: Wed, 6 Nov 2019 20:16:32 -0500 Subject: [PATCH 13/16] Parse WSGI environ dictionary into a Request object that is passed to request handlers (#4) --- adafruit_wsgi/request.py | 115 ++++++++++++++++++++++++++++++++++++ adafruit_wsgi/wsgi_app.py | 10 +++- examples/wsgi_simpletest.py | 4 +- 3 files changed, 124 insertions(+), 5 deletions(-) create mode 100644 adafruit_wsgi/request.py diff --git a/adafruit_wsgi/request.py b/adafruit_wsgi/request.py new file mode 100644 index 0000000..75db459 --- /dev/null +++ b/adafruit_wsgi/request.py @@ -0,0 +1,115 @@ +# The MIT License (MIT) +# +# Copyright (c) 2019 Matthew Costi for Adafruit Industries +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. + +""" +`Request` +================================================================================ + + +* Author(s): Matthew Costi +""" +import re + +class Request(): + """ + An incoming HTTP request. + A higher level abstraction of the raw WSGI Environ dictionary. + """ + def __init__(self, environ): + self.method = environ["REQUEST_METHOD"] + self.path = environ["PATH_INFO"] + self.query_params = self.__parse_query_params(environ["QUERY_STRING"]) + self.headers = self.__parse_headers(environ) + self.body = environ["wsgi.input"] + self.wsgi_environ = environ + + @property + def method(self): + """ + the HTTP Method Type of this request + """ + return self.method + + @property + def path(self): + """ + the path this request was made to + """ + return self.full_path + + @property + def query_params(self): + """ + Request query parameters, represented as a dictionary of + param name to param value + """ + return self.query_params + + @property + def headers(self): + """ + Request headers, represented as a dictionary of + header name to header value + """ + return self.headers + + @property + def body(self): + """ + The Request Body + """ + return self.body + + @property + def wsgi_environ(self): + """ + The raw WSGI Environment dictionary representation of the request + """ + return self.wsgi_environ + + @staticmethod + def __parse_query_params(query_string): + param_list = query_string.split("&") + params = {} + for param in param_list: + key_val = param.split("=") + if len(key_val) == 2: + params[key_val[0]] = key_val[1] + return params + + @staticmethod + def __parse_headers(environ): + headers = {} + + # Content Type and Content Length headers + # are stored in environ differently than other headers + if "CONTENT_TYPE" in environ: + headers["content-type"] = environ["CONTENT_TYPE"] + if "CONTENT_LENGTH" in environ: + headers["content-length"] = environ["CONTENT_LENGTH"] + + env_header_re = re.compile(r'HTTP_(.+)') + for key, val in environ.items(): + header = env_header_re.match(key) + if header: + headers[header.replace("_","-").lower()] = val + return headers diff --git a/adafruit_wsgi/wsgi_app.py b/adafruit_wsgi/wsgi_app.py index 15454c4..2e67e84 100644 --- a/adafruit_wsgi/wsgi_app.py +++ b/adafruit_wsgi/wsgi_app.py @@ -45,6 +45,8 @@ import re +from adafruit_wsgi.request import Request + __version__ = "0.0.0-auto.0" __repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_WSGI.git" @@ -55,7 +57,7 @@ class WSGIApp: def __init__(self): self._routes = [] - self._variable_re = re.compile("^<([a-zA-Z]*)>$") + self._variable_re = re.compile("^<([a-zA-Z]+)>$") def __call__(self, environ, start_response): """ @@ -69,11 +71,13 @@ def __call__(self, environ, start_response): headers = [] resp_data = [] - match = self._match_route(environ["PATH_INFO"], environ["REQUEST_METHOD"].upper()) + request = Request(environ) + + match = self._match_route(request.path, request.method.upper()) if match: args, route = match - status, headers, resp_data = route["func"](environ, *args) + status, headers, resp_data = route["func"](request, *args) start_response(status, headers) return resp_data diff --git a/examples/wsgi_simpletest.py b/examples/wsgi_simpletest.py index da02c40..5c12bed 100644 --- a/examples/wsgi_simpletest.py +++ b/examples/wsgi_simpletest.py @@ -60,13 +60,13 @@ web_app = WSGIApp() @web_app.route('/led_on///') -def led_on(environ, r, g, b): # pylint: disable=unused-argument +def led_on(request, r, g, b): # pylint: disable=unused-argument print("led on!") status_light.fill((int(r), int(g), int(b))) return ("200 OK", [], "led on!") @web_app.route('/led_off') -def led_off(environ): # pylint: disable=unused-argument +def led_off(request): # pylint: disable=unused-argument print("led off!") status_light.fill(0) return ("200 OK", [], "led off!") From 4ae8991417f33acffb26ad73cfb5c7570a363e20 Mon Sep 17 00:00:00 2001 From: Mathew Costi Date: Sun, 17 Nov 2019 12:21:47 -0500 Subject: [PATCH 14/16] Fix errors with Request object. (#5) * Thanks @siddacious --- adafruit_wsgi/request.py | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/adafruit_wsgi/request.py b/adafruit_wsgi/request.py index 75db459..5b13303 100644 --- a/adafruit_wsgi/request.py +++ b/adafruit_wsgi/request.py @@ -35,26 +35,26 @@ class Request(): A higher level abstraction of the raw WSGI Environ dictionary. """ def __init__(self, environ): - self.method = environ["REQUEST_METHOD"] - self.path = environ["PATH_INFO"] - self.query_params = self.__parse_query_params(environ["QUERY_STRING"]) - self.headers = self.__parse_headers(environ) - self.body = environ["wsgi.input"] - self.wsgi_environ = environ + self._method = environ["REQUEST_METHOD"] + self._path = environ["PATH_INFO"] + self._query_params = self.__parse_query_params(environ.get("QUERY_STRING", "")) + self._headers = self.__parse_headers(environ) + self._body = environ["wsgi.input"] + self._wsgi_environ = environ @property def method(self): """ the HTTP Method Type of this request """ - return self.method + return self._method @property def path(self): """ the path this request was made to """ - return self.full_path + return self._path @property def query_params(self): @@ -62,7 +62,7 @@ def query_params(self): Request query parameters, represented as a dictionary of param name to param value """ - return self.query_params + return self._query_params @property def headers(self): @@ -70,21 +70,21 @@ def headers(self): Request headers, represented as a dictionary of header name to header value """ - return self.headers + return self._headers @property def body(self): """ The Request Body """ - return self.body + return self._body @property def wsgi_environ(self): """ The raw WSGI Environment dictionary representation of the request """ - return self.wsgi_environ + return self._wsgi_environ @staticmethod def __parse_query_params(query_string): @@ -111,5 +111,5 @@ def __parse_headers(environ): for key, val in environ.items(): header = env_header_re.match(key) if header: - headers[header.replace("_","-").lower()] = val + headers[header.group(1).replace("_", "-").lower()] = val return headers From 872aecbfe7357bd151f7aa9808d95a452c9c9787 Mon Sep 17 00:00:00 2001 From: Matt Costi Date: Sun, 17 Nov 2019 12:50:30 -0500 Subject: [PATCH 15/16] fix linting --- adafruit_wsgi/wsgi_app.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/adafruit_wsgi/wsgi_app.py b/adafruit_wsgi/wsgi_app.py index 2e67e84..5939a43 100644 --- a/adafruit_wsgi/wsgi_app.py +++ b/adafruit_wsgi/wsgi_app.py @@ -116,13 +116,11 @@ def route(self, rule, methods=None): """ if not methods: methods = ['GET'] - def decorate(func): - self.on_request(methods, rule, func) - return decorate + return lambda func: self.on_request(methods, rule, func) def _match_route(self, path, method): for matcher, route in self._routes: match = matcher.match(path) if match and method in route["methods"]: return (match.groups(), route) - return None \ No newline at end of file + return None From 5d1b212c941ae57c2125f369ad0d7a3f03ac5670 Mon Sep 17 00:00:00 2001 From: siddacious Date: Thu, 9 Jan 2020 18:34:43 -0800 Subject: [PATCH 16/16] Updating to complete the actions configuration --- .gitignore | 2 +- .travis.yml | 48 ------------------------------------------------ README.rst | 4 ++-- 3 files changed, 3 insertions(+), 51 deletions(-) delete mode 100644 .travis.yml diff --git a/.gitignore b/.gitignore index 3573d73..066d563 100644 --- a/.gitignore +++ b/.gitignore @@ -4,7 +4,7 @@ __pycache__ _build *.pyc .env -build* +build*/ bundles *.DS_Store .eggs diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 493fd98..0000000 --- a/.travis.yml +++ /dev/null @@ -1,48 +0,0 @@ -# This is a common .travis.yml for generating library release zip files for -# CircuitPython library releases using circuitpython-build-tools. -# See https://github.com/adafruit/circuitpython-build-tools for detailed setup -# instructions. - -dist: xenial -language: python -python: - - "3.6" - -cache: - pip: true - -# TODO: if deployment to PyPi is desired, change 'DEPLOY_PYPI' to "true", -# or remove the env block entirely and remove the condition in the -# deploy block. -env: - - DEPLOY_PYPI="false" - -deploy: - - provider: releases - api_key: "$GITHUB_TOKEN" - file_glob: true - file: "$TRAVIS_BUILD_DIR/bundles/*" - skip_cleanup: true - overwrite: true - on: - tags: true - # TODO: Use 'travis encrypt --com -r adafruit/' to generate - # the encrypted password for adafruit-travis. Paste result below. - - provider: pypi - user: adafruit-travis - password: - secure: #-- PASTE ENCRYPTED PASSWORD HERE --# - on: - tags: true - condition: $DEPLOY_PYPI = "true" - -install: - - pip install -r requirements.txt - - pip install circuitpython-build-tools Sphinx sphinx-rtd-theme - - pip install --force-reinstall pylint==1.9.2 - -script: - - pylint adafruit_wsgi/*.py - - ([[ ! -d "examples" ]] || pylint --disable=missing-docstring,invalid-name,bad-whitespace examples/*.py) - - circuitpython-build-bundles --filename_prefix adafruit-circuitpython-wsgi --library_location . - - cd docs && sphinx-build -E -W -b html . _build/html && cd .. diff --git a/README.rst b/README.rst index 5d1295a..fbbb72f 100644 --- a/README.rst +++ b/README.rst @@ -9,8 +9,8 @@ Introduction :target: https://discord.gg/nBQh6qu :alt: Discord -.. image:: https://travis-ci.com/adafruit/Adafruit_CircuitPython_WSGI.svg?branch=master - :target: https://travis-ci.com/adafruit/Adafruit_CircuitPython_WSGI +.. image:: https://github.com/adafruit/Adafruit_CircuitPython_WSGI/workflows/Build%20CI/badge.svg + :target: https://github.com/adafruit/Adafruit_CircuitPython_WSGI/actions :alt: Build Status CircuitPython framework for creating WSGI compatible web server applications.