mirror of
https://github.com/dalathegreat/Battery-Emulator.git
synced 2025-10-03 17:59:27 +02:00
add ElegantOTA library
This commit is contained in:
parent
56784539fa
commit
ed1b6e75c7
20 changed files with 2092 additions and 0 deletions
2
Software/src/lib/ayushsharma82-ElegantOTA/.gitattributes
vendored
Normal file
2
Software/src/lib/ayushsharma82-ElegantOTA/.gitattributes
vendored
Normal file
|
@ -0,0 +1,2 @@
|
|||
# Auto detect text files and perform LF normalization
|
||||
* text=auto
|
86
Software/src/lib/ayushsharma82-ElegantOTA/.github/workflows/ci.yml
vendored
Normal file
86
Software/src/lib/ayushsharma82-ElegantOTA/.github/workflows/ci.yml
vendored
Normal file
|
@ -0,0 +1,86 @@
|
|||
name: Arduino Library CI
|
||||
|
||||
on:
|
||||
push:
|
||||
paths-ignore:
|
||||
- '**/**.md'
|
||||
- '/keywords.txt'
|
||||
- '/library.json'
|
||||
- '/library.properties'
|
||||
- '/ui'
|
||||
- '/docs'
|
||||
pull_request:
|
||||
paths-ignore:
|
||||
- '**/**.md'
|
||||
- '/keywords.txt'
|
||||
- '/library.json'
|
||||
- '/library.properties'
|
||||
- '/ui'
|
||||
- '/docs'
|
||||
|
||||
jobs:
|
||||
Async_CI:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/setup-python@v1
|
||||
with:
|
||||
python-version: '3.x'
|
||||
|
||||
- uses: actions/checkout@v2
|
||||
|
||||
- uses: actions/checkout@v2
|
||||
with:
|
||||
repository: adafruit/ci-arduino
|
||||
path: ci
|
||||
|
||||
- name: pre-install
|
||||
run: bash ci/actions_install.sh
|
||||
|
||||
- name: Set configuration
|
||||
run: arduino-cli config set library.enable_unsafe_install true
|
||||
|
||||
- name: Install test dependencies
|
||||
run: arduino-cli lib install --git-url https://github.com/me-no-dev/ESPAsyncWebServer --git-url https://github.com/me-no-dev/ESPAsyncTCP --git-url https://github.com/me-no-dev/AsyncTCP
|
||||
|
||||
- name: Skip SyncDemo Example
|
||||
run: |
|
||||
cd examples
|
||||
cd Demo
|
||||
touch .esp32.test.skip
|
||||
touch .esp8266.test.skip
|
||||
|
||||
- name: Configure ElegantOTA to Async Mode
|
||||
run: |
|
||||
cd src
|
||||
sed -i 's/ELEGANTOTA_USE_ASYNC_WEBSERVER 0/ELEGANTOTA_USE_ASYNC_WEBSERVER 1/' ElegantOTA.h
|
||||
|
||||
- name: Test Async Demo
|
||||
continue-on-error: true
|
||||
run: python3 ci/build_platform.py esp8266 esp32
|
||||
|
||||
Sync_CI:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/setup-python@v1
|
||||
with:
|
||||
python-version: '3.x'
|
||||
|
||||
- uses: actions/checkout@v2
|
||||
|
||||
- uses: actions/checkout@v2
|
||||
with:
|
||||
repository: adafruit/ci-arduino
|
||||
path: ci
|
||||
|
||||
- name: pre-install
|
||||
run: bash ci/actions_install.sh
|
||||
|
||||
- name: Skip AsyncDemo Example
|
||||
run: |
|
||||
cd examples
|
||||
cd AsyncDemo
|
||||
touch .esp32.test.skip
|
||||
touch .esp8266.test.skip
|
||||
|
||||
- name: Test Sync Demo
|
||||
run: python3 ci/build_platform.py esp8266 esp32 picow_rp2040
|
39
Software/src/lib/ayushsharma82-ElegantOTA/.gitignore
vendored
Normal file
39
Software/src/lib/ayushsharma82-ElegantOTA/.gitignore
vendored
Normal file
|
@ -0,0 +1,39 @@
|
|||
# Prerequisites
|
||||
*.d
|
||||
|
||||
# Compiled Object files
|
||||
*.slo
|
||||
*.lo
|
||||
*.o
|
||||
*.obj
|
||||
.docusaurus
|
||||
|
||||
# Precompiled Headers
|
||||
*.gch
|
||||
*.pch
|
||||
|
||||
# Compiled Dynamic libraries
|
||||
*.so
|
||||
*.dylib
|
||||
*.dll
|
||||
|
||||
# Fortran module files
|
||||
*.mod
|
||||
*.smod
|
||||
|
||||
# Compiled Static libraries
|
||||
*.lai
|
||||
*.la
|
||||
*.a
|
||||
*.lib
|
||||
|
||||
# Executables
|
||||
*.exe
|
||||
*.out
|
||||
*.app
|
||||
|
||||
node_modules
|
||||
.DS_Store
|
||||
.vscode
|
||||
/build
|
||||
/portal
|
661
Software/src/lib/ayushsharma82-ElegantOTA/LICENSE
Normal file
661
Software/src/lib/ayushsharma82-ElegantOTA/LICENSE
Normal file
|
@ -0,0 +1,661 @@
|
|||
GNU AFFERO GENERAL PUBLIC LICENSE
|
||||
Version 3, 19 November 2007
|
||||
|
||||
Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
|
||||
Everyone is permitted to copy and distribute verbatim copies
|
||||
of this license document, but changing it is not allowed.
|
||||
|
||||
Preamble
|
||||
|
||||
The GNU Affero General Public License is a free, copyleft license for
|
||||
software and other kinds of works, specifically designed to ensure
|
||||
cooperation with the community in the case of network server software.
|
||||
|
||||
The licenses for most software and other practical works are designed
|
||||
to take away your freedom to share and change the works. By contrast,
|
||||
our General Public Licenses are intended to guarantee your freedom to
|
||||
share and change all versions of a program--to make sure it remains free
|
||||
software for all its users.
|
||||
|
||||
When we speak of free software, we are referring to freedom, not
|
||||
price. Our General Public Licenses are designed to make sure that you
|
||||
have the freedom to distribute copies of free software (and charge for
|
||||
them if you wish), that you receive source code or can get it if you
|
||||
want it, that you can change the software or use pieces of it in new
|
||||
free programs, and that you know you can do these things.
|
||||
|
||||
Developers that use our General Public Licenses protect your rights
|
||||
with two steps: (1) assert copyright on the software, and (2) offer
|
||||
you this License which gives you legal permission to copy, distribute
|
||||
and/or modify the software.
|
||||
|
||||
A secondary benefit of defending all users' freedom is that
|
||||
improvements made in alternate versions of the program, if they
|
||||
receive widespread use, become available for other developers to
|
||||
incorporate. Many developers of free software are heartened and
|
||||
encouraged by the resulting cooperation. However, in the case of
|
||||
software used on network servers, this result may fail to come about.
|
||||
The GNU General Public License permits making a modified version and
|
||||
letting the public access it on a server without ever releasing its
|
||||
source code to the public.
|
||||
|
||||
The GNU Affero General Public License is designed specifically to
|
||||
ensure that, in such cases, the modified source code becomes available
|
||||
to the community. It requires the operator of a network server to
|
||||
provide the source code of the modified version running there to the
|
||||
users of that server. Therefore, public use of a modified version, on
|
||||
a publicly accessible server, gives the public access to the source
|
||||
code of the modified version.
|
||||
|
||||
An older license, called the Affero General Public License and
|
||||
published by Affero, was designed to accomplish similar goals. This is
|
||||
a different license, not a version of the Affero GPL, but Affero has
|
||||
released a new version of the Affero GPL which permits relicensing under
|
||||
this license.
|
||||
|
||||
The precise terms and conditions for copying, distribution and
|
||||
modification follow.
|
||||
|
||||
TERMS AND CONDITIONS
|
||||
|
||||
0. Definitions.
|
||||
|
||||
"This License" refers to version 3 of the GNU Affero General Public License.
|
||||
|
||||
"Copyright" also means copyright-like laws that apply to other kinds of
|
||||
works, such as semiconductor masks.
|
||||
|
||||
"The Program" refers to any copyrightable work licensed under this
|
||||
License. Each licensee is addressed as "you". "Licensees" and
|
||||
"recipients" may be individuals or organizations.
|
||||
|
||||
To "modify" a work means to copy from or adapt all or part of the work
|
||||
in a fashion requiring copyright permission, other than the making of an
|
||||
exact copy. The resulting work is called a "modified version" of the
|
||||
earlier work or a work "based on" the earlier work.
|
||||
|
||||
A "covered work" means either the unmodified Program or a work based
|
||||
on the Program.
|
||||
|
||||
To "propagate" a work means to do anything with it that, without
|
||||
permission, would make you directly or secondarily liable for
|
||||
infringement under applicable copyright law, except executing it on a
|
||||
computer or modifying a private copy. Propagation includes copying,
|
||||
distribution (with or without modification), making available to the
|
||||
public, and in some countries other activities as well.
|
||||
|
||||
To "convey" a work means any kind of propagation that enables other
|
||||
parties to make or receive copies. Mere interaction with a user through
|
||||
a computer network, with no transfer of a copy, is not conveying.
|
||||
|
||||
An interactive user interface displays "Appropriate Legal Notices"
|
||||
to the extent that it includes a convenient and prominently visible
|
||||
feature that (1) displays an appropriate copyright notice, and (2)
|
||||
tells the user that there is no warranty for the work (except to the
|
||||
extent that warranties are provided), that licensees may convey the
|
||||
work under this License, and how to view a copy of this License. If
|
||||
the interface presents a list of user commands or options, such as a
|
||||
menu, a prominent item in the list meets this criterion.
|
||||
|
||||
1. Source Code.
|
||||
|
||||
The "source code" for a work means the preferred form of the work
|
||||
for making modifications to it. "Object code" means any non-source
|
||||
form of a work.
|
||||
|
||||
A "Standard Interface" means an interface that either is an official
|
||||
standard defined by a recognized standards body, or, in the case of
|
||||
interfaces specified for a particular programming language, one that
|
||||
is widely used among developers working in that language.
|
||||
|
||||
The "System Libraries" of an executable work include anything, other
|
||||
than the work as a whole, that (a) is included in the normal form of
|
||||
packaging a Major Component, but which is not part of that Major
|
||||
Component, and (b) serves only to enable use of the work with that
|
||||
Major Component, or to implement a Standard Interface for which an
|
||||
implementation is available to the public in source code form. A
|
||||
"Major Component", in this context, means a major essential component
|
||||
(kernel, window system, and so on) of the specific operating system
|
||||
(if any) on which the executable work runs, or a compiler used to
|
||||
produce the work, or an object code interpreter used to run it.
|
||||
|
||||
The "Corresponding Source" for a work in object code form means all
|
||||
the source code needed to generate, install, and (for an executable
|
||||
work) run the object code and to modify the work, including scripts to
|
||||
control those activities. However, it does not include the work's
|
||||
System Libraries, or general-purpose tools or generally available free
|
||||
programs which are used unmodified in performing those activities but
|
||||
which are not part of the work. For example, Corresponding Source
|
||||
includes interface definition files associated with source files for
|
||||
the work, and the source code for shared libraries and dynamically
|
||||
linked subprograms that the work is specifically designed to require,
|
||||
such as by intimate data communication or control flow between those
|
||||
subprograms and other parts of the work.
|
||||
|
||||
The Corresponding Source need not include anything that users
|
||||
can regenerate automatically from other parts of the Corresponding
|
||||
Source.
|
||||
|
||||
The Corresponding Source for a work in source code form is that
|
||||
same work.
|
||||
|
||||
2. Basic Permissions.
|
||||
|
||||
All rights granted under this License are granted for the term of
|
||||
copyright on the Program, and are irrevocable provided the stated
|
||||
conditions are met. This License explicitly affirms your unlimited
|
||||
permission to run the unmodified Program. The output from running a
|
||||
covered work is covered by this License only if the output, given its
|
||||
content, constitutes a covered work. This License acknowledges your
|
||||
rights of fair use or other equivalent, as provided by copyright law.
|
||||
|
||||
You may make, run and propagate covered works that you do not
|
||||
convey, without conditions so long as your license otherwise remains
|
||||
in force. You may convey covered works to others for the sole purpose
|
||||
of having them make modifications exclusively for you, or provide you
|
||||
with facilities for running those works, provided that you comply with
|
||||
the terms of this License in conveying all material for which you do
|
||||
not control copyright. Those thus making or running the covered works
|
||||
for you must do so exclusively on your behalf, under your direction
|
||||
and control, on terms that prohibit them from making any copies of
|
||||
your copyrighted material outside their relationship with you.
|
||||
|
||||
Conveying under any other circumstances is permitted solely under
|
||||
the conditions stated below. Sublicensing is not allowed; section 10
|
||||
makes it unnecessary.
|
||||
|
||||
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
|
||||
|
||||
No covered work shall be deemed part of an effective technological
|
||||
measure under any applicable law fulfilling obligations under article
|
||||
11 of the WIPO copyright treaty adopted on 20 December 1996, or
|
||||
similar laws prohibiting or restricting circumvention of such
|
||||
measures.
|
||||
|
||||
When you convey a covered work, you waive any legal power to forbid
|
||||
circumvention of technological measures to the extent such circumvention
|
||||
is effected by exercising rights under this License with respect to
|
||||
the covered work, and you disclaim any intention to limit operation or
|
||||
modification of the work as a means of enforcing, against the work's
|
||||
users, your or third parties' legal rights to forbid circumvention of
|
||||
technological measures.
|
||||
|
||||
4. Conveying Verbatim Copies.
|
||||
|
||||
You may convey verbatim copies of the Program's source code as you
|
||||
receive it, in any medium, provided that you conspicuously and
|
||||
appropriately publish on each copy an appropriate copyright notice;
|
||||
keep intact all notices stating that this License and any
|
||||
non-permissive terms added in accord with section 7 apply to the code;
|
||||
keep intact all notices of the absence of any warranty; and give all
|
||||
recipients a copy of this License along with the Program.
|
||||
|
||||
You may charge any price or no price for each copy that you convey,
|
||||
and you may offer support or warranty protection for a fee.
|
||||
|
||||
5. Conveying Modified Source Versions.
|
||||
|
||||
You may convey a work based on the Program, or the modifications to
|
||||
produce it from the Program, in the form of source code under the
|
||||
terms of section 4, provided that you also meet all of these conditions:
|
||||
|
||||
a) The work must carry prominent notices stating that you modified
|
||||
it, and giving a relevant date.
|
||||
|
||||
b) The work must carry prominent notices stating that it is
|
||||
released under this License and any conditions added under section
|
||||
7. This requirement modifies the requirement in section 4 to
|
||||
"keep intact all notices".
|
||||
|
||||
c) You must license the entire work, as a whole, under this
|
||||
License to anyone who comes into possession of a copy. This
|
||||
License will therefore apply, along with any applicable section 7
|
||||
additional terms, to the whole of the work, and all its parts,
|
||||
regardless of how they are packaged. This License gives no
|
||||
permission to license the work in any other way, but it does not
|
||||
invalidate such permission if you have separately received it.
|
||||
|
||||
d) If the work has interactive user interfaces, each must display
|
||||
Appropriate Legal Notices; however, if the Program has interactive
|
||||
interfaces that do not display Appropriate Legal Notices, your
|
||||
work need not make them do so.
|
||||
|
||||
A compilation of a covered work with other separate and independent
|
||||
works, which are not by their nature extensions of the covered work,
|
||||
and which are not combined with it such as to form a larger program,
|
||||
in or on a volume of a storage or distribution medium, is called an
|
||||
"aggregate" if the compilation and its resulting copyright are not
|
||||
used to limit the access or legal rights of the compilation's users
|
||||
beyond what the individual works permit. Inclusion of a covered work
|
||||
in an aggregate does not cause this License to apply to the other
|
||||
parts of the aggregate.
|
||||
|
||||
6. Conveying Non-Source Forms.
|
||||
|
||||
You may convey a covered work in object code form under the terms
|
||||
of sections 4 and 5, provided that you also convey the
|
||||
machine-readable Corresponding Source under the terms of this License,
|
||||
in one of these ways:
|
||||
|
||||
a) Convey the object code in, or embodied in, a physical product
|
||||
(including a physical distribution medium), accompanied by the
|
||||
Corresponding Source fixed on a durable physical medium
|
||||
customarily used for software interchange.
|
||||
|
||||
b) Convey the object code in, or embodied in, a physical product
|
||||
(including a physical distribution medium), accompanied by a
|
||||
written offer, valid for at least three years and valid for as
|
||||
long as you offer spare parts or customer support for that product
|
||||
model, to give anyone who possesses the object code either (1) a
|
||||
copy of the Corresponding Source for all the software in the
|
||||
product that is covered by this License, on a durable physical
|
||||
medium customarily used for software interchange, for a price no
|
||||
more than your reasonable cost of physically performing this
|
||||
conveying of source, or (2) access to copy the
|
||||
Corresponding Source from a network server at no charge.
|
||||
|
||||
c) Convey individual copies of the object code with a copy of the
|
||||
written offer to provide the Corresponding Source. This
|
||||
alternative is allowed only occasionally and noncommercially, and
|
||||
only if you received the object code with such an offer, in accord
|
||||
with subsection 6b.
|
||||
|
||||
d) Convey the object code by offering access from a designated
|
||||
place (gratis or for a charge), and offer equivalent access to the
|
||||
Corresponding Source in the same way through the same place at no
|
||||
further charge. You need not require recipients to copy the
|
||||
Corresponding Source along with the object code. If the place to
|
||||
copy the object code is a network server, the Corresponding Source
|
||||
may be on a different server (operated by you or a third party)
|
||||
that supports equivalent copying facilities, provided you maintain
|
||||
clear directions next to the object code saying where to find the
|
||||
Corresponding Source. Regardless of what server hosts the
|
||||
Corresponding Source, you remain obligated to ensure that it is
|
||||
available for as long as needed to satisfy these requirements.
|
||||
|
||||
e) Convey the object code using peer-to-peer transmission, provided
|
||||
you inform other peers where the object code and Corresponding
|
||||
Source of the work are being offered to the general public at no
|
||||
charge under subsection 6d.
|
||||
|
||||
A separable portion of the object code, whose source code is excluded
|
||||
from the Corresponding Source as a System Library, need not be
|
||||
included in conveying the object code work.
|
||||
|
||||
A "User Product" is either (1) a "consumer product", which means any
|
||||
tangible personal property which is normally used for personal, family,
|
||||
or household purposes, or (2) anything designed or sold for incorporation
|
||||
into a dwelling. In determining whether a product is a consumer product,
|
||||
doubtful cases shall be resolved in favor of coverage. For a particular
|
||||
product received by a particular user, "normally used" refers to a
|
||||
typical or common use of that class of product, regardless of the status
|
||||
of the particular user or of the way in which the particular user
|
||||
actually uses, or expects or is expected to use, the product. A product
|
||||
is a consumer product regardless of whether the product has substantial
|
||||
commercial, industrial or non-consumer uses, unless such uses represent
|
||||
the only significant mode of use of the product.
|
||||
|
||||
"Installation Information" for a User Product means any methods,
|
||||
procedures, authorization keys, or other information required to install
|
||||
and execute modified versions of a covered work in that User Product from
|
||||
a modified version of its Corresponding Source. The information must
|
||||
suffice to ensure that the continued functioning of the modified object
|
||||
code is in no case prevented or interfered with solely because
|
||||
modification has been made.
|
||||
|
||||
If you convey an object code work under this section in, or with, or
|
||||
specifically for use in, a User Product, and the conveying occurs as
|
||||
part of a transaction in which the right of possession and use of the
|
||||
User Product is transferred to the recipient in perpetuity or for a
|
||||
fixed term (regardless of how the transaction is characterized), the
|
||||
Corresponding Source conveyed under this section must be accompanied
|
||||
by the Installation Information. But this requirement does not apply
|
||||
if neither you nor any third party retains the ability to install
|
||||
modified object code on the User Product (for example, the work has
|
||||
been installed in ROM).
|
||||
|
||||
The requirement to provide Installation Information does not include a
|
||||
requirement to continue to provide support service, warranty, or updates
|
||||
for a work that has been modified or installed by the recipient, or for
|
||||
the User Product in which it has been modified or installed. Access to a
|
||||
network may be denied when the modification itself materially and
|
||||
adversely affects the operation of the network or violates the rules and
|
||||
protocols for communication across the network.
|
||||
|
||||
Corresponding Source conveyed, and Installation Information provided,
|
||||
in accord with this section must be in a format that is publicly
|
||||
documented (and with an implementation available to the public in
|
||||
source code form), and must require no special password or key for
|
||||
unpacking, reading or copying.
|
||||
|
||||
7. Additional Terms.
|
||||
|
||||
"Additional permissions" are terms that supplement the terms of this
|
||||
License by making exceptions from one or more of its conditions.
|
||||
Additional permissions that are applicable to the entire Program shall
|
||||
be treated as though they were included in this License, to the extent
|
||||
that they are valid under applicable law. If additional permissions
|
||||
apply only to part of the Program, that part may be used separately
|
||||
under those permissions, but the entire Program remains governed by
|
||||
this License without regard to the additional permissions.
|
||||
|
||||
When you convey a copy of a covered work, you may at your option
|
||||
remove any additional permissions from that copy, or from any part of
|
||||
it. (Additional permissions may be written to require their own
|
||||
removal in certain cases when you modify the work.) You may place
|
||||
additional permissions on material, added by you to a covered work,
|
||||
for which you have or can give appropriate copyright permission.
|
||||
|
||||
Notwithstanding any other provision of this License, for material you
|
||||
add to a covered work, you may (if authorized by the copyright holders of
|
||||
that material) supplement the terms of this License with terms:
|
||||
|
||||
a) Disclaiming warranty or limiting liability differently from the
|
||||
terms of sections 15 and 16 of this License; or
|
||||
|
||||
b) Requiring preservation of specified reasonable legal notices or
|
||||
author attributions in that material or in the Appropriate Legal
|
||||
Notices displayed by works containing it; or
|
||||
|
||||
c) Prohibiting misrepresentation of the origin of that material, or
|
||||
requiring that modified versions of such material be marked in
|
||||
reasonable ways as different from the original version; or
|
||||
|
||||
d) Limiting the use for publicity purposes of names of licensors or
|
||||
authors of the material; or
|
||||
|
||||
e) Declining to grant rights under trademark law for use of some
|
||||
trade names, trademarks, or service marks; or
|
||||
|
||||
f) Requiring indemnification of licensors and authors of that
|
||||
material by anyone who conveys the material (or modified versions of
|
||||
it) with contractual assumptions of liability to the recipient, for
|
||||
any liability that these contractual assumptions directly impose on
|
||||
those licensors and authors.
|
||||
|
||||
All other non-permissive additional terms are considered "further
|
||||
restrictions" within the meaning of section 10. If the Program as you
|
||||
received it, or any part of it, contains a notice stating that it is
|
||||
governed by this License along with a term that is a further
|
||||
restriction, you may remove that term. If a license document contains
|
||||
a further restriction but permits relicensing or conveying under this
|
||||
License, you may add to a covered work material governed by the terms
|
||||
of that license document, provided that the further restriction does
|
||||
not survive such relicensing or conveying.
|
||||
|
||||
If you add terms to a covered work in accord with this section, you
|
||||
must place, in the relevant source files, a statement of the
|
||||
additional terms that apply to those files, or a notice indicating
|
||||
where to find the applicable terms.
|
||||
|
||||
Additional terms, permissive or non-permissive, may be stated in the
|
||||
form of a separately written license, or stated as exceptions;
|
||||
the above requirements apply either way.
|
||||
|
||||
8. Termination.
|
||||
|
||||
You may not propagate or modify a covered work except as expressly
|
||||
provided under this License. Any attempt otherwise to propagate or
|
||||
modify it is void, and will automatically terminate your rights under
|
||||
this License (including any patent licenses granted under the third
|
||||
paragraph of section 11).
|
||||
|
||||
However, if you cease all violation of this License, then your
|
||||
license from a particular copyright holder is reinstated (a)
|
||||
provisionally, unless and until the copyright holder explicitly and
|
||||
finally terminates your license, and (b) permanently, if the copyright
|
||||
holder fails to notify you of the violation by some reasonable means
|
||||
prior to 60 days after the cessation.
|
||||
|
||||
Moreover, your license from a particular copyright holder is
|
||||
reinstated permanently if the copyright holder notifies you of the
|
||||
violation by some reasonable means, this is the first time you have
|
||||
received notice of violation of this License (for any work) from that
|
||||
copyright holder, and you cure the violation prior to 30 days after
|
||||
your receipt of the notice.
|
||||
|
||||
Termination of your rights under this section does not terminate the
|
||||
licenses of parties who have received copies or rights from you under
|
||||
this License. If your rights have been terminated and not permanently
|
||||
reinstated, you do not qualify to receive new licenses for the same
|
||||
material under section 10.
|
||||
|
||||
9. Acceptance Not Required for Having Copies.
|
||||
|
||||
You are not required to accept this License in order to receive or
|
||||
run a copy of the Program. Ancillary propagation of a covered work
|
||||
occurring solely as a consequence of using peer-to-peer transmission
|
||||
to receive a copy likewise does not require acceptance. However,
|
||||
nothing other than this License grants you permission to propagate or
|
||||
modify any covered work. These actions infringe copyright if you do
|
||||
not accept this License. Therefore, by modifying or propagating a
|
||||
covered work, you indicate your acceptance of this License to do so.
|
||||
|
||||
10. Automatic Licensing of Downstream Recipients.
|
||||
|
||||
Each time you convey a covered work, the recipient automatically
|
||||
receives a license from the original licensors, to run, modify and
|
||||
propagate that work, subject to this License. You are not responsible
|
||||
for enforcing compliance by third parties with this License.
|
||||
|
||||
An "entity transaction" is a transaction transferring control of an
|
||||
organization, or substantially all assets of one, or subdividing an
|
||||
organization, or merging organizations. If propagation of a covered
|
||||
work results from an entity transaction, each party to that
|
||||
transaction who receives a copy of the work also receives whatever
|
||||
licenses to the work the party's predecessor in interest had or could
|
||||
give under the previous paragraph, plus a right to possession of the
|
||||
Corresponding Source of the work from the predecessor in interest, if
|
||||
the predecessor has it or can get it with reasonable efforts.
|
||||
|
||||
You may not impose any further restrictions on the exercise of the
|
||||
rights granted or affirmed under this License. For example, you may
|
||||
not impose a license fee, royalty, or other charge for exercise of
|
||||
rights granted under this License, and you may not initiate litigation
|
||||
(including a cross-claim or counterclaim in a lawsuit) alleging that
|
||||
any patent claim is infringed by making, using, selling, offering for
|
||||
sale, or importing the Program or any portion of it.
|
||||
|
||||
11. Patents.
|
||||
|
||||
A "contributor" is a copyright holder who authorizes use under this
|
||||
License of the Program or a work on which the Program is based. The
|
||||
work thus licensed is called the contributor's "contributor version".
|
||||
|
||||
A contributor's "essential patent claims" are all patent claims
|
||||
owned or controlled by the contributor, whether already acquired or
|
||||
hereafter acquired, that would be infringed by some manner, permitted
|
||||
by this License, of making, using, or selling its contributor version,
|
||||
but do not include claims that would be infringed only as a
|
||||
consequence of further modification of the contributor version. For
|
||||
purposes of this definition, "control" includes the right to grant
|
||||
patent sublicenses in a manner consistent with the requirements of
|
||||
this License.
|
||||
|
||||
Each contributor grants you a non-exclusive, worldwide, royalty-free
|
||||
patent license under the contributor's essential patent claims, to
|
||||
make, use, sell, offer for sale, import and otherwise run, modify and
|
||||
propagate the contents of its contributor version.
|
||||
|
||||
In the following three paragraphs, a "patent license" is any express
|
||||
agreement or commitment, however denominated, not to enforce a patent
|
||||
(such as an express permission to practice a patent or covenant not to
|
||||
sue for patent infringement). To "grant" such a patent license to a
|
||||
party means to make such an agreement or commitment not to enforce a
|
||||
patent against the party.
|
||||
|
||||
If you convey a covered work, knowingly relying on a patent license,
|
||||
and the Corresponding Source of the work is not available for anyone
|
||||
to copy, free of charge and under the terms of this License, through a
|
||||
publicly available network server or other readily accessible means,
|
||||
then you must either (1) cause the Corresponding Source to be so
|
||||
available, or (2) arrange to deprive yourself of the benefit of the
|
||||
patent license for this particular work, or (3) arrange, in a manner
|
||||
consistent with the requirements of this License, to extend the patent
|
||||
license to downstream recipients. "Knowingly relying" means you have
|
||||
actual knowledge that, but for the patent license, your conveying the
|
||||
covered work in a country, or your recipient's use of the covered work
|
||||
in a country, would infringe one or more identifiable patents in that
|
||||
country that you have reason to believe are valid.
|
||||
|
||||
If, pursuant to or in connection with a single transaction or
|
||||
arrangement, you convey, or propagate by procuring conveyance of, a
|
||||
covered work, and grant a patent license to some of the parties
|
||||
receiving the covered work authorizing them to use, propagate, modify
|
||||
or convey a specific copy of the covered work, then the patent license
|
||||
you grant is automatically extended to all recipients of the covered
|
||||
work and works based on it.
|
||||
|
||||
A patent license is "discriminatory" if it does not include within
|
||||
the scope of its coverage, prohibits the exercise of, or is
|
||||
conditioned on the non-exercise of one or more of the rights that are
|
||||
specifically granted under this License. You may not convey a covered
|
||||
work if you are a party to an arrangement with a third party that is
|
||||
in the business of distributing software, under which you make payment
|
||||
to the third party based on the extent of your activity of conveying
|
||||
the work, and under which the third party grants, to any of the
|
||||
parties who would receive the covered work from you, a discriminatory
|
||||
patent license (a) in connection with copies of the covered work
|
||||
conveyed by you (or copies made from those copies), or (b) primarily
|
||||
for and in connection with specific products or compilations that
|
||||
contain the covered work, unless you entered into that arrangement,
|
||||
or that patent license was granted, prior to 28 March 2007.
|
||||
|
||||
Nothing in this License shall be construed as excluding or limiting
|
||||
any implied license or other defenses to infringement that may
|
||||
otherwise be available to you under applicable patent law.
|
||||
|
||||
12. No Surrender of Others' Freedom.
|
||||
|
||||
If conditions are imposed on you (whether by court order, agreement or
|
||||
otherwise) that contradict the conditions of this License, they do not
|
||||
excuse you from the conditions of this License. If you cannot convey a
|
||||
covered work so as to satisfy simultaneously your obligations under this
|
||||
License and any other pertinent obligations, then as a consequence you may
|
||||
not convey it at all. For example, if you agree to terms that obligate you
|
||||
to collect a royalty for further conveying from those to whom you convey
|
||||
the Program, the only way you could satisfy both those terms and this
|
||||
License would be to refrain entirely from conveying the Program.
|
||||
|
||||
13. Remote Network Interaction; Use with the GNU General Public License.
|
||||
|
||||
Notwithstanding any other provision of this License, if you modify the
|
||||
Program, your modified version must prominently offer all users
|
||||
interacting with it remotely through a computer network (if your version
|
||||
supports such interaction) an opportunity to receive the Corresponding
|
||||
Source of your version by providing access to the Corresponding Source
|
||||
from a network server at no charge, through some standard or customary
|
||||
means of facilitating copying of software. This Corresponding Source
|
||||
shall include the Corresponding Source for any work covered by version 3
|
||||
of the GNU General Public License that is incorporated pursuant to the
|
||||
following paragraph.
|
||||
|
||||
Notwithstanding any other provision of this License, you have
|
||||
permission to link or combine any covered work with a work licensed
|
||||
under version 3 of the GNU General Public License into a single
|
||||
combined work, and to convey the resulting work. The terms of this
|
||||
License will continue to apply to the part which is the covered work,
|
||||
but the work with which it is combined will remain governed by version
|
||||
3 of the GNU General Public License.
|
||||
|
||||
14. Revised Versions of this License.
|
||||
|
||||
The Free Software Foundation may publish revised and/or new versions of
|
||||
the GNU Affero General Public License from time to time. Such new versions
|
||||
will be similar in spirit to the present version, but may differ in detail to
|
||||
address new problems or concerns.
|
||||
|
||||
Each version is given a distinguishing version number. If the
|
||||
Program specifies that a certain numbered version of the GNU Affero General
|
||||
Public License "or any later version" applies to it, you have the
|
||||
option of following the terms and conditions either of that numbered
|
||||
version or of any later version published by the Free Software
|
||||
Foundation. If the Program does not specify a version number of the
|
||||
GNU Affero General Public License, you may choose any version ever published
|
||||
by the Free Software Foundation.
|
||||
|
||||
If the Program specifies that a proxy can decide which future
|
||||
versions of the GNU Affero General Public License can be used, that proxy's
|
||||
public statement of acceptance of a version permanently authorizes you
|
||||
to choose that version for the Program.
|
||||
|
||||
Later license versions may give you additional or different
|
||||
permissions. However, no additional obligations are imposed on any
|
||||
author or copyright holder as a result of your choosing to follow a
|
||||
later version.
|
||||
|
||||
15. Disclaimer of Warranty.
|
||||
|
||||
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
|
||||
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
|
||||
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
|
||||
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
|
||||
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
|
||||
IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
|
||||
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
|
||||
|
||||
16. Limitation of Liability.
|
||||
|
||||
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
||||
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
|
||||
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
|
||||
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
|
||||
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
|
||||
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
|
||||
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
|
||||
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
|
||||
SUCH DAMAGES.
|
||||
|
||||
17. Interpretation of Sections 15 and 16.
|
||||
|
||||
If the disclaimer of warranty and limitation of liability provided
|
||||
above cannot be given local legal effect according to their terms,
|
||||
reviewing courts shall apply local law that most closely approximates
|
||||
an absolute waiver of all civil liability in connection with the
|
||||
Program, unless a warranty or assumption of liability accompanies a
|
||||
copy of the Program in return for a fee.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
How to Apply These Terms to Your New Programs
|
||||
|
||||
If you develop a new program, and you want it to be of the greatest
|
||||
possible use to the public, the best way to achieve this is to make it
|
||||
free software which everyone can redistribute and change under these terms.
|
||||
|
||||
To do so, attach the following notices to the program. It is safest
|
||||
to attach them to the start of each source file to most effectively
|
||||
state the exclusion of warranty; and each file should have at least
|
||||
the "copyright" line and a pointer to where the full notice is found.
|
||||
|
||||
<one line to give the program's name and a brief idea of what it does.>
|
||||
Copyright (C) <year> <name of author>
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Affero General Public License as published
|
||||
by the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU Affero General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Affero General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
Also add information on how to contact you by electronic and paper mail.
|
||||
|
||||
If your software can interact with users remotely through a computer
|
||||
network, you should also make sure that it provides a way for users to
|
||||
get its source. For example, if your program is a web application, its
|
||||
interface could display a "Source" link that leads users to an archive
|
||||
of the code. There are many ways you could offer source, and different
|
||||
solutions will be better for different programs; see section 13 for the
|
||||
specific requirements.
|
||||
|
||||
You should also get your employer (if you work as a programmer) or school,
|
||||
if any, to sign a "copyright disclaimer" for the program, if necessary.
|
||||
For more information on this, and how to apply and follow the GNU AGPL, see
|
||||
<https://www.gnu.org/licenses/>.
|
96
Software/src/lib/ayushsharma82-ElegantOTA/README.md
Normal file
96
Software/src/lib/ayushsharma82-ElegantOTA/README.md
Normal file
|
@ -0,0 +1,96 @@
|
|||
This is commit 9ab44bd from https://github.com/ayushsharma82/ElegantOTA
|
||||
|
||||
<p><br/></p>
|
||||
<p align="center"><img src="/docs/feature.png?sanitize=true&raw=true" width="700"></p>
|
||||
|
||||
<br/>
|
||||
<p align="center">
|
||||
<img src="https://img.shields.io/github/last-commit/ayushsharma82/ElegantOTA.svg?style=for-the-badge" />
|
||||
|
||||
<img src="https://img.shields.io/github/actions/workflow/status/ayushsharma82/ElegantOTA/ci.yml?branch=master&style=for-the-badge" />
|
||||
|
||||
<img src="https://img.shields.io/github/license/ayushsharma82/ElegantOTA.svg?style=for-the-badge" />
|
||||
</p>
|
||||
<br/>
|
||||
|
||||
|
||||
<p align="center">OTA update library for wireless microcontrollers</p>
|
||||
<p align="center">
|
||||
ElegantOTA provides a beautiful user interface to upload over-the-air firmware/filesystem updates to your hardware with precise status and progress. ElegantOTA is designed to make the process of OTA updates slick and simple!
|
||||
</p>
|
||||
|
||||
<br/>
|
||||
<br/>
|
||||
|
||||
## Features
|
||||
- 🔥 Quick & Simple OTA procedure
|
||||
- 🏀 Get useful insight on progress and status of your OTA update
|
||||
- 🎷 No need to learn HTML/CSS/JS
|
||||
- 🛫 Ready to use within 3 lines of code
|
||||
|
||||
<br/>
|
||||
|
||||
## Supported MCUs
|
||||
ElegantOTA works on the following microcontrollers/boards:
|
||||
- ESP8266
|
||||
- ESP32
|
||||
- RP2040 ( Pico W )
|
||||
- *( more coming soon )*
|
||||
|
||||
<br/>
|
||||
<br/>
|
||||
|
||||
<h2>Documentation</h2>
|
||||
<p>Learn more about Installation & Usage: <a href="https://docs.elegantota.pro">Click Here</a></p>
|
||||
|
||||
<br>
|
||||
|
||||
<!-- <b>Antivirus Issue:</b> If you have an antivirus on your PC with internet security, the progress bar on webpage will instantly show 100% because of request caching by your antivirus software. There is no fix for this unless you want to disable your antivirus or whitelist your local IP addresses in it. ( Same is the case with iOS, safari will cache the outgoing requests ) -->
|
||||
|
||||
<br>
|
||||
|
||||
## Open-Source Preview
|
||||
*Preview might appear as blurry due to image optimization.*
|
||||
<br>
|
||||
|
||||
<img src="/docs/demo.gif?raw=true" width="600">
|
||||
|
||||
<br>
|
||||
<br>
|
||||
|
||||
## Want More? Upgrade to Pro
|
||||
|
||||
ElegantOTA Pro comes with the following extended functionality:
|
||||
- New Drag & Drop Zone
|
||||
- Disable certain OTA modes
|
||||
- Hardware ID & Firmware Version on portal
|
||||
- Custom title
|
||||
- Branding (Custom Logo)
|
||||
- Commercial License
|
||||
- Atlast, It is a fantastic way to support the developer for the time went into the making & maintaining the library.
|
||||
|
||||
<br> <b>Available here: </b>
|
||||
|
||||
- [Official Website ( elegantota.pro )](https://elegantota.pro)
|
||||
|
||||
<br/>
|
||||
|
||||
<a href="https://elegantota.pro" target="_blank">
|
||||
<img src="/docs/pro-preview.jpg" alt="ElegantOTA Pro" width="600">
|
||||
</a>
|
||||
|
||||
<br>
|
||||
<br>
|
||||
|
||||
<h2>Contributions</h2>
|
||||
<p>Every contribution to this repository is highly appreciated! If you spot any bug or problem, open a issue or pull request so that it can be rectified for everyone.</p>
|
||||
|
||||
**For feature requests:** Please open a issue and I'll add the feature in a future release once I get some time in my hands.
|
||||
|
||||
<br/>
|
||||
|
||||
<h2>License</h2>
|
||||
|
||||
ElegantOTA open-source edition is licensed under Affero General Public License v3.0 ( AGPL-3.0 ).
|
||||
|
||||
If you are intending to use ElegantOTA in a commercial project, please consider purchasing [ElegantOTA Pro](https://elegantota.pro) which comes with a less restrictive SOFTT Commercial License 1.0 ( SCL-1.0 ).
|
BIN
Software/src/lib/ayushsharma82-ElegantOTA/docs/demo.gif
Normal file
BIN
Software/src/lib/ayushsharma82-ElegantOTA/docs/demo.gif
Normal file
Binary file not shown.
After Width: | Height: | Size: 2 MiB |
BIN
Software/src/lib/ayushsharma82-ElegantOTA/docs/feature.png
Normal file
BIN
Software/src/lib/ayushsharma82-ElegantOTA/docs/feature.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 66 KiB |
31
Software/src/lib/ayushsharma82-ElegantOTA/docs/logo.svg
Normal file
31
Software/src/lib/ayushsharma82-ElegantOTA/docs/logo.svg
Normal file
|
@ -0,0 +1,31 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 22.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
viewBox="0 0 254 83" style="enable-background:new 0 0 254 83;" xml:space="preserve">
|
||||
<style type="text/css">
|
||||
.st0{fill:#2E3034;}
|
||||
.st1{fill:#488EFF;}
|
||||
</style>
|
||||
<g id="_x30_b742467-27ea-ae3f-7cfa-ca0e10ac04e7" transform="matrix(2.2,0,0,2.2,103.8876416683197,132.35599603652955)">
|
||||
<path class="st0" d="M-6.1-45.4v-1H-13v9.3h6.8v-1h-5.8v-3.1h5.2v-1h-5.2v-3.1H-6.1z M-3.6-47h-1.1v9.8h1.1V-47z M1.3-38
|
||||
c-1.4,0-2.3-1-2.5-2.2h5.9v-0.4c0-2-1.3-3.6-3.5-3.6s-3.5,1.6-3.5,3.6S-0.8-37,1.3-37C3-37,4-37.9,4.5-39.2H3.3
|
||||
C3-38.5,2.3-38,1.3-38z M1.2-43.3c1.3,0,2.2,0.9,2.4,2.1h-4.8C-0.9-42.4-0.1-43.3,1.2-43.3z M11.5-44.2v1.1
|
||||
c-0.5-0.8-1.3-1.2-2.5-1.2c-2,0-3.4,1.6-3.4,3.6c0,2,1.3,3.6,3.4,3.6c1.2,0,2-0.5,2.5-1.3v1c0,1.4-0.7,2.2-2.3,2.2
|
||||
c-1.1,0-1.8-0.4-2-1.1H5.9c0.4,1.2,1.5,2,3.3,2c2.1,0,3.3-1.1,3.3-3.1v-6.8H11.5z M9.1-38.1c-1.6,0-2.5-1.2-2.5-2.6
|
||||
c0-1.4,0.9-2.6,2.5-2.6c1.5,0,2.4,1.2,2.4,2.6C11.5-39.3,10.6-38.1,9.1-38.1z M17.3-44.3c-2,0-3.4,1.6-3.4,3.6s1.3,3.6,3.4,3.6
|
||||
c1.2,0,2-0.5,2.5-1.2v1.1h1v-7h-1v1.1C19.3-43.8,18.4-44.3,17.3-44.3z M17.4-38c-1.6,0-2.5-1.2-2.5-2.7c0-1.4,0.9-2.7,2.5-2.7
|
||||
c1.6,0,2.4,1.2,2.4,2.7C19.8-39.2,19-38,17.4-38z M22.7-44.2v7h1v-4c0-1.3,1-2.1,2.1-2.1c1.2,0,2,0.8,2,2.1v4h1v-4.1
|
||||
c0-2-1.3-3-2.8-3c-1.1,0-1.8,0.5-2.3,1.2v-1.1H22.7z M32.2-37.2v-6.1h1.6v-0.9h-1.6v-2.5h-1.1v2.5h-1.4v0.9h1.4v6.1H32.2z
|
||||
M39.3-46.5c-2.8,0-4.7,2.1-4.7,4.8c0,2.6,1.9,4.7,4.7,4.7s4.7-2.1,4.7-4.7C44-44.4,42.1-46.5,39.3-46.5z M39.3-38.1
|
||||
c-2.3,0-3.7-1.6-3.7-3.7c0-2.1,1.4-3.7,3.7-3.7s3.7,1.6,3.7,3.7C43-39.7,41.6-38.1,39.3-38.1z M51.9-46.4h-7.5v1h3.2v8.3h1v-8.3
|
||||
h3.2V-46.4z M56.5-46.4h-1.3l-3.9,9.3h1.2l1.1-2.7h4.6l1.1,2.7h1.2L56.5-46.4z M54-40.8l1.9-4.5l1.9,4.5H54z"/>
|
||||
</g>
|
||||
<g id="dc688d1f-a066-b7e7-8abc-115fa40e9445" transform="matrix(0.22552057488297111,0,0,0.22552057488297111,34.522743981666856,117.0177449672735)">
|
||||
<path class="st1" d="M119-347.6c5.7,0,7.8,6.6,4.5,10.8c-7.2,8.4-14.4,16.5-21.6,24.9c-2.1,2.4-6.6,2.4-9,0
|
||||
c-7.2-8.4-14.4-16.5-21.6-24.9c-4.5-5.1,1.2-12.3,6.3-10.8h13.2c-7.2-28.8-29.1-52.5-58.8-59.1c-5.7-1.2-11.4-1.8-17.1-1.8
|
||||
c-28.8,0-55.5,15.9-69.6,42c-3.9,7.2-14.7,0.9-10.8-6.3c19.2-34.8,59.4-54.9,98.7-46.2c35.4,7.5,63,36,70.2,71.4
|
||||
C103.4-347.6,119-347.6,119-347.6z M-83.2-309.2c-5.7,0-7.8-6.6-4.5-10.8c7.2-8.4,14.4-16.5,21.6-24.9c2.1-2.4,6.6-2.4,9,0
|
||||
c7.2,8.4,14.4,16.5,21.6,24.9c4.5,5.1-1.2,12.3-6.3,10.8H-55c7.2,28.8,29.1,52.5,58.8,59.1c5.7,1.2,11.4,1.8,17.1,1.8
|
||||
c28.8,0,55.5-15.9,69.6-42c3.9-7.2,14.7-0.9,10.8,6.3c-19.2,35.1-59.4,55.2-98.7,46.5c-35.4-7.8-63.3-36.3-70.5-71.7H-83.2z"/>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 2.7 KiB |
BIN
Software/src/lib/ayushsharma82-ElegantOTA/docs/pro-preview.jpg
Normal file
BIN
Software/src/lib/ayushsharma82-ElegantOTA/docs/pro-preview.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 79 KiB |
|
@ -0,0 +1,100 @@
|
|||
/*
|
||||
-----------------------
|
||||
ElegantOTA - Async Demo Example
|
||||
-----------------------
|
||||
|
||||
NOTE: Make sure you have enabled Async Mode in ElegantOTA before compiling this example!
|
||||
Guide: https://docs.elegantota.pro/async-mode/
|
||||
|
||||
Skill Level: Beginner
|
||||
|
||||
This example provides with a bare minimal app with ElegantOTA functionality which works
|
||||
with AsyncWebServer.
|
||||
|
||||
Github: https://github.com/ayushsharma82/ElegantOTA
|
||||
WiKi: https://docs.elegantota.pro
|
||||
|
||||
Works with both ESP8266 & ESP32
|
||||
|
||||
-------------------------------
|
||||
|
||||
Upgrade to ElegantOTA Pro: https://elegantota.pro
|
||||
|
||||
*/
|
||||
|
||||
#if defined(ESP8266)
|
||||
#include <ESP8266WiFi.h>
|
||||
#include <ESPAsyncTCP.h>
|
||||
#elif defined(ESP32)
|
||||
#include <WiFi.h>
|
||||
#include <AsyncTCP.h>
|
||||
#endif
|
||||
|
||||
#include <ESPAsyncWebServer.h>
|
||||
#include <ElegantOTA.h>
|
||||
|
||||
const char* ssid = "........";
|
||||
const char* password = "........";
|
||||
|
||||
AsyncWebServer server(80);
|
||||
|
||||
unsigned long ota_progress_millis = 0;
|
||||
|
||||
void onOTAStart() {
|
||||
// Log when OTA has started
|
||||
Serial.println("OTA update started!");
|
||||
// <Add your own code here>
|
||||
}
|
||||
|
||||
void onOTAProgress(size_t current, size_t final) {
|
||||
// Log every 1 second
|
||||
if (millis() - ota_progress_millis > 1000) {
|
||||
ota_progress_millis = millis();
|
||||
Serial.printf("OTA Progress Current: %u bytes, Final: %u bytes\n", current, final);
|
||||
}
|
||||
}
|
||||
|
||||
void onOTAEnd(bool success) {
|
||||
// Log when OTA has finished
|
||||
if (success) {
|
||||
Serial.println("OTA update finished successfully!");
|
||||
} else {
|
||||
Serial.println("There was an error during OTA update!");
|
||||
}
|
||||
// <Add your own code here>
|
||||
}
|
||||
|
||||
void setup(void) {
|
||||
Serial.begin(115200);
|
||||
WiFi.mode(WIFI_STA);
|
||||
WiFi.begin(ssid, password);
|
||||
Serial.println("");
|
||||
|
||||
// Wait for connection
|
||||
while (WiFi.status() != WL_CONNECTED) {
|
||||
delay(500);
|
||||
Serial.print(".");
|
||||
}
|
||||
Serial.println("");
|
||||
Serial.print("Connected to ");
|
||||
Serial.println(ssid);
|
||||
Serial.print("IP address: ");
|
||||
Serial.println(WiFi.localIP());
|
||||
|
||||
server.on("/", HTTP_GET, [](AsyncWebServerRequest *request) {
|
||||
request->send(200, "text/plain", "Hi! This is ElegantOTA AsyncDemo.");
|
||||
});
|
||||
|
||||
ElegantOTA.begin(&server); // Start ElegantOTA
|
||||
// ElegantOTA callbacks
|
||||
ElegantOTA.onStart(onOTAStart);
|
||||
ElegantOTA.onProgress(onOTAProgress);
|
||||
ElegantOTA.onEnd(onOTAEnd);
|
||||
|
||||
server.begin();
|
||||
Serial.println("HTTP server started");
|
||||
}
|
||||
|
||||
void loop(void) {
|
||||
ElegantOTA.loop();
|
||||
}
|
117
Software/src/lib/ayushsharma82-ElegantOTA/examples/Demo/Demo.ino
Normal file
117
Software/src/lib/ayushsharma82-ElegantOTA/examples/Demo/Demo.ino
Normal file
|
@ -0,0 +1,117 @@
|
|||
/*
|
||||
-----------------------
|
||||
ElegantOTA - Demo Example
|
||||
-----------------------
|
||||
|
||||
Skill Level: Beginner
|
||||
|
||||
This example provides with a bare minimal app with ElegantOTA functionality.
|
||||
|
||||
Github: https://github.com/ayushsharma82/ElegantOTA
|
||||
WiKi: https://docs.elegantota.pro
|
||||
|
||||
Works with following hardware:
|
||||
- ESP8266
|
||||
- ESP32
|
||||
- RP2040 (with WiFi) (Example: Raspberry Pi Pico W)
|
||||
|
||||
|
||||
Important note for RP2040 users:
|
||||
- RP2040 requires LittleFS partition for the OTA updates to work. Without LittleFS partition, OTA updates will fail.
|
||||
Make sure to select Tools > Flash Size > "2MB (Sketch 1MB, FS 1MB)" option.
|
||||
- If using bare RP2040, it requires WiFi module like Pico W for ElegantOTA to work.
|
||||
|
||||
-------------------------------
|
||||
|
||||
Upgrade to ElegantOTA Pro: https://elegantota.pro
|
||||
|
||||
*/
|
||||
|
||||
|
||||
#if defined(ESP8266)
|
||||
#include <ESP8266WiFi.h>
|
||||
#include <WiFiClient.h>
|
||||
#include <ESP8266WebServer.h>
|
||||
#elif defined(ESP32)
|
||||
#include <WiFi.h>
|
||||
#include <WiFiClient.h>
|
||||
#include <WebServer.h>
|
||||
#elif defined(TARGET_RP2040)
|
||||
#include <WiFi.h>
|
||||
#include <WebServer.h>
|
||||
#endif
|
||||
|
||||
#include <ElegantOTA.h>
|
||||
|
||||
const char* ssid = "";
|
||||
const char* password = "";
|
||||
|
||||
#if defined(ESP8266)
|
||||
ESP8266WebServer server(80);
|
||||
#elif defined(ESP32)
|
||||
WebServer server(80);
|
||||
#elif defined(TARGET_RP2040)
|
||||
WebServer server(80);
|
||||
#endif
|
||||
|
||||
unsigned long ota_progress_millis = 0;
|
||||
|
||||
void onOTAStart() {
|
||||
// Log when OTA has started
|
||||
Serial.println("OTA update started!");
|
||||
// <Add your own code here>
|
||||
}
|
||||
|
||||
void onOTAProgress(size_t current, size_t final) {
|
||||
// Log every 1 second
|
||||
if (millis() - ota_progress_millis > 1000) {
|
||||
ota_progress_millis = millis();
|
||||
Serial.printf("OTA Progress Current: %u bytes, Final: %u bytes\n", current, final);
|
||||
}
|
||||
}
|
||||
|
||||
void onOTAEnd(bool success) {
|
||||
// Log when OTA has finished
|
||||
if (success) {
|
||||
Serial.println("OTA update finished successfully!");
|
||||
} else {
|
||||
Serial.println("There was an error during OTA update!");
|
||||
}
|
||||
// <Add your own code here>
|
||||
}
|
||||
|
||||
void setup(void) {
|
||||
Serial.begin(115200);
|
||||
WiFi.mode(WIFI_STA);
|
||||
WiFi.begin(ssid, password);
|
||||
Serial.println("");
|
||||
|
||||
// Wait for connection
|
||||
while (WiFi.status() != WL_CONNECTED) {
|
||||
delay(500);
|
||||
Serial.print(".");
|
||||
}
|
||||
Serial.println("");
|
||||
Serial.print("Connected to ");
|
||||
Serial.println(ssid);
|
||||
Serial.print("IP address: ");
|
||||
Serial.println(WiFi.localIP());
|
||||
|
||||
server.on("/", []() {
|
||||
server.send(200, "text/plain", "Hi! This is ElegantOTA Demo.");
|
||||
});
|
||||
|
||||
ElegantOTA.begin(&server); // Start ElegantOTA
|
||||
// ElegantOTA callbacks
|
||||
ElegantOTA.onStart(onOTAStart);
|
||||
ElegantOTA.onProgress(onOTAProgress);
|
||||
ElegantOTA.onEnd(onOTAEnd);
|
||||
|
||||
server.begin();
|
||||
Serial.println("HTTP server started");
|
||||
}
|
||||
|
||||
void loop(void) {
|
||||
server.handleClient();
|
||||
ElegantOTA.loop();
|
||||
}
|
9
Software/src/lib/ayushsharma82-ElegantOTA/keywords.txt
Normal file
9
Software/src/lib/ayushsharma82-ElegantOTA/keywords.txt
Normal file
|
@ -0,0 +1,9 @@
|
|||
ElegantOTA KEYWORD1
|
||||
begin KEYWORD2
|
||||
loop KEYWORD2
|
||||
setAuth KEYWORD2
|
||||
clearAuth KEYWORD2
|
||||
setAutoReboot KEYWORD2
|
||||
onStart KEYWORD2
|
||||
onEnd KEYWORD2
|
||||
onProgress KEYWORD2
|
21
Software/src/lib/ayushsharma82-ElegantOTA/library.json
Normal file
21
Software/src/lib/ayushsharma82-ElegantOTA/library.json
Normal file
|
@ -0,0 +1,21 @@
|
|||
{
|
||||
"name": "ElegantOTA",
|
||||
"keywords": "ElegantOTA, OTA, Update, ESP8266, ESP32, over, the, air, firmware, filesystem, littlefs, spiffs",
|
||||
"description": "OTA updates made slick and simple for everyone!",
|
||||
"repository":
|
||||
{
|
||||
"type": "git",
|
||||
"url": "https://github.com/ayushsharma82/ElegantOTA.git"
|
||||
},
|
||||
"authors":
|
||||
[
|
||||
{
|
||||
"name": "Ayush Sharma",
|
||||
"email": "asrocks5@gmail.com",
|
||||
"maintainer": true
|
||||
}
|
||||
],
|
||||
"version": "3.1.0",
|
||||
"frameworks": "arduino",
|
||||
"platforms": ["espressif8266", "espressif32", "raspberrypi"]
|
||||
}
|
|
@ -0,0 +1,9 @@
|
|||
name=ElegantOTA
|
||||
version=3.1.0
|
||||
author=Ayush Sharma
|
||||
category=Communication
|
||||
maintainer=Ayush Sharma <asrocks5@gmail.com>
|
||||
sentence=OTA updates made slick and simple for everyone!
|
||||
paragraph=A OTA library which provides an interactive portal for your over-the-air updates for wireless microcontrollers.
|
||||
url=https://github.com/ayushsharma82/ElegantOTA
|
||||
architectures=esp8266,esp32,rp2040
|
103
Software/src/lib/ayushsharma82-ElegantOTA/platformio_upload.py
Normal file
103
Software/src/lib/ayushsharma82-ElegantOTA/platformio_upload.py
Normal file
|
@ -0,0 +1,103 @@
|
|||
# Allows PlatformIO to upload directly to ElegantOTA
|
||||
#
|
||||
# To use:
|
||||
# - copy this script into the same folder as your platformio.ini
|
||||
# - set the following for your project in platformio.ini:
|
||||
#
|
||||
# extra_scripts = platformio_upload.py
|
||||
# upload_protocol = custom
|
||||
# upload_url = <your upload URL>
|
||||
#
|
||||
# An example of an upload URL:
|
||||
# upload_url = http://192.168.1.123/update
|
||||
# also possible: upload_url = http://domainname/update
|
||||
|
||||
import requests
|
||||
import hashlib
|
||||
from urllib.parse import urlparse
|
||||
import time
|
||||
Import("env")
|
||||
|
||||
try:
|
||||
from requests_toolbelt import MultipartEncoder, MultipartEncoderMonitor
|
||||
from tqdm import tqdm
|
||||
except ImportError:
|
||||
env.Execute("$PYTHONEXE -m pip install requests_toolbelt")
|
||||
env.Execute("$PYTHONEXE -m pip install tqdm")
|
||||
from requests_toolbelt import MultipartEncoder, MultipartEncoderMonitor
|
||||
from tqdm import tqdm
|
||||
|
||||
def on_upload(source, target, env):
|
||||
firmware_path = str(source[0])
|
||||
upload_url_compatibility = env.GetProjectOption('upload_url')
|
||||
upload_url = upload_url_compatibility.replace("/update", "")
|
||||
|
||||
with open(firmware_path, 'rb') as firmware:
|
||||
md5 = hashlib.md5(firmware.read()).hexdigest()
|
||||
|
||||
parsed_url = urlparse(upload_url)
|
||||
host_ip = parsed_url.netloc
|
||||
|
||||
# Führe die GET-Anfrage aus
|
||||
start_url = f"{upload_url}/ota/start?mode=fr&hash={md5}"
|
||||
|
||||
start_headers = {
|
||||
'Host': host_ip,
|
||||
'User-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/118.0',
|
||||
'Accept': '*/*',
|
||||
'Accept-Language': 'de,en-US;q=0.7,en;q=0.3',
|
||||
'Accept-Encoding': 'gzip, deflate',
|
||||
'Referer': f'{upload_url}/update',
|
||||
'Connection': 'keep-alive'
|
||||
}
|
||||
|
||||
start_response = requests.get(start_url, headers=start_headers)
|
||||
|
||||
if start_response.status_code != 200:
|
||||
print("start-request faild " + str(start_response.status_code))
|
||||
return
|
||||
|
||||
firmware.seek(0)
|
||||
encoder = MultipartEncoder(fields={
|
||||
'MD5': md5,
|
||||
'firmware': ('firmware', firmware, 'application/octet-stream')}
|
||||
)
|
||||
|
||||
bar = tqdm(desc='Upload Progress',
|
||||
total=encoder.len,
|
||||
dynamic_ncols=True,
|
||||
unit='B',
|
||||
unit_scale=True,
|
||||
unit_divisor=1024
|
||||
)
|
||||
|
||||
monitor = MultipartEncoderMonitor(encoder, lambda monitor: bar.update(monitor.bytes_read - bar.n))
|
||||
|
||||
post_headers = {
|
||||
'Host': host_ip,
|
||||
'User-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/118.0',
|
||||
'Accept': '*/*',
|
||||
'Accept-Language': 'de,en-US;q=0.7,en;q=0.3',
|
||||
'Accept-Encoding': 'gzip, deflate',
|
||||
'Referer': f'{upload_url}/update',
|
||||
'Connection': 'keep-alive',
|
||||
'Content-Type': monitor.content_type,
|
||||
'Content-Length': str(monitor.len),
|
||||
'Origin': f'{upload_url}'
|
||||
}
|
||||
|
||||
|
||||
response = requests.post(f"{upload_url}/ota/upload", data=monitor, headers=post_headers)
|
||||
|
||||
bar.close()
|
||||
time.sleep(0.1)
|
||||
|
||||
if response.status_code != 200:
|
||||
message = "\nUpload faild.\nServer response: " + response.text
|
||||
tqdm.write(message)
|
||||
else:
|
||||
message = "\nUpload successful.\nServer response: " + response.text
|
||||
tqdm.write(message)
|
||||
|
||||
|
||||
env.Replace(UPLOADCMD=on_upload)
|
348
Software/src/lib/ayushsharma82-ElegantOTA/src/ElegantOTA.cpp
Normal file
348
Software/src/lib/ayushsharma82-ElegantOTA/src/ElegantOTA.cpp
Normal file
|
@ -0,0 +1,348 @@
|
|||
#include "ElegantOTA.h"
|
||||
|
||||
ElegantOTAClass::ElegantOTAClass(){}
|
||||
|
||||
void ElegantOTAClass::begin(ELEGANTOTA_WEBSERVER *server, const char * username, const char * password){
|
||||
_server = server;
|
||||
|
||||
setAuth(username, password);
|
||||
|
||||
#if defined(TARGET_RP2040)
|
||||
if (!__isPicoW) {
|
||||
ELEGANTOTA_DEBUG_MSG("RP2040: Not a Pico W, skipping OTA setup\n");
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
|
||||
#if ELEGANTOTA_USE_ASYNC_WEBSERVER == 1
|
||||
_server->on("/update", HTTP_GET, [&](AsyncWebServerRequest *request){
|
||||
if(_authenticate && !request->authenticate(_username, _password)){
|
||||
return request->requestAuthentication();
|
||||
}
|
||||
AsyncWebServerResponse *response = request->beginResponse_P(200, "text/html", ELEGANT_HTML, sizeof(ELEGANT_HTML));
|
||||
response->addHeader("Content-Encoding", "gzip");
|
||||
request->send(response);
|
||||
});
|
||||
#else
|
||||
_server->on("/update", HTTP_GET, [&](){
|
||||
if (_authenticate && !_server->authenticate(_username, _password)) {
|
||||
return _server->requestAuthentication();
|
||||
}
|
||||
_server->sendHeader("Content-Encoding", "gzip");
|
||||
_server->send_P(200, "text/html", (const char*)ELEGANT_HTML, sizeof(ELEGANT_HTML));
|
||||
});
|
||||
#endif
|
||||
|
||||
#if ELEGANTOTA_USE_ASYNC_WEBSERVER == 1
|
||||
_server->on("/ota/start", HTTP_GET, [&](AsyncWebServerRequest *request) {
|
||||
if (_authenticate && !request->authenticate(_username, _password)) {
|
||||
return request->requestAuthentication();
|
||||
}
|
||||
|
||||
// Get header x-ota-mode value, if present
|
||||
OTA_Mode mode = OTA_MODE_FIRMWARE;
|
||||
// Get mode from arg
|
||||
if (request->hasParam("mode")) {
|
||||
String argValue = request->getParam("mode")->value();
|
||||
if (argValue == "fs") {
|
||||
ELEGANTOTA_DEBUG_MSG("OTA Mode: Filesystem\n");
|
||||
mode = OTA_MODE_FILESYSTEM;
|
||||
} else {
|
||||
ELEGANTOTA_DEBUG_MSG("OTA Mode: Firmware\n");
|
||||
mode = OTA_MODE_FIRMWARE;
|
||||
}
|
||||
}
|
||||
|
||||
// Get file MD5 hash from arg
|
||||
if (request->hasParam("hash")) {
|
||||
String hash = request->getParam("hash")->value();
|
||||
ELEGANTOTA_DEBUG_MSG(String("MD5: "+hash+"\n").c_str());
|
||||
if (!Update.setMD5(hash.c_str())) {
|
||||
ELEGANTOTA_DEBUG_MSG("ERROR: MD5 hash not valid\n");
|
||||
return request->send(400, "text/plain", "MD5 parameter invalid");
|
||||
}
|
||||
}
|
||||
|
||||
#if UPDATE_DEBUG == 1
|
||||
// Serial output must be active to see the callback serial prints
|
||||
Serial.setDebugOutput(true);
|
||||
#endif
|
||||
|
||||
// Pre-OTA update callback
|
||||
if (preUpdateCallback != NULL) preUpdateCallback();
|
||||
|
||||
// Start update process
|
||||
#if defined(ESP8266)
|
||||
uint32_t update_size = mode == OTA_MODE_FILESYSTEM ? ((size_t)FS_end - (size_t)FS_start) : ((ESP.getFreeSketchSpace() - 0x1000) & 0xFFFFF000);
|
||||
if (mode == OTA_MODE_FILESYSTEM) {
|
||||
close_all_fs();
|
||||
}
|
||||
Update.runAsync(true);
|
||||
if (!Update.begin(update_size, mode == OTA_MODE_FILESYSTEM ? U_FS : U_FLASH)) {
|
||||
ELEGANTOTA_DEBUG_MSG("Failed to start update process\n");
|
||||
// Save error to string
|
||||
StreamString str;
|
||||
Update.printError(str);
|
||||
_update_error_str = str.c_str();
|
||||
_update_error_str += "\n";
|
||||
ELEGANTOTA_DEBUG_MSG(_update_error_str.c_str());
|
||||
}
|
||||
#elif defined(ESP32)
|
||||
if (!Update.begin(UPDATE_SIZE_UNKNOWN, mode == OTA_MODE_FILESYSTEM ? U_SPIFFS : U_FLASH)) {
|
||||
ELEGANTOTA_DEBUG_MSG("Failed to start update process\n");
|
||||
// Save error to string
|
||||
StreamString str;
|
||||
Update.printError(str);
|
||||
_update_error_str = str.c_str();
|
||||
_update_error_str += "\n";
|
||||
ELEGANTOTA_DEBUG_MSG(_update_error_str.c_str());
|
||||
}
|
||||
#endif
|
||||
|
||||
return request->send((Update.hasError()) ? 400 : 200, "text/plain", (Update.hasError()) ? _update_error_str.c_str() : "OK");
|
||||
});
|
||||
#else
|
||||
_server->on("/ota/start", HTTP_GET, [&]() {
|
||||
if (_authenticate && !_server->authenticate(_username, _password)) {
|
||||
return _server->requestAuthentication();
|
||||
}
|
||||
|
||||
// Get header x-ota-mode value, if present
|
||||
OTA_Mode mode = OTA_MODE_FIRMWARE;
|
||||
// Get mode from arg
|
||||
if (_server->hasArg("mode")) {
|
||||
String argValue = _server->arg("mode");
|
||||
if (argValue == "fs") {
|
||||
ELEGANTOTA_DEBUG_MSG("OTA Mode: Filesystem\n");
|
||||
mode = OTA_MODE_FILESYSTEM;
|
||||
} else {
|
||||
ELEGANTOTA_DEBUG_MSG("OTA Mode: Firmware\n");
|
||||
mode = OTA_MODE_FIRMWARE;
|
||||
}
|
||||
}
|
||||
|
||||
// Get file MD5 hash from arg
|
||||
if (_server->hasArg("hash")) {
|
||||
String hash = _server->arg("hash");
|
||||
ELEGANTOTA_DEBUG_MSG(String("MD5: "+hash+"\n").c_str());
|
||||
if (!Update.setMD5(hash.c_str())) {
|
||||
ELEGANTOTA_DEBUG_MSG("ERROR: MD5 hash not valid\n");
|
||||
return _server->send(400, "text/plain", "MD5 parameter invalid");
|
||||
}
|
||||
}
|
||||
|
||||
#if UPDATE_DEBUG == 1
|
||||
// Serial output must be active to see the callback serial prints
|
||||
Serial.setDebugOutput(true);
|
||||
#endif
|
||||
|
||||
// Pre-OTA update callback
|
||||
if (preUpdateCallback != NULL) preUpdateCallback();
|
||||
|
||||
// Start update process
|
||||
#if defined(ESP8266)
|
||||
uint32_t update_size = mode == OTA_MODE_FILESYSTEM ? ((size_t)FS_end - (size_t)FS_start) : ((ESP.getFreeSketchSpace() - 0x1000) & 0xFFFFF000);
|
||||
if (mode == OTA_MODE_FILESYSTEM) {
|
||||
close_all_fs();
|
||||
}
|
||||
Update.runAsync(true);
|
||||
if (!Update.begin(update_size, mode == OTA_MODE_FILESYSTEM ? U_FS : U_FLASH)) {
|
||||
ELEGANTOTA_DEBUG_MSG("Failed to start update process\n");
|
||||
// Save error to string
|
||||
StreamString str;
|
||||
Update.printError(str);
|
||||
_update_error_str = str.c_str();
|
||||
_update_error_str += "\n";
|
||||
ELEGANTOTA_DEBUG_MSG(_update_error_str.c_str());
|
||||
}
|
||||
#elif defined(ESP32)
|
||||
if (!Update.begin(UPDATE_SIZE_UNKNOWN, mode == OTA_MODE_FILESYSTEM ? U_SPIFFS : U_FLASH)) {
|
||||
ELEGANTOTA_DEBUG_MSG("Failed to start update process\n");
|
||||
// Save error to string
|
||||
StreamString str;
|
||||
Update.printError(str);
|
||||
_update_error_str = str.c_str();
|
||||
_update_error_str += "\n";
|
||||
ELEGANTOTA_DEBUG_MSG(_update_error_str.c_str());
|
||||
}
|
||||
#elif defined(TARGET_RP2040)
|
||||
uint32_t update_size = 0;
|
||||
// Gather FS Size
|
||||
if (mode == OTA_MODE_FILESYSTEM) {
|
||||
update_size = ((size_t)&_FS_end - (size_t)&_FS_start);
|
||||
LittleFS.end();
|
||||
} else {
|
||||
FSInfo64 i;
|
||||
LittleFS.begin();
|
||||
LittleFS.info64(i);
|
||||
update_size = i.totalBytes - i.usedBytes;
|
||||
}
|
||||
// Start update process
|
||||
if (!Update.begin(update_size, mode == OTA_MODE_FILESYSTEM ? U_FS : U_FLASH)) {
|
||||
ELEGANTOTA_DEBUG_MSG("Failed to start update process because there is not enough space\n");
|
||||
_update_error_str = "Not enough space";
|
||||
return _server->send(400, "text/plain", _update_error_str.c_str());
|
||||
}
|
||||
#endif
|
||||
|
||||
return _server->send((Update.hasError()) ? 400 : 200, "text/plain", (Update.hasError()) ? _update_error_str.c_str() : "OK");
|
||||
});
|
||||
#endif
|
||||
|
||||
#if ELEGANTOTA_USE_ASYNC_WEBSERVER == 1
|
||||
_server->on("/ota/upload", HTTP_POST, [&](AsyncWebServerRequest *request) {
|
||||
if(_authenticate && !request->authenticate(_username, _password)){
|
||||
return request->requestAuthentication();
|
||||
}
|
||||
// Post-OTA update callback
|
||||
if (postUpdateCallback != NULL) postUpdateCallback(!Update.hasError());
|
||||
AsyncWebServerResponse *response = request->beginResponse((Update.hasError()) ? 400 : 200, "text/plain", (Update.hasError()) ? _update_error_str.c_str() : "OK");
|
||||
response->addHeader("Connection", "close");
|
||||
response->addHeader("Access-Control-Allow-Origin", "*");
|
||||
request->send(response);
|
||||
// Set reboot flag
|
||||
if (!Update.hasError()) {
|
||||
if (_auto_reboot) {
|
||||
_reboot_request_millis = millis();
|
||||
_reboot = true;
|
||||
}
|
||||
}
|
||||
}, [&](AsyncWebServerRequest *request, String filename, size_t index, uint8_t *data, size_t len, bool final) {
|
||||
//Upload handler chunks in data
|
||||
if(_authenticate){
|
||||
if(!request->authenticate(_username, _password)){
|
||||
return request->requestAuthentication();
|
||||
}
|
||||
}
|
||||
|
||||
if (!index) {
|
||||
// Reset progress size on first frame
|
||||
_current_progress_size = 0;
|
||||
}
|
||||
|
||||
// Write chunked data to the free sketch space
|
||||
if(len){
|
||||
if (Update.write(data, len) != len) {
|
||||
return request->send(400, "text/plain", "Failed to write chunked data to free space");
|
||||
}
|
||||
_current_progress_size += len;
|
||||
// Progress update callback
|
||||
if (progressUpdateCallback != NULL) progressUpdateCallback(_current_progress_size, request->contentLength());
|
||||
}
|
||||
|
||||
if (final) { // if the final flag is set then this is the last frame of data
|
||||
if (!Update.end(true)) { //true to set the size to the current progress
|
||||
// Save error to string
|
||||
StreamString str;
|
||||
Update.printError(str);
|
||||
_update_error_str = str.c_str();
|
||||
_update_error_str += "\n";
|
||||
ELEGANTOTA_DEBUG_MSG(_update_error_str.c_str());
|
||||
}
|
||||
}else{
|
||||
return;
|
||||
}
|
||||
});
|
||||
#else
|
||||
_server->on("/ota/upload", HTTP_POST, [&](){
|
||||
if (_authenticate && !_server->authenticate(_username, _password)) {
|
||||
return _server->requestAuthentication();
|
||||
}
|
||||
// Post-OTA update callback
|
||||
if (postUpdateCallback != NULL) postUpdateCallback(!Update.hasError());
|
||||
_server->sendHeader("Connection", "close");
|
||||
_server->send((Update.hasError()) ? 400 : 200, "text/plain", (Update.hasError()) ? _update_error_str.c_str() : "OK");
|
||||
// Set reboot flag
|
||||
if (!Update.hasError()) {
|
||||
if (_auto_reboot) {
|
||||
_reboot_request_millis = millis();
|
||||
_reboot = true;
|
||||
}
|
||||
}
|
||||
}, [&](){
|
||||
// Actual OTA Download
|
||||
HTTPUpload& upload = _server->upload();
|
||||
if (upload.status == UPLOAD_FILE_START) {
|
||||
// Check authentication
|
||||
if (_authenticate && !_server->authenticate(_username, _password)) {
|
||||
ELEGANTOTA_DEBUG_MSG("Authentication Failed on UPLOAD_FILE_START\n");
|
||||
return;
|
||||
}
|
||||
Serial.printf("Update Received: %s\n", upload.filename.c_str());
|
||||
_current_progress_size = 0;
|
||||
} else if (upload.status == UPLOAD_FILE_WRITE) {
|
||||
if (Update.write(upload.buf, upload.currentSize) != upload.currentSize) {
|
||||
#if UPDATE_DEBUG == 1
|
||||
Update.printError(Serial);
|
||||
#endif
|
||||
}
|
||||
|
||||
_current_progress_size += upload.currentSize;
|
||||
// Progress update callback
|
||||
if (progressUpdateCallback != NULL) progressUpdateCallback(_current_progress_size, upload.totalSize);
|
||||
} else if (upload.status == UPLOAD_FILE_END) {
|
||||
if (Update.end(true)) {
|
||||
ELEGANTOTA_DEBUG_MSG(String("Update Success: "+String(upload.totalSize)+"\n").c_str());
|
||||
} else {
|
||||
ELEGANTOTA_DEBUG_MSG("[!] Update Failed\n");
|
||||
// Store error to string
|
||||
StreamString str;
|
||||
Update.printError(str);
|
||||
_update_error_str = str.c_str();
|
||||
_update_error_str += "\n";
|
||||
ELEGANTOTA_DEBUG_MSG(_update_error_str.c_str());
|
||||
}
|
||||
|
||||
#if UPDATE_DEBUG == 1
|
||||
Serial.setDebugOutput(false);
|
||||
#endif
|
||||
} else {
|
||||
ELEGANTOTA_DEBUG_MSG(String("Update Failed Unexpectedly (likely broken connection): status="+String(upload.status)+"\n").c_str());
|
||||
}
|
||||
});
|
||||
#endif
|
||||
}
|
||||
|
||||
void ElegantOTAClass::setAuth(const char * username, const char * password){
|
||||
if (strlen(username) > 0 && strlen(password) > 0) {
|
||||
strlcpy(_username, username, sizeof(_username));
|
||||
strlcpy(_password, password, sizeof(_password));
|
||||
_authenticate = true;
|
||||
}
|
||||
}
|
||||
|
||||
void ElegantOTAClass::clearAuth(){
|
||||
_authenticate = false;
|
||||
}
|
||||
|
||||
void ElegantOTAClass::setAutoReboot(bool enable){
|
||||
_auto_reboot = enable;
|
||||
}
|
||||
|
||||
void ElegantOTAClass::loop() {
|
||||
// Check if 2 seconds have passed since _reboot_request_millis was set
|
||||
if (_reboot && millis() - _reboot_request_millis > 2000) {
|
||||
ELEGANTOTA_DEBUG_MSG("Rebooting...\n");
|
||||
#if defined(ESP8266) || defined(ESP32)
|
||||
ESP.restart();
|
||||
#elif defined(TARGET_RP2040)
|
||||
rp2040.reboot();
|
||||
#endif
|
||||
_reboot = false;
|
||||
}
|
||||
}
|
||||
|
||||
void ElegantOTAClass::onStart(std::function<void()> callable){
|
||||
preUpdateCallback = callable;
|
||||
}
|
||||
|
||||
void ElegantOTAClass::onProgress(std::function<void(size_t current, size_t final)> callable){
|
||||
progressUpdateCallback= callable;
|
||||
}
|
||||
|
||||
void ElegantOTAClass::onEnd(std::function<void(bool success)> callable){
|
||||
postUpdateCallback = callable;
|
||||
}
|
||||
|
||||
|
||||
ElegantOTAClass ElegantOTA;
|
138
Software/src/lib/ayushsharma82-ElegantOTA/src/ElegantOTA.h
Normal file
138
Software/src/lib/ayushsharma82-ElegantOTA/src/ElegantOTA.h
Normal file
|
@ -0,0 +1,138 @@
|
|||
/**
|
||||
_____ _ _ ___ _____ _
|
||||
| ____| | ___ __ _ __ _ _ __ | |_ / _ \_ _|/ \
|
||||
| _| | |/ _ \/ _` |/ _` | '_ \| __| | | || | / _ \
|
||||
| |___| | __/ (_| | (_| | | | | |_| |_| || |/ ___ \
|
||||
|_____|_|\___|\__, |\__,_|_| |_|\__|\___/ |_/_/ \_\
|
||||
|___/
|
||||
*/
|
||||
|
||||
/**
|
||||
*
|
||||
* @name ElegantOTA
|
||||
* @author Ayush Sharma (ayush@softt.io)
|
||||
* @brief
|
||||
* @version 3.0.0
|
||||
* @date 2023-08-30
|
||||
*/
|
||||
|
||||
#ifndef ElegantOTA_h
|
||||
#define ElegantOTA_h
|
||||
|
||||
#include "Arduino.h"
|
||||
#include "stdlib_noniso.h"
|
||||
#include "elop.h"
|
||||
|
||||
#ifndef ELEGANTOTA_USE_ASYNC_WEBSERVER
|
||||
#define ELEGANTOTA_USE_ASYNC_WEBSERVER 0
|
||||
#endif
|
||||
|
||||
#ifndef ELEGANTOTA_DEBUG
|
||||
#define ELEGANTOTA_DEBUG 0
|
||||
#endif
|
||||
|
||||
#ifndef UPDATE_DEBUG
|
||||
#define UPDATE_DEBUG 0
|
||||
#endif
|
||||
|
||||
#if ELEGANTOTA_DEBUG
|
||||
#define ELEGANTOTA_DEBUG_MSG(x) Serial.printf("%s %s", "[ElegantOTA] ", x)
|
||||
#else
|
||||
#define ELEGANTOTA_DEBUG_MSG(x)
|
||||
#endif
|
||||
|
||||
#if defined(ESP8266)
|
||||
#include <functional>
|
||||
#include "FS.h"
|
||||
#include "LittleFS.h"
|
||||
#include "Updater.h"
|
||||
#include "StreamString.h"
|
||||
#if ELEGANTOTA_USE_ASYNC_WEBSERVER == 1
|
||||
#include "ESPAsyncTCP.h"
|
||||
#include "ESPAsyncWebServer.h"
|
||||
#define ELEGANTOTA_WEBSERVER AsyncWebServer
|
||||
#else
|
||||
#include "ESP8266WiFi.h"
|
||||
#include "WiFiClient.h"
|
||||
#include "ESP8266WebServer.h"
|
||||
#define ELEGANTOTA_WEBSERVER ESP8266WebServer
|
||||
#endif
|
||||
#define HARDWARE "ESP8266"
|
||||
#elif defined(ESP32)
|
||||
#include <functional>
|
||||
#include "FS.h"
|
||||
#include "Update.h"
|
||||
#include "StreamString.h"
|
||||
#if ELEGANTOTA_USE_ASYNC_WEBSERVER == 1
|
||||
#include "AsyncTCP.h"
|
||||
#include "ESPAsyncWebServer.h"
|
||||
#define ELEGANTOTA_WEBSERVER AsyncWebServer
|
||||
#else
|
||||
#include "WiFi.h"
|
||||
#include "WiFiClient.h"
|
||||
#include "WebServer.h"
|
||||
#define ELEGANTOTA_WEBSERVER WebServer
|
||||
#endif
|
||||
#define HARDWARE "ESP32"
|
||||
#elif defined(TARGET_RP2040)
|
||||
#include <functional>
|
||||
#include "Arduino.h"
|
||||
#include "FS.h"
|
||||
#include "LittleFS.h"
|
||||
#include "WiFiClient.h"
|
||||
#include "WiFiServer.h"
|
||||
#include "WebServer.h"
|
||||
#include "WiFiUdp.h"
|
||||
#include "StreamString.h"
|
||||
#include "Updater.h"
|
||||
#define HARDWARE "RP2040"
|
||||
#define ELEGANTOTA_WEBSERVER WebServer
|
||||
// Throw an error if async mode is enabled
|
||||
#if ELEGANTOTA_USE_ASYNC_WEBSERVER == 1
|
||||
#error "Async mode is not supported on RP2040. Please set ELEGANTOTA_USE_ASYNC_WEBSERVER to 0."
|
||||
#endif
|
||||
extern uint8_t _FS_start;
|
||||
extern uint8_t _FS_end;
|
||||
#endif
|
||||
|
||||
enum OTA_Mode {
|
||||
OTA_MODE_FIRMWARE = 0,
|
||||
OTA_MODE_FILESYSTEM = 1
|
||||
};
|
||||
|
||||
class ElegantOTAClass{
|
||||
public:
|
||||
ElegantOTAClass();
|
||||
|
||||
void begin(ELEGANTOTA_WEBSERVER *server, const char * username = "", const char * password = "");
|
||||
|
||||
void setAuth(const char * username, const char * password);
|
||||
void clearAuth();
|
||||
void setAutoReboot(bool enable);
|
||||
void loop();
|
||||
|
||||
void onStart(std::function<void()> callable);
|
||||
void onProgress(std::function<void(size_t current, size_t final)> callable);
|
||||
void onEnd(std::function<void(bool success)> callable);
|
||||
|
||||
private:
|
||||
ELEGANTOTA_WEBSERVER *_server;
|
||||
|
||||
bool _authenticate;
|
||||
char _username[64];
|
||||
char _password[64];
|
||||
|
||||
bool _auto_reboot = true;
|
||||
bool _reboot = false;
|
||||
unsigned long _reboot_request_millis = 0;
|
||||
|
||||
String _update_error_str = "";
|
||||
unsigned long _current_progress_size;
|
||||
|
||||
std::function<void()> preUpdateCallback = NULL;
|
||||
std::function<void(size_t current, size_t final)> progressUpdateCallback = NULL;
|
||||
std::function<void(bool success)> postUpdateCallback = NULL;
|
||||
};
|
||||
|
||||
extern ElegantOTAClass ElegantOTA;
|
||||
#endif
|
324
Software/src/lib/ayushsharma82-ElegantOTA/src/elop.cpp
Normal file
324
Software/src/lib/ayushsharma82-ElegantOTA/src/elop.cpp
Normal file
|
@ -0,0 +1,324 @@
|
|||
#include "elop.h"
|
||||
|
||||
const uint8_t ELEGANT_HTML[9590] PROGMEM = {
|
||||
31,139,8,0,0,0,0,0,2,3,164,87,215,118,227,56,18,125,159,175,160,120,206,112,8,11,162,37,89,150,
|
||||
213,146,224,206,189,157,28,38,7,175,183,15,12,130,34,218,16,192,1,64,135,149,245,239,91,32,21,219,158,224,
|
||||
157,23,34,85,221,91,9,129,227,70,170,153,187,45,120,144,187,169,60,28,251,111,32,169,154,144,144,171,16,198,
|
||||
156,166,135,227,41,119,52,96,57,53,150,59,18,254,248,195,155,214,32,92,204,42,58,229,36,188,18,252,186,208,
|
||||
198,133,1,211,202,113,5,82,215,34,117,57,73,249,149,96,188,85,13,176,80,194,9,42,91,150,81,201,73,7,
|
||||
32,156,112,146,31,190,150,124,66,149,59,249,225,121,240,81,56,62,222,173,167,199,150,25,81,184,0,204,3,138,
|
||||
169,78,75,201,129,192,104,107,181,17,19,161,14,191,138,179,82,49,39,180,138,209,12,152,173,11,50,2,14,149,
|
||||
83,48,33,97,134,83,199,1,220,143,226,80,10,117,25,162,196,112,249,81,88,55,18,89,156,69,81,150,216,178,
|
||||
240,150,219,205,126,188,96,43,64,88,211,52,68,200,112,87,26,53,202,180,137,107,30,26,232,44,88,81,253,94,
|
||||
114,115,251,61,151,156,57,109,158,75,25,127,227,217,206,64,157,124,1,117,254,13,66,105,76,209,72,241,235,224,
|
||||
168,116,212,91,127,114,97,185,185,226,38,166,228,112,182,230,96,158,131,34,176,148,37,85,16,8,9,89,46,100,
|
||||
234,29,8,209,90,80,120,65,150,208,52,229,233,177,78,185,69,34,113,116,114,76,167,149,206,199,119,199,31,194,
|
||||
40,18,222,119,24,111,91,4,11,105,44,208,28,37,186,182,34,94,122,133,103,43,178,97,163,141,109,121,225,12,
|
||||
231,208,157,163,209,50,238,129,141,233,50,244,140,204,230,163,58,80,1,77,132,114,124,98,132,187,141,162,152,173,
|
||||
71,100,99,5,97,10,38,101,220,24,110,78,181,20,172,150,221,158,34,95,202,120,173,170,8,78,170,34,240,14,
|
||||
149,150,183,152,225,41,87,190,190,108,248,148,37,27,67,18,10,197,100,153,242,112,120,79,147,42,173,110,167,186,
|
||||
188,175,163,167,194,133,195,47,38,45,68,180,85,23,95,136,217,124,21,133,212,71,1,242,68,19,94,44,107,197,
|
||||
247,73,163,61,90,6,199,71,106,148,113,199,114,16,203,193,39,204,208,124,142,98,52,146,154,81,249,189,211,134,
|
||||
78,120,226,114,94,103,45,165,230,50,188,187,107,196,97,53,5,78,4,155,130,40,138,174,133,74,245,117,50,165,
|
||||
128,121,196,83,65,227,48,46,170,96,217,22,211,82,27,216,105,94,117,24,120,44,20,162,90,148,219,167,241,170,
|
||||
114,151,157,197,54,73,152,164,214,250,148,251,106,138,107,35,16,94,137,79,248,82,242,197,237,187,197,250,145,78,
|
||||
249,203,156,179,203,11,125,3,28,204,119,121,10,174,163,225,223,225,49,124,170,175,248,63,163,234,160,209,99,244,
|
||||
192,181,215,87,32,224,249,185,226,38,14,25,84,214,101,136,55,142,147,255,195,142,71,135,245,129,196,215,75,143,
|
||||
139,220,159,160,73,49,201,93,136,54,119,236,243,88,162,217,98,155,202,40,146,201,167,79,220,30,85,71,66,20,
|
||||
157,92,124,230,204,37,133,209,78,251,35,39,201,169,61,185,86,167,70,23,220,184,219,4,24,100,44,113,152,242,
|
||||
140,150,18,144,159,202,100,209,31,202,249,21,53,193,71,50,227,55,213,41,58,156,205,231,248,102,107,56,218,60,
|
||||
176,189,180,36,225,243,23,47,95,189,126,243,175,183,239,222,127,248,120,116,124,114,250,237,119,223,255,240,227,79,
|
||||
63,255,242,235,111,244,130,1,246,36,23,159,47,229,84,233,226,119,99,93,121,117,125,115,251,223,118,167,187,215,
|
||||
219,239,31,12,158,52,119,33,107,100,6,246,202,225,10,219,226,116,229,162,29,143,211,59,123,120,120,184,215,109,
|
||||
165,115,12,130,230,15,5,65,164,150,5,65,174,82,65,213,134,104,181,193,109,82,109,103,83,250,131,158,144,227,
|
||||
114,122,193,13,90,32,100,137,55,3,64,7,40,234,244,15,58,157,39,123,251,119,171,201,110,15,69,189,238,193,
|
||||
160,187,191,191,215,111,87,87,137,143,64,74,218,163,116,108,19,201,213,196,229,163,180,217,68,246,44,61,39,89,
|
||||
82,91,16,251,17,26,45,141,4,15,168,74,245,244,197,173,227,118,203,186,53,224,217,249,200,30,182,71,182,213,
|
||||
66,105,82,148,54,143,143,168,203,147,76,106,109,234,110,141,17,163,157,238,126,31,173,192,193,235,11,15,251,131,
|
||||
254,89,155,244,143,209,49,37,109,204,192,110,186,182,155,54,155,152,53,201,0,165,103,12,2,184,127,126,71,236,
|
||||
25,61,31,143,187,189,22,251,122,175,187,193,113,13,224,192,241,231,30,96,186,133,191,3,8,20,224,151,14,1,
|
||||
118,197,2,31,32,160,64,16,65,92,31,240,228,45,191,249,115,142,109,31,150,248,158,192,131,247,80,226,244,247,
|
||||
206,8,53,137,59,16,42,188,185,30,117,246,183,151,215,252,201,103,45,84,28,194,206,195,57,191,121,164,179,222,
|
||||
211,238,210,146,194,191,186,222,41,7,165,7,55,48,148,94,76,113,23,225,206,131,121,123,65,45,239,247,30,195,
|
||||
179,135,150,2,108,145,176,78,255,14,58,205,14,116,7,85,175,123,142,5,232,137,113,111,36,32,66,116,103,208,
|
||||
20,59,253,49,89,229,102,240,116,97,171,76,252,35,241,185,139,125,9,244,119,226,189,150,64,81,127,15,161,225,
|
||||
66,32,36,225,131,49,186,168,236,126,40,76,22,104,12,47,36,101,60,222,61,251,207,243,214,111,237,214,147,230,
|
||||
191,119,207,119,197,4,131,238,232,175,10,147,145,102,147,126,221,67,172,65,218,81,180,76,159,76,132,74,249,205,
|
||||
9,236,232,165,205,180,213,65,40,170,182,71,161,175,227,46,110,117,119,88,115,128,96,122,60,102,59,221,187,135,
|
||||
116,16,242,158,182,96,121,35,27,243,209,77,178,56,244,72,86,221,240,222,192,183,100,53,139,223,144,89,233,178,
|
||||
193,112,102,171,218,185,231,248,250,132,126,147,92,8,149,108,137,197,165,226,150,209,130,199,92,49,157,242,31,191,
|
||||
123,247,82,79,11,173,184,114,160,137,208,170,28,234,202,124,8,54,229,247,52,23,152,53,225,22,64,13,58,199,
|
||||
176,240,103,22,47,51,145,249,76,88,200,130,29,203,101,22,44,20,78,182,89,36,47,129,30,2,104,209,214,190,
|
||||
205,238,153,254,120,252,90,51,201,140,158,190,92,16,197,242,204,158,163,53,203,186,242,192,171,119,228,205,104,119,
|
||||
167,241,85,176,19,188,226,142,155,169,80,60,16,89,64,85,160,171,219,48,16,54,160,193,139,50,203,184,1,41,
|
||||
47,248,140,150,46,215,38,8,130,55,220,63,40,131,231,23,186,188,204,105,42,62,243,60,24,231,206,21,118,184,
|
||||
187,155,85,139,137,54,147,195,74,75,10,198,149,229,65,112,244,238,7,152,216,245,222,156,144,7,210,35,27,68,
|
||||
149,18,110,231,248,8,102,239,238,78,171,111,163,1,151,181,176,181,37,104,190,190,210,143,214,170,32,179,121,69,
|
||||
69,145,191,197,117,22,108,205,38,75,16,66,194,37,72,24,69,15,203,0,246,250,161,123,186,97,228,10,217,112,
|
||||
154,190,145,154,186,143,175,183,1,87,18,214,123,190,189,118,20,47,166,227,54,110,67,121,221,127,25,188,197,25,
|
||||
121,151,248,125,2,217,62,193,41,12,160,2,49,93,7,140,97,129,102,108,251,74,174,211,255,84,248,255,157,106,
|
||||
127,192,136,0,53,168,82,115,11,207,124,146,126,177,157,24,26,50,146,221,159,244,31,16,127,110,12,189,93,191,
|
||||
136,106,163,235,135,16,3,203,135,141,90,64,216,170,5,157,40,218,50,169,65,200,143,66,185,65,181,12,25,101,
|
||||
132,173,47,13,180,62,192,12,145,201,230,245,11,72,184,32,108,117,200,98,69,58,7,123,221,253,65,15,222,21,
|
||||
152,147,86,247,0,198,123,131,131,39,88,147,214,106,169,135,29,89,174,12,112,9,219,164,28,155,229,54,41,97,
|
||||
155,152,179,242,156,196,254,235,15,120,104,235,75,116,227,201,178,88,236,246,150,171,131,173,151,139,57,43,22,55,
|
||||
124,167,59,24,143,11,184,124,177,57,139,139,102,191,7,243,79,198,227,30,106,118,122,231,164,88,185,54,37,52,
|
||||
249,148,101,120,226,219,201,4,231,190,205,115,124,235,91,33,238,91,73,58,253,186,10,94,18,133,191,39,28,95,
|
||||
18,141,63,17,55,82,100,26,43,204,177,198,14,56,203,255,177,85,247,184,21,227,48,16,128,207,19,172,12,112,
|
||||
56,252,61,204,43,23,73,183,77,154,220,126,45,41,205,139,220,143,136,15,67,194,254,71,94,35,199,21,37,149,
|
||||
209,140,143,241,125,7,190,199,142,204,0,94,3,58,46,86,123,152,215,157,248,239,78,204,231,51,51,19,122,39,
|
||||
114,132,4,196,11,253,49,254,189,3,243,249,140,204,0,95,67,239,17,16,51,87,39,229,99,252,101,216,98,32,
|
||||
195,80,213,121,50,124,49,160,34,82,98,250,192,136,197,184,96,73,37,104,56,33,185,33,230,41,222,197,147,81,
|
||||
147,129,76,17,186,33,78,70,239,54,208,94,6,51,228,233,128,108,136,169,4,79,3,176,17,232,22,19,67,232,
|
||||
201,128,46,71,137,133,48,74,79,7,184,33,38,52,64,240,192,176,205,128,139,138,168,182,60,88,124,89,160,12,
|
||||
167,83,123,82,62,223,41,175,225,247,144,240,236,112,200,148,124,190,73,226,53,250,14,72,180,11,130,58,37,159,
|
||||
239,18,220,18,27,97,76,100,130,211,241,249,230,144,155,33,227,98,178,58,41,122,50,124,49,82,224,94,209,56,
|
||||
25,144,233,96,9,66,138,15,8,95,136,43,66,44,139,244,83,97,91,97,226,206,44,171,83,209,83,225,81,102,
|
||||
97,172,7,132,253,150,129,46,97,180,156,14,110,6,42,25,236,192,201,168,197,0,130,78,184,224,100,128,123,41,
|
||||
102,22,5,139,60,37,186,32,14,19,102,217,201,200,197,64,210,169,101,201,147,1,221,117,160,53,66,50,105,19,
|
||||
242,245,119,43,54,215,86,238,53,13,95,111,134,122,13,96,92,42,170,158,102,193,201,248,58,79,35,6,138,45,
|
||||
20,15,157,142,175,119,135,221,14,142,139,78,105,247,56,21,88,10,56,165,91,37,228,148,216,146,64,83,171,73,
|
||||
127,128,228,116,204,33,110,157,193,39,135,108,7,164,45,41,97,242,32,225,164,68,65,179,145,118,66,100,87,66,
|
||||
47,103,170,234,9,225,134,164,170,43,58,251,132,196,114,100,136,54,170,79,68,175,58,194,132,97,86,121,34,160,
|
||||
91,97,138,130,23,253,84,192,23,195,41,105,234,42,167,66,119,27,221,78,86,56,166,227,231,239,159,101,54,218,
|
||||
21,148,50,155,142,159,55,199,236,92,6,160,81,13,195,98,252,156,223,176,117,233,8,186,181,248,132,252,188,65,
|
||||
110,169,98,92,158,70,19,247,211,1,157,16,164,136,149,123,226,132,112,65,46,84,91,87,132,196,131,68,126,37,
|
||||
226,112,229,201,192,102,168,184,181,106,118,159,144,90,142,74,18,164,247,233,128,111,8,37,128,52,59,25,241,171,
|
||||
240,16,116,177,228,1,194,37,1,165,225,8,123,128,216,222,140,185,43,37,229,1,130,13,1,84,20,194,236,147,
|
||||
162,139,146,168,172,84,239,19,210,187,17,26,103,239,251,66,254,103,196,12,48,24,136,129,40,122,155,72,252,160,
|
||||
0,236,6,244,8,5,84,83,84,216,81,54,49,6,144,236,217,155,77,26,20,52,192,199,120,30,224,153,29,215,
|
||||
90,56,151,122,27,112,107,43,186,136,119,91,226,4,207,115,149,209,240,227,129,115,255,202,63,76,89,90,7,253,
|
||||
4,172,101,155,186,123,47,30,113,47,104,82,156,15,82,201,64,239,39,211,32,46,29,171,101,93,67,150,254,207,
|
||||
10,6,84,108,107,170,25,102,202,172,142,105,230,182,77,48,61,251,105,32,209,127,32,123,77,185,58,126,168,53,
|
||||
174,62,55,113,231,123,62,5,203,255,127,119,144,8,182,92,199,71,122,239,201,150,235,69,134,177,173,172,64,68,
|
||||
18,235,120,249,241,221,111,70,192,154,117,122,158,114,111,48,154,62,170,51,243,161,60,167,82,101,199,70,156,2,
|
||||
222,24,233,63,23,115,48,118,0,60,28,30,220,27,79,6,170,168,164,238,133,21,218,133,86,75,143,138,49,183,
|
||||
180,86,58,240,239,73,170,70,73,143,235,185,75,187,122,254,165,44,156,12,23,244,113,238,42,224,196,109,253,172,
|
||||
116,79,14,110,220,216,21,157,244,191,253,123,36,223,120,82,235,48,145,241,58,71,133,255,237,89,166,224,48,61,
|
||||
83,188,175,30,60,79,175,5,135,33,59,73,101,122,249,173,153,105,25,190,33,55,188,16,121,14,37,229,88,174,
|
||||
127,56,49,207,243,49,229,242,157,148,126,165,213,92,131,49,7,84,181,243,195,88,148,37,232,187,7,143,30,166,
|
||||
178,101,183,222,77,11,228,244,55,18,30,124,0,225,115,224,70,149,155,148,55,83,110,86,101,230,33,61,197,21,
|
||||
115,215,133,48,16,4,51,102,66,100,41,193,122,121,234,251,140,167,52,124,91,72,64,62,57,104,92,156,170,164,
|
||||
146,216,104,182,132,77,158,62,167,242,27,78,7,32,175,154,90,218,144,205,130,60,164,249,167,145,240,90,247,240,
|
||||
91,63,150,67,246,120,173,65,115,61,240,235,138,184,222,80,178,46,80,89,134,16,3,214,226,44,48,103,176,147,
|
||||
181,27,7,216,132,20,157,165,111,245,128,178,156,202,16,104,253,9,151,53,76,172,94,57,219,76,202,151,92,88,
|
||||
239,38,234,50,89,6,254,62,234,78,194,60,172,175,146,51,50,148,225,135,253,196,202,123,228,174,46,245,207,54,
|
||||
50,221,54,68,112,165,64,222,233,255,155,89,251,229,130,155,5,126,153,246,159,144,170,166,91,121,172,142,55,215,
|
||||
77,47,198,201,168,58,25,222,140,11,9,249,153,40,222,139,202,99,11,175,108,208,129,149,132,88,170,249,152,28,
|
||||
125,80,225,8,36,24,161,129,54,235,66,165,116,113,147,91,238,60,35,28,232,151,71,15,239,90,91,61,7,172,
|
||||
192,82,81,55,86,21,148,129,255,244,201,254,129,207,124,103,78,231,125,244,177,136,187,207,55,148,127,6,223,143,
|
||||
42,64,58,116,222,172,210,46,97,174,234,50,15,116,76,244,144,111,235,216,34,107,121,113,119,103,39,156,188,119,
|
||||
97,92,231,26,163,100,236,10,141,237,202,226,213,37,255,11,159,189,151,240,136,2,59,158,222,29,97,203,182,118,
|
||||
71,230,168,114,192,79,199,218,99,168,134,23,53,37,249,106,203,167,18,62,99,163,90,180,72,149,180,162,86,198,
|
||||
114,11,217,130,151,115,88,155,228,44,18,177,67,216,39,132,52,253,38,116,32,66,175,77,154,238,161,226,159,160,
|
||||
183,143,6,163,226,31,66,57,86,123,160,187,190,198,24,47,103,83,103,217,120,53,131,52,224,157,83,247,27,84,
|
||||
183,249,92,244,237,54,212,51,192,173,192,63,116,179,107,189,138,105,226,232,84,196,195,250,60,192,85,60,57,160,
|
||||
131,203,153,246,159,49,132,29,224,110,227,218,45,188,238,224,134,220,235,66,226,81,78,28,207,251,33,68,97,203,
|
||||
178,152,87,21,148,168,204,12,169,125,38,153,140,169,229,133,150,159,33,120,22,178,229,32,2,55,89,164,238,17,
|
||||
218,140,106,237,84,194,248,116,61,77,92,32,17,21,251,113,117,28,209,129,56,36,188,47,239,126,249,229,86,81,
|
||||
75,43,42,9,87,2,46,65,219,192,255,85,213,94,70,121,235,82,174,188,186,99,167,74,240,2,74,156,134,30,
|
||||
153,224,113,234,93,177,162,128,216,15,105,31,73,228,239,59,127,58,149,99,83,73,129,92,112,32,174,84,21,132,
|
||||
91,46,107,234,191,147,253,136,181,25,56,110,237,184,107,204,203,183,159,93,29,241,245,218,90,69,198,255,255,237,
|
||||
152,196,248,94,89,213,22,103,224,203,15,40,220,203,176,145,113,165,129,176,110,118,133,233,0,5,196,14,47,56,
|
||||
87,8,63,37,100,58,208,142,240,35,236,211,231,187,147,199,1,121,100,148,243,190,19,132,77,223,106,65,37,118,
|
||||
130,197,93,239,12,242,235,7,84,121,123,80,52,61,157,244,64,13,6,236,145,128,101,122,103,114,225,194,79,219,
|
||||
93,63,19,246,53,209,26,184,124,225,34,75,166,48,83,26,88,194,103,22,116,131,205,4,145,17,167,84,247,152,
|
||||
42,157,131,142,16,50,233,63,221,146,73,118,134,95,199,35,49,74,138,124,0,185,150,143,228,127,240,45,124,15,
|
||||
211,118,131,119,20,217,101,212,55,103,37,158,239,183,212,233,213,72,81,66,180,0,106,18,72,118,227,111,39,209,
|
||||
18,166,199,194,70,116,66,147,42,16,241,252,69,109,112,16,87,220,36,42,212,105,100,249,212,141,36,223,76,34,
|
||||
53,254,27,125,206,80,78,52,227,133,144,171,164,22,145,225,165,137,12,104,49,99,102,101,44,20,81,45,88,132,
|
||||
11,75,66,212,1,216,117,234,151,122,196,179,125,247,123,27,233,217,62,204,21,120,135,247,216,115,53,85,86,177,
|
||||
187,32,79,192,138,140,123,143,161,6,118,77,11,46,217,99,28,241,246,145,63,27,9,241,175,17,107,239,6,249,
|
||||
195,187,85,168,23,194,103,254,192,110,0,156,253,239,175,138,169,146,204,39,86,231,104,122,51,128,227,196,128,104,
|
||||
184,178,37,165,210,5,151,221,32,78,115,225,38,196,230,112,59,85,249,170,41,184,158,139,18,131,54,246,179,40,
|
||||
23,168,165,109,23,186,233,32,56,238,66,55,140,12,241,180,170,234,163,190,91,189,106,249,116,170,147,37,34,64,
|
||||
240,187,235,143,251,51,108,206,133,139,74,122,218,41,147,212,37,210,147,76,47,87,214,66,62,121,31,66,187,216,
|
||||
101,139,61,182,248,154,45,190,97,139,111,217,226,187,134,236,235,226,57,168,229,32,203,243,70,240,230,188,234,155,
|
||||
130,6,188,41,51,86,171,114,222,140,153,160,219,81,141,150,118,93,118,60,205,49,132,69,197,112,237,54,27,243,
|
||||
167,80,165,50,21,207,128,237,223,126,132,223,209,115,152,215,146,107,246,8,74,169,24,130,120,166,216,13,119,157,
|
||||
228,134,61,20,83,232,196,255,203,174,149,104,59,139,194,224,87,113,246,77,28,235,221,237,108,207,49,59,85,180,
|
||||
156,31,197,1,236,114,61,190,251,0,49,82,109,255,229,1,238,222,124,95,12,4,67,76,56,70,150,114,68,175,
|
||||
56,83,54,108,142,241,108,106,27,252,219,176,102,212,13,21,98,8,216,115,250,213,168,123,59,235,190,187,64,159,
|
||||
30,190,90,220,202,116,219,73,205,189,163,138,9,106,248,129,109,15,76,185,32,21,132,10,94,183,249,142,106,230,
|
||||
46,113,214,6,27,199,70,54,57,73,178,7,59,166,179,109,100,103,69,39,249,242,108,240,235,199,219,146,181,38,
|
||||
236,245,117,116,32,40,104,167,89,142,31,198,157,79,167,49,119,73,40,150,157,169,149,236,187,88,251,183,18,99,
|
||||
103,152,42,70,23,107,139,38,111,6,58,178,235,72,95,243,97,37,33,75,220,8,147,91,241,191,138,249,121,171,
|
||||
116,180,44,93,6,76,209,31,112,0,86,198,40,218,234,74,170,38,111,101,59,123,252,135,127,57,18,132,191,38,
|
||||
201,231,94,20,236,218,55,220,252,53,239,23,247,76,167,214,84,193,114,184,106,187,163,197,187,218,215,195,211,106,
|
||||
251,145,58,170,88,107,46,73,222,208,154,193,224,185,79,135,149,44,122,237,58,250,65,246,198,185,153,211,222,200,
|
||||
137,236,57,225,237,129,10,94,66,110,223,211,82,30,225,106,172,8,134,247,197,75,158,227,108,125,225,67,116,199,
|
||||
91,50,57,28,56,59,232,146,195,156,226,103,49,121,207,168,42,246,55,189,119,139,90,113,38,202,237,52,123,34,
|
||||
171,74,51,147,147,172,59,93,76,1,76,92,108,236,91,198,90,185,152,182,123,114,19,120,208,227,220,222,187,254,
|
||||
46,104,66,82,209,125,211,80,117,30,74,174,59,65,207,185,224,218,16,110,88,51,250,227,158,255,122,105,88,92,
|
||||
138,184,44,227,171,188,21,239,85,92,241,186,87,44,134,92,130,129,53,122,63,53,51,195,141,80,19,172,102,109,
|
||||
57,4,64,138,184,23,113,195,218,126,112,163,251,199,45,120,120,43,82,75,78,133,172,135,0,204,187,77,49,191,
|
||||
49,240,38,143,126,115,230,16,29,254,165,150,189,207,129,243,246,188,166,6,217,209,130,155,115,190,153,118,204,23,
|
||||
47,5,189,163,21,154,186,109,229,83,12,224,238,81,82,204,187,103,40,122,165,173,78,39,121,107,152,26,243,146,
|
||||
107,151,152,74,36,166,151,253,70,222,212,177,62,212,241,129,151,76,198,5,181,97,174,99,218,151,92,198,188,82,
|
||||
180,97,49,107,118,172,140,225,21,138,249,86,250,27,184,206,145,13,47,75,193,156,73,48,55,52,244,4,79,62,
|
||||
200,40,139,144,134,99,169,191,208,34,68,221,247,241,173,114,7,75,37,231,127,91,147,83,30,165,219,91,196,25,
|
||||
9,200,47,130,26,6,202,43,44,232,41,105,44,48,139,250,29,59,226,21,40,206,202,240,186,187,163,55,151,242,
|
||||
121,150,59,218,58,54,8,231,89,224,173,221,117,175,82,54,136,232,66,73,33,136,110,105,71,180,81,188,48,45,
|
||||
211,58,119,103,46,39,222,112,115,6,181,90,209,146,51,151,212,149,108,200,252,144,138,86,236,129,211,247,147,70,
|
||||
94,113,82,149,188,165,2,69,45,168,222,179,146,188,50,37,17,107,251,134,217,105,17,216,131,43,20,87,252,74,
|
||||
89,209,226,114,28,229,238,10,111,53,51,11,4,114,211,20,25,81,218,157,174,57,136,240,232,139,170,170,2,137,
|
||||
168,170,119,223,62,188,68,155,187,52,202,238,31,163,31,163,228,225,187,43,19,152,165,163,212,126,127,145,218,175,
|
||||
160,242,30,238,195,48,140,206,202,43,122,39,122,133,254,237,148,11,113,184,151,219,185,86,87,84,155,139,251,114,
|
||||
246,145,131,192,190,103,115,28,2,194,91,183,177,80,210,238,113,126,193,106,214,113,138,66,169,100,55,79,27,32,
|
||||
247,148,115,48,204,107,13,134,9,174,169,48,211,53,17,166,188,102,194,220,215,20,58,177,134,49,137,173,113,244,
|
||||
114,77,160,187,99,158,35,244,150,20,222,146,130,37,223,146,194,91,82,72,180,34,238,20,107,152,131,153,238,180,
|
||||
20,189,97,219,185,227,198,178,195,125,156,43,59,172,254,136,67,165,157,84,37,236,98,65,77,178,45,4,239,114,
|
||||
197,10,243,109,26,251,239,239,182,199,61,55,204,69,184,175,143,143,138,118,171,243,156,49,193,145,175,231,50,38,
|
||||
216,85,6,14,145,49,129,102,146,164,3,124,112,166,4,171,140,5,220,63,39,186,187,227,100,255,63,0,217,4,
|
||||
36,15,138,53,99,226,142,25,82,223,136,166,32,100,78,64,246,149,60,164,195,171,111,73,79,249,131,213,104,118,
|
||||
100,147,78,53,52,153,134,206,188,50,112,143,43,238,30,153,108,69,132,107,238,87,204,6,8,17,46,241,30,225,
|
||||
5,42,224,11,71,26,115,49,51,231,66,118,65,100,151,196,221,12,223,47,224,160,191,80,15,240,66,125,131,232,
|
||||
227,2,157,180,125,165,187,172,123,199,132,183,174,201,154,81,16,199,164,18,236,52,131,78,64,77,178,96,16,243,
|
||||
10,16,115,139,50,216,130,36,195,6,16,166,225,144,63,147,135,25,124,204,16,158,177,77,50,97,71,242,50,64,
|
||||
84,102,1,250,243,143,236,217,38,213,63,255,66,202,73,64,220,165,151,132,147,144,200,22,68,54,17,85,47,196,
|
||||
16,202,250,241,183,119,236,236,91,5,29,185,6,118,48,114,8,253,61,36,130,111,239,30,211,146,213,223,141,99,
|
||||
66,91,222,88,132,120,85,16,220,126,112,98,180,209,145,91,25,170,34,222,86,188,229,110,235,64,191,66,166,70,
|
||||
102,221,215,36,112,170,64,220,178,205,109,105,175,153,34,64,64,171,7,77,252,26,93,3,99,18,250,217,165,193,
|
||||
128,7,123,87,224,74,134,104,32,74,30,7,255,161,228,138,193,115,208,66,19,89,72,177,38,45,212,55,237,152,
|
||||
184,54,89,147,130,121,167,125,123,69,60,148,3,52,38,238,56,151,87,103,84,65,17,143,134,215,106,59,102,142,
|
||||
140,181,87,122,62,165,33,59,38,53,237,200,102,176,127,115,8,29,64,50,64,2,112,7,192,83,64,238,61,2,
|
||||
91,201,31,177,176,18,2,101,74,147,174,240,232,117,254,98,191,186,83,80,17,245,82,1,7,65,254,180,54,128,
|
||||
99,2,58,252,207,206,117,40,183,145,195,208,95,225,117,115,78,218,97,221,98,127,200,181,84,57,154,244,222,235,
|
||||
183,31,22,134,41,66,194,106,177,105,211,50,74,92,200,7,60,114,69,2,32,64,153,25,97,63,106,166,150,91,
|
||||
24,189,188,103,89,246,139,182,2,185,242,223,149,95,124,239,7,127,243,202,85,22,83,22,119,228,121,230,110,12,
|
||||
49,66,50,33,155,48,6,24,144,74,59,17,196,172,101,12,27,183,137,155,126,1,131,239,90,227,187,193,248,62,
|
||||
105,72,208,17,175,131,115,250,41,132,193,132,232,225,127,86,17,80,11,112,200,20,77,56,128,198,41,104,60,128,
|
||||
166,41,104,2,232,237,49,94,217,174,219,50,187,219,108,102,44,217,71,179,139,157,25,134,131,185,221,102,243,186,
|
||||
77,15,109,129,90,122,104,58,197,121,129,222,4,122,179,131,255,254,168,94,12,64,244,90,115,54,244,127,90,235,
|
||||
184,141,41,32,42,219,234,201,155,209,247,82,43,186,107,242,190,103,212,70,174,58,52,5,31,56,92,66,239,192,
|
||||
137,131,253,33,214,95,66,243,30,180,9,130,102,108,37,129,118,95,64,196,19,252,237,218,23,56,198,6,76,123,
|
||||
137,109,194,14,238,24,62,52,18,62,236,212,7,6,23,209,59,112,228,224,78,68,119,4,127,70,143,70,120,10,
|
||||
152,92,39,143,128,63,163,231,32,103,64,221,207,31,86,149,144,166,71,173,44,177,207,181,189,121,94,195,5,52,
|
||||
66,17,242,112,11,38,250,33,43,13,101,7,161,230,75,240,140,207,206,33,33,190,159,252,47,29,196,181,121,0,
|
||||
139,249,98,145,227,239,213,50,223,173,109,103,224,85,173,106,6,181,150,84,225,62,236,156,155,211,150,179,105,179,
|
||||
233,189,78,225,48,175,208,119,38,36,19,7,133,66,240,184,235,60,175,49,38,227,135,206,12,105,86,37,28,68,
|
||||
53,10,3,140,174,237,225,223,172,194,183,219,7,112,46,90,167,121,157,104,195,92,50,193,43,149,234,6,154,208,
|
||||
21,206,15,148,121,19,14,34,95,114,137,104,93,73,164,55,45,72,143,139,17,143,100,107,228,125,254,190,106,121,
|
||||
66,31,151,63,197,174,213,190,169,93,213,174,117,181,87,50,165,86,168,158,60,192,154,233,253,237,89,165,25,46,
|
||||
110,140,219,151,238,38,192,14,125,185,129,84,201,102,251,14,10,156,39,77,90,185,85,19,86,222,214,34,183,94,
|
||||
82,45,182,241,249,249,199,6,243,227,87,202,25,147,242,229,151,97,93,121,90,212,96,207,132,83,41,169,192,211,
|
||||
38,156,15,198,88,127,86,13,154,86,128,22,105,48,88,106,97,192,50,217,59,235,52,43,195,204,12,201,189,86,
|
||||
200,97,72,200,197,234,184,116,86,94,142,91,73,211,69,167,86,7,13,133,203,151,208,45,58,55,171,72,29,218,
|
||||
185,193,4,31,225,255,112,52,180,43,227,160,192,66,49,128,175,24,120,16,121,181,182,111,42,222,16,105,95,130,
|
||||
220,55,217,85,68,58,6,240,127,192,235,234,196,229,155,179,201,209,194,201,28,178,74,160,105,47,218,237,221,41,
|
||||
118,76,196,188,125,145,171,98,84,146,248,170,145,42,150,187,203,232,48,200,206,192,132,205,234,131,4,75,183,138,
|
||||
139,141,145,81,105,26,143,214,196,68,77,163,81,48,120,7,202,212,245,122,94,203,30,65,69,23,38,108,19,105,
|
||||
153,202,242,210,152,88,206,217,26,135,47,234,18,146,207,86,238,195,105,87,25,101,13,9,164,71,207,79,18,204,
|
||||
237,207,99,124,251,132,196,84,221,52,144,132,169,207,174,120,231,126,43,53,172,118,249,105,203,31,162,244,222,67,
|
||||
7,91,103,243,201,118,162,227,162,150,83,209,130,94,72,37,44,105,53,87,92,206,37,154,80,129,235,201,22,236,
|
||||
63,253,189,160,79,248,219,154,126,187,114,250,21,143,173,122,74,138,39,151,112,134,96,124,27,77,151,62,143,147,
|
||||
108,101,85,86,83,121,86,161,24,135,183,3,118,199,130,210,119,66,194,12,110,87,66,43,12,214,80,170,177,244,
|
||||
94,252,14,29,99,201,142,154,75,61,143,154,255,225,237,168,7,171,26,127,83,199,174,196,119,217,243,207,126,143,
|
||||
246,65,145,97,212,59,92,149,199,151,29,46,151,44,3,196,205,64,195,19,172,242,114,123,44,171,45,6,122,169,
|
||||
105,254,97,154,197,231,201,108,117,116,110,129,57,243,169,195,211,99,200,113,214,156,201,180,100,89,150,242,198,100,
|
||||
198,115,166,239,194,17,222,211,187,207,79,154,241,207,158,25,252,122,229,180,74,156,134,20,114,104,175,92,181,234,
|
||||
120,36,182,38,118,38,246,194,70,208,81,198,155,113,19,207,151,80,230,222,228,193,180,238,179,41,183,105,219,110,
|
||||
55,75,40,67,232,77,136,142,124,197,114,86,244,140,173,115,122,198,46,155,62,155,97,88,76,199,178,199,83,132,
|
||||
77,16,100,111,179,236,188,213,187,52,41,61,127,124,197,221,102,171,77,71,197,87,155,158,170,164,165,180,52,44,
|
||||
65,165,167,169,172,182,125,127,236,78,236,161,52,166,49,234,194,133,149,179,52,179,5,11,158,167,145,137,164,45,
|
||||
32,19,201,43,95,79,132,94,119,142,65,240,166,122,134,93,130,73,164,105,218,3,185,234,118,39,109,203,228,156,
|
||||
21,174,142,162,186,26,44,191,15,185,197,120,206,119,108,240,130,156,181,234,177,124,239,97,80,215,218,59,187,203,
|
||||
211,249,67,220,241,227,245,148,169,233,167,21,221,102,30,128,212,232,119,41,249,1,253,46,61,118,2,183,95,251,
|
||||
8,46,179,147,123,103,243,38,126,173,163,23,102,78,24,37,187,48,243,229,7,80,29,119,21,227,208,56,228,0,
|
||||
171,119,110,201,48,162,51,109,162,213,254,53,70,65,241,214,162,97,208,97,206,121,147,143,133,91,248,225,53,252,
|
||||
208,218,255,108,92,85,118,196,48,16,187,138,158,255,61,134,160,203,237,49,10,63,101,88,230,221,211,119,20,42,
|
||||
134,147,129,48,217,146,78,92,171,8,78,122,19,26,193,128,86,177,150,247,193,77,247,222,189,67,95,60,8,154,
|
||||
218,167,220,77,247,184,190,3,107,220,204,217,201,227,219,166,79,64,40,3,122,96,3,190,35,24,208,64,119,64,
|
||||
92,17,99,20,112,14,189,189,150,90,238,118,106,130,68,131,221,120,52,209,12,20,220,59,114,110,187,221,202,54,
|
||||
163,222,158,163,210,150,83,127,3,106,147,95,77,119,167,198,195,163,206,61,63,107,13,58,6,106,140,222,160,45,
|
||||
42,62,53,165,55,253,38,253,179,225,186,254,153,178,166,193,146,121,187,80,181,220,83,67,150,225,244,241,209,52,
|
||||
203,78,141,98,76,248,110,108,56,100,134,26,3,227,224,37,67,17,36,141,44,39,109,33,105,83,149,15,30,65,
|
||||
42,120,73,200,36,71,212,62,151,56,170,36,233,184,60,140,67,146,2,33,104,76,148,104,75,198,164,17,167,81,
|
||||
13,70,249,105,150,208,57,72,248,235,82,209,33,31,50,148,18,108,157,75,254,96,131,20,214,75,178,153,100,205,
|
||||
56,151,26,126,100,75,126,158,72,133,38,64,243,163,76,116,74,162,193,182,224,194,92,23,140,130,167,73,34,205,
|
||||
245,39,157,229,142,43,189,13,67,225,173,4,233,53,25,145,122,216,69,86,115,83,56,192,164,117,113,87,159,239,
|
||||
3,141,63,184,69,138,49,143,40,138,62,124,201,227,246,106,170,96,148,112,56,136,138,229,248,97,182,52,155,154,
|
||||
29,63,205,230,167,39,228,135,70,83,163,209,122,182,253,154,152,44,88,245,124,29,21,197,90,236,65,47,191,30,
|
||||
246,230,175,5,17,43,201,227,221,246,250,254,253,143,170,214,255,86,38,38,169,242,30,184,91,7,93,45,73,2,
|
||||
120,190,230,149,239,87,191,133,39,106,177,56,47,44,66,235,171,205,14,58,8,226,251,159,236,84,24,39,71,112,
|
||||
144,77,156,0,161,29,135,60,231,171,127,89,248,97,210,26,9,176,46,217,4,7,170,55,75,104,224,29,64,244,
|
||||
232,57,153,4,213,199,107,83,32,236,6,126,38,70,27,169,145,160,45,251,199,234,78,92,47,193,217,76,244,101,
|
||||
126,121,99,111,111,44,125,115,250,196,193,208,158,119,86,242,227,196,68,138,133,250,208,159,138,144,200,46,196,214,
|
||||
41,69,216,72,41,223,165,155,133,56,147,236,70,226,68,235,88,58,34,37,17,56,67,189,190,164,223,33,163,79,
|
||||
234,228,41,29,63,168,123,94,95,195,247,71,33,30,243,110,131,68,92,141,202,175,27,175,228,193,206,33,232,217,
|
||||
182,47,153,48,124,192,148,246,50,127,97,88,162,216,175,45,237,105,223,244,82,44,233,21,170,196,27,82,183,241,
|
||||
181,115,138,198,29,48,70,255,164,203,248,166,196,122,161,85,25,236,13,182,193,81,122,145,80,237,214,120,91,170,
|
||||
167,30,225,16,21,224,33,187,13,13,8,215,242,191,141,229,38,107,252,155,124,129,15,149,27,235,249,44,53,46,
|
||||
68,175,217,54,100,18,150,39,70,148,192,71,103,46,11,237,114,73,205,89,216,190,237,48,193,22,145,157,169,196,
|
||||
1,129,92,125,18,107,171,54,89,252,118,179,203,148,7,115,214,204,224,151,193,178,185,236,134,142,175,128,82,33,
|
||||
235,98,218,135,204,60,4,34,213,28,253,116,154,195,150,175,81,4,235,49,233,235,146,243,37,67,81,112,66,73,
|
||||
121,209,144,19,108,61,163,244,182,76,109,44,253,9,112,100,250,226,196,46,225,196,62,115,50,8,164,238,173,98,
|
||||
74,242,149,83,77,243,110,21,111,94,147,141,223,71,186,141,6,191,195,49,129,193,193,118,212,80,90,121,17,215,
|
||||
210,60,43,86,108,60,110,28,205,97,240,94,82,46,91,151,85,120,113,35,253,29,119,6,93,11,183,113,183,52,
|
||||
193,54,132,179,202,47,216,106,54,74,33,233,185,139,8,9,185,62,110,27,220,174,199,213,36,8,93,193,101,203,
|
||||
109,188,89,107,55,111,148,48,183,105,67,70,72,162,80,94,70,127,247,9,234,239,59,96,134,157,241,84,175,144,
|
||||
109,31,12,243,143,74,52,13,78,39,236,110,189,190,10,222,24,205,33,182,57,6,134,202,172,28,215,1,100,125,
|
||||
204,76,18,175,171,43,50,96,72,93,242,248,45,195,6,122,138,5,81,157,68,114,70,36,39,39,80,133,189,94,
|
||||
192,29,148,28,57,171,231,195,150,172,45,145,129,64,64,133,223,5,129,238,156,66,239,53,201,118,226,141,233,140,
|
||||
88,145,161,147,241,200,8,45,192,114,154,74,213,250,195,190,97,159,77,5,143,146,216,27,46,199,181,87,162,246,
|
||||
211,58,141,60,158,47,129,17,175,77,26,186,48,6,104,165,61,64,45,5,52,146,241,149,142,225,253,180,116,230,
|
||||
252,114,92,118,195,169,130,123,69,5,135,88,79,47,15,39,52,187,181,55,189,209,22,219,31,103,63,120,23,57,
|
||||
6,186,181,141,52,236,22,103,203,198,177,32,105,167,160,216,119,158,240,77,179,122,107,156,106,199,45,226,180,13,
|
||||
158,211,42,217,129,252,108,229,243,215,175,210,5,106,238,40,213,190,237,10,53,174,126,253,66,91,145,94,148,218,
|
||||
51,158,203,27,147,80,44,215,157,206,18,6,211,246,193,96,98,24,74,120,195,74,122,166,143,42,75,105,114,52,
|
||||
249,85,103,119,37,103,151,148,188,177,56,167,52,203,220,134,160,105,245,117,244,180,110,40,89,75,57,159,91,78,
|
||||
25,188,194,57,143,107,58,165,190,181,129,200,19,144,193,112,180,28,44,111,89,8,46,137,52,37,142,197,146,64,
|
||||
206,231,127,90,103,197,85,36,3,249,113,144,173,116,190,31,105,247,58,52,93,78,200,96,39,105,133,231,11,237,
|
||||
164,69,209,246,176,1,58,204,26,49,139,94,130,91,185,53,108,174,120,247,42,224,168,62,87,208,170,229,242,145,
|
||||
133,150,145,215,173,54,252,120,44,27,226,219,63,69,254,39,174,63,223,127,255,245,231,191,237,29,133,118,228,56,
|
||||
236,87,116,62,6,239,214,30,15,29,44,51,51,83,202,220,121,229,246,235,79,178,28,71,114,210,247,182,112,124,
|
||||
133,128,162,152,37,89,182,164,232,200,84,221,211,113,105,47,44,39,228,1,231,195,180,235,114,225,87,118,29,165,
|
||||
244,116,92,143,246,92,154,149,130,198,218,17,88,225,76,39,251,54,173,29,189,135,150,173,39,68,189,90,238,110,
|
||||
131,50,215,130,168,7,169,77,137,4,226,13,5,121,147,83,144,118,29,64,150,131,64,38,117,64,14,6,208,52,
|
||||
2,197,185,138,182,203,90,51,105,180,30,94,2,124,207,144,92,206,183,73,55,78,112,145,127,241,132,235,218,64,
|
||||
89,207,249,28,205,38,233,48,66,133,161,107,173,240,248,128,127,181,130,66,205,98,128,173,138,202,73,49,67,109,
|
||||
74,19,69,95,6,81,139,98,104,248,223,76,108,47,5,166,56,234,9,158,187,123,117,103,6,157,120,129,79,181,
|
||||
23,120,173,60,225,24,185,239,162,52,184,53,168,60,120,222,85,177,120,181,235,4,0,240,106,209,121,9,176,254,
|
||||
5,242,145,123,252,50,207,239,55,86,15,168,16,16,141,250,49,103,23,16,29,15,35,240,40,218,16,69,228,137,
|
||||
15,252,238,64,194,144,151,131,67,93,131,126,161,151,105,3,126,197,37,206,245,11,252,49,167,24,29,14,225,8,
|
||||
193,199,60,208,17,131,92,175,211,119,169,56,46,16,13,126,17,170,166,110,138,20,66,15,42,12,5,53,193,222,
|
||||
137,241,203,233,112,110,225,208,192,198,122,10,113,101,68,244,152,239,98,36,157,239,13,102,199,212,117,30,105,53,
|
||||
19,172,12,36,116,44,146,13,16,253,118,128,75,68,189,65,201,233,208,125,57,53,97,13,74,175,121,72,246,159,
|
||||
74,157,79,164,74,5,157,104,109,94,82,142,166,153,104,240,15,123,150,125,74,222,27,245,30,59,136,192,244,81,
|
||||
4,186,72,220,181,77,118,70,52,142,136,23,85,167,42,246,212,57,5,149,40,13,230,3,210,228,147,55,214,215,
|
||||
134,27,156,143,186,149,56,114,153,106,37,106,20,115,97,234,107,106,2,126,67,119,151,14,2,214,221,91,93,45,
|
||||
196,76,150,251,234,216,236,32,248,134,29,4,127,54,236,192,159,148,25,104,139,85,201,5,112,62,217,71,185,62,
|
||||
240,85,128,16,73,60,42,66,35,139,135,33,100,24,73,55,186,212,72,124,104,96,83,140,150,1,156,136,70,178,
|
||||
136,210,151,41,217,142,236,88,141,24,188,81,140,98,12,206,3,253,6,27,26,25,58,185,240,124,50,91,161,60,
|
||||
123,202,157,140,227,137,198,65,18,135,68,221,20,114,234,55,147,163,64,125,247,189,73,60,99,250,47,16,144,201,
|
||||
40,251,216,130,178,135,239,10,43,237,150,208,12,36,52,61,11,77,28,183,93,146,211,255,93,37,167,11,13,169,
|
||||
184,240,23,147,138,150,155,213,38,182,94,116,72,48,82,100,145,186,111,135,118,8,248,175,5,28,13,210,91,253,
|
||||
70,140,221,220,128,43,184,227,144,165,150,230,76,28,125,238,120,124,201,255,219,248,82,50,123,151,13,236,81,255,
|
||||
32,69,192,142,172,11,98,130,130,202,72,92,26,29,129,11,151,51,24,2,120,183,168,38,46,244,190,237,189,41,
|
||||
39,31,227,221,80,130,220,112,241,220,148,19,252,164,233,23,45,142,137,170,204,133,231,235,24,18,24,167,36,115,
|
||||
179,28,113,149,120,13,191,35,99,225,202,10,18,185,119,139,236,71,171,136,60,7,24,49,22,170,133,106,105,253,
|
||||
127,190,101,195,255,124,235,31,193,183,82,244,177,99,79,128,167,204,209,147,212,2,191,205,249,28,100,143,163,60,
|
||||
30,133,3,49,213,180,69,19,98,208,183,124,69,204,133,167,169,26,68,121,71,213,144,77,250,186,171,216,76,20,
|
||||
7,176,103,217,21,251,253,231,84,49,121,236,118,204,58,169,22,23,40,0,51,69,149,142,229,226,42,82,161,114,
|
||||
176,233,58,241,232,207,14,133,223,51,81,148,67,218,18,26,131,114,129,210,92,161,61,205,95,93,16,44,132,9,
|
||||
90,239,245,50,172,220,251,62,138,48,19,154,134,118,218,43,64,201,201,74,2,214,89,117,150,2,155,111,99,66,
|
||||
125,12,49,28,55,182,255,166,73,131,100,110,246,194,141,165,205,181,189,106,19,219,149,145,90,200,56,38,240,219,
|
||||
199,200,246,111,60,133,243,240,244,209,237,27,55,158,54,200,231,57,33,30,42,167,239,229,107,88,11,120,126,59,
|
||||
118,242,106,53,61,183,90,167,86,71,151,0,17,106,64,39,162,221,234,205,5,165,11,207,212,159,68,165,49,211,
|
||||
254,80,106,157,75,10,190,1,180,129,93,234,128,99,88,180,125,165,4,18,150,109,115,127,134,75,17,160,32,210,
|
||||
236,145,123,173,243,233,168,181,12,52,39,56,125,22,66,210,46,151,77,112,91,230,203,93,56,210,114,23,24,84,
|
||||
123,136,188,253,246,219,247,12,202,142,85,233,150,28,163,200,47,170,126,76,188,84,2,168,96,34,197,210,39,72,
|
||||
65,211,141,170,33,131,22,109,72,87,123,249,74,59,214,164,86,208,198,127,186,150,66,185,110,20,231,56,160,234,
|
||||
187,197,77,201,24,133,149,14,52,102,79,103,192,182,110,85,155,179,68,94,112,251,26,13,234,227,138,211,145,16,
|
||||
167,163,191,88,156,106,87,71,106,28,10,241,208,89,84,103,0,11,217,51,112,192,55,155,120,231,241,132,183,94,
|
||||
9,217,33,56,247,98,88,245,161,159,180,92,135,167,93,161,203,158,9,91,201,76,14,94,176,141,198,137,187,226,
|
||||
255,174,40,23,147,142,51,205,169,128,190,46,254,155,249,210,116,247,38,45,101,51,89,75,113,203,212,174,76,64,
|
||||
219,211,119,41,169,203,200,13,80,11,15,243,175,233,244,160,149,67,231,33,110,42,225,25,247,233,92,47,171,125,
|
||||
14,161,126,216,135,120,188,71,182,8,171,17,1,34,114,131,6,18,205,33,216,173,70,12,27,177,75,60,203,120,
|
||||
222,81,122,140,194,185,151,249,218,156,96,161,120,246,161,87,234,157,100,89,95,192,122,208,95,44,176,200,246,127,
|
||||
81,174,117,21,139,158,64,193,153,128,34,10,160,98,58,161,232,112,56,49,222,160,175,139,128,133,155,115,219,80,
|
||||
197,37,49,130,77,227,120,138,145,241,241,4,107,24,243,236,139,147,176,5,47,70,200,95,189,118,144,229,117,10,
|
||||
167,5,49,104,150,218,225,32,131,165,221,129,232,39,188,186,213,151,247,214,191,24,53,247,128,247,139,131,238,77,
|
||||
13,236,68,240,142,15,99,66,137,143,247,29,62,154,66,174,227,177,38,14,249,14,221,7,60,227,125,79,112,147,
|
||||
170,224,40,100,184,135,39,138,254,126,225,119,53,191,13,116,253,131,0,0
|
||||
};
|
8
Software/src/lib/ayushsharma82-ElegantOTA/src/elop.h
Normal file
8
Software/src/lib/ayushsharma82-ElegantOTA/src/elop.h
Normal file
|
@ -0,0 +1,8 @@
|
|||
#ifndef elop_h
|
||||
#define elop_h
|
||||
|
||||
#include <Arduino.h>
|
||||
|
||||
extern const uint8_t ELEGANT_HTML[9590];
|
||||
|
||||
#endif
|
Loading…
Add table
Add a link
Reference in a new issue