From 87edf61c7d48a01787e8a37edaf5e898d28da323 Mon Sep 17 00:00:00 2001 From: Philipp Date: Sun, 18 Dec 2016 22:17:09 +0100 Subject: [PATCH] fill function implemented --- homie-esp8266-v1-setup-sources/.babelrc | 3 + homie-esp8266-v1-setup-sources/.gitignore | 5 + homie-esp8266-v1-setup-sources/LICENSE | 339 ++++++++++++++++++ homie-esp8266-v1-setup-sources/README.md | 11 + .../app/assets/favicon.ico | Bin 0 -> 5430 bytes .../app/assets/img/favicon-16x16.png | Bin 0 -> 595 bytes .../app/assets/img/favicon-192x192.png | Bin 0 -> 30088 bytes .../app/assets/img/favicon-32x32.png | Bin 0 -> 1244 bytes .../app/assets/img/logo.png | Bin 0 -> 25823 bytes homie-esp8266-v1-setup-sources/app/js/app.js | 140 ++++++++ .../app/js/steps/connection.js | 53 +++ .../app/js/steps/details.js | 144 ++++++++ .../app/js/steps/info.js | 105 ++++++ .../app/js/steps/mqtt.js | 146 ++++++++ .../app/js/steps/sending.js | 58 +++ .../app/js/steps/wifi.js | 202 +++++++++++ .../app/vendor/bulma/css/bulma.min.css | 2 + .../app/vendor/font-awesome/icons.min.css | 1 + .../gulpfile.babel.js | 163 +++++++++ homie-esp8266-v1-setup-sources/index.html | 34 ++ homie-esp8266-v1-setup-sources/package.json | 55 +++ pixelprojektor/pixelprojektor.ino | 57 ++- 22 files changed, 1507 insertions(+), 11 deletions(-) create mode 100644 homie-esp8266-v1-setup-sources/.babelrc create mode 100644 homie-esp8266-v1-setup-sources/.gitignore create mode 100644 homie-esp8266-v1-setup-sources/LICENSE create mode 100644 homie-esp8266-v1-setup-sources/README.md create mode 100644 homie-esp8266-v1-setup-sources/app/assets/favicon.ico create mode 100644 homie-esp8266-v1-setup-sources/app/assets/img/favicon-16x16.png create mode 100644 homie-esp8266-v1-setup-sources/app/assets/img/favicon-192x192.png create mode 100644 homie-esp8266-v1-setup-sources/app/assets/img/favicon-32x32.png create mode 100644 homie-esp8266-v1-setup-sources/app/assets/img/logo.png create mode 100644 homie-esp8266-v1-setup-sources/app/js/app.js create mode 100644 homie-esp8266-v1-setup-sources/app/js/steps/connection.js create mode 100644 homie-esp8266-v1-setup-sources/app/js/steps/details.js create mode 100644 homie-esp8266-v1-setup-sources/app/js/steps/info.js create mode 100644 homie-esp8266-v1-setup-sources/app/js/steps/mqtt.js create mode 100644 homie-esp8266-v1-setup-sources/app/js/steps/sending.js create mode 100644 homie-esp8266-v1-setup-sources/app/js/steps/wifi.js create mode 100644 homie-esp8266-v1-setup-sources/app/vendor/bulma/css/bulma.min.css create mode 100644 homie-esp8266-v1-setup-sources/app/vendor/font-awesome/icons.min.css create mode 100644 homie-esp8266-v1-setup-sources/gulpfile.babel.js create mode 100644 homie-esp8266-v1-setup-sources/index.html create mode 100644 homie-esp8266-v1-setup-sources/package.json diff --git a/homie-esp8266-v1-setup-sources/.babelrc b/homie-esp8266-v1-setup-sources/.babelrc new file mode 100644 index 0000000..11f1df8 --- /dev/null +++ b/homie-esp8266-v1-setup-sources/.babelrc @@ -0,0 +1,3 @@ +{ + "presets": ["es2015", "stage-3"] +} diff --git a/homie-esp8266-v1-setup-sources/.gitignore b/homie-esp8266-v1-setup-sources/.gitignore new file mode 100644 index 0000000..580a5df --- /dev/null +++ b/homie-esp8266-v1-setup-sources/.gitignore @@ -0,0 +1,5 @@ +/node_modules/ +/public/ + +/npm-debug.log +/ui_bundle.gz diff --git a/homie-esp8266-v1-setup-sources/LICENSE b/homie-esp8266-v1-setup-sources/LICENSE new file mode 100644 index 0000000..22fbe5d --- /dev/null +++ b/homie-esp8266-v1-setup-sources/LICENSE @@ -0,0 +1,339 @@ +GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Lesser General Public License instead.) You can apply it to +your programs, too. + + 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 +this service 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. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute 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 and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +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 +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the 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 a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, 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. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE 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. + + 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 +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + {description} + Copyright (C) {year} {fullname} + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 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 General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + {signature of Ty Coon}, 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. \ No newline at end of file diff --git a/homie-esp8266-v1-setup-sources/README.md b/homie-esp8266-v1-setup-sources/README.md new file mode 100644 index 0000000..2f47e5c --- /dev/null +++ b/homie-esp8266-v1-setup-sources/README.md @@ -0,0 +1,11 @@ +Configurator for Homie for ESP8266 +================================== + +Sources of the UI to configure an ESP8266 loaded with an Homie firmware. + +## Contribute + +Contributions are very welcome! + +To build assets, just run `npm run dev`. +This will build the public directory, and watch for changes in the `app` folder. diff --git a/homie-esp8266-v1-setup-sources/app/assets/favicon.ico b/homie-esp8266-v1-setup-sources/app/assets/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..24b77953a6b239cfc736c51bdec60156207bba78 GIT binary patch literal 5430 zcmeI0*;7+_7RP_>Sav^6TU}lKFf~=)NF}|U6mfa2=`GV$%i3>6< z#(Yb=>+?idMr9;+e?`9nLD8)&SBAgd#X^vdn zpgH0s_n`iv5D#UBSwog3c)8EA5~j34;s%7c>v8^YEp*vk_BjerpZx^sfkna`$(|Zi zUm7qhAFoN6*7|ug!{4nIG0GN<42>X?IHEm@VHq4oW<(XPi?eY@l8MTXj8BW7(H?Mb z$B(W}xS(i`6#|PxMF-_+-t3uTQ_#Qbl`-%3&TSe9C52hkXsFg2S-qx+KJkN z9^472fcE0hit%xAb6O9#XAtk`!cm_tWUI|M=-Q0KG)IBjgjhurj(b+%XO9x(UKn06 zJ~L~(k9H|M{^u?dkodC2E+#UEmo)}B9{BVu;dL3lFs}g zL^_>v_|PbJiJl5`>~(2}uc!@?er8-zj%u%kTDCS(tS%p4P_oGUrL#20EDMp&{8c8M zsylRG2#5C#AWAxJJf#@__PoN%E-Ob_J;mzs@%7EWuxoeb*>$p8WOw4`HpIuh-kTIR z8*n#%c2j!%49iHEW)x?vt7U%0_~rAh|2w0(7<;>&u~(ln*8eGEmB0JA@q7F?{I`4z zH=bv*x7x^3nf--azL(drtPEbB?_*&apwVA-laazGmEp$wrK?KO_6f zLgyCaEE~1k7#+D;xpmoWylZ7_uI3A#Z<8tCrjn(H4KfYcz3>+-i!3MnIeVZQ*pR0h zaMh~%pB1Y5Ulpm$AtkE5&nSwFcHHJV%Xr!!0Up*K*!bAyZk!U3+7-*de87B zF~kzX+sx1bq#UZpEzcYw@22f9Lq4$(14>lpB4XH9>f{Fp!*ZR~zTY5yCx%VLaD?ig zmHdE&fDT;UStQi3YvLT-l-w5>5C|4a;dH$pAAAs@t22!8|3a) z#88QIK6=E3*5Qt{+Q|+}o0Kg%cJBksTf>T_%i4djP9JV@%X>%T;pxC#-H z3PefDa6(dw{_a8HUX}U@y`T9)Pv>CZIU+~#6pd-4Yp%bR^rPgH*e|A@&$ZRg&_sS{ zKz5Qz(BLt!npLVhC`S|sIfD0<4u<=r->?q-$D|)g`re{0@E*&?&;lRoU+*V9T~*h? zQ?54P6vcxhPdOMe6}_lihkgy|tK_e+S7hs1IfJ)r8}_@lAT#Nipl>z}BS=(>5OEFU zVm(5|I+(kMgnMP`PF(lb;p)LMWS^_UjRVC(p3=yBQJXflrvIz;Z+ydKQ`jvs!ONvn z=$rT088VW31&uz^KSJ>kNbg24y`NIb5q)<3M`|NVsHbk%lU{xo)KN7;u1uHrp(b^0 zeLd+bWYh5Su=U)WVHfr8dt9DClhn7Q?@R9n@4+28qSvlpqV7ULqCwbSG?tivuz_ZT5NY=qR;fPEAXd>`Uqi1Ka5DgP!! zde;iMlIQECnjw0GMEL+J*P&nEuqZhuok39W6!z{NvNQAudl#D@4ETeK$qxaL9 z!8upTC|@gyA$m_eZie(Dk!rX;bMm@#u3zn(_B($kh8FIJz`zOY^6Do)I2eq={>R49 zE-<{$Q#@bWa;3tv9_RggaWixTcfv+S;=_jb{rl~^jjL%oUk?=aOEVjZ!G{<|c|7pF zmnX#}-@{2t7BU5&{VySL?O9^r`&vhy3jV$aC#4pgS6XpNIhIHJ!mY%>h=CEqy7iBc zzW;{|eDC-*F=*xF3u*8q_U##1VmRQ{gYZBLPAVp7k3McVqp*HM4D6zEj1dEKFgW}8 z*Uk@<_9_gF7``P2qmpveu>dQM9vViZY!b)ilM__80-_ZYn`lqV&XApRVxXRG-Rt+0 z&M{|(0E&mBWb`Z;#RQW|r#BJ9QH5-3f^y|smF!h)r2N&F#K3-%PcUL&%Nh9o`q$R% ze6LLR3o93FkyYqyR!K*0Rk}A!$4&o+QLg-o^7S^V8I0-{quME0oqnECA0rs`Q;d2# z)=cKC@&EIs{XDtC{&^P(Ec^-R{}ibFMEEP=Eo0jk82kLcF+P_5iipHx H&Y%APNRKuX literal 0 HcmV?d00001 diff --git a/homie-esp8266-v1-setup-sources/app/assets/img/favicon-16x16.png b/homie-esp8266-v1-setup-sources/app/assets/img/favicon-16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..c0de4810904af7750001d33c9867edc72265d929 GIT binary patch literal 595 zcmV-Z0<8UsP)~yFo zLfwv>I#Ky=K(70ITY$WkPv>^nKoUtbd_xe1b7JHN<*LJCup&g+myC^N7##X} zpfKe=O!mFFvH%eL${e2fHWDcnD$v+M`1nzLVX(pwJ9ZGWX#)jc@ntCOl}EE33jhv< zMPr45*h*@5@5G7_7DL^x?X1|ck*1UT(antnLd{;=n*|6p-H1X651}>DBkcqzq|xLC zC&<72N-1k`t$Gmv3X8!P3dyv=$D3`dR-l-!U@=Q?V1=P76jEq{s%7+PKR$-Uo^1r^ zKLr{$7n{F}hM#Go;HV5dNscf~q;!BdTx_3zL+`689umAQg`I%CW-b#>%94hXR h50V{QgQdL7(r>zn(Y*bX@C5(>002ovPDHLkV1mG369E7K literal 0 HcmV?d00001 diff --git a/homie-esp8266-v1-setup-sources/app/assets/img/favicon-192x192.png b/homie-esp8266-v1-setup-sources/app/assets/img/favicon-192x192.png new file mode 100644 index 0000000000000000000000000000000000000000..3de15666645ed0f8274a5ba6fc67e57f09aad2ed GIT binary patch literal 30088 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 Jlr;_h{{S;m9S8sb literal 0 HcmV?d00001 diff --git a/homie-esp8266-v1-setup-sources/app/assets/img/favicon-32x32.png b/homie-esp8266-v1-setup-sources/app/assets/img/favicon-32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..282467ed8d6258170e1d30b9228c15a290ca795e GIT binary patch literal 1244 zcmV<21S9*2P)k7~(>$Sd3OuOQYg~5Yz=h zabe=lL>GhwJAzQ#pn|sgmob#OX z+&l39dWx05crlT``0LK6i6QHGC^a+`LG*1yM!CVXAM1+ z_~PB`>mraI8VrHHX~<`Y#&hWmsp(lfuY^eeio+JwUIweVs{0VWgzC=op3lT&k~-_$GDWK92T1FVgYaD|pkhOddW~BY|V%dk2X0#hE?# z8`+5&7H>{boXafrifN;QHz0sO0Blgz*l?I=^&YE}pnNZYi4so4=-!kd(i`L9)d^-U z-@wFS4O(s`rP|<9uXk;Ll7!0I2l`j~*$^Zgre#|nrF@Y>I$s@ETTKNFsTs3i)wO3-jM1eD~JYj_u~(KfJ|#fgQ0yn?J!f(lzdkf7XbOBsX{F`oVI)0K|~31sd+ z#BgM<+zLpB;4u|0oz*~OM{QST2ld zIc3ehy|tNLTYKp5jS>#ItBCH6?;jXmq4VSbGa5ItOwD(bN4$_Y@mpJkeS14Syd2eamp8hQ{X8c_wEvLr;N>^pCwX_gC>({ZabI@Q-oOQ4>Ar`>Ip(S?>t}ZzM8me{w$yP?ao^wH^ZfCP82i z4hpl1wp~8gt`+!Q{IS7u-ML4?18kT7JE%iWdv)!pp+35%`orZ~v;);UBG4x&e20VWa`27*3I7vd zmCPKrSeR^e+-%{n)zrvni{X}y_GV@lTQ_euu`sqU`JXoackh~PHQ#J(;oxAg6>Nmj zR#OXO@T-~S79)Fea}#qjhyQtZM^IR}XOOqg|Mcq*`u*=+`~Ty+R`#Jjp5fHc161ni z|FM9*e$;Skm>)G**WSfUca58W&F8rDy>U}LWn&wk{jEc+uPYY zBZ`U~ByVion5eo%?!M=+&q9eUa?8$1Yyv-2WeDKM77YUUA?HZ|KmPy!!jK^DsE(j3 z?t_>h?n99v?&$ybFaBR9vt!sHh2_*h`yH!DUbdRnsK}-ie)hEPVXw2j{irj_=iun| z+|+&bjEAYAPr7}FXI}q!>fB6T{jkjD8jsEQw#{gc$!|1kwr2NCn`Q|;{0}*_Rbn5? z8V@hI-Tj_~`)<0pIN`vpCFn|+Pev<-8hsmmk`0ievCsL=NaJ@d{gopAbUwDfOaam~ zMd!;Lhv627?T9dF2Ta6IC%`ReJrrLP_YZ~lIbG}WR&47`SIm(0$xc*L6xQLZkUSY1 zA9IfBcaF(xN?7swVN*?+G^Ce6mLVWo#3y7}AR)L1(;wv>Tf5%Bvu#;c@eFj=Krqx8 zJK^IxU|jU6<0~6$4Hc=%U_2I25*rYFQiY?K{msW}wQa#@boU{nz2gM@%%b>>uwcLA zW)9Pu!uya;X->atO5XU6~Vw`_vM zc4ajF9J6JJ%3>R!zNZ3fda?}^X8xMV8jlAKSpALo_-cYnEp@g}WL{CnJa~+U%TT9J z8&22)3r^(C3T1IaA1SoDo>GlW$5pPT*xfY0=Thsa!Z&yH`X zk#wr0A%R6gw5ss090RSj`|@^TjJO%Enz-eZ<_X!(hs>O##lp)o<-8}PLGyo*QB!{v zO-vH;CL}QBKg>!&#=+ex6KRf6DiPaKv>*`a9*mngB#*mey6c7#U25^vMt;xfzO(J- zNY+>R_zO&v1ZFCYAV<9Z4|=}#9Z&70do5e~++fs{Rl}Mvy^d&3$pv1#E``^a9@WGw z2s|6Uq+R53kXAU$Q(4?CiB=^t2Ve0mdkxyx`gUB4-*|co%vzMdbWYpEVE05c5b>

5d@8eh{wLU#y^&rbO~(8v`$ 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%0DqRMJX{LX(zMxc(>w2K($AXMFMnAS8Ddo0vR za5Q#m`k`QHWk2?t%U?H_!pitBK_3d=5%IEik=F%?*(Un4?6wuU+FJOma?<9-xKqiZ zQGKT0NV_vM95jv;;tp?+4{17$rp4h**il-%^2yMu3k$}yta=Ta6xgz;a6a5_fY7nQ zfOmrxH6gqh^J8HdhXg5?-~Mb7-LZ&iSy8Qk$Wsp_FfV&J&VL&+1Sg+S_t|d{K0#f1$YYxy#e+C4rb=b)I>JfHifiM&6}-@MFK` z@(=J{Dq|Z}K^#txPovK3IHQf;K2XXmz9nzbf7C;JA=atOArD0$WEUIB-%GJox34&@ zEG9zj@jKV|mZ-y|Jq!woQ-Xzk+B&59>`c>4md%}jHxlHzN?{^?oLds+p=iWey%HG( zC8DYrwVdaJ|2S`w##j_*8_D2e)seOPIP8_EamLRXDKssKxzIQ-o*DAzb*p(?|L^fN zT)LR}YqOncB9PS4EXAwZXqGQ3iTT%3QVd&bLbA|GnC?>C(l?XPYOa0whdKe1i8sq% zIQCw3blTbQ@h)*HJ}Hm2Ey%116$K9J{a(viy%h-(zUuvF9cOhQa(Om1aJ#^z zUl?&z!Xs|hG6YFw4(=^B$`_vZduVumu7(T5D2n_$P4_L&KKK*HV6R6S9a+-Yb}i|i z%HL9c`#gnO{p6CH;|dTR%%ni5B!MwTFPe5my*ym*4416yD72ec88UgF`17;5yZLRY zM=bnLj!FuVjwWfsQI!Yx?-ZBP#~6#mMbPc!UTWo*=JlU!^k09z0FfnW`;(d3rQIzZc13M&?~| zrJQ^p+o%Se`cP?1-&T}n$2KGwx&3%iPj2?4G1%R{h`EmaaFM)g`9g6F-+15tpDLw2 zlGs(4zpWZbhE%b(ZAy6|o)Y+^!C!8^(C7P5^zP)xqoFG~vcUF#7QIen4$zP#gXurd z8MDapNbEW{P`ny(0(`}G85D$%D*D0rU4q8!=5Y|~%uEWgr54;WQ?L3_{Y6F1Hcr`b zeHmU&mRj%Ri`<;zcps94?{;lVy_}~)*3YdDphwfVK;>XweM3_0hNyDTM9eHI3-6{ z(e8PBZQNtU4-aXsU~bO7Q{Qtiz>L1E8EVveTcG8!a#}R2{-B^Ci)+Aa>M#fy}rGV z@ZuX_Ixy+tU4?sva0@V-KgQ@*6M#@+mn)(Xt8_=yP-9QwU2i+IWhT~KDhWTNRnoVt zId0;%GHiY~UKMO-0uz((0gQ+Wvg`8BEvHh)Wij6Mm+QR45W(Zn<}1sFl<})n+AE7u z1NY8PSdI|5xE(`*kCu`J@)ysQOGsgXDccA;YUv52w6T^2HiZ}D@G>i@Ob=NeOrB{A zdwYf|+T|GFVvEwN@O|TL3h#EGD-0sLWgodF>34JF=<}%@^NT_nx|r&XMo^dcB+me^ zv1uWv!gfa@)Aa7mq@7-^HO&&_f}yRS;Pg9eBhgG)-`|+A7O4NnWv_8J$j!!O`ZsCx z-Wo^c(`SaX!d5)546z-t9WCy=Q{ro6ff{qz8PQT-82-Oi(9+*r`kn>H!-gK4O$>FP zg{(w`myB%(CAcM-SjVZp%5?~TrV=-m#>cHv$$!gU;|qhF^fanwN~W5y2Tq(!SoW?+m02BDns5+r3XO!YbihmV zuvhIlR?#&Nv&y+Hs%5`DwoGx;UpU?CP;1T0ZLqpb_n#HLC8K^6wY-~sraB9-kxu5k z(bm?qsGcJ2v7#fA;YTIDyT1xNrR_A7wXf)Sz#J!_s*OIpsMlo

i8|d;)XfxTA2V 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 { + window.fetch(`${BASE_API}/config`, options).then((res) => { + return res.json(); + }).then((json) => { + if (json.success) { + resolve(); + } else { + reject(); + } + }).catch(() => { + reject(); + }); + }); + } + + render () { + let Step; + + switch (this.state.step) { + case STEP_CONNECTION: + Step = ConnectionStep; + break; + case STEP_INFO: + Step = InfoStep; + break; + case STEP_WIFI: + Step = WifiStep; + break; + case STEP_MQTT: + Step = MqttStep; + break; + case STEP_DETAILS: + Step = DetailsStep; + break; + case STEP_SENDING: + Step = SendingStep; + break; + } + + return ( +

+

Homie for ESP8266

+

Set up your device.

+ + + + this.nextStep()} setWifiCreds={(creds) => this.setWifiCreds(creds)} setMqttCreds={(creds) => this.setMqttCreds(creds)} setName={(name) => this.setName(name)} setDeviceId={(deviceId) => this.setDeviceId(deviceId)} setOtaCreds={(creds) => this.setOtaCreds(creds)} sendConfig={() => this.sendConfig()} /> +
+ ); + } +} + +ReactDOM.render(, document.getElementById('app')); diff --git a/homie-esp8266-v1-setup-sources/app/js/steps/connection.js b/homie-esp8266-v1-setup-sources/app/js/steps/connection.js new file mode 100644 index 0000000..02ff23d --- /dev/null +++ b/homie-esp8266-v1-setup-sources/app/js/steps/connection.js @@ -0,0 +1,53 @@ +'use strict'; + +import 'whatwg-fetch'; + +import React from 'react'; + +export default class ConnectionStep extends React.Component { + constructor (props) { + super(props); + } + + componentDidMount () { + let interval; + let done = false; + let heartbeat = () => { + window.fetch(`${this.props.baseApi}/heart`).then((res) => { + if (res.ok && !done) { + done = true; // prevent multiple request to trigger multiple nextStep + window.clearInterval(interval); + this.props.nextStep(); + } + }); + }; + + interval = window.setInterval(heartbeat, 5 * 1000); + heartbeat(); + } + + render () { + return ( +
+
+

+ Connect to your device Wi-Fi AP. + If the AP is named Homie-1234abcd, + the password is 1234abcd. +

+
+
+ Loading + Waiting for the device... +
+
+ ); + } +} + +if (process.env.NODE_ENV !== 'production') { // for Preact + ConnectionStep.propTypes = { + baseApi: React.PropTypes.string.isRequired, + nextStep: React.PropTypes.func.isRequired + }; +} diff --git a/homie-esp8266-v1-setup-sources/app/js/steps/details.js b/homie-esp8266-v1-setup-sources/app/js/steps/details.js new file mode 100644 index 0000000..bf985c0 --- /dev/null +++ b/homie-esp8266-v1-setup-sources/app/js/steps/details.js @@ -0,0 +1,144 @@ +'use strict'; + +import React from 'react'; + +export default class DetailsStep extends React.Component { + constructor (props) { + super(props); + + this.state = { + ota: false, + ssl: false + }; + } + + handleOtaCheckbox (e) { + this.setState({ ota: e.target.checked }); + } + + handleSslCheckbox (e) { + this.setState({ ssl: e.target.checked }); + } + + handleFormSubmit (e) { + e.preventDefault(); + + let otaCreds = {}; + otaCreds.enabled = false; + + if (this.state.ota) { + otaCreds.enabled = true; + + otaCreds.host = this.refs.host.value; + otaCreds.port = parseInt(this.refs.port.value, 10); + + otaCreds.ssl = false; + if (this.state.ssl) { + otaCreds.ssl = true; + if (this.refs.fingerprint.value !== '') otaCreds['fingerprint'] = this.refs.fingerprint.value; + } + + otaCreds.path = this.refs.path.value; + } + + this.props.setName(this.refs.name.value); + if (this.refs.deviceId.value !== '') this.props.setDeviceId(this.refs.deviceId.value); + this.props.setOtaCreds(otaCreds); + + this.props.nextStep(); + } + + render () { + return ( +
+

+ A few details before finishing the configuration. +

+ +
this.handleFormSubmit(e) }> + +

+ + Required. +

+ + +

+ + Optional. The default value is the hardware device ID. MAY be composed of lowercase letters from a to z, numbers from 0 to 9, and it MAY contain -, but MUST NOT start or end with a - +

+ +

+ +

+ + {(() => { + if (this.state.ota) { + return ( +
+ +

+ + Required. +

+ + +

+ + Required. +

+ +

+ +

+ + {(() => { + if (this.state.ssl) { + return ( +
+ +

+ + Optional. Can be lower-case, upper-case, separated by spaced or :. +

+
+ ); + } + })()} + + +

+ + Required. +

+ +
+
+ ); + } + })()} + +

+ +

+
+
+ ); + } +} + +if (process.env.NODE_ENV !== 'production') { // for Preact + DetailsStep.propTypes = { + nextStep: React.PropTypes.func.isRequired, + mqttConfig: React.PropTypes.object.isRequired, + setName: React.PropTypes.func.isRequired, + setDeviceId: React.PropTypes.func.isRequired, + setOtaCreds: React.PropTypes.func.isRequired + }; +} diff --git a/homie-esp8266-v1-setup-sources/app/js/steps/info.js b/homie-esp8266-v1-setup-sources/app/js/steps/info.js new file mode 100644 index 0000000..4788011 --- /dev/null +++ b/homie-esp8266-v1-setup-sources/app/js/steps/info.js @@ -0,0 +1,105 @@ +'use strict'; + +import 'whatwg-fetch'; + +import React from 'react'; + +export default class InfoStep extends React.Component { + constructor (props) { + super(props); + this.state = { + loading: true, + info: {} + }; + } + + componentDidMount () { + let interval; + let done = false; + let deviceinfo = () => { + window.fetch(`${this.props.baseApi}/device-info`).then((res) => { + if (res.ok && !done) { + done = true; + window.clearInterval(interval); + return res.json(); + } + }).then((json) => { + this.setState({ + loading: false, + info: json + }); + }); + }; + + interval = window.setInterval(deviceinfo, 5 * 1000); + deviceinfo(); + } + + handleNextButton (e) { + e.preventDefault(); + + this.props.nextStep(); + } + + render () { + return ( +
+ {(() => { + if (this.state.loading) { + return ( +
+ Loading + Gathering device information... +
+ ); + } else { + return ( +
+

+ Here are some information about the device you are about to configure: +

+ +
    +
  • Device ID: { this.state.info.device_id }
  • +
  • Homie version: { this.state.info.homie_version }
  • +
  • Firmware name: { this.state.info.firmware.name }
  • +
  • Firmware version: { this.state.info.firmware.version }
  • +
  • + Nodes: + + + + + + + + + { this.state.info.nodes.map((node, i) => { + return ( + + + + + ); + }) } + +
    IDType
    { node.id }{ node.type }
    +
  • +
+ + { this.handleNextButton(e); } }>Next +
+ ); + } + })()} +
+ ); + } +} + +if (process.env.NODE_ENV !== 'production') { // for Preact + InfoStep.propTypes = { + baseApi: React.PropTypes.string.isRequired, + nextStep: React.PropTypes.func.isRequired + }; +} diff --git a/homie-esp8266-v1-setup-sources/app/js/steps/mqtt.js b/homie-esp8266-v1-setup-sources/app/js/steps/mqtt.js new file mode 100644 index 0000000..dda1699 --- /dev/null +++ b/homie-esp8266-v1-setup-sources/app/js/steps/mqtt.js @@ -0,0 +1,146 @@ +'use strict'; + +import React from 'react'; + +export default class MqttStep extends React.Component { + constructor (props) { + super(props); + this.state = { + auth: false, + showPassword: false, + ssl: false + }; + } + + handleSslCheckbox (e) { + this.setState({ ssl: e.target.checked }); + } + + handleAuthCheckbox (e) { + this.setState({ auth: e.target.checked }); + } + + handleHiddenCheckbox (e) { + this.setState({ showPassword: e.target.checked }); + } + + handleFormSubmit (e) { + e.preventDefault(); + + let creds = {}; + creds.host = this.refs.host.value; + creds.port = parseInt(this.refs.port.value, 10); + if (this.refs.baseTopic.value !== '') creds['base_topic'] = this.refs.baseTopic.value; + + creds.ssl = false; + if (this.state.ssl) { + creds.ssl = true; + if (this.refs.fingerprint.value !== '') creds['fingerprint'] = this.refs.fingerprint.value; + } + + creds.auth = false; + if (this.state.auth) { + creds.auth = true; + creds.username = this.refs.username.value; + creds.password = this.refs.password.value; + } + + this.props.setMqttCreds(creds); + this.props.nextStep(); + } + + render () { + return ( +
+

+ Enter the MQTT credentials. +

+ +
this.handleFormSubmit(e) }> + +

+ + Required. +

+ + +

+ + Required. +

+ + +

+ + Optional. The default value is devices/. +

+ +

+ +

+ + {(() => { + if (this.state.ssl) { + return ( +
+ +

+ + Optional. Can be lower-case, upper-case, separated by spaced or :. +

+
+ ); + } + })()} + +

+ +

+ + {(() => { + if (this.state.auth) { + return ( +
+ +

+ + Required. +

+ + +

+ + +

+ Required. + +
+
+ ); + } + })()} + +

+ +

+
+
+ ); + } +} + +if (process.env.NODE_ENV !== 'production') { // for Preact + MqttStep.propTypes = { + nextStep: React.PropTypes.func.isRequired, + setMqttCreds: React.PropTypes.func.isRequired + }; +} diff --git a/homie-esp8266-v1-setup-sources/app/js/steps/sending.js b/homie-esp8266-v1-setup-sources/app/js/steps/sending.js new file mode 100644 index 0000000..4bd41b6 --- /dev/null +++ b/homie-esp8266-v1-setup-sources/app/js/steps/sending.js @@ -0,0 +1,58 @@ +'use strict'; + +import React from 'react'; + +export default class SendingStep extends React.Component { + constructor (props) { + super(props); + this.state = { + loading: true, + success: null + }; + } + + componentDidMount () { + this.props.sendConfig().then(() => { + this.setState({ loading: false, success: true }); + }).catch(() => { + this.setState({ loading: false, success: false }); + }); + } + + render () { + return ( +
+ {(() => { + if (this.state.loading) { + return ( +
+ Loading + Sending configuration... +
+ ); + } else { + if (this.state.success) { + return ( +
+ The configuration was sent. Your device will reboot. +
+ ); + } else { + return ( +
+ There was an error while sending the configuration. Please retry. +
+ ); + } + } + })()} +
+ ); + } +} + +if (process.env.NODE_ENV !== 'production') { // for Preact + SendingStep.propTypes = { + sendConfig: React.PropTypes.func.isRequired + }; +} diff --git a/homie-esp8266-v1-setup-sources/app/js/steps/wifi.js b/homie-esp8266-v1-setup-sources/app/js/steps/wifi.js new file mode 100644 index 0000000..49d12c1 --- /dev/null +++ b/homie-esp8266-v1-setup-sources/app/js/steps/wifi.js @@ -0,0 +1,202 @@ +'use strict'; + +import 'whatwg-fetch'; + +import React from 'react'; + +export default class WifiStep extends React.Component { + constructor (props) { + super(props); + this.state = { + loading: false, + networks: { networks: [] }, + buttonDisabled: true, + selectedSsid: null, + showSsidInput: false, + showPasswordInput: false, + showPassword: false + }; + } + + componentDidMount () { + let interval; + let done = false; + let networks = () => { + window.fetch(`${this.props.baseApi}/networks`).then((res) => { + if (res.ok && !done) { + done = true; + window.clearInterval(interval); + return res.json(); + } + }).then((json) => { + this.setState({ + loading: false, + networks: json + }); + }); + }; + + interval = window.setInterval(networks, 5 * 1000); + networks(); + } + + handleSelectChange (e) { + if (e.target.value === 'select') { + this.setState({ showSsidInput: false, showPasswordInput: false, selectedSsid: null, buttonDisabled: true }); + } else if (e.target.value === 'other') { + this.setState({ showSsidInput: true, showPasswordInput: true, selectedSsid: null, buttonDisabled: false }); + } else { + let data = e.target.options[e.target.selectedIndex].dataset; + this.setState({ showSsidInput: false, showPasswordInput: data.open === 'no', selectedSsid: data.ssid, buttonDisabled: false }); + } + } + + handleHiddenChange (e) { + this.setState({ showPassword: e.target.checked }); + } + + handleFormSubmit (e) { + e.preventDefault(); + + let creds = {}; + + if (this.state.selectedSsid) { + creds.ssid = this.state.selectedSsid; + } else { + creds.ssid = this.refs.ssid.value; + } + creds.password = this.refs.password.value; + + this.props.setWifiCreds(creds); + this.props.nextStep(); + } + + render () { + return ( +
+ {(() => { + if (this.state.loading) { + return ( +
+ Loading + Gathering available networks... +
+ ); + } else { + this.state.networks.networks.sort(function (networkA, networkB) { + if (networkA.rssi > networkB.rssi) { + return -1; + } else if (networkA.rssi < networkB.rssi) { + return 1; + } else { + return 0; + } + }); + + let networks = this.state.networks.networks.map(function (network) { + if (network.rssi <= -100) { + network.signalQuality = 0; + } else if (network.rssi >= -50) { + network.signalQuality = 100; + } else { + network.signalQuality = 2 * (network.rssi + 100); + } + + switch (network.encryption) { + case 'wep': + network.encryption = 'WEP'; + break; + case 'wpa': + network.encryption = 'WPA'; + break; + case 'wpa2': + network.encryption = 'WPA2'; + break; + case 'none': + network.encryption = 'Open'; + break; + case 'auto': + network.encryption = 'Automatic'; + break; + } + return network; + }); + + return ( +
+

+ Select the Wi-Fi network to connect to: +

+ +
this.handleFormSubmit(e) }> + +

+ + + +

+ + {(() => { + if (this.state.showSsidInput) { + return ( +
+ +

+ + Required. +

+
+ ); + } + })()} + + {(() => { + if (this.state.showPasswordInput) { + return ( +
+ +

+ + +

+ Optional. Leave blank if open network. +
+
+ ); + } + })()} + +

+ +

+
+
+ ); + } + })()} +
+ ); + } +} + +if (process.env.NODE_ENV !== 'production') { // for Preact + WifiStep.propTypes = { + baseApi: React.PropTypes.string.isRequired, + nextStep: React.PropTypes.func.isRequired, + setWifiCreds: React.PropTypes.func.isRequired + }; +} diff --git a/homie-esp8266-v1-setup-sources/app/vendor/bulma/css/bulma.min.css b/homie-esp8266-v1-setup-sources/app/vendor/bulma/css/bulma.min.css new file mode 100644 index 0000000..d5d5466 --- /dev/null +++ b/homie-esp8266-v1-setup-sources/app/vendor/bulma/css/bulma.min.css @@ -0,0 +1,2 @@ +html,body,body div,span,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,abbr,address,cite,code,del,dfn,em,img,ins,kbd,q,samp,small,strong,sub,sup,var,b,i,dl,dt,dd,ol,ul,li,fieldset,form,label,legend,table,caption,tbody,tfoot,thead,tr,th,td,article,aside,figure,footer,header,menu,nav,section,time,mark,audio,video,details,summary{margin:0;padding:0;border:0;font-size:100%;font-weight:normal;vertical-align:baseline;background:transparent}article,aside,figure,footer,header,nav,section,details,summary{display:block}html{box-sizing:border-box}*,*:before,*:after{box-sizing:inherit}img,object,embed{max-width:100%}html{overflow-y:scroll}ul{list-style:none}blockquote,q{quotes:none}blockquote:before,blockquote:after,q:before,q:after{content:'';content:none}a{margin:0;padding:0;font-size:100%;vertical-align:baseline;background:transparent}del{text-decoration:line-through}abbr[title],dfn[title]{border-bottom:1px dotted #000;cursor:help}table{border-collapse:collapse;border-spacing:0}th{font-weight:bold;vertical-align:bottom}td{font-weight:normal;vertical-align:top}hr{display:block;height:1px;border:0;border-top:1px solid #ccc;margin:1em 0;padding:0}input,select{vertical-align:middle}pre{white-space:pre;white-space:pre-wrap;white-space:pre-line;word-wrap:break-word}input[type="radio"]{vertical-align:text-bottom}input[type="checkbox"]{vertical-align:bottom}select,input,textarea{font:99% sans-serif}table{font-size:inherit;font:100%}small{font-size:85%}strong{font-weight:bold}td,td img{vertical-align:top}sub,sup{font-size:75%;line-height:0;position:relative}sup{top:-0.5em}sub{bottom:-0.25em}pre,code,kbd,samp{font-family:monospace, sans-serif}label,input[type=button],input[type=submit],input[type=file],button{cursor:pointer}button,input,select,textarea{margin:0}button,input[type=button]{width:auto;overflow:visible}@-webkit-keyframes spin-around{from{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes spin-around{from{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}html{background:#f5f7fa;font-size:14px;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;min-width:300px;overflow-x:hidden;overflow-y:scroll;text-rendering:optimizeLegibility}html.has-modal-open{overflow:hidden}body,button,input,select,textarea{font-family:"Helvetica Neue","Helvetica","Arial",sans-serif}code,pre{-moz-osx-font-smoothing:auto;-webkit-font-smoothing:auto;font-family:monospace;line-height:1.25}body{color:#69707a;font-size:1rem;line-height:1.428571428571429}a{color:#1fc8db;cursor:pointer;text-decoration:none;-webkit-transition:none 86ms ease-out;transition:none 86ms ease-out}a:hover{color:#222324}code{background:#f5f7fa;color:#ed6c63;font-size:12px;font-weight:normal;padding:1px 2px 2px}hr{border-top-color:#d3d6db;margin:20px 0}img{max-width:100%}input[type="checkbox"],input[type="radio"]{vertical-align:baseline}small{font-size:11px}strong{color:#222324}article,aside,figure,footer,header,hgroup,section{display:block}pre{background:#f5f7fa;color:#69707a;white-space:pre;word-wrap:normal}pre code{background:#f5f7fa;color:#69707a;display:block;overflow-x:auto;padding:16px 20px}table{width:100%}table th,table td{text-align:left;vertical-align:top}table th{color:#222324}.block:not(:last-child),.content:not(:last-child),.title:not(:last-child),.subtitle:not(:last-child),.message:not(:last-child),.notification:not(:last-child),.progress:not(:last-child),.highlight:not(:last-child),.navbar:not(:last-child),.tabs:not(:last-child),.box:not(:last-child){margin-bottom:20px}.container{position:relative}@media screen and (min-width: 980px){.container{margin:0 auto;max-width:960px}.container.is-fluid{margin:0 20px;max-width:none}}.fa{font-size:21px;text-align:center;vertical-align:top}.content.is-medium{font-size:18px}.content.is-medium code{font-size:14px}.content.is-large{font-size:24px}.content.is-large code{font-size:18px}.content h1,.content h2,.content h3,.content h4,.content h5,.content h6{color:#222324;font-weight:300;line-height:1.125;margin-bottom:20px}.content h1:not(:first-child),.content h2:not(:first-child),.content h3:not(:first-child){margin-top:40px}.content h1{font-size:2em}.content h2{font-size:1.75em}.content h3{font-size:1.5em}.content h4{font-size:1.25em}.content h5{font-size:1.125em}.content h6{font-size:1em}.content p:not(:last-child){margin-bottom:1em}.content li+li{margin-top:0.25em}.content ol{list-style:decimal outside;margin:1em 2em}.content ul{list-style:disc outside;margin:1em 2em}.content ul ul{list-style-type:circle;margin-top:0.5em}.content ul ul ul{list-style-type:square}.content blockquote{background:#f5f7fa;border-left:5px solid #d3d6db;padding:1.5em}.content blockquote:not(:last-child){margin-bottom:1em}.highlight{background-color:#fdf6e3;color:#586e75}.highlight .c{color:#93a1a1}.highlight .err,.highlight .g{color:#586e75}.highlight .k{color:#859900}.highlight .l,.highlight .n{color:#586e75}.highlight .o{color:#859900}.highlight .x{color:#cb4b16}.highlight .p{color:#586e75}.highlight .cm{color:#93a1a1}.highlight .cp{color:#859900}.highlight .c1{color:#93a1a1}.highlight .cs{color:#859900}.highlight .gd{color:#2aa198}.highlight .ge{color:#586e75;font-style:italic}.highlight .gr{color:#dc322f}.highlight .gh{color:#cb4b16}.highlight .gi{color:#859900}.highlight .go,.highlight .gp{color:#586e75}.highlight .gs{color:#586e75;font-weight:bold}.highlight .gu{color:#cb4b16}.highlight .gt{color:#586e75}.highlight .kc{color:#cb4b16}.highlight .kd{color:#268bd2}.highlight .kn,.highlight .kp{color:#859900}.highlight .kr{color:#268bd2}.highlight .kt{color:#dc322f}.highlight .ld{color:#586e75}.highlight .m,.highlight .s{color:#2aa198}.highlight .na{color:#B58900}.highlight .nb{color:#586e75}.highlight .nc{color:#268bd2}.highlight .no{color:#cb4b16}.highlight .nd{color:#268bd2}.highlight .ni,.highlight .ne{color:#cb4b16}.highlight .nf{color:#268bd2}.highlight .nl,.highlight .nn,.highlight .nx,.highlight .py{color:#586e75}.highlight .nt,.highlight .nv{color:#268bd2}.highlight .ow{color:#859900}.highlight .w{color:#586e75}.highlight .mf,.highlight .mh,.highlight .mi,.highlight .mo{color:#2aa198}.highlight .sb{color:#93a1a1}.highlight .sc{color:#2aa198}.highlight .sd{color:#586e75}.highlight .s2{color:#2aa198}.highlight .se{color:#cb4b16}.highlight .sh{color:#586e75}.highlight .si,.highlight .sx{color:#2aa198}.highlight .sr{color:#dc322f}.highlight .s1,.highlight .ss{color:#2aa198}.highlight .bp,.highlight .vc,.highlight .vg,.highlight .vi{color:#268bd2}.highlight .il{color:#2aa198}.is-flex{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.is-clearfix:after{clear:both;content:" ";display:table}.is-pulled-left{float:left}.is-pulled-right{float:right}.is-overlay{bottom:0;left:0;position:absolute;right:0;top:0}.is-fullwidth{width:100%}.is-text-centered{text-align:center}.is-text-left{text-align:left}.is-text-right{text-align:right}@media screen and (max-width: 768px){.is-hidden-mobile{display:none !important}}@media screen and (min-width: 769px){.is-hidden-tablet{display:none !important}}@media screen and (max-width: 979px){.is-hidden-touch{display:none !important}}@media screen and (min-width: 980px){.is-hidden-desktop{display:none !important}}.is-disabled{pointer-events:none}.is-marginless{margin:0 !important}.is-unselectable{-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.input,.textarea{-moz-appearance:none;-webkit-appearance:none;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background:#fff;border:1px solid #d3d6db;border-radius:3px;color:#222324;display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;font-size:14px;height:32px;line-height:24px;padding:3px 8px;position:relative;vertical-align:top;box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);display:block;max-width:100%;width:100%}.input:hover,.textarea:hover{border-color:#aeb1b5}.input:active,.textarea:active,.input:focus,.textarea:focus{border-color:#1fc8db;outline:none}.input[disabled],[disabled].textarea,.input[disabled]:hover,[disabled].textarea:hover{background:#f5f7fa;border-color:#d3d6db;cursor:not-allowed}.input[disabled]::-moz-placeholder,[disabled].textarea::-moz-placeholder,.input[disabled]:hover::-moz-placeholder,[disabled].textarea:hover::-moz-placeholder{color:rgba(34,35,36,0.3)}.input[disabled]::-webkit-input-placeholder,[disabled].textarea::-webkit-input-placeholder,.input[disabled]:hover::-webkit-input-placeholder,[disabled].textarea:hover::-webkit-input-placeholder{color:rgba(34,35,36,0.3)}.input[disabled]:-moz-placeholder,[disabled].textarea:-moz-placeholder,.input[disabled]:hover:-moz-placeholder,[disabled].textarea:hover:-moz-placeholder{color:rgba(34,35,36,0.3)}.input[disabled]:-ms-input-placeholder,[disabled].textarea:-ms-input-placeholder,.input[disabled]:hover:-ms-input-placeholder,[disabled].textarea:hover:-ms-input-placeholder{color:rgba(34,35,36,0.3)}.input.is-dark,.is-dark.textarea{border-color:#222324}.input.is-primary,.is-primary.textarea{border-color:#1fc8db}.input.is-info,.is-info.textarea{border-color:#42afe3}.input.is-success,.is-success.textarea{border-color:#97cd76}.input.is-warning,.is-warning.textarea{border-color:#fce473}.input.is-danger,.is-danger.textarea{border-color:#ed6c63}.input[type="search"],[type="search"].textarea{border-radius:290486px}.input.is-flat,.is-flat.textarea{border:none;box-shadow:none;padding:4px 8px}.input.is-small,.is-small.textarea{border-radius:2px;font-size:11px;height:24px;line-height:16px;padding:3px 6px}.input.is-small.is-flat,.is-small.is-flat.textarea{padding:4px 6px}.input.is-medium,.is-medium.textarea{font-size:18px;height:40px;line-height:32px;padding:3px 10px}.input.is-medium.is-flat,.is-medium.is-flat.textarea{padding:4px 10px}.input.is-large,.is-large.textarea{font-size:24px;height:48px;line-height:40px;padding:3px 12px}.input.is-large.is-flat,.is-large.is-flat.textarea{padding:4px 12px}.input.is-fullwidth,.is-fullwidth.textarea{display:block;width:100%}.input.is-inline,.is-inline.textarea{display:inline;width:auto}.textarea{line-height:1.2;max-height:600px;max-width:100%;min-height:120px;min-width:100%;padding:10px;resize:vertical}.checkbox,.panel-checkbox,.radio{cursor:pointer;display:inline-block;line-height:16px;padding-left:18px;position:relative;vertical-align:top}.checkbox input,.panel-checkbox input,.radio input{-moz-appearance:none;-webkit-appearance:none;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background:#fff;border:1px solid #d3d6db;border-radius:3px;color:#222324;display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;font-size:14px;height:32px;line-height:24px;padding:3px 8px;position:relative;vertical-align:top;border-radius:1px;box-shadow:inset 0 1px 1px rgba(0,0,0,0.1);cursor:pointer;float:left;height:14px;left:0;outline:none;padding:0;position:absolute;top:1px;width:14px}.checkbox input:hover,.panel-checkbox input:hover,.radio input:hover{border-color:#aeb1b5}.checkbox input:active,.panel-checkbox input:active,.radio input:active,.checkbox input:focus,.panel-checkbox input:focus,.radio input:focus{border-color:#1fc8db;outline:none}.checkbox input[disabled],.panel-checkbox input[disabled],.radio input[disabled],.checkbox input[disabled]:hover,.panel-checkbox input[disabled]:hover,.radio input[disabled]:hover{background:#f5f7fa;border-color:#d3d6db;cursor:not-allowed}.checkbox input[disabled]::-moz-placeholder,.panel-checkbox input[disabled]::-moz-placeholder,.radio input[disabled]::-moz-placeholder,.checkbox input[disabled]:hover::-moz-placeholder,.panel-checkbox input[disabled]:hover::-moz-placeholder,.radio input[disabled]:hover::-moz-placeholder{color:rgba(34,35,36,0.3)}.checkbox input[disabled]::-webkit-input-placeholder,.panel-checkbox input[disabled]::-webkit-input-placeholder,.radio input[disabled]::-webkit-input-placeholder,.checkbox input[disabled]:hover::-webkit-input-placeholder,.panel-checkbox input[disabled]:hover::-webkit-input-placeholder,.radio input[disabled]:hover::-webkit-input-placeholder{color:rgba(34,35,36,0.3)}.checkbox input[disabled]:-moz-placeholder,.panel-checkbox input[disabled]:-moz-placeholder,.radio input[disabled]:-moz-placeholder,.checkbox input[disabled]:hover:-moz-placeholder,.panel-checkbox input[disabled]:hover:-moz-placeholder,.radio input[disabled]:hover:-moz-placeholder{color:rgba(34,35,36,0.3)}.checkbox input[disabled]:-ms-input-placeholder,.panel-checkbox input[disabled]:-ms-input-placeholder,.radio input[disabled]:-ms-input-placeholder,.checkbox input[disabled]:hover:-ms-input-placeholder,.panel-checkbox input[disabled]:hover:-ms-input-placeholder,.radio input[disabled]:hover:-ms-input-placeholder{color:rgba(34,35,36,0.3)}.checkbox input.is-dark,.panel-checkbox input.is-dark,.radio input.is-dark{border-color:#222324}.checkbox input.is-primary,.panel-checkbox input.is-primary,.radio input.is-primary{border-color:#1fc8db}.checkbox input.is-info,.panel-checkbox input.is-info,.radio input.is-info{border-color:#42afe3}.checkbox input.is-success,.panel-checkbox input.is-success,.radio input.is-success{border-color:#97cd76}.checkbox input.is-warning,.panel-checkbox input.is-warning,.radio input.is-warning{border-color:#fce473}.checkbox input.is-danger,.panel-checkbox input.is-danger,.radio input.is-danger{border-color:#ed6c63}.checkbox input:after,.panel-checkbox input:after,.radio input:after{border:1px solid #fff;border-right:0;border-top:0;content:" ";display:block;height:7px;pointer-events:none;position:absolute;-webkit-transform:rotate(-45deg);transform:rotate(-45deg);width:7px;height:4px;left:3px;opacity:0;position:absolute;top:3px;-webkit-transform:rotate(-45deg) scale(1);transform:rotate(-45deg) scale(1)}.checkbox input:checked,.panel-checkbox input:checked,.radio input:checked{background:#1fc8db;border-color:#1fc8db;box-shadow:none}.checkbox input:checked:after,.panel-checkbox input:checked:after,.radio input:checked:after{opacity:1}.checkbox:hover,.panel-checkbox:hover,.radio:hover{color:#222324}.checkbox:hover input,.panel-checkbox:hover input,.radio:hover input{border-color:#aeb1b5}.checkbox:hover input:checked,.panel-checkbox:hover input:checked,.radio:hover input:checked{border-color:#1fc8db}.is-disabled.checkbox,.is-disabled.panel-checkbox,.is-disabled.radio,.is-disabled.checkbox:hover,.is-disabled.panel-checkbox:hover,.is-disabled.radio:hover{color:#aeb1b5}.radio+.radio{margin-left:10px}.radio input{border-radius:8px}.radio input:after{background:#fff;border:0;border-radius:2px;left:4px;top:4px;-webkit-transform:none;transform:none;width:4px}.select{display:inline-block;height:32px;position:relative;vertical-align:top}.select select{-moz-appearance:none;-webkit-appearance:none;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background:#fff;border:1px solid #d3d6db;border-radius:3px;color:#222324;display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;font-size:14px;height:32px;line-height:24px;padding:3px 8px;position:relative;vertical-align:top;cursor:pointer;display:block;outline:none;padding-right:36px}.select select:hover{border-color:#aeb1b5}.select select:active,.select select:focus{border-color:#1fc8db;outline:none}.select select[disabled],.select select[disabled]:hover{background:#f5f7fa;border-color:#d3d6db;cursor:not-allowed}.select select[disabled]::-moz-placeholder,.select select[disabled]:hover::-moz-placeholder{color:rgba(34,35,36,0.3)}.select select[disabled]::-webkit-input-placeholder,.select select[disabled]:hover::-webkit-input-placeholder{color:rgba(34,35,36,0.3)}.select select[disabled]:-moz-placeholder,.select select[disabled]:hover:-moz-placeholder{color:rgba(34,35,36,0.3)}.select select[disabled]:-ms-input-placeholder,.select select[disabled]:hover:-ms-input-placeholder{color:rgba(34,35,36,0.3)}.select select.is-dark{border-color:#222324}.select select.is-primary{border-color:#1fc8db}.select select.is-info{border-color:#42afe3}.select select.is-success{border-color:#97cd76}.select select.is-warning{border-color:#fce473}.select select.is-danger{border-color:#ed6c63}.select select:hover{border-color:#aeb1b5}.select select::ms-expand{display:none}.select.is-fullwidth{width:100%}.select.is-fullwidth select{width:100%}.select:after{border:1px solid #1fc8db;border-right:0;border-top:0;content:" ";display:block;height:7px;pointer-events:none;position:absolute;-webkit-transform:rotate(-45deg);transform:rotate(-45deg);width:7px;margin-top:-6px;right:16px;top:50%}.select:hover:after{border-color:#222324}.label{color:#222324;display:block;font-weight:bold}.label:not(:last-child){margin-bottom:5px}.help{display:block;font-size:11px;margin-top:5px}.help.is-dark{color:#222324}.help.is-primary{color:#1fc8db}.help.is-info{color:#42afe3}.help.is-success{color:#97cd76}.help.is-warning{color:#fce473}.help.is-danger{color:#ed6c63}@media screen and (max-width: 768px){.control-label{margin-bottom:5px}}@media screen and (min-width: 769px){.control-label{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;margin-right:20px;padding-top:7px;text-align:right}}.control{position:relative;text-align:left}.control.is-loading:after{position:absolute !important;right:8px;top:8px}.control:not(:last-child){margin-bottom:10px}.control.has-icon>.fa{display:inline-block;font-size:14px;height:16px;line-height:16px;text-align:center;vertical-align:top;width:16px;color:#aeb1b5;pointer-events:none;position:absolute;top:8px;z-index:4}.control.has-icon .input:focus+.fa,.control.has-icon .textarea:focus+.fa{color:#222324}.control.has-icon:not(.has-icon-right)>.fa{left:8px}.control.has-icon:not(.has-icon-right) .input,.control.has-icon:not(.has-icon-right) .textarea{padding-left:32px}.control.has-icon-right>.fa{right:8px}.control.has-icon-right .input,.control.has-icon-right .textarea{padding-right:32px}.control.has-addons{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.control.has-addons .input,.control.has-addons .textarea,.control.has-addons .button,.control.has-addons .pagination a,.pagination .control.has-addons a,.control.has-addons .select{border-radius:0;margin-right:-1px}.control.has-addons .input:hover,.control.has-addons .textarea:hover,.control.has-addons .button:hover,.control.has-addons .pagination a:hover,.pagination .control.has-addons a:hover,.control.has-addons .select:hover{z-index:2}.control.has-addons .input:active,.control.has-addons .textarea:active,.control.has-addons .input:focus,.control.has-addons .textarea:focus,.control.has-addons .button:active,.control.has-addons .pagination a:active,.pagination .control.has-addons a:active,.control.has-addons .button:focus,.control.has-addons .pagination a:focus,.pagination .control.has-addons a:focus,.control.has-addons .select:active,.control.has-addons .select:focus{z-index:3}.control.has-addons .input:first-child,.control.has-addons .textarea:first-child,.control.has-addons .button:first-child,.control.has-addons .pagination a:first-child,.pagination .control.has-addons a:first-child,.control.has-addons .select:first-child{border-radius:3px 0 0 3px}.control.has-addons .input:first-child select,.control.has-addons .textarea:first-child select,.control.has-addons .button:first-child select,.control.has-addons .pagination a:first-child select,.pagination .control.has-addons a:first-child select,.control.has-addons .select:first-child select{border-radius:3px 0 0 3px}.control.has-addons .input:last-child,.control.has-addons .textarea:last-child,.control.has-addons .button:last-child,.control.has-addons .pagination a:last-child,.pagination .control.has-addons a:last-child,.control.has-addons .select:last-child{border-radius:0 3px 3px 0}.control.has-addons.is-centered{-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center}.control.is-grouped{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.control.is-grouped>.button:not(:last-child),.pagination .control.is-grouped>a:not(:last-child),.control.is-grouped>.input:not(:last-child),.control.is-grouped>.textarea:not(:last-child),.control.is-grouped>.select:not(:last-child){margin-right:10px}.control.is-grouped>.input,.control.is-grouped>.textarea{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}@media screen and (min-width: 769px){.control.is-horizontal{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.control.is-horizontal>.control{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-flex:5;-webkit-flex:5;-ms-flex:5;flex:5}}.button,.pagination a{-moz-appearance:none;-webkit-appearance:none;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background:#fff;border:1px solid #d3d6db;border-radius:3px;color:#222324;display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;font-size:14px;height:32px;line-height:24px;padding:3px 8px;position:relative;vertical-align:top;-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;padding:3px 10px;text-align:center;white-space:nowrap}.button:hover,.pagination a:hover{border-color:#aeb1b5}.button:active,.pagination a:active,.button:focus,.pagination a:focus{border-color:#1fc8db;outline:none}.button[disabled],.pagination a[disabled],.button[disabled]:hover,.pagination a[disabled]:hover{background:#f5f7fa;border-color:#d3d6db;cursor:not-allowed}.button[disabled]::-moz-placeholder,.pagination a[disabled]::-moz-placeholder,.button[disabled]:hover::-moz-placeholder,.pagination a[disabled]:hover::-moz-placeholder{color:rgba(34,35,36,0.3)}.button[disabled]::-webkit-input-placeholder,.pagination a[disabled]::-webkit-input-placeholder,.button[disabled]:hover::-webkit-input-placeholder,.pagination a[disabled]:hover::-webkit-input-placeholder{color:rgba(34,35,36,0.3)}.button[disabled]:-moz-placeholder,.pagination a[disabled]:-moz-placeholder,.button[disabled]:hover:-moz-placeholder,.pagination a[disabled]:hover:-moz-placeholder{color:rgba(34,35,36,0.3)}.button[disabled]:-ms-input-placeholder,.pagination a[disabled]:-ms-input-placeholder,.button[disabled]:hover:-ms-input-placeholder,.pagination a[disabled]:hover:-ms-input-placeholder{color:rgba(34,35,36,0.3)}.button strong,.pagination a strong{color:inherit}.button small,.pagination a small{display:block;font-size:11px;line-height:1;margin-top:5px}.button .icon:first-child,.pagination a .icon:first-child{margin-right:4px}.button .icon:last-child,.pagination a .icon:last-child{margin-left:4px}.button:hover,.pagination a:hover{color:#222324}.button:active,.pagination a:active{box-shadow:inset 0 1px 2px rgba(0,0,0,0.2)}.button.is-dark,.pagination a.is-dark{background:#222324;border-color:transparent;color:#fff}.button.is-dark:hover,.pagination a.is-dark:hover,.button.is-dark:focus,.pagination a.is-dark:focus{background:#090a0a;border-color:transparent;color:#fff}.button.is-dark:active,.pagination a.is-dark:active{border-color:transparent}.button.is-dark.is-outlined,.pagination a.is-dark.is-outlined{background:transparent;border-color:#222324;color:#222324}.button.is-dark.is-outlined:hover,.pagination a.is-dark.is-outlined:hover,.button.is-dark.is-outlined:focus,.pagination a.is-dark.is-outlined:focus{border-color:#090a0a;color:#090a0a}.button.is-dark.is-inverted,.pagination a.is-dark.is-inverted{background:#fff;color:#222324}.button.is-dark.is-inverted:hover,.pagination a.is-dark.is-inverted:hover{background:#f2f2f2}.button.is-dark.is-inverted.is-outlined,.pagination a.is-dark.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-dark.is-inverted.is-outlined:hover,.pagination a.is-dark.is-inverted.is-outlined:hover{background:rgba(0,0,0,0.05)}.button.is-dark.is-loading:after,.pagination a.is-dark.is-loading:after{border-color:transparent transparent #fff #fff !important}.button.is-primary,.pagination a.is-primary{background:#1fc8db;border-color:transparent;color:#fff}.button.is-primary:hover,.pagination a.is-primary:hover,.button.is-primary:focus,.pagination a.is-primary:focus{background:#199fae;border-color:transparent;color:#fff}.button.is-primary:active,.pagination a.is-primary:active{border-color:transparent}.button.is-primary.is-outlined,.pagination a.is-primary.is-outlined{background:transparent;border-color:#1fc8db;color:#1fc8db}.button.is-primary.is-outlined:hover,.pagination a.is-primary.is-outlined:hover,.button.is-primary.is-outlined:focus,.pagination a.is-primary.is-outlined:focus{border-color:#199fae;color:#199fae}.button.is-primary.is-inverted,.pagination a.is-primary.is-inverted{background:#fff;color:#1fc8db}.button.is-primary.is-inverted:hover,.pagination a.is-primary.is-inverted:hover{background:#f2f2f2}.button.is-primary.is-inverted.is-outlined,.pagination a.is-primary.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-primary.is-inverted.is-outlined:hover,.pagination a.is-primary.is-inverted.is-outlined:hover{background:rgba(0,0,0,0.05)}.button.is-primary.is-loading:after,.pagination a.is-primary.is-loading:after{border-color:transparent transparent #fff #fff !important}.button.is-info,.pagination a.is-info{background:#42afe3;border-color:transparent;color:#fff}.button.is-info:hover,.pagination a.is-info:hover,.button.is-info:focus,.pagination a.is-info:focus{background:#1f99d3;border-color:transparent;color:#fff}.button.is-info:active,.pagination a.is-info:active{border-color:transparent}.button.is-info.is-outlined,.pagination a.is-info.is-outlined{background:transparent;border-color:#42afe3;color:#42afe3}.button.is-info.is-outlined:hover,.pagination a.is-info.is-outlined:hover,.button.is-info.is-outlined:focus,.pagination a.is-info.is-outlined:focus{border-color:#1f99d3;color:#1f99d3}.button.is-info.is-inverted,.pagination a.is-info.is-inverted{background:#fff;color:#42afe3}.button.is-info.is-inverted:hover,.pagination a.is-info.is-inverted:hover{background:#f2f2f2}.button.is-info.is-inverted.is-outlined,.pagination a.is-info.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-info.is-inverted.is-outlined:hover,.pagination a.is-info.is-inverted.is-outlined:hover{background:rgba(0,0,0,0.05)}.button.is-info.is-loading:after,.pagination a.is-info.is-loading:after{border-color:transparent transparent #fff #fff !important}.button.is-success,.pagination a.is-success{background:#97cd76;border-color:transparent;color:#fff}.button.is-success:hover,.pagination a.is-success:hover,.button.is-success:focus,.pagination a.is-success:focus{background:#7bbf51;border-color:transparent;color:#fff}.button.is-success:active,.pagination a.is-success:active{border-color:transparent}.button.is-success.is-outlined,.pagination a.is-success.is-outlined{background:transparent;border-color:#97cd76;color:#97cd76}.button.is-success.is-outlined:hover,.pagination a.is-success.is-outlined:hover,.button.is-success.is-outlined:focus,.pagination a.is-success.is-outlined:focus{border-color:#7bbf51;color:#7bbf51}.button.is-success.is-inverted,.pagination a.is-success.is-inverted{background:#fff;color:#97cd76}.button.is-success.is-inverted:hover,.pagination a.is-success.is-inverted:hover{background:#f2f2f2}.button.is-success.is-inverted.is-outlined,.pagination a.is-success.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-success.is-inverted.is-outlined:hover,.pagination a.is-success.is-inverted.is-outlined:hover{background:rgba(0,0,0,0.05)}.button.is-success.is-loading:after,.pagination a.is-success.is-loading:after{border-color:transparent transparent #fff #fff !important}.button.is-warning,.pagination a.is-warning{background:#fce473;border-color:transparent;color:rgba(0,0,0,0.5)}.button.is-warning:hover,.pagination a.is-warning:hover,.button.is-warning:focus,.pagination a.is-warning:focus{background:#fbda41;border-color:transparent;color:rgba(0,0,0,0.5)}.button.is-warning:active,.pagination a.is-warning:active{border-color:transparent}.button.is-warning.is-outlined,.pagination a.is-warning.is-outlined{background:transparent;border-color:#fce473;color:#fce473}.button.is-warning.is-outlined:hover,.pagination a.is-warning.is-outlined:hover,.button.is-warning.is-outlined:focus,.pagination a.is-warning.is-outlined:focus{border-color:#fbda41;color:#fbda41}.button.is-warning.is-inverted,.pagination a.is-warning.is-inverted{background:rgba(0,0,0,0.5);color:#fce473}.button.is-warning.is-inverted:hover,.pagination a.is-warning.is-inverted:hover{background:rgba(0,0,0,0.5)}.button.is-warning.is-inverted.is-outlined,.pagination a.is-warning.is-inverted.is-outlined{background-color:transparent;border-color:rgba(0,0,0,0.5);color:rgba(0,0,0,0.5)}.button.is-warning.is-inverted.is-outlined:hover,.pagination a.is-warning.is-inverted.is-outlined:hover{background:rgba(0,0,0,0.05)}.button.is-warning.is-loading:after,.pagination a.is-warning.is-loading:after{border-color:transparent transparent rgba(0,0,0,0.5) rgba(0,0,0,0.5) !important}.button.is-danger,.pagination a.is-danger{background:#ed6c63;border-color:transparent;color:#fff}.button.is-danger:hover,.pagination a.is-danger:hover,.button.is-danger:focus,.pagination a.is-danger:focus{background:#e84135;border-color:transparent;color:#fff}.button.is-danger:active,.pagination a.is-danger:active{border-color:transparent}.button.is-danger.is-outlined,.pagination a.is-danger.is-outlined{background:transparent;border-color:#ed6c63;color:#ed6c63}.button.is-danger.is-outlined:hover,.pagination a.is-danger.is-outlined:hover,.button.is-danger.is-outlined:focus,.pagination a.is-danger.is-outlined:focus{border-color:#e84135;color:#e84135}.button.is-danger.is-inverted,.pagination a.is-danger.is-inverted{background:#fff;color:#ed6c63}.button.is-danger.is-inverted:hover,.pagination a.is-danger.is-inverted:hover{background:#f2f2f2}.button.is-danger.is-inverted.is-outlined,.pagination a.is-danger.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-danger.is-inverted.is-outlined:hover,.pagination a.is-danger.is-inverted.is-outlined:hover{background:rgba(0,0,0,0.05)}.button.is-danger.is-loading:after,.pagination a.is-danger.is-loading:after{border-color:transparent transparent #fff #fff !important}.button.is-link,.pagination a.is-link{border-color:transparent;color:#69707a;text-decoration:underline}.button.is-link:hover,.pagination a.is-link:hover,.button.is-link:focus,.pagination a.is-link:focus{background:#d3d6db;color:#222324}.button.is-small,.pagination a.is-small{border-radius:2px;font-size:11px;height:24px;line-height:16px;padding:3px 6px}.button.is-medium,.pagination a.is-medium{font-size:18px;height:40px;padding:7px 14px}.button.is-large,.pagination a.is-large{font-size:22px;height:48px;padding:11px 20px}.button.is-fullwidth,.pagination a.is-fullwidth{display:block;width:100%}.button.is-flexible,.pagination a.is-flexible{height:auto}.button.is-loading,.pagination a.is-loading{color:transparent;pointer-events:none}.button.is-loading:after,.pagination a.is-loading:after{left:50%;margin-left:-8px;margin-top:-8px;position:absolute;top:50%;position:absolute !important}.button.is-disabled,.pagination a.is-disabled,.button[disabled],.pagination a[disabled]{opacity:0.5;pointer-events:none}.title,.subtitle{font-weight:300}.title em,.title span,.subtitle em,.subtitle span{font-weight:300}.title strong,.subtitle strong{font-weight:500}.title a:hover,.subtitle a:hover{border-bottom:1px solid}.title .tag,.subtitle .tag{vertical-align:bottom}.title{color:#222324;font-size:28px;line-height:1}.title strong{color:inherit}.title code{display:inline-block;font-size:28px}.title+.subtitle{margin-top:-10px}.title+.highlight{margin-top:-10px}.title.is-normal{font-weight:400}.title.is-normal strong{font-weight:700}.title.is-1{font-size:48px}.title.is-1 code{font-size:40px}.title.is-2{font-size:40px}.title.is-2 code{font-size:28px}.title.is-3{font-size:28px}.title.is-3 code{font-size:24px}.title.is-4{font-size:24px}.title.is-4 code{font-size:18px}.title.is-5{font-size:18px}.title.is-5 code{font-size:14px}.title.is-6{font-size:14px}.title.is-6 code{font-size:14px}@media screen and (min-width: 769px){.title+.subtitle{margin-top:-15px}}.subtitle{font-size:18px;line-height:1.125}.subtitle+.title{margin-top:-20px}.subtitle strong{color:#222324}.subtitle code{border-radius:3px;display:inline-block;font-size:14px;padding:2px 3px;vertical-align:top}.subtitle+.text{margin-top:20px}.subtitle.is-normal{font-weight:400}.subtitle.is-normal strong{font-weight:700}.subtitle.is-1{font-size:48px}.subtitle.is-1 code{font-size:40px}.subtitle.is-2{font-size:40px}.subtitle.is-2 code{font-size:28px}.subtitle.is-3{font-size:28px}.subtitle.is-3 code{font-size:24px}.subtitle.is-4{font-size:24px}.subtitle.is-4 code{font-size:18px}.subtitle.is-5{font-size:18px}.subtitle.is-5 code{font-size:14px}.subtitle.is-6{font-size:14px}.subtitle.is-6 code{font-size:14px}.image{display:block;position:relative}.image img{display:block}.image.is-square img,.image.is-1by1 img,.image.is-4by3 img,.image.is-3by2 img,.image.is-16by9 img,.image.is-2by1 img{bottom:0;left:0;position:absolute;right:0;top:0;height:100%;width:100%}.image.is-square,.image.is-1by1{padding-top:100%}.image.is-4by3{padding-top:75%}.image.is-3by2{padding-top:66.6666%}.image.is-16by9{padding-top:56.25%}.image.is-2by1{padding-top:50%}.image.is-16x16{height:16px;width:16px}.image.is-24x24{height:24px;width:24px}.image.is-32x32{height:32px;width:32px}.image.is-48x48{height:48px;width:48px}.image.is-64x64{height:64px;width:64px}.image.is-96x96{height:96px;width:96px}.image.is-128x128{height:128px;width:128px}.message-body{border:1px solid #d3d6db;border-radius:3px;padding:12px 15px}.message-body strong{color:inherit}.message-header{background:#69707a;border-radius:3px 3px 0 0;color:#fff;font-size:10px;font-weight:bold;letter-spacing:1px;padding:3px 8px;text-transform:uppercase}.message-header+.message-body{border-radius:0 0 3px 3px;border-top:none}.message{background:#f5f7fa;border-radius:3px}.message.is-dark{background:#f5f5f5}.message.is-dark .message-header{background:#222324;color:#fff}.message.is-dark .message-body{border-color:#222324;color:gray}.message.is-primary{background:#edfbfc}.message.is-primary .message-header{background:#1fc8db;color:#fff}.message.is-primary .message-body{border-color:#1fc8db;color:gray}.message.is-info{background:#edf7fc}.message.is-info .message-header{background:#42afe3;color:#fff}.message.is-info .message-body{border-color:#42afe3;color:gray}.message.is-success{background:#f4faf0}.message.is-success .message-header{background:#97cd76;color:#fff}.message.is-success .message-body{border-color:#97cd76;color:gray}.message.is-warning{background:#fffbeb}.message.is-warning .message-header{background:#fce473;color:rgba(0,0,0,0.5)}.message.is-warning .message-body{border-color:#fce473;color:#666}.message.is-danger{background:#fdeeed}.message.is-danger .message-header{background:#ed6c63;color:#fff}.message.is-danger .message-body{border-color:#ed6c63;color:gray}.notification{background:#f5f7fa;border-radius:3px;padding:16px 20px;position:relative}.notification:after{clear:both;content:" ";display:table}.notification .title{color:inherit}.notification.is-dark{background:#222324;color:#fff}.notification.is-primary{background:#1fc8db;color:#fff}.notification.is-info{background:#42afe3;color:#fff}.notification.is-success{background:#97cd76;color:#fff}.notification.is-warning{background:#fce473;color:rgba(0,0,0,0.5)}.notification.is-danger{background:#ed6c63;color:#fff}.notification .delete,.notification .modal-close{background:rgba(0,0,0,0.2);border-radius:0 3px;float:right;margin:-16px -20px 0 20px}.notification .delete:hover,.notification .modal-close:hover{background:rgba(0,0,0,0.5)}.progress{-moz-appearance:none;-webkit-appearance:none;border:none;border-radius:290486px;display:block;height:12px;overflow:hidden;padding:0;width:100%}.progress::-webkit-progress-bar{background:#d3d6db}.progress::-webkit-progress-value{background:#69707a}.progress::-moz-progress-bar{background:#69707a}.progress.is-small{height:8px}.progress.is-medium{height:16px}.progress.is-large{height:20px}.progress.is-dark::-webkit-progress-value{background:#222324}.progress.is-dark::-moz-progress-bar{background:#222324}.progress.is-primary::-webkit-progress-value{background:#1fc8db}.progress.is-primary::-moz-progress-bar{background:#1fc8db}.progress.is-info::-webkit-progress-value{background:#42afe3}.progress.is-info::-moz-progress-bar{background:#42afe3}.progress.is-success::-webkit-progress-value{background:#97cd76}.progress.is-success::-moz-progress-bar{background:#97cd76}.progress.is-warning::-webkit-progress-value{background:#fce473}.progress.is-warning::-moz-progress-bar{background:#fce473}.progress.is-danger::-webkit-progress-value{background:#ed6c63}.progress.is-danger::-moz-progress-bar{background:#ed6c63}.delete,.modal-close{-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-moz-appearance:none;-webkit-appearance:none;background:rgba(0,0,0,0.2);border:none;border-radius:290486px;cursor:pointer;display:inline-block;height:24px;position:relative;vertical-align:top;width:24px}.delete:before,.modal-close:before,.delete:after,.modal-close:after{background:white;content:"";display:block;height:2px;left:50%;margin-left:-25%;margin-top:-1px;position:absolute;top:50%;width:50%}.delete:before,.modal-close:before{-webkit-transform:rotate(45deg);transform:rotate(45deg)}.delete:after,.modal-close:after{-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}.delete:hover,.modal-close:hover{background:#ed6c63}.delete.is-small,.tag:not(.is-large) .delete,.tag:not(.is-large) .modal-close,.is-small.modal-close{height:16px;width:16px}.delete.is-medium,.is-medium.modal-close{height:32px;width:32px}.delete.is-large,.is-large.modal-close{height:40px;width:40px}.icon{display:inline-block;font-size:21px;height:24px;line-height:24px;text-align:center;vertical-align:top;width:24px}.icon .fa{font-size:inherit;line-height:inherit}.icon.is-small{display:inline-block;font-size:14px;height:16px;line-height:16px;text-align:center;vertical-align:top;width:16px}.icon.is-medium{display:inline-block;font-size:28px;height:32px;line-height:32px;text-align:center;vertical-align:top;width:32px}.icon.is-large{display:inline-block;font-size:42px;height:48px;line-height:48px;text-align:center;vertical-align:top;width:48px}.hamburger,.header-toggle{cursor:pointer;display:block;height:50px;position:relative;width:50px}.hamburger span,.header-toggle span{background:#69707a;display:block;height:1px;left:50%;margin-left:-7px;position:absolute;top:50%;-webkit-transition:none 86ms ease-out;transition:none 86ms ease-out;-webkit-transition-property:background, left, opacity, -webkit-transform;transition-property:background, left, opacity, -webkit-transform;transition-property:background, left, opacity, transform;transition-property:background, left, opacity, transform, -webkit-transform;width:15px}.hamburger span:nth-child(1),.header-toggle span:nth-child(1){margin-top:-6px}.hamburger span:nth-child(2),.header-toggle span:nth-child(2){margin-top:-1px}.hamburger span:nth-child(3),.header-toggle span:nth-child(3){margin-top:4px}.hamburger:hover,.header-toggle:hover{background:#f5f7fa}.hamburger.is-active span,.is-active.header-toggle span{background:#1fc8db}.hamburger.is-active span:nth-child(1),.is-active.header-toggle span:nth-child(1){margin-left:-5px;-webkit-transform:rotate(45deg);transform:rotate(45deg);-webkit-transform-origin:left top;transform-origin:left top}.hamburger.is-active span:nth-child(2),.is-active.header-toggle span:nth-child(2){opacity:0}.hamburger.is-active span:nth-child(3),.is-active.header-toggle span:nth-child(3){margin-left:-5px;-webkit-transform:rotate(-45deg);transform:rotate(-45deg);-webkit-transform-origin:left bottom;transform-origin:left bottom}@media screen and (min-width: 769px){.hamburger,.header-toggle{height:50px;width:50px}}.heading{display:block;font-size:11px;letter-spacing:1px;margin-bottom:5px;text-transform:uppercase}.highlight{font-size:12px;font-weight:normal;max-width:100%;overflow:hidden;padding:0}.highlight pre{overflow:auto;max-width:100%}.image{display:block;position:relative;vertical-align:top}.image img{bottom:0;left:0;position:absolute;right:0;top:0;display:block;width:100%}.image.is-3x2{padding-top:66.6666%}.loader,.control.is-loading:after,.button.is-loading:after,.pagination a.is-loading:after{-webkit-animation:spin-around 500ms infinite linear;animation:spin-around 500ms infinite linear;border:2px solid #d3d6db;border-radius:290486px;border-right-color:transparent;border-top-color:transparent;content:"";display:block;height:16px;position:relative;width:16px}.number{background:#f5f7fa;border-radius:290486px;display:inline-block;font-size:18px;vertical-align:top}.tag{background:#f5f7fa;border-radius:3px;box-shadow:inset 0 -1px 0 rgba(0,0,0,0.1);color:#69707a;display:inline-block;font-size:12px;height:24px;line-height:16px;padding:4px 10px;vertical-align:top;white-space:nowrap}.tag.is-dark{background:#69707a;color:#fff}.tag.is-rounded{border-radius:290486px}.tag.is-medium{box-shadow:inset 0 -2px 0 rgba(0,0,0,0.1);font-size:14px;height:32px;padding:7px 14px 9px}.tag:not(.is-large) .delete,.tag:not(.is-large) .modal-close{margin-left:4px;margin-right:-6px}.tag.is-large{box-shadow:inset 0 -2px 0 rgba(0,0,0,0.1);font-size:18px;height:40px;line-height:24px;padding:7px 18px 9px}.tag.is-large .delete,.tag.is-large .modal-close{margin-left:4px;margin-right:-8px}.tag.is-dark{background:#222324;color:#fff}.tag.is-primary{background:#1fc8db;color:#fff}.tag.is-info{background:#42afe3;color:#fff}.tag.is-success{background:#97cd76;color:#fff}.tag.is-warning{background:#fce473;color:rgba(0,0,0,0.5)}.tag.is-danger{background:#ed6c63;color:#fff}.column{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;padding:10px}.columns.is-mobile>.column.is-half{-webkit-box-flex:0;-webkit-flex:none;-ms-flex:none;flex:none;width:50%}.columns.is-mobile>.column.is-third{-webkit-box-flex:0;-webkit-flex:none;-ms-flex:none;flex:none;width:33.3333%}.columns.is-mobile>.column.is-quarter{-webkit-box-flex:0;-webkit-flex:none;-ms-flex:none;flex:none;width:25%}.columns.is-mobile>.column.is-offset-half{margin-left:50%}.columns.is-mobile>.column.is-offset-third{margin-left:33.3333%}.columns.is-mobile>.column.is-offset-quarter{margin-left:25%}.columns.is-mobile>.column.is-1{-webkit-box-flex:0;-webkit-flex:none;-ms-flex:none;flex:none;width:8.33333%}.columns.is-mobile>.column.is-offset-1{margin-left:8.33333%}.columns.is-mobile>.column.is-2{-webkit-box-flex:0;-webkit-flex:none;-ms-flex:none;flex:none;width:16.66667%}.columns.is-mobile>.column.is-offset-2{margin-left:16.66667%}.columns.is-mobile>.column.is-3{-webkit-box-flex:0;-webkit-flex:none;-ms-flex:none;flex:none;width:25%}.columns.is-mobile>.column.is-offset-3{margin-left:25%}.columns.is-mobile>.column.is-4{-webkit-box-flex:0;-webkit-flex:none;-ms-flex:none;flex:none;width:33.33333%}.columns.is-mobile>.column.is-offset-4{margin-left:33.33333%}.columns.is-mobile>.column.is-5{-webkit-box-flex:0;-webkit-flex:none;-ms-flex:none;flex:none;width:41.66667%}.columns.is-mobile>.column.is-offset-5{margin-left:41.66667%}.columns.is-mobile>.column.is-6{-webkit-box-flex:0;-webkit-flex:none;-ms-flex:none;flex:none;width:50%}.columns.is-mobile>.column.is-offset-6{margin-left:50%}.columns.is-mobile>.column.is-7{-webkit-box-flex:0;-webkit-flex:none;-ms-flex:none;flex:none;width:58.33333%}.columns.is-mobile>.column.is-offset-7{margin-left:58.33333%}.columns.is-mobile>.column.is-8{-webkit-box-flex:0;-webkit-flex:none;-ms-flex:none;flex:none;width:66.66667%}.columns.is-mobile>.column.is-offset-8{margin-left:66.66667%}.columns.is-mobile>.column.is-9{-webkit-box-flex:0;-webkit-flex:none;-ms-flex:none;flex:none;width:75%}.columns.is-mobile>.column.is-offset-9{margin-left:75%}.columns.is-mobile>.column.is-10{-webkit-box-flex:0;-webkit-flex:none;-ms-flex:none;flex:none;width:83.33333%}.columns.is-mobile>.column.is-offset-10{margin-left:83.33333%}.columns.is-mobile>.column.is-11{-webkit-box-flex:0;-webkit-flex:none;-ms-flex:none;flex:none;width:91.66667%}.columns.is-mobile>.column.is-offset-11{margin-left:91.66667%}@media screen and (max-width: 768px){.column.is-half-mobile{-webkit-box-flex:0;-webkit-flex:none;-ms-flex:none;flex:none;width:50%}.column.is-third-mobile{-webkit-box-flex:0;-webkit-flex:none;-ms-flex:none;flex:none;width:33.3333%}.column.is-quarter-mobile{-webkit-box-flex:0;-webkit-flex:none;-ms-flex:none;flex:none;width:25%}.column.is-offset-half-mobile{margin-left:50%}.column.is-offset-third-mobile{margin-left:33.3333%}.column.is-offset-quarter-mobile{margin-left:25%}.column.is-1-mobile{-webkit-box-flex:0;-webkit-flex:none;-ms-flex:none;flex:none;width:8.33333%}.column.is-offset-1-mobile{margin-left:8.33333%}.column.is-2-mobile{-webkit-box-flex:0;-webkit-flex:none;-ms-flex:none;flex:none;width:16.66667%}.column.is-offset-2-mobile{margin-left:16.66667%}.column.is-3-mobile{-webkit-box-flex:0;-webkit-flex:none;-ms-flex:none;flex:none;width:25%}.column.is-offset-3-mobile{margin-left:25%}.column.is-4-mobile{-webkit-box-flex:0;-webkit-flex:none;-ms-flex:none;flex:none;width:33.33333%}.column.is-offset-4-mobile{margin-left:33.33333%}.column.is-5-mobile{-webkit-box-flex:0;-webkit-flex:none;-ms-flex:none;flex:none;width:41.66667%}.column.is-offset-5-mobile{margin-left:41.66667%}.column.is-6-mobile{-webkit-box-flex:0;-webkit-flex:none;-ms-flex:none;flex:none;width:50%}.column.is-offset-6-mobile{margin-left:50%}.column.is-7-mobile{-webkit-box-flex:0;-webkit-flex:none;-ms-flex:none;flex:none;width:58.33333%}.column.is-offset-7-mobile{margin-left:58.33333%}.column.is-8-mobile{-webkit-box-flex:0;-webkit-flex:none;-ms-flex:none;flex:none;width:66.66667%}.column.is-offset-8-mobile{margin-left:66.66667%}.column.is-9-mobile{-webkit-box-flex:0;-webkit-flex:none;-ms-flex:none;flex:none;width:75%}.column.is-offset-9-mobile{margin-left:75%}.column.is-10-mobile{-webkit-box-flex:0;-webkit-flex:none;-ms-flex:none;flex:none;width:83.33333%}.column.is-offset-10-mobile{margin-left:83.33333%}.column.is-11-mobile{-webkit-box-flex:0;-webkit-flex:none;-ms-flex:none;flex:none;width:91.66667%}.column.is-offset-11-mobile{margin-left:91.66667%}}@media screen and (min-width: 769px){.column.is-half,.column.is-half-tablet{-webkit-box-flex:0;-webkit-flex:none;-ms-flex:none;flex:none;width:50%}.column.is-third,.column.is-third-tablet{-webkit-box-flex:0;-webkit-flex:none;-ms-flex:none;flex:none;width:33.3333%}.column.is-quarter,.column.is-quarter-tablet{-webkit-box-flex:0;-webkit-flex:none;-ms-flex:none;flex:none;width:25%}.column.is-offset-half,.column.is-offset-half-tablet{margin-left:50%}.column.is-offset-third,.column.is-offset-third-tablet{margin-left:33.3333%}.column.is-offset-quarter,.column.is-offset-quarter-tablet{margin-left:25%}.column.is-1,.column.is-1-tablet{-webkit-box-flex:0;-webkit-flex:none;-ms-flex:none;flex:none;width:8.33333%}.column.is-offset-1,.column.is-offset-1-tablet{margin-left:8.33333%}.column.is-2,.column.is-2-tablet{-webkit-box-flex:0;-webkit-flex:none;-ms-flex:none;flex:none;width:16.66667%}.column.is-offset-2,.column.is-offset-2-tablet{margin-left:16.66667%}.column.is-3,.column.is-3-tablet{-webkit-box-flex:0;-webkit-flex:none;-ms-flex:none;flex:none;width:25%}.column.is-offset-3,.column.is-offset-3-tablet{margin-left:25%}.column.is-4,.column.is-4-tablet{-webkit-box-flex:0;-webkit-flex:none;-ms-flex:none;flex:none;width:33.33333%}.column.is-offset-4,.column.is-offset-4-tablet{margin-left:33.33333%}.column.is-5,.column.is-5-tablet{-webkit-box-flex:0;-webkit-flex:none;-ms-flex:none;flex:none;width:41.66667%}.column.is-offset-5,.column.is-offset-5-tablet{margin-left:41.66667%}.column.is-6,.column.is-6-tablet{-webkit-box-flex:0;-webkit-flex:none;-ms-flex:none;flex:none;width:50%}.column.is-offset-6,.column.is-offset-6-tablet{margin-left:50%}.column.is-7,.column.is-7-tablet{-webkit-box-flex:0;-webkit-flex:none;-ms-flex:none;flex:none;width:58.33333%}.column.is-offset-7,.column.is-offset-7-tablet{margin-left:58.33333%}.column.is-8,.column.is-8-tablet{-webkit-box-flex:0;-webkit-flex:none;-ms-flex:none;flex:none;width:66.66667%}.column.is-offset-8,.column.is-offset-8-tablet{margin-left:66.66667%}.column.is-9,.column.is-9-tablet{-webkit-box-flex:0;-webkit-flex:none;-ms-flex:none;flex:none;width:75%}.column.is-offset-9,.column.is-offset-9-tablet{margin-left:75%}.column.is-10,.column.is-10-tablet{-webkit-box-flex:0;-webkit-flex:none;-ms-flex:none;flex:none;width:83.33333%}.column.is-offset-10,.column.is-offset-10-tablet{margin-left:83.33333%}.column.is-11,.column.is-11-tablet{-webkit-box-flex:0;-webkit-flex:none;-ms-flex:none;flex:none;width:91.66667%}.column.is-offset-11,.column.is-offset-11-tablet{margin-left:91.66667%}}@media screen and (min-width: 980px){.column.is-half-desktop{-webkit-box-flex:0;-webkit-flex:none;-ms-flex:none;flex:none;width:50%}.column.is-third-desktop{-webkit-box-flex:0;-webkit-flex:none;-ms-flex:none;flex:none;width:33.3333%}.column.is-quarter-desktop{-webkit-box-flex:0;-webkit-flex:none;-ms-flex:none;flex:none;width:25%}.column.is-offset-half-desktop{margin-left:50%}.column.is-offset-third-desktop{margin-left:33.3333%}.column.is-offset-quarter-desktop{margin-left:25%}.column.is-1-desktop{-webkit-box-flex:0;-webkit-flex:none;-ms-flex:none;flex:none;width:8.33333%}.column.is-offset-1-desktop{margin-left:8.33333%}.column.is-2-desktop{-webkit-box-flex:0;-webkit-flex:none;-ms-flex:none;flex:none;width:16.66667%}.column.is-offset-2-desktop{margin-left:16.66667%}.column.is-3-desktop{-webkit-box-flex:0;-webkit-flex:none;-ms-flex:none;flex:none;width:25%}.column.is-offset-3-desktop{margin-left:25%}.column.is-4-desktop{-webkit-box-flex:0;-webkit-flex:none;-ms-flex:none;flex:none;width:33.33333%}.column.is-offset-4-desktop{margin-left:33.33333%}.column.is-5-desktop{-webkit-box-flex:0;-webkit-flex:none;-ms-flex:none;flex:none;width:41.66667%}.column.is-offset-5-desktop{margin-left:41.66667%}.column.is-6-desktop{-webkit-box-flex:0;-webkit-flex:none;-ms-flex:none;flex:none;width:50%}.column.is-offset-6-desktop{margin-left:50%}.column.is-7-desktop{-webkit-box-flex:0;-webkit-flex:none;-ms-flex:none;flex:none;width:58.33333%}.column.is-offset-7-desktop{margin-left:58.33333%}.column.is-8-desktop{-webkit-box-flex:0;-webkit-flex:none;-ms-flex:none;flex:none;width:66.66667%}.column.is-offset-8-desktop{margin-left:66.66667%}.column.is-9-desktop{-webkit-box-flex:0;-webkit-flex:none;-ms-flex:none;flex:none;width:75%}.column.is-offset-9-desktop{margin-left:75%}.column.is-10-desktop{-webkit-box-flex:0;-webkit-flex:none;-ms-flex:none;flex:none;width:83.33333%}.column.is-offset-10-desktop{margin-left:83.33333%}.column.is-11-desktop{-webkit-box-flex:0;-webkit-flex:none;-ms-flex:none;flex:none;width:91.66667%}.column.is-offset-11-desktop{margin-left:91.66667%}}.columns{margin-left:-10px;margin-right:-10px;margin-top:-10px}.columns:last-child{margin-bottom:-10px}.columns:not(:last-child){margin-bottom:10px}.columns.is-centered{-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center}.columns.is-mobile{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.columns.is-gapless{margin-left:0;margin-right:0}.columns.is-gapless:not(:last-child){margin-bottom:20px}.columns.is-gapless>.column{margin:0;padding:0}.columns.is-multiline{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.columns.is-vcentered{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;-ms-grid-row-align:center;align-items:center}@media screen and (min-width: 769px){.columns.is-grid{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.columns.is-grid>.column{-webkit-flex-basis:33.3333%;-ms-flex-preferred-size:33.3333%;flex-basis:33.3333%;max-width:33.3333%;padding:10px;width:33.3333%}.columns.is-grid>.column+.column{margin-left:0}}@media screen and (min-width: 769px){.columns:not(.is-desktop){display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}}@media screen and (min-width: 980px){.columns.is-desktop{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}}.navbar-item .title,.navbar-item .subtitle{margin-bottom:0}@media screen and (max-width: 768px){.navbar-item:not(:last-child){margin-bottom:10px}}.navbar code{border-radius:3px}.navbar img{display:inline-block;vertical-align:top}@media screen and (min-width: 769px){.navbar{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between}.navbar>.navbar-item:not(.is-narrow){-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}}.navbar-left .navbar-item.is-flexible,.navbar-right .navbar-item.is-flexible{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.navbar-left .navbar-item:not(:last-child),.navbar-right .navbar-item:not(:last-child){margin-right:10px}@media screen and (max-width: 768px){.navbar-left+.navbar-right{margin-top:20px}}@media screen and (min-width: 769px){.navbar-left{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}}@media screen and (min-width: 769px){.navbar-right{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:end;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end}}.card-header{-webkit-box-align:stretch;-webkit-align-items:stretch;-ms-flex-align:stretch;align-items:stretch;box-shadow:0 1px 2px rgba(0,0,0,0.1);display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;min-height:40px}.card-header-title{-webkit-box-align:start;-webkit-align-items:flex-start;-ms-flex-align:start;align-items:flex-start;color:#222324;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;font-weight:bold;padding:10px}.card-header-icon{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;cursor:pointer;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;width:40px}.card-image{display:block;position:relative}.card-content{padding:20px}.card-content .title+.subtitle{margin-top:-20px}.card-footer{background:#f5f7fa;border-top:1px solid #d3d6db;-webkit-box-align:stretch;-webkit-align-items:stretch;-ms-flex-align:stretch;align-items:stretch;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.card-footer-item{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;padding:10px}.card-footer-item:not(:last-child){border-right:1px solid #d3d6db}.card{background:white;box-shadow:0 2px 3px rgba(0,0,0,0.1),0 0 0 1px rgba(0,0,0,0.1);max-width:100%;position:relative;width:300px}.card .media:not(:last-child){margin-bottom:10px}.card.is-rounded{border-radius:5px}.card.is-fullwidth{width:100%}.table{background:white;color:#222324;margin-bottom:20px;width:100%}.table th,.table td{border:1px solid #d3d6db;border-width:0 0 1px;padding:8px 10px;vertical-align:top}.table th.table-narrow,.table td.table-narrow{white-space:nowrap;width:1%}.table th.table-link,.table td.table-link{padding:0}.table th.table-link>a,.table td.table-link>a{display:block;padding:8px 10px}.table th.table-link>a:hover,.table td.table-link>a:hover{background:#1fc8db;color:#fff}.table th.table-icon,.table td.table-icon{padding:5px;text-align:center;white-space:nowrap;width:1%}.table th.table-icon .fa,.table td.table-icon .fa{display:inline-block;font-size:21px;height:24px;line-height:24px;text-align:center;vertical-align:top;width:24px}.table th.table-icon.table-link,.table td.table-icon.table-link{padding:0}.table th.table-icon.table-link>a,.table td.table-icon.table-link>a{padding:5px}.table th{color:#222324;text-align:left}.table tr:hover{background:rgba(245,247,250,0.5);color:#222324}.table tr:last-child td{border-bottom-width:0}.table thead th,.table thead td{border-width:0 0 2px;color:#aeb1b5}.table tfoot th,.table tfoot td{border-width:2px 0 0;color:#aeb1b5}.table.is-bordered th,.table.is-bordered td{border-width:1px}.table.is-bordered tr:last-child td{border-bottom-width:1px}.table.is-narrow th,.table.is-narrow td{padding:5px 10px}.table.is-narrow th.table-link,.table.is-narrow td.table-link{padding:0}.table.is-narrow th.table-link>a,.table.is-narrow td.table-link>a{padding:5px 10px}.table.is-narrow th.table-icon,.table.is-narrow td.table-icon{padding:2px}.table.is-narrow th.table-icon.table-link,.table.is-narrow td.table-icon.table-link{padding:0}.table.is-narrow th.table-icon.table-link>a,.table.is-narrow td.table-icon.table-link>a{padding:2px}.table.is-striped tbody tr:nth-child(2n){background:rgba(245,247,250,0.5)}.table.is-striped tbody tr:nth-child(2n):hover{background:#f5f7fa}.tabs{line-height:24px;overflow:hidden;overflow-x:auto;white-space:nowrap}.tabs .fa{font-size:14px;line-height:20px;margin:2px -2px;width:20px}.tabs a{border-bottom:1px solid #d3d6db;color:#69707a;display:block;margin-bottom:-1px;padding:5px 0;vertical-align:top}.tabs a:hover{border-bottom-color:#222324;color:#222324}.tabs li{display:block;vertical-align:top}.tabs li+li{margin-left:20px}.tabs li.is-active a{border-bottom-color:#1fc8db;color:#1fc8db}.tabs ul{border-bottom:1px solid #d3d6db;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.tabs.is-centered a{padding:5px 10px}.tabs.is-centered li+li{margin-left:0}.tabs.is-centered ul{-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;text-align:center}.tabs.is-right ul{-webkit-box-pack:end;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end}.tabs.is-boxed a{border:1px solid transparent;border-radius:3px 3px 0 0;padding:5px 15px}.tabs.is-boxed a:hover{background:#f5f7fa;border-bottom-color:#d3d6db}.tabs.is-boxed li+li{margin-left:5px}.tabs.is-boxed li.is-active a{background:white;border-color:#d3d6db;border-bottom-color:transparent}.tabs.is-boxed.is-centered li,.tabs.is-boxed.is-centered li+li{margin:0 2px}.tabs.is-toggle a{border:1px solid #d3d6db;margin-bottom:0;padding:5px 10px;position:relative}.tabs.is-toggle a:hover{background:#f5f7fa;border-color:#aeb1b5;z-index:2}.tabs.is-toggle li+li{margin-left:-1px}.tabs.is-toggle li:first-child a{border-radius:3px 0 0 3px}.tabs.is-toggle li:last-child a{border-radius:0 3px 3px 0}.tabs.is-toggle li.is-active a{background:#1fc8db;border-color:#1fc8db;color:#fff;z-index:1}.tabs.is-toggle ul{border-bottom:none}@media screen and (min-width: 769px){.tabs.is-fullwidth li{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.tabs.is-fullwidth li+li{margin-left:0}.tabs.is-fullwidth ul{-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;text-align:center}}.media-number{background:#f5f7fa;border-radius:290486px;display:inline-block;font-size:18px;height:32px;line-height:24px;min-width:32px;padding:4px 8px;text-align:center;vertical-align:top}@media screen and (max-width: 768px){.media-number{margin-bottom:10px}}@media screen and (min-width: 769px){.media-number{margin-right:10px}}.media-left{margin-right:10px}.media-right{margin-left:10px}.media-content{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;text-align:left}.media{-webkit-box-align:start;-webkit-align-items:flex-start;-ms-flex-align:start;align-items:flex-start;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;text-align:left}.media .content:not(:last-child){margin-bottom:10px}.media .media{border-top:1px solid rgba(211,214,219,0.5);display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding-top:10px}.media .media .textarea{border-radius:2px;font-size:11px;height:24px;line-height:16px;padding:3px 6px}.media .media .button,.media .media .pagination a,.pagination .media .media a{border-radius:2px;font-size:11px;height:24px;line-height:16px;padding:3px 6px}.media .media .content:not(:last-child),.media .media .control:not(:last-child){margin-bottom:5px}.media .media .media{font-size:12px;padding-top:5px}.media .media .media+.media{margin-top:5px}.media+.media{border-top:1px solid rgba(211,214,219,0.5);margin-top:10px;padding-top:10px}.media.is-large+.media{margin-top:20px;padding-top:20px}@media screen and (min-width: 769px){.media.is-large .media-number{margin-right:20px}}.menu-nav a{display:block;padding:5px 10px}.menu-list a{border-radius:2px;color:#69707a;display:block;padding:5px 10px}.menu-list a:hover{background:#f5f7fa;color:#1fc8db}.menu-list a.is-active{background:#1fc8db;color:#fff}.menu-list li ul{border-left:1px solid #d3d6db;margin:10px;padding-left:10px}.menu-label{color:#aeb1b5;font-size:11px;letter-spacing:1px;margin-bottom:5px;text-transform:uppercase}.menu-label:not(:first-child){margin-top:20px}.pagination{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;text-align:center}.pagination a{display:block;min-width:32px;padding:3px 8px}.pagination a.is-active{background:#1fc8db;border-color:#1fc8db;color:#fff}.pagination span{color:#aeb1b5;display:block;margin:0 4px}.pagination li{margin:0 2px}.pagination ul{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center}@media screen and (max-width: 768px){.pagination{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.pagination>a{width:calc(50% - 5px)}.pagination>a:not(:first-child){margin-left:10px}.pagination li{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.pagination ul{margin-top:10px}}@media screen and (min-width: 769px){.pagination>a:not(:first-child){-webkit-box-ordinal-group:2;-webkit-order:1;-ms-flex-order:1;order:1}}.panel-icon{display:inline-block;font-size:14px;height:16px;line-height:16px;text-align:center;vertical-align:top;width:16px;color:#aeb1b5;float:left;margin:0 4px 0 -2px}.panel-icon .fa{font-size:inherit;line-height:inherit}.panel-heading{background:#f5f7fa;border-bottom:1px solid #d3d6db;border-radius:4px 4px 0 0;color:#222324;font-size:18px;font-weight:300;padding:10px}.panel-list a{color:#69707a}.panel-list a:hover{color:#1fc8db}.panel-tabs{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;font-size:11px;padding:5px 10px 0;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center}.panel-tabs:not(:last-child){border-bottom:1px solid #d3d6db}.panel-tabs a{border-bottom:1px solid #d3d6db;margin-bottom:-1px;padding:5px}.panel-tabs a.is-active{border-bottom-color:#222324;color:#222324}.panel-block{color:#222324;display:block;line-height:16px;padding:10px}.panel-block:not(:last-child){border-bottom:1px solid #d3d6db}.panel-block .checkbox,.panel-block .panel-checkbox{border:1px solid transparent;border-radius:3px;display:block;padding:8px;padding-left:32px}.panel-block .checkbox input,.panel-block .panel-checkbox input{left:9px;top:9px}.panel-block .checkbox:hover,.panel-block .panel-checkbox:hover{border-color:#1fc8db}a.panel-block:hover{background:#f5f7fa}.panel-checkbox{display:block;padding:9px 10px 9px 30px}.panel-checkbox:not(:last-child){border-bottom:1px solid #d3d6db}.panel-checkbox input{left:8px;top:10px}.panel{border:1px solid #d3d6db;border-radius:5px}.panel:not(:last-child){margin-bottom:20px}.modal-background{bottom:0;left:0;position:absolute;right:0;top:0;background:rgba(0,0,0,0.86)}.modal-content{margin:0 20px;max-height:calc(100vh - 160px);overflow:auto;position:relative;width:100%}@media screen and (min-width: 769px){.modal-content{margin:0 auto;max-height:calc(100vh - 40px);width:640px}}.modal-close{background:none;height:40px;position:fixed;right:20px;top:20px;width:40px}.modal{bottom:0;left:0;position:absolute;right:0;top:0;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;-ms-grid-row-align:center;align-items:center;display:none;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;overflow:hidden;position:fixed;z-index:1986}.modal.is-active{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.box{background:white;border-radius:5px;box-shadow:0 2px 3px rgba(0,0,0,0.1),0 0 0 1px rgba(0,0,0,0.1);padding:20px}.header{background:white;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;line-height:24px;position:relative;text-align:center;z-index:2}.header:after{clear:both;content:" ";display:table}.header .container{-webkit-box-align:stretch;-webkit-align-items:stretch;-ms-flex-align:stretch;align-items:stretch;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;width:100%}.header.has-shadow{box-shadow:0 1px 2px rgba(0,0,0,0.1)}@media screen and (max-width: 768px){.header .container{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}}@media screen and (min-width: 769px){.header{height:50px}}.header-toggle{position:absolute;right:0;top:0}@media screen and (min-width: 769px){.header-toggle{display:none}}.header-item{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:10px}.header-item img{max-height:24px}.header-item a{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.header-item .fa{font-size:21px;line-height:24px}.header-item .button+.button,.header-item .pagination a+.button,.pagination .header-item a+.button,.header-item .pagination .button+a,.pagination .header-item .button+a,.header-item .pagination a+a,.pagination .header-item a+a{margin-left:10px}@media screen and (max-width: 768px){.header-item{text-align:left}}.header-item a,a.header-item{color:#69707a}.header-item a:hover,a.header-item:hover{color:#222324}.header-item a.is-active,a.header-item.is-active{color:#222324}.header-icon{display:inline-block;font-size:14px;height:24px;line-height:24px;text-align:center;vertical-align:top;width:24px;color:#69707a;margin:0 5px}.header-icon:hover{color:#222324}.header-tab{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;-ms-grid-row-align:center;align-items:center;border-bottom:1px solid transparent;color:#69707a;display:block;height:50px;line-height:24px;padding:13px 15px}.header-tab:hover{border-bottom:1px solid #1fc8db}.header-tab.is-active{border-bottom:3px solid #1fc8db;color:#1fc8db}.header-left{-webkit-box-align:stretch;-webkit-align-items:stretch;-ms-flex-align:stretch;align-items:stretch;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;overflow:hidden;overflow-x:auto;white-space:nowrap}@media screen and (max-width: 768px){.header-left{height:50px}}@media screen and (min-width: 980px){.header-left .header-item:first-child{padding-left:0}}.header-right{-webkit-box-align:stretch;-webkit-align-items:stretch;-ms-flex-align:stretch;-ms-grid-row-align:stretch;align-items:stretch}@media screen and (min-width: 769px){.header-right{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}}@media screen and (min-width: 980px){.header-right .header-item:last-child{padding-right:0}}.header-full{-webkit-box-align:stretch;-webkit-align-items:stretch;-ms-flex-align:stretch;align-items:stretch;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;text-align:center;width:100%}.header-full>.header-item{-webkit-box-align:stretch;-webkit-align-items:stretch;-ms-flex-align:stretch;align-items:stretch;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;padding:0}.header-full>.header-item>a{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;width:100%}@media screen and (max-width: 768px){.header-menu{box-shadow:0 4px 7px rgba(0,0,0,0.1);display:none}.header-menu .header-item{border-top:1px solid rgba(211,214,219,0.5);padding:10px}.header-menu.is-active{display:block}}.header.is-centered{-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center}.header.is-centered .header-left,.header.is-centered .header-right{-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center}.header.is-small{background:#f5f7fa;box-shadow:none;height:40px;z-index:1}.header.is-small .container{height:40px}.header.is-small .header-tab{font-size:13px;height:40px;padding:8px 10px}.header.is-small .header-tab:hover,.header.is-small .header-tab.is-active{border-bottom-width:2px}.hero-video{bottom:0;left:0;position:absolute;right:0;top:0;overflow:hidden}.hero-video.is-transparent{opacity:0.3}.hero-video video{left:50%;min-height:100%;min-width:100%;position:absolute;top:50%;-webkit-transform:translate3d(-50%, -50%, 0);transform:translate3d(-50%, -50%, 0)}@media screen and (max-width: 768px){.hero-video{display:none}}.hero-content{padding:40px 20px}@media screen and (min-width: 980px){.hero-content{padding:40px 0}}.hero-buttons{margin-top:20px}@media screen and (max-width: 768px){.hero-buttons .button,.hero-buttons .pagination a,.pagination .hero-buttons a{display:block}.hero-buttons .button:not(:last-child),.hero-buttons .pagination a:not(:last-child),.pagination .hero-buttons a:not(:last-child){margin-bottom:10px}}@media screen and (min-width: 769px){.hero-buttons{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center}.hero-buttons .button:not(:last-child),.hero-buttons .pagination a:not(:last-child),.pagination .hero-buttons a:not(:last-child){margin-right:20px}}.hero{background:white;text-align:center}.hero .header{background:none}.hero .header .container{box-shadow:0 1px 0 rgba(211,214,219,0.3)}.hero .tabs a{border:none}.hero .tabs ul{border-bottom:none}.hero .tabs.is-boxed a{padding:8px 15px}.hero.is-dark{background:#222324;color:#fff}.hero.is-dark .title{color:#fff}.hero.is-dark .title a,.hero.is-dark .title strong{color:inherit}.hero.is-dark .subtitle{color:rgba(255,255,255,0.7)}.hero.is-dark .subtitle strong{color:#fff}.hero.is-dark .header .container{box-shadow:0 1px 0 rgba(255,255,255,0.2)}.hero.is-dark .header-icon,.hero.is-dark a.header-item,.hero.is-dark .header-item>a:not(.button){color:rgba(255,255,255,0.5)}.hero.is-dark .header-icon:hover,.hero.is-dark .header-icon.is-active,.hero.is-dark a.header-item:hover,.hero.is-dark a.header-item.is-active,.hero.is-dark .header-item>a:not(.button):hover,.hero.is-dark .header-item>a:not(.button).is-active{color:#fff}.hero.is-dark .tabs a{color:#fff;opacity:0.5}.hero.is-dark .tabs a:hover{opacity:1}.hero.is-dark .tabs li.is-active a{opacity:1}.hero.is-dark .tabs.is-boxed a,.hero.is-dark .tabs.is-toggle a{color:#fff}.hero.is-dark .tabs.is-boxed a:hover,.hero.is-dark .tabs.is-toggle a:hover{background:rgba(0,0,0,0.1)}.hero.is-dark .tabs.is-boxed li.is-active a,.hero.is-dark .tabs.is-boxed li.is-active a:hover,.hero.is-dark .tabs.is-toggle li.is-active a,.hero.is-dark .tabs.is-toggle li.is-active a:hover{background:#fff;color:#222324}.hero.is-dark.is-bold{background-image:-webkit-linear-gradient(309deg, #080a0b 0%, #222324 71%, #2c2e34 100%);background-image:linear-gradient(141deg, #080a0b 0%, #222324 71%, #2c2e34 100%)}@media screen and (max-width: 768px){.hero.is-dark .header-toggle span{background:#fff}.hero.is-dark .header-toggle:hover{background:rgba(0,0,0,0.1)}.hero.is-dark .header-toggle.is-active span{background:#fff}.hero.is-dark .header-menu .header-item{border-top-color:rgba(255,255,255,0.2)}}.hero.is-primary{background:#1fc8db;color:#fff}.hero.is-primary .title{color:#fff}.hero.is-primary .title a,.hero.is-primary .title strong{color:inherit}.hero.is-primary .subtitle{color:rgba(255,255,255,0.7)}.hero.is-primary .subtitle strong{color:#fff}.hero.is-primary .header .container{box-shadow:0 1px 0 rgba(255,255,255,0.2)}.hero.is-primary .header-icon,.hero.is-primary a.header-item,.hero.is-primary .header-item>a:not(.button){color:rgba(255,255,255,0.5)}.hero.is-primary .header-icon:hover,.hero.is-primary .header-icon.is-active,.hero.is-primary a.header-item:hover,.hero.is-primary a.header-item.is-active,.hero.is-primary .header-item>a:not(.button):hover,.hero.is-primary .header-item>a:not(.button).is-active{color:#fff}.hero.is-primary .tabs a{color:#fff;opacity:0.5}.hero.is-primary .tabs a:hover{opacity:1}.hero.is-primary .tabs li.is-active a{opacity:1}.hero.is-primary .tabs.is-boxed a,.hero.is-primary .tabs.is-toggle a{color:#fff}.hero.is-primary .tabs.is-boxed a:hover,.hero.is-primary .tabs.is-toggle a:hover{background:rgba(0,0,0,0.1)}.hero.is-primary .tabs.is-boxed li.is-active a,.hero.is-primary .tabs.is-boxed li.is-active a:hover,.hero.is-primary .tabs.is-toggle li.is-active a,.hero.is-primary .tabs.is-toggle li.is-active a:hover{background:#fff;color:#1fc8db}.hero.is-primary.is-bold{background-image:-webkit-linear-gradient(309deg, #0fb8ad 0%, #1fc8db 71%, #2cb5e8 100%);background-image:linear-gradient(141deg, #0fb8ad 0%, #1fc8db 71%, #2cb5e8 100%)}@media screen and (max-width: 768px){.hero.is-primary .header-toggle span{background:#fff}.hero.is-primary .header-toggle:hover{background:rgba(0,0,0,0.1)}.hero.is-primary .header-toggle.is-active span{background:#fff}.hero.is-primary .header-menu .header-item{border-top-color:rgba(255,255,255,0.2)}}.hero.is-info{background:#42afe3;color:#fff}.hero.is-info .title{color:#fff}.hero.is-info .title a,.hero.is-info .title strong{color:inherit}.hero.is-info .subtitle{color:rgba(255,255,255,0.7)}.hero.is-info .subtitle strong{color:#fff}.hero.is-info .header .container{box-shadow:0 1px 0 rgba(255,255,255,0.2)}.hero.is-info .header-icon,.hero.is-info a.header-item,.hero.is-info .header-item>a:not(.button){color:rgba(255,255,255,0.5)}.hero.is-info .header-icon:hover,.hero.is-info .header-icon.is-active,.hero.is-info a.header-item:hover,.hero.is-info a.header-item.is-active,.hero.is-info .header-item>a:not(.button):hover,.hero.is-info .header-item>a:not(.button).is-active{color:#fff}.hero.is-info .tabs a{color:#fff;opacity:0.5}.hero.is-info .tabs a:hover{opacity:1}.hero.is-info .tabs li.is-active a{opacity:1}.hero.is-info .tabs.is-boxed a,.hero.is-info .tabs.is-toggle a{color:#fff}.hero.is-info .tabs.is-boxed a:hover,.hero.is-info .tabs.is-toggle a:hover{background:rgba(0,0,0,0.1)}.hero.is-info .tabs.is-boxed li.is-active a,.hero.is-info .tabs.is-boxed li.is-active a:hover,.hero.is-info .tabs.is-toggle li.is-active a,.hero.is-info .tabs.is-toggle li.is-active a:hover{background:#fff;color:#42afe3}.hero.is-info.is-bold{background-image:-webkit-linear-gradient(309deg, #13bfdf 0%, #42afe3 71%, #53a1eb 100%);background-image:linear-gradient(141deg, #13bfdf 0%, #42afe3 71%, #53a1eb 100%)}@media screen and (max-width: 768px){.hero.is-info .header-toggle span{background:#fff}.hero.is-info .header-toggle:hover{background:rgba(0,0,0,0.1)}.hero.is-info .header-toggle.is-active span{background:#fff}.hero.is-info .header-menu .header-item{border-top-color:rgba(255,255,255,0.2)}}.hero.is-success{background:#97cd76;color:#fff}.hero.is-success .title{color:#fff}.hero.is-success .title a,.hero.is-success .title strong{color:inherit}.hero.is-success .subtitle{color:rgba(255,255,255,0.7)}.hero.is-success .subtitle strong{color:#fff}.hero.is-success .header .container{box-shadow:0 1px 0 rgba(255,255,255,0.2)}.hero.is-success .header-icon,.hero.is-success a.header-item,.hero.is-success .header-item>a:not(.button){color:rgba(255,255,255,0.5)}.hero.is-success .header-icon:hover,.hero.is-success .header-icon.is-active,.hero.is-success a.header-item:hover,.hero.is-success a.header-item.is-active,.hero.is-success .header-item>a:not(.button):hover,.hero.is-success .header-item>a:not(.button).is-active{color:#fff}.hero.is-success .tabs a{color:#fff;opacity:0.5}.hero.is-success .tabs a:hover{opacity:1}.hero.is-success .tabs li.is-active a{opacity:1}.hero.is-success .tabs.is-boxed a,.hero.is-success .tabs.is-toggle a{color:#fff}.hero.is-success .tabs.is-boxed a:hover,.hero.is-success .tabs.is-toggle a:hover{background:rgba(0,0,0,0.1)}.hero.is-success .tabs.is-boxed li.is-active a,.hero.is-success .tabs.is-boxed li.is-active a:hover,.hero.is-success .tabs.is-toggle li.is-active a,.hero.is-success .tabs.is-toggle li.is-active a:hover{background:#fff;color:#97cd76}.hero.is-success.is-bold{background-image:-webkit-linear-gradient(309deg, #8ecb45 0%, #97cd76 71%, #96d885 100%);background-image:linear-gradient(141deg, #8ecb45 0%, #97cd76 71%, #96d885 100%)}@media screen and (max-width: 768px){.hero.is-success .header-toggle span{background:#fff}.hero.is-success .header-toggle:hover{background:rgba(0,0,0,0.1)}.hero.is-success .header-toggle.is-active span{background:#fff}.hero.is-success .header-menu .header-item{border-top-color:rgba(255,255,255,0.2)}}.hero.is-warning{background:#fce473;color:rgba(0,0,0,0.5)}.hero.is-warning .title{color:rgba(0,0,0,0.5)}.hero.is-warning .title a,.hero.is-warning .title strong{color:inherit}.hero.is-warning .subtitle{color:rgba(0,0,0,0.7)}.hero.is-warning .subtitle strong{color:rgba(0,0,0,0.5)}.hero.is-warning .header .container{box-shadow:0 1px 0 rgba(0,0,0,0.2)}.hero.is-warning .header-icon,.hero.is-warning a.header-item,.hero.is-warning .header-item>a:not(.button){color:rgba(0,0,0,0.5)}.hero.is-warning .header-icon:hover,.hero.is-warning .header-icon.is-active,.hero.is-warning a.header-item:hover,.hero.is-warning a.header-item.is-active,.hero.is-warning .header-item>a:not(.button):hover,.hero.is-warning .header-item>a:not(.button).is-active{color:rgba(0,0,0,0.5)}.hero.is-warning .tabs a{color:rgba(0,0,0,0.5);opacity:0.5}.hero.is-warning .tabs a:hover{opacity:1}.hero.is-warning .tabs li.is-active a{opacity:1}.hero.is-warning .tabs.is-boxed a,.hero.is-warning .tabs.is-toggle a{color:rgba(0,0,0,0.5)}.hero.is-warning .tabs.is-boxed a:hover,.hero.is-warning .tabs.is-toggle a:hover{background:rgba(0,0,0,0.1)}.hero.is-warning .tabs.is-boxed li.is-active a,.hero.is-warning .tabs.is-boxed li.is-active a:hover,.hero.is-warning .tabs.is-toggle li.is-active a,.hero.is-warning .tabs.is-toggle li.is-active a:hover{background:rgba(0,0,0,0.5);color:#fce473}.hero.is-warning.is-bold{background-image:-webkit-linear-gradient(309deg, #ffbd3d 0%, #fce473 71%, #fffe8a 100%);background-image:linear-gradient(141deg, #ffbd3d 0%, #fce473 71%, #fffe8a 100%)}@media screen and (max-width: 768px){.hero.is-warning .header-toggle span{background:rgba(0,0,0,0.5)}.hero.is-warning .header-toggle:hover{background:rgba(0,0,0,0.1)}.hero.is-warning .header-toggle.is-active span{background:rgba(0,0,0,0.5)}.hero.is-warning .header-menu .header-item{border-top-color:rgba(0,0,0,0.2)}}.hero.is-danger{background:#ed6c63;color:#fff}.hero.is-danger .title{color:#fff}.hero.is-danger .title a,.hero.is-danger .title strong{color:inherit}.hero.is-danger .subtitle{color:rgba(255,255,255,0.7)}.hero.is-danger .subtitle strong{color:#fff}.hero.is-danger .header .container{box-shadow:0 1px 0 rgba(255,255,255,0.2)}.hero.is-danger .header-icon,.hero.is-danger a.header-item,.hero.is-danger .header-item>a:not(.button){color:rgba(255,255,255,0.5)}.hero.is-danger .header-icon:hover,.hero.is-danger .header-icon.is-active,.hero.is-danger a.header-item:hover,.hero.is-danger a.header-item.is-active,.hero.is-danger .header-item>a:not(.button):hover,.hero.is-danger .header-item>a:not(.button).is-active{color:#fff}.hero.is-danger .tabs a{color:#fff;opacity:0.5}.hero.is-danger .tabs a:hover{opacity:1}.hero.is-danger .tabs li.is-active a{opacity:1}.hero.is-danger .tabs.is-boxed a,.hero.is-danger .tabs.is-toggle a{color:#fff}.hero.is-danger .tabs.is-boxed a:hover,.hero.is-danger .tabs.is-toggle a:hover{background:rgba(0,0,0,0.1)}.hero.is-danger .tabs.is-boxed li.is-active a,.hero.is-danger .tabs.is-boxed li.is-active a:hover,.hero.is-danger .tabs.is-toggle li.is-active a,.hero.is-danger .tabs.is-toggle li.is-active a:hover{background:#fff;color:#ed6c63}.hero.is-danger.is-bold{background-image:-webkit-linear-gradient(309deg, #f32a3e 0%, #ed6c63 71%, #f39376 100%);background-image:linear-gradient(141deg, #f32a3e 0%, #ed6c63 71%, #f39376 100%)}@media screen and (max-width: 768px){.hero.is-danger .header-toggle span{background:#fff}.hero.is-danger .header-toggle:hover{background:rgba(0,0,0,0.1)}.hero.is-danger .header-toggle.is-active span{background:#fff}.hero.is-danger .header-menu .header-item{border-top-color:rgba(255,255,255,0.2)}}@media screen and (min-width: 769px){.hero.is-fullheight .tabs,.hero.is-large .tabs{font-size:18px}}@media screen and (min-width: 769px){.hero.is-medium .hero-content{padding:120px 20px}}@media screen and (min-width: 980px){.hero.is-medium .hero-content{padding:120px 0}}.hero.is-large .tabs a{padding:10px 15px}@media screen and (min-width: 769px){.hero.is-large .hero-content{padding:240px 20px}}@media screen and (min-width: 980px){.hero.is-large .hero-content{padding:240px 0}}.hero.is-fullheight{-webkit-box-align:stretch;-webkit-align-items:stretch;-ms-flex-align:stretch;align-items:stretch;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;min-height:100vh}.hero.is-fullheight .tabs a{padding:15px 20px}.hero.is-fullheight .hero-content{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center}.hero.is-left{text-align:left}.hero.is-right{text-align:right}.section{background:white;padding:40px 20px}.section+.section{border-top:1px solid rgba(211,214,219,0.5)}@media screen and (min-width: 980px){.section{padding:40px 0}.section.is-medium{padding:120px 0}.section.is-large{padding:240px 0}}.footer{background:#f5f7fa;padding:40px 20px 80px}.footer a{color:#69707a}.footer a:hover{color:#222324}.footer a:not(.icon){border-bottom:1px solid #d3d6db}.footer a:not(.icon):hover{border-bottom-color:#1fc8db} +/*# sourceMappingURL=bulma.min.css.map */ \ No newline at end of file diff --git a/homie-esp8266-v1-setup-sources/app/vendor/font-awesome/icons.min.css b/homie-esp8266-v1-setup-sources/app/vendor/font-awesome/icons.min.css new file mode 100644 index 0000000..f384095 --- /dev/null +++ b/homie-esp8266-v1-setup-sources/app/vendor/font-awesome/icons.min.css @@ -0,0 +1 @@ +@font-face{font-family:'FortAwesome';src:url(data:application/font-woff;charset=utf-8;base64,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) format("woff");font-weight:400;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FortAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-heartbeat:before{content:'\f000'}.fa-info:before{content:'\f001'}.fa-wifi:before{content:'\f002'}.fa-signal:before{content:'\f003'}.fa-cogs:before{content:'\f004'}.fa-rocket:before{content:'\f005'} diff --git a/homie-esp8266-v1-setup-sources/gulpfile.babel.js b/homie-esp8266-v1-setup-sources/gulpfile.babel.js new file mode 100644 index 0000000..e8e17bb --- /dev/null +++ b/homie-esp8266-v1-setup-sources/gulpfile.babel.js @@ -0,0 +1,163 @@ +'use strict'; + +import gulp from 'gulp'; +import plumber from 'gulp-plumber'; // help to avoid crash if error in a task +import newer from 'gulp-newer'; +import watch from 'gulp-watch'; // gulp.watch doesn't detect new files +import smoosher from 'gulp-smoosher'; +import zopfli from 'gulp-zopfli'; +import rename from 'gulp-rename'; +import del from 'del'; // delete files +import imagemin from 'gulp-imagemin'; +import runSequence from 'run-sequence'; +import notifier from 'node-notifier'; +import uglify from 'gulp-uglify'; +import browserify from 'browserify'; +import envify from 'envify/custom'; +import babelify from 'babelify'; +import source from 'vinyl-source-stream'; // helper for browserify text stream to gulp pipeline +import buffer from 'vinyl-buffer'; // helper for browserify + +let errored = false; +let errorHandler = function (task) { + return function (error) { + errored = true; + console.log(`Error in ${task}: ${error.message}`); + notifier.notify({ + title: `Error in ${task}`, + message: error.message + }); + }; +}; + +// ################ +// # Entry points # +// ################ + +gulp.task('dev', ['buildpublic:dev'], function (done) { + watch('./app/assets/**/*', function (vinyl) { + console.log(`${vinyl.path} was ${vinyl.event}, piping to public/...`); + runSequence('assets'); + }); + + watch('./app/vendor/**/*', function (vinyl) { + console.log(`${vinyl.path} was ${vinyl.event}, piping to public/vendor/...`); + runSequence('vendor'); + }); + + watch('./app/js/**/*.js', function (vinyl) { + console.log(`${vinyl.path} was '${vinyl.event}', running Babel...`); + runSequence('es6-7:dev'); + }); +}); + +gulp.task('dist', function (done) { + runSequence('buildpublic:dist', 'builduigz', function () { + if (errored) { + console.log('Distribution failed'); + process.exit(-1); + } + + done(); + }); +}); + +// #################### +// # public directory # +// #################### + +gulp.task('builduigz', function () { + return gulp.src('index.html') + .pipe(plumber(errorHandler('buildpublic:imagemin'))) + .pipe(smoosher()) + .pipe(rename('ui_bundle')) + .pipe(zopfli()) + .pipe(gulp.dest('./')); +}); + +gulp.task('buildpublic:dist', function (done) { + runSequence( + 'buildpublic:clear', + ['assets', 'vendor', 'es6-7:dist'], + 'buildpublic:imagemin', + done); +}); + +gulp.task('buildpublic:dev', function (done) { + runSequence( + 'buildpublic:clear', + ['assets', 'vendor', 'es6-7:dev'], + done); +}); + +gulp.task('buildpublic:clear', function (done) { + del(['./public/**/*']).then(function () { + done(); + }); +}); + +gulp.task('buildpublic:imagemin', function () { + return gulp.src('./public/img/**/*.{png,jpg,gif,svg}', { + base: './public' + }) + .pipe(plumber(errorHandler('buildpublic:imagemin'))) + .pipe(imagemin({ + progressive: true + })) + .pipe(gulp.dest('./public')); +}); + +// Babel + +let es67 = (prod = false) => { + const babelPlugins = []; + if (prod) babelPlugins.push(['module-alias', [{ 'src': 'npm:preact-compat', 'expose': 'react' }, { 'src': 'npm:preact-compat', 'expose': 'react-dom' }]]); + return browserify({ entries: './app/js/app.js', debug: false }) // debug for sourcemaps + .transform(babelify, { presets: ['es2015', 'stage-3', 'react'], plugins: babelPlugins }); +}; + +gulp.task('es6-7:dev', function () { + return es67() + .bundle() + .on('error', function (error) { + errorHandler('es6-7')(error); + this.emit('end'); + }) // Don't crash if failed, plumber doesn't work with browserify + .pipe(source('bundle.min.js')) + .pipe(buffer()) + .pipe(gulp.dest('./public/js')); +}); + +gulp.task('es6-7:dist', function () { + return es67(true) + .transform(envify({ NODE_ENV: 'production' }), { global: true }) // global: act on node_modules (here react prod mode) + .bundle() + .on('error', function (error) { + errorHandler('es6-7')(error); + this.emit('end'); + }) // Don't crash if failed, plumber doesn't work with browserify + .pipe(source('bundle.min.js')) + .pipe(buffer()) + .pipe(uglify()) + .pipe(gulp.dest('./public/js/')); +}); + +// assets and vendor + +gulp.task('assets', function () { + return gulp.src('./app/assets/**/*', { + base: './app/assets' + }) + .pipe(plumber(errorHandler('assets'))) + .pipe(newer('./public')) + .pipe(gulp.dest('./public')); +}); + +gulp.task('vendor', function () { + return gulp.src('./app/vendor/**/*', { + base: './app' + }) + .pipe(plumber(errorHandler('vendor'))) + .pipe(newer('./public')) + .pipe(gulp.dest('./public')); +}); diff --git a/homie-esp8266-v1-setup-sources/index.html b/homie-esp8266-v1-setup-sources/index.html new file mode 100644 index 0000000..3cbf2f2 --- /dev/null +++ b/homie-esp8266-v1-setup-sources/index.html @@ -0,0 +1,34 @@ + + + + + + + + Set up your Homie for ESP8266 device + + + + + + + + + + + + +
+
+ + + + + + diff --git a/homie-esp8266-v1-setup-sources/package.json b/homie-esp8266-v1-setup-sources/package.json new file mode 100644 index 0000000..dd7a23c --- /dev/null +++ b/homie-esp8266-v1-setup-sources/package.json @@ -0,0 +1,55 @@ +{ + "name": "homie-esp8266-configurator", + "version": "0.1.0", + "description": "UI to configure an ESP8266 loaded with an Homie firmware", + "scripts": { + "dev": "gulp dev", + "dist": "gulp dist" + }, + "author": { + "name": "Marvin Roger", + "email": "bonjourmarvin@marvinroger.fr", + "url": "http://marvinroger.fr" + }, + "repository": { + "type": "git", + "url": "https://github.com/marvinroger/homie-esp8266-configurator.git" + }, + "bugs": "https://github.com/marvinroger/homie-esp8266-configurator/issues", + "homepage": "https://github.com/marvinroger/homie-esp8266-configurator", + "license": "GPL-2.0", + "dependencies": { + "babel-runtime": "^6.3.19" + }, + "devDependencies": { + "babel-core": "^6.4.0", + "babel-plugin-module-alias": "^1.4.0", + "babel-plugin-transform-runtime": "^6.3.13", + "babel-preset-es2015": "^6.1.18", + "babel-preset-react": "^6.1.18", + "babel-preset-stage-3": "^6.1.18", + "babelify": "^7.2.0", + "browserify": "^13.0.0", + "del": "^2.2.0", + "envify": "^3.4.0", + "gulp": "^3.9.0", + "gulp-imagemin": "^2.4.0", + "gulp-newer": "^1.1.0", + "gulp-plumber": "^1.0.1", + "gulp-rename": "^1.2.2", + "gulp-smoosher": "0.0.9", + "gulp-uglify": "^1.5.1", + "gulp-watch": "^4.3.5", + "gulp-zopfli": "^1.0.0", + "immutable": "^3.7.6", + "node-notifier": "^4.3.1", + "preact-compat": "^1.7.1", + "react": "^15.0.1", + "react-dom": "^15.0.1", + "request": "^2.67.0", + "run-sequence": "^1.1.5", + "vinyl-buffer": "^1.0.0", + "vinyl-source-stream": "^1.1.0", + "whatwg-fetch": "^0.11.0" + } +} diff --git a/pixelprojektor/pixelprojektor.ino b/pixelprojektor/pixelprojektor.ino index 72b9dfd..311fb12 100644 --- a/pixelprojektor/pixelprojektor.ino +++ b/pixelprojektor/pixelprojektor.ino @@ -1,24 +1,50 @@ -#include - +#include // homie lib from: https://github.com/marvinroger/homie-esp8266/ +#include +#ifdef __AVR__ + #include +#endif +#define PIN 2 //data pin for ws2812 -HomieNode effectNode("effect", "commands"); -HomieNode pixelsNode("pixels", "commands"); +Adafruit_NeoPixel strip = Adafruit_NeoPixel(64, PIN, NEO_GRB + NEO_KHZ800); +HomieNode homieNode("pixel", "commands"); + +void led_fill(uint32_t c) +{ + for (int i=0; i < strip.numPixels(); i++) { + strip.setPixelColor(i, c); //turn every third pixel on + } + strip.show(); +} bool effectHandler(const HomieRange& range, const String& value) { int sep = value.indexOf("|"); - if(sep > 0) { - //Homie.getLogger() << "scroll " << value << " wait " << wait << endl; - - } else { + Homie.getLogger() << "-> " << value << endl; + + //Serial.print("->"); Serial.println(value); + + if (value.charAt(0)=='#'){ //solid fill + String color=value.substring(1); + int number = (int) strtol( &color[0], NULL, 16); - //Homie.getLogger() << "scroll " << value << endl; + + // Split them up into r, g, b values + int r = number >> 16; + int g = number >> 8 & 0xFF; + int b = number & 0xFF; + Homie.getLogger() << "r=" << r << " g=" << g << " b=" << b << endl; + //Serial.print("r=");Serial.print(r); + //Serial.print(" g=");Serial.print(g); + //Serial.print(" b=");Serial.println(b); + + led_fill(strip.Color(r, g, b)); } + return true; } @@ -46,11 +72,17 @@ void setup() { Homie_setFirmware("pixelprojektor", "1.0.0"); - effectNode.advertise("on").settable(effectHandler); - pixelsNode.advertise("on").settable(pixelsHandler); + homieNode.advertise("effect").settable(effectHandler); + homieNode.advertise("pixels").settable(pixelsHandler); + strip.begin(); + strip.show(); // Initialize all pixels to 'off' + + led_fill(strip.Color(0, 0, 0)); Homie.setup(); + + } void loop() { @@ -61,3 +93,6 @@ void loop() { + + +