diff --git a/.editorconfig b/.editorconfig deleted file mode 100755 index 7a12570..0000000 --- a/.editorconfig +++ /dev/null @@ -1,19 +0,0 @@ -root = true - -[*] -charset = utf-8 -end_of_line = lf -indent_style = space -insert_final_newline = true -trim_trailing_whitespace = true -ident_size = 4 - -[*.md] -ident_size = 2 -trim_trailing_whitespace = false - -[*.json] -ident_size = 2 - -[{.gitignore,.gitkeep,.editorconfig}] -ident_size = 2 diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 3fbad49..771559a 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -1,4 +1 @@ -# Require maintainer's :+1: for changes to the .github/ repo-config files -# mainly due to https://github.com/probot/settings privilege escalation .github/* @frenck -.gitlab-ci.yml @frenck diff --git a/.github/CODE_OF_CONDUCT.md b/.github/CODE_OF_CONDUCT.md new file mode 100644 index 0000000..8b146f4 --- /dev/null +++ b/.github/CODE_OF_CONDUCT.md @@ -0,0 +1,133 @@ +# Contributor Covenant Code of Conduct + +## Our Pledge + +We as members, contributors, and leaders pledge to make participation in our +community a harassment-free experience for everyone, regardless of age, body +size, visible or invisible disability, ethnicity, sex characteristics, gender +identity and expression, level of experience, education, socio-economic status, +nationality, personal appearance, race, religion, or sexual identity +and orientation. + +We pledge to act and interact in ways that contribute to an open, welcoming, +diverse, inclusive, and healthy community. + +## Our Standards + +Examples of behavior that contributes to a positive environment for our +community include: + +- Demonstrating empathy and kindness toward other people +- Being respectful of differing opinions, viewpoints, and experiences +- Giving and gracefully accepting constructive feedback +- Accepting responsibility and apologizing to those affected by our mistakes, + and learning from the experience +- Focusing on what is best not just for us as individuals, but for the + overall community + +Examples of unacceptable behavior include: + +- The use of sexualized language or imagery, and sexual attention or + advances of any kind +- Trolling, insulting or derogatory comments, and personal or political attacks +- Public or private harassment +- Publishing others' private information, such as a physical or email + address, without their explicit permission +- Other conduct which could reasonably be considered inappropriate in a + professional setting + +## Enforcement Responsibilities + +Community leaders are responsible for clarifying and enforcing our standards of +acceptable behavior and will take appropriate and fair corrective action in +response to any behavior that they deem inappropriate, threatening, offensive, +or harmful. + +Community leaders have the right and responsibility to remove, edit, or reject +comments, commits, code, wiki edits, issues, and other contributions that are +not aligned to this Code of Conduct, and will communicate reasons for moderation +decisions when appropriate. + +## Scope + +This Code of Conduct applies within all community spaces, and also applies when +an individual is officially representing the community in public spaces. +Examples of representing our community include using an official e-mail address, +posting via an official social media account, or acting as an appointed +representative at an online or offline event. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be +reported to the community leaders responsible for enforcement at +frenck@frenck.dev. + +All complaints will be reviewed and investigated promptly and fairly. + +All community leaders are obligated to respect the privacy and security of the +reporter of any incident. + +## Enforcement Guidelines + +Community leaders will follow these Community Impact Guidelines in determining +the consequences for any action they deem in violation of this Code of Conduct: + +### 1. Correction + +**Community Impact**: Use of inappropriate language or other behavior deemed +unprofessional or unwelcome in the community. + +**Consequence**: A private, written warning from community leaders, providing +clarity around the nature of the violation and an explanation of why the +behavior was inappropriate. A public apology may be requested. + +### 2. Warning + +**Community Impact**: A violation through a single incident or series +of actions. + +**Consequence**: A warning with consequences for continued behavior. No +interaction with the people involved, including unsolicited interaction with +those enforcing the Code of Conduct, for a specified period of time. This +includes avoiding interactions in community spaces as well as external channels +like social media. Violating these terms may lead to a temporary or +permanent ban. + +### 3. Temporary Ban + +**Community Impact**: A serious violation of community standards, including +sustained inappropriate behavior. + +**Consequence**: A temporary ban from any sort of interaction or public +communication with the community for a specified period of time. No public or +private interaction with the people involved, including unsolicited interaction +with those enforcing the Code of Conduct, is allowed during this period. +Violating these terms may lead to a permanent ban. + +### 4. Permanent Ban + +**Community Impact**: Demonstrating a pattern of violation of community +standards, including sustained inappropriate behavior, harassment of an +individual, or aggression toward or disparagement of classes of individuals. + +**Consequence**: A permanent ban from any sort of public interaction within +the community. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], +version 2.0, available at +[https://www.contributor-covenant.org/version/2/0/code_of_conduct.html][v2.0]. + +Community Impact Guidelines were inspired by +[Mozilla's code of conduct enforcement ladder][mozilla coc]. + +For answers to common questions about this code of conduct, see the FAQ at +[https://www.contributor-covenant.org/faq][faq]. Translations are available +at [https://www.contributor-covenant.org/translations][translations]. + +[homepage]: https://www.contributor-covenant.org +[v2.0]: https://www.contributor-covenant.org/version/2/0/code_of_conduct.html +[mozilla coc]: https://github.com/mozilla/diversity +[faq]: https://www.contributor-covenant.org/faq +[translations]: https://www.contributor-covenant.org/translations diff --git a/CONTRIBUTING.md b/.github/CONTRIBUTING.md similarity index 100% rename from CONTRIBUTING.md rename to .github/CONTRIBUTING.md diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 0000000..7f95bd4 --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1,4 @@ +--- +github: frenck +patreon: frenck +custom: https://frenck.dev/donate/ diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index cbd529a..14f7b5b 100755 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -6,4 +6,4 @@ > ([Github link][autolink-references] to related issues or pull requests) -[autolink-references]: https://help.github.com/articles/autolinked-references-and-urls/ \ No newline at end of file +[autolink-references]: https://help.github.com/articles/autolinked-references-and-urls/ diff --git a/.github/SECURITY.md b/.github/SECURITY.md new file mode 100644 index 0000000..021b03d --- /dev/null +++ b/.github/SECURITY.md @@ -0,0 +1,1839 @@ +# Security Policy + +I take the security of my software and services seriously. This includes +all open source software I create, maintain or help to maintain. + +If you believe you have found a security vulnerability in any repository +I maintain, including this one, please report it responsible to me as +described below. + +**Please DO NOT report security vulnerabilities publicly!** + +So... DO NOT create a GitHub issue for it ;) + +## Reporting a vulnerability + +Privately and confidently, send me a detailed description of the vulnerability +you have discovered using an encrypted and authenticated channel. Personally, +I prefer this to be done using PGP encrypted email. Contact information +needed for this is listed down below. + +In the report, please include as much information as possible, including: + +- A extensive description of the vulnerability. +- How it could be exploited. +- The potential impact you think it would have (e.g., DOS attackable, privacy + concerns, leaking of credentials). +- Steps for reproducing the vulnerability. +- Code (if any), that is needed for reproducing the issue. +- If you have an idea for a fix, patch or any other adjustment for mitigating + the vulnerability reported. + +Sorry for the long list, but providing as much information as possible allows +me to act more quickly. Make sure to write your report in the English language. + +Please take care not to violate the privacy of other people in your report. +For example, stack traces or exploit scripts sent to me should never contain +private or personally identifiable information. + +## After you have reported the vulnerability + +Give me at least a week to investigate and respond to the reported vulnerability +you have found; and up to 60 days to fix and distribute it. This includes a +window for existing users to upgrade, patch or mitigate the issue as well. + +If you intent, at any point, to disclose the vulnerability to someone else +or maybe even publicly, please give me a reasonable advanced notice. + +If any dependent projects are involved, I will take care of informing the +maintainers of those projects as well. + +## Bug bounty + +Unfortunately, I cannot offer a paid bug bounty program. I will, however, give +my best efforts to show appreciation towards people that took the time and +effort to disclose vulnerabilities responsibly. + +Me, and the open source community, will be forever grateful. + +Oh, and if we ever meet, I'm happy to buy you a beer :) + +## Contact information + +Please contact me, Franck Nijhof, directly on: + +security@frenck.dev (not for support!) + +GPG Fingerprint: `731C 60D6 80E6 E850 F31C 2E88 AB33 ADAC E710 1952` + +https://keys.openpgp.org/search?q=731C60D680E6E850F31C2E88AB33ADACE7101952 + +```txt +-----BEGIN PGP PUBLIC KEY BLOCK----- + +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 +FHJUUkMAAAIMAAAAIGdUUkMAAAIsAAAAIGJUUkMAAAJMAAAAIGNocm0AAAJsAAAA +JG1sdWMAAAAAAAAAAQAAAAxlblVTAAAAHAAAABwAcwBSAEcAQgAgAGIAdQBpAGwA +dAAtAGkAbgAAbWx1YwAAAAAAAAABAAAADGVuVVMAAAAyAAAAHABOAG8AIABjAG8A +cAB5AHIAaQBnAGgAdAAsACAAdQBzAGUAIABmAHIAZQBlAGwAeQAAAABYWVogAAAA +AAAA9tYAAQAAAADTLXNmMzIAAAAAAAEMSgAABeP///MqAAAHmwAA/Yf///ui///9 +owAAA9gAAMCUWFlaIAAAAAAAAG+UAAA47gAAA5BYWVogAAAAAAAAJJ0AAA+DAAC2 +vlhZWiAAAAAAAABipQAAt5AAABjecGFyYQAAAAAAAwAAAAJmZgAA8qcAAA1ZAAAT +0AAACltwYXJhAAAAAAADAAAAAmZmAADypwAADVkAABPQAAAKW3BhcmEAAAAAAAMA +AAACZmYAAPKnAAANWQAAE9AAAApbY2hybQAAAAAAAwAAAACj1wAAVHsAAEzNAACZ +mgAAJmYAAA9c/8AAEQgAgACAAwESAAIRAQMRAf/EAB8AAAEFAQEBAQEBAAAAAAAA +AAABAgMEBQYHCAkKC//EALUQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNR +YQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZH +SElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Sl +pqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX2 +9/j5+v/EAB8BAAMBAQEBAQEBAQEAAAAAAAABAgMEBQYHCAkKC//EALURAAIBAgQE +AwQHBQQEAAECdwABAgMRBAUhMQYSQVEHYXETIjKBCBRCkaGxwQkjM1LwFWJy0QoW +JDThJfEXGBkaJicoKSo1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2 +d3h5eoKDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJ +ytLT1NXW19jZ2uLj5OXm5+jp6vLz9PX29/j5+v/bAEMACAYGBwYFCAcHBwkJCAoM +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 +73QnlXw4/oDrjt/ZPD2SY9spk8ApQzQbKKSRuGxzZU8irDS5tLtYR9z4j1ulJGWm +j3GvuZjjXSxHy1dwOo8ph2N7b5nmzruXH1wjgppZ48hOcLn/z1dghvh4M8eBvoho +HElMD+bgudYsKEAwQMjPcIbjM+USR9BGSLQ3RnJhbmNrIE5pamhvZiAoRGVhbGVy +RGlyZWN0KSA8Zi5uaWpob2ZAZGVhbGVyZGlyZWN0Lm5sPokCVAQTAQoAPgIbAwIe +AQIXgAULCQgHAwUVCgkICwUWAgMBABYhBHMcYNaA5uhQ8xwuiKszraznEBlSBQJg +eyeWBQkMLyuoAAoJEKszraznEBlSKNkQAKk9a6khEhDigwZWByPcNuv29uNB0m4C +TMKP5kmUXCf1rJcMFc7rxC1JrDiSKUJpeNRJLly4ltp3D3hIt0dWU928CAeHzD9k +veNJZMqA+KLRkjOQt3mQlsWhPN3gCN/oatrVzvchTGInuD5DQj1suPNCCoohgAIR +z248TyTr34cLN16ehAI4PHq9ZL6+V0CbM5a36Dp5nVHtDQQOqUTQzRUGcbQdYtFg +txs9mnODJRt91ykkKi2CBkZP4yzzjdXyAT/2JFBNk/wPNUkHSLZsN5xDwRw44KUG +GqsL4ALMFYv/ITM6lTDDdQyo9g7DOUy36yhpo5nyka+vuvQxeTQouJ4mytaM+5fV +nYd8PGqm+YI9EYKXpWdd55ycVrkD7qGwRPD6OROyn7sLldC6L5HhbexRNywM1qnp +DLd1upPn2LwnqUB4P9W56NxAeVlTrYP2JyZ/1KjtmdmsRnlDv6SIWv+GwLKaVgCr +j0YuAbk4BWQNhEVm38O9vYQPr0ti4A75t6EuHjMc1xrlpTwdMQ30hTu/M3hV6V/P +sLN/YnVVIYvYsokOvPMd5fikOek+CUcxHIkmW1sp5ryDvUDC3wfIXvl70wWsmeU9 +4tN7TJczPIqOynRuNE3nUMMdtrxdU95Auh5BIdFANQNud1SX+E1UCKfs4VIIxNW6 +wNgrzyErU8g5iQIcBBABAgAGBQJYPYAyAAoJEE5+WcG+PB5Y+JUP/0fnrZbh/2uO +vflSKUwb8kt4B2OYsZLdtql5L8ou/go2x6tMV+ciUSq8YkmlhCNzp5up/Qt4iRlo +C/MCAGo3v3Y//65xCz16WoLugXVpQSl3YvGS7dq66b0kPiVEhs67S2dzymG3uvm7 +TtpsHoyREQPSEn10lSXtozu7UsfBK/Zxt+fBF2OpaKWtokem2sNhvRmRfAvfyry7 +THKGEYAcJLgw+lwsunZe3vueCSBiF21P4LkSIcqkfzi5jrw1bsv8E0s+gLm3f5e4 +tNn66v5cWwUblP+i9MhmfitkffxxNDWfJmqHoDMInDoCZbjZRrR2GRgrvgmaU9eD +mlKspgTcE4LPIhTjTq7nAaOGLQ86oV7xU9KCUTzWSGzcL+7M0dCZQf3FrPa8D2Uu +r/I9yQglkkG0kl4yj7uXpdn/5iqVFf5DV/ZiNyIVOdUk1JUT/SBc42bGiqN9w+ev +jkZ+I9vs02JO40spz4MV8PUbJZpZw4eRcc+EuUd8Tw4ox5wDHLrTvvXI8Lg3LZ1G +7CC4ah5RYBQ4MwoljG4KGaCl4inX8hMM1A9hsQ4CoraAeh8LBXSK6pfTZSkWWo3o +8V4CLiDzRP7ofnqzEUMh8JM+NUVKk/KcrmmVFivKaXntu+3VXH56AWb1PIrT2gjR +E5jgwd/4LyEmFWnsDOwyc4KR8SY4C3KtiQI9BBMBCgAnBQJYDvofAhsDBQkDwoLb +BQsJCAcDBRUKCQgLBRYCAwEAAh4BAheAAAoJEKszraznEBlS7m4QAI0k9eBKf2Wz +LNbgLZ9SpQBHiNYu+vFLZ+ErJ0uTy9Z52ioa7d525MLsjLslS8WFhqiRuo8BXOWV +EIy0aRLazz1ZVK6ul+2Oauzv6pd1Ac+3jgkJDVK2/MQlzFOxkXGyG3h2T2/Wcbqy +YPR4ajTmfaQp6w7wVIdU7irqN5IuF9XkRVWYrk5Hxr/p0LeB50w+n/BQZB/DWetq +O7/ISk4I1ViWv9IkGx7zkqc28hUSaxLHQxsFiAyv2KjX7QkAZ/q0KIlN3FjLLiWn +000bSv200GpTPsUVezLvYWHIqnlTXc1OVYpeVr+sl1ZOiInVQuUKteoayT3D6rQP +Z1I5kBnmCyT9fCa4etljgARyauM7REskE2/0InFOD2oFfI0xq1qE+VxHDVuIp4uJ +veKAv3N+REz9rqyTXyy/rDhCg5pSNnc6WWgwixIlr8iQwg+XVGEl68P+2LcjFj5+ +I5qmTYmbqaPmbaubMK5nSfZthcvQUe5JbaZ+7nhWtmR4l3Qhe+0OAo70W6n7tikT +frbGA/IFTu8FaJfCFlnByoPxgv52RRRxplUNi4hK3K/QdEx0IWS8DDCwvKC5djgL +Sem7jG+EP/826a2YxRM4zF2Oh7Ly0Ob9/no/kSlK5RBlkag7a7kkUuh0pMEbFYJa +soXjsvl2VbbwSBlzClkgdrP4Uv8TMVLZiQI9BBMBCgAnAhsDBQkDwoLbAh4BAheA +BQJYQffRBQsJCAcDBRUKCQgLBRYCAwEAAAoJEKszraznEBlSFegP+wSnfaykt8aB +xR3lQ35nVANyhgc97TCjmtAuPvsbbrWt2vlCBqpG1Zt4YIx9BS0qB4C9uVbQgzUY +awwb97wDutCtY8kbCFb/Hc5T2y6QZo7ezXROPKa0R5qqAzVRBUdi17aa3XoQTSs0 +Ln2OpvnXMaPpw2oHPORbZIN4/VgyeZ3Xmf/gFHF1JwSD6ruKZg8Hqw6VHFcpdJif +56B4nTYYUgYq5/2SmdoLRXQ+jkheFnWZgwnBVEt0IrmAYlEBZe6Y3JBiikIVyMav +NGYrVIWVqK1Uk8nvYh5sZBmnGceTPH/qEUYCew3yucsZXRtP0UwqhU8qPH9CDoJ4 +uKVBYglyY22jv+ZQwhJY67SAiV03g7v3PluLBQ7rF5jBZytkyEh+YGOY45PiYbEC +ex50Pr5Z8u9WX6jS9oxv4eIO6D/EhwqE2DjnMsGXxmWDcxQZZ/tiOEOFvv+8Lf/A +U1BSiZvs/KHTXO9t9o70Qaa1eEO9TiUpHlshYcJm2dB5xzcvaEu1nUaEMW2gF32c +t2zQhzrHOF960fFewpXL5AWnx6CodCfpVbkfUlqZnawXMiqUf/KyDGRXI0BNfTw4 +X1XjOn62E3a2rjQUCOwEOmye6LU1gslNXLU24BV4FsATHeFYT5ShXD9z349/k7w1 +NYekekhbnzZacJLRrs5mdtRt3AO6xXCGiQIiBBMBCAAMBQJYqq4rBYMHhh+AAAoJ +ENKnjZBbW+M9w6UP/2H5Cl2DD2C5cnHI59hZHL7ms0cgTbaY4eifg33EJwjx2oR7 +SXs3D8oLqcc8AO9zyFfKV/Ov4SIgtnNCHaGRRfATMDPKmkA3KbKwJYxBLKPOJoB2 +qP+4BqtAkgzkmOsSxpwt05TvhpAwMMY13N22+w6LZMY5tcMn6n37lRHIY1S+f6j1 +Wq9hAcq26KS1jTcrHXzQBCAwT2THWoUWC6AWyRfmQ9EdzzM+0rYohuxVRAPk2s73 +RJDq1PFwnnNZPNEpUd/0GB4094WZWKLI+PWj/lkT+My882a+pXCv0ewR3Zu5026j +AEmELOvOl9Rke159Jjh3vftn72xXPYjvS0zdmoEz9b85IM54j59QWD5y1NCGfB+D +nfzLs+rYvCvklYHtEU9rku/nrSdHDKBDgZScVz/PZE4PYS/t+/EyaG57zCINpABg +YG2Mt8sk8UWbI5q0y63YN3W5jUj22qGQwPKWM9eeI3D59yLqQfhChMLMoMEmd0N+ +IebDgfPu2kOCe5R45YwIZVZutGEUrtPaPqgBq8lXGSNLqreK7FTeVw3YcQEEifAu +tgNLvrs0byVzq+Vcyb6JpgHqMQYxFbKFWhbf0ctbcGwbpdx05sge+Oj2LDBeGFHr +hse0MK1SxniYU51k6c3Kulu5xP1rmMPDq5wegzFY6atUtrLm10RMyuj2KLiHiQIc +BBABCgAGBQJYz8/iAAoJEDsgzdHcGjGt5ZQP/3VS5NIl0zXMpgCrHy51slGAypW9 +oLpg3wTTgQ+nA+fhRiB4DS05UevYVSZnku91QHP5jaZOHEwUjFjHP98NJruu6upZ +xYPTmBqub2l+k89CekursvVlS8DXSvHPkuc7OAuYxghXpVjNoJJtEIEW/fndZKhV +Gil8NTlrENvUL7ttQlB7Wy8i3OMyaAVYkMhEQSB23WadRF21sI4WhUFDWi+WAsJu +/ZMTzQW6e/qiKZkjREh+JkId0uaSXUv1aAu7K+w17Wu+cUFNudNy7ffo+n32KgEs +kFrdee8FoueA2Rgasfmt9Ux4+jmqVQQ/ybdxWARDmItVINQBIsQqlw/JnwvWUIB0 +b0kUVhwK3CVNDKkBNt7RbpynHslcTB6uRCet3/yuwhnIrR2dYmTit5C/xZInArwF +IMjQCkJTGY9DR+bZOYqdj55Ks2RqZCwLvCfbKeYJNM+NM3PivpLx4qfveO4cDOj3 ++baR+3zyAHn0gWFlKQhYexu6qJIwSOgWkaNWIHxNiDdQgCBURrarw5WXR/Gw3nCk +2rIFOOI2Xf/UWRRq+1EEnnyp4kabYTXhqJH4vrn1jId1jHzvxyjxfmfdnsaQzjUv +xLDWEGUJx6BiqM4cF8c+IVNID7qWYPkeFQEHk3hXVhQIL5IBxQIR+gIw4baV0OM9 +6xy7GM7cWkY8K3FyiQIcBBABCgAGBQJY0OsLAAoJEP1xAF+XmpJtTksP/2RFe/1w +i81UT4sxYt7mKQPKukcNyTGhW2WdyYcC7zWpRf8rO5jF1O8mMTPax0vWfZwZYJ/s +MMYA11nQ37PJ/9Q8wpuuRW6JHXp6uHk09ESqtolms23Nni9KaILN+DZfiys9xHLL +fT7Yvu30XYnuIeVOz62lbCxzHf4dfSbLLK1SFSUVaLw1IlUokuYJuXcTSFOcS9cD +/IKDEEfU6mDWk7+NXkcjtjEqVoj+tWHsx3xDfPCMYTqUIZjn9joYgoO46jQ2GoOD +hQx49DG2+XSlbVvf9BJim1KROOwDzOllE2wS/qhLHPjfvnH4x2s8pYYDFbLDLgrC +KMiMQjnQYR9C2VdVXDpaBj5TQGe744Tc8X0li8gYBexdhx6+LdtCZjBlP4F+W4UF +7SsBrOigKkSbcAT6WGCCbGTix+Dwyx/E0qOMeW/MFcCR/+6ROR/qNCzF3kVKRwi7 +rQ1MnUEYUrwLexsYTeTfcikbM8Lhq/VcgkIVsMFMLF1dXOfNd4RVgobf+Nev8tF6 +3uFrEZkFDJL+5PZ8TNdqLUczus283ZQ4KJKYLUG6mdUFiZ5LHbwfj+jsYjlnyRpb +ktAaUl03fyAhlm4e4GkZstozdZpSbhn4iITUyOtuxB6aLm+qRaofPJk0qR8pIfjW +hzg2HnYIMFvDI6cmF4JaoN2lFrc4xtOH+AexiQIcBBABCgAGBQJY0QC6AAoJEOGO +OevrgZ2ycdsP/24bA/Vlkyv1eIl6BYCIVP81wxXO9ToMPe7JEuuCAZUVnjxMX7PJ +rw3nZWdRscA0GAGACyYb8Ngbdqe+cw6nwdffc385I6lVfIO3WtSu3OSV5TetD6lV +h/CTcLx8rdNespRmY22HgPwVtIFGK1+cLUHuGhHVMVWx9GZiTBL4O+a1xEgEt7gc +5Dp6DgFndxm1Xce0ipX7F6iI6PIN3qMSBX8ZZ0OFusdu/kAp8xkD/lNXgoNCLy42 +jIdNlpZ/g23Y3mdV2Sv0kIYYCFXlzAuc+z4WxOypQXajxG6x86KWDh4yEcEZCxVq +mXB/Ip7sdYZVb89RWcx1gc9eB5K/LdakaRM3g6LT6hDhU/I9y1SaSyL8jGTDT6RQ +WOArGKKh0uZCTRQhy9ODX2R7fGWK7liEHrRx2hEiVNDIRWNZsegoGrJBofyTGmby +L6ZjWwjHqBzhxsDVclS3RFwBIrxXmDqU9Gov9IQlBwHtvPgbEyj31wgAwtN5XWGT +2u/DXPU1KXgAJ8Dp5I2JeIkw5+AXMJIleV4LhISKla12P6u6AonPezeB9EgRuA3R +zy4QVhICbPPRq4Dt6olLinwl4XMg00560xLB9pKks4VUsGXdRz43xUCzzkv1BpII +fFY1Yw1BU0kuy27Q7bJipBnnBjobluGbGe8D1nYqn2IJfPkK2yMRNmdNiQIcBBMB +CgAGBQJY0QvAAAoJECXpVpUYDwHawDQQAJ+7AJPbuvEDTvYuXBSURr8tu9YZkBvG +4LwGeWLvZqhXYfzA+rnhh7qF1UMa0dANH11vpM6Vea9gOkJWuGI2rsy3NfthUkb5 +xBs65JdR1RaAcTDnS4f/YsgT3l3ymCXDgAB50JGFkMmUCBnpsziyz1rOltQyu9WU +/9Pl7ZXOB29DHCcPR1VVPA4GuaNzduDHwJZPqTOAIsupMqlM0X/20nK5EuZ2xUkr +8qzOc6pleOYbeUEOi0VJOZ79iV4Kw7GohBnIgl3v/vqGUIGNOSshM66vu0N1pnDN +uU4hpz0B9dx7wtxi/YgIgkCxB8R+jvr06EiLNkYQE7V868E3Q0FCmhWqX1OKTIDi +o6A6tdb+yVLCZI4JeWFSb5fPwdehQeYOCcY4J3+XUIL2oyKi5MEwQvD/MCHJMKV/ +3+6rSUGxDgqdBk5czenye9aXgSzL62FPFIZUo3XbeuWHMdgqbttdzdcjlvrC1B1R +TTZIpuwfqiqda9PUWZ8mE0dO5hTFYs7QXLbsmvBwVhCr+6j+GFuRtoK/DHy7lGCg +jBJ5lTBKuFXRG6pnQTx+9soc2PkmZ95W9ABjp6WjKWpnOmEhEsS8Z8ZTNyeq6i9P +CgnbDbJ9YCAqvzqZS3hVPyYEZ77JJ+roCM2ZcxrFsSY/7YDCGWkozU82xBmLQRKg +NnVJm0GaEzKHiQIcBBMBCgAGBQJY0oulAAoJEKrlTh++YQ8/sb8P/jsv/QgdkgPA +Y5FVJTCOtqSxar3dd97cjXvTNbcPL93CTKZeP2bLaY5evrgDAuCta0fIw2hDEkJb +rMiHik75PN8hWNrde8bquF1f7IP2aPeIbN7gSZi1xZ10wLOn6I+YWJSiKYcOHkpF +PaOWN4iWi57frUV+eMdU5C78pUfi7AbWdA+NK5g1DWOIip61dzsabNjehWT1UmO9 +w/odeIAg+kxlkeedYWHbHQ53KMsMBREu2tHiqsLCCQs7gcst4oxUbP4RhABCIZMz +L7HXT1bHc7NrXVN49oT0eWneqyyKF1dAKpbUriZ9xts9JoME6N1N6a+cm/J5mIBp +dpMpEz06gFw5xopjAwkO6WJ1P4o2eEGWb1ikKfAGjxCCNkJ6/fHHlwHj2lCJPUVj +6feczwVlZiplWxqbBpGP7SMBvkeI5RXTNlK9VaDvj+I/9YGFLKAylp0wLGw3V9E7 +pWmJh9KoWYNMLkCpeoRyVDiMEwxZgIk9AmZ743FzQlw2UqPYHIuYa/HpOb5MEn4K +V9PmZpGb/otVkqHwQio6XBEDWBiNzt0V7Kvz5+cHkH9zPkAA1FhzwbX6s8LSoRIz +n4L8w+G+PWSIW314RFxqyPzkq1g31sMlwxC/6HjDyAx8Db5DIIS2TR5dWI3R9MAc +i9CkFnUJQ4uiAKcE6G/AsGZtMcr9suKGiQIwBBMBCgAaBQJY0SOhAwUDeA+GPFte +Pl0rW0AuXTI+JAAACgkQ/XEAX5eakm2K0g/9H1UkGJzC2qNc9a/8x8kD3E9aRJoo +3exzryyLobqSkI+8tHEyWnVzCWaZkTnwcQ902NBr9cNJR/ETmyI6n/D0ta8YR0jL +ZyCOJIrr7bU1CcHK+wKjufthkBBfnvfl8DXODy3lQz9qz4uoucdR9gl8ezVVPZ56 +2VYKJkDXU2pt4YTy9yTGAT3ByvpcRekdeEy1U0nAMT/H2MkaN2jdzkXQXXU/MEZO +8psKlxl7JBQljdDVvA4iC9m4g73CP3E4KFhB28vIij18b9upajByLrksa3yrJsEA +0h+KMwBpQYX19pDyW6cRuL8gkl77X9vhNHiyJsddNFe27QmyoIcUM6gTxv3HjNbv +IhsYw7x5VPcVonYe6lHtccmW9ssCgQevmQUUG4T1k9F0nvNMIk+DRsZlw4ByE0gf +HkcyWgncbVGVKBKp+EXUjaxoHiLlviaJ4vw0HavlwYtZEqZiCKpnC8L49l8qUKO3 +p0G47Ps2GsoLWmdt6e31jEcR92Fia7d6UBmpqC4hMgC9yget+YiWlr/PIkcfHZtu +o/1mNg9Vn2NA7YnlpAVxcdK35ikd7UurdfAmsIGDcoIwwtUWny3a+2sYDxrRBz47 +l8IDEwGtkPAMQ5RlGYI+fIN1FNyTRJdpYDQQCCir3LVeiQ+fmQieSqbXwJgxhVcZ +fZUPr3iPs9tZ3vWJAiIEEwEKAAwFAli1MRcFgweGH4AACgkQz/YjtHAvYX2nxQ/+ +IuT/5Zei4Hv40nOmkburp+t1ee1iUymuPnyyErmtY7nF4+QIzZLusXR5vv47uDHT +UZ4+dKoqRrq/HTyYm/Em4mdEa7CLyrA7dNZpJ6OxlWIYD2QAxbdHIsTaC7X88OWF +xwU/iOgJ6e6DO6D7y4AndIGu2Kz6MrLJ65NWpXPSnwudv8MQZ3ZzsSd932/AAtTe +4jEzhIEjNRCUWjMBcLerlubhF4dtfA2JS4U5wsaeW0lH4bIW5LBlx7LI5S3RHuCW +y2FkPYUx5tc1WIXUruJA1MQLCGfe30x0/YCoiwQ6q944CAi3Fb8vVu1yAjLHMsPw +uhta7rfc0I70ztAmLk2QofZ5b20IgB58uUgSaCHBpNYK9vHSyH4RwKBXTtUIJw7X +DxwTIt8X9vuQQD5lcbakCzIyEk5owG6IdqFfGKx3wvz/YoECYIUObkecw0CvMSJh +9UNdkqH/D4A76NpJEC8vso4D0ctDAhnlvhXRvM/ilU6Fr6o3t3Y+U/lbFJG811Km +t3wjvtJgMEtnmZ9DhEOVgUgIZwQMY5VSCbGeAuKMCQGfPUxFzXiGDI9tJU3yUF96 +5vh3oVvytqRU14q9XpPgc6a7EuqvHhZzflShWoiDTzRne83JBcxCFTAg4juAW7vf +C5J/+CPj+KTIaBPkIINsDTWOOTI//3YpnLJpLuI1UNOJAhwEEAEKAAYFAllwe1sA +CgkQ9nldQ8fpKQkvtw//SK0hPgSdVum+0BeQl9OttlFwVY+uKwDYf7lumueIaxcd +kv2OH3oZ2z1Liv390jiMwuCUOxE2JQ5oxBF+LsRyZPUv8URmgFBudW58NKVeQid7 +A6iZDgUcm9oN36vFYsU7mF9HhHCqCy4q77SW6BUu+/e5OIp+ZuSdkvp5L8BSz/F8 +gjzSaAdUK/uHVgFeFOVtYu8ZR3FG1w4b92iCeE09JixrsflT4WOT2J5MLyOjVWSs +eKe/cfVdQDOYIJLIfExbOaTmoKhmHPw/t8Qr/SAr7bgTkbpPlBmFKSoVoN9m8eY2 +KLhfwCDDSuPWO4lOGEUDMO1iUJoj+6A9xij0H4y97G9ukytH6+WcShHDthYLM4ly +S+a7uPayxIGo5MWrHj+SfEPjD9dkQALv/e7JX9vAw73Mk/DI5MJeiH6dJqOTDw6I +t45w2m1vOGr5G8UuiHnPLSNa42HyYQkciaYi76n3Il7aiAcSZpckpPh5WiFugF++ +Y7pU0YCFrKfqVSqu6amnfOVZBEg9c8Pr0+A6wSQE6eoS3BWb17mN8z7e2NXSITMh +zvPt3SMQbTp4POf2b7Tm9ILqOHqrzz/3FSxGgW32se7rb34zmwGwb7ewRM8w4wr8 +8kPEHC/k/2jf6+LXHvoFrazgGZ1LQjJY4s61vb7U963oZfRizgw5DrQlInM82jKJ +AhwEEAEKAAYFAllxrFAACgkQ9nldQ8fpKQmLgRAAhmsKQf8/I3XhQiAp1P8tCxdQ +oM+HVsbqTh5se9vGARfIpS9fKjVJfSIR34d1EAtnqpOsNYKSw2M5Fjc3vVY74+u9 +lR8W2UOzpul0P4aIubJUrE5oYrdivOSEioXrLRAAl9Bpx7CvEP2VJjxNU2c3I3Wo +h0GUbPgWhRKSLt2RUjuE8CpW6HbN4nOP6ta9IujtZoB98wvwdpNWM+40r9zap1Pa +00V/JlcPJGJXMeHtF0Gjf+pwrMZn9x7dP/Yljn/nmy2re5KecdmBHVc8chzONOqU +7buaMdpIzUzFdZ/NC+bC7csYpWrB8h6X3ddM0qCO2ywGSLs08NknuibKJL/j2ARG +nc6KKkQRyo/lx/1gaVOvSr81WaDiKPbRjPd5P9SAkwGacX0NHx6U1GFi4qtD0GVm ++0X5fGV952w4hxpCghelv21U/b9GITuspXQT3yVbl1WJOkZ74uiVuAj1f5ysiiW8 +5OCAV8hDQs8TMKdu7c/qMFVmI7qo0nxJFVH3WHlRH4P2UW6wC+uyPz/imU1cPaGQ +lezH8t9g/j8YWiWtzNZDwEYt1wGqJw5nTQ+XyBpbN0DGs7V2UyK8oZO5+gLctv9H +fyIiSzdjfi0p3gsMzxp0cr6t0gb0tpkehPBSyuA86ulPHFguGfaDB+AXR5lUdCvb +r3JwWBr+QaDMcp6EuU20EWtleWJhc2UuaW8vZnJlbmNriQJUBBMBCgA+AhsDAh4B +AheABQsJCAcDBRUKCQgLBRYCAwEAFiEEcxxg1oDm6FDzHC6IqzOtrOcQGVIFAmB7 +J5YFCQwvK6gACgkQqzOtrOcQGVK+bRAAn4i9FLvSAXuoDkPzXFnVvkxkldZ2ptbh +FtZIUAVMFGlreXoQXrRkzQ57kGCGryY+cL+nOwWYpsvfy8ydt+t9WauG2NCRsfHp +u3kkXCw3t7sftASzhlzocNP0NBexf1nslW43gc1TYQv7qytg26yxw40SF3To9y0G +N9kLjrXXBBfnQBTVvJ/ba59Rb3/RpK+Cz0qzXldtpvIOgu3nevyeKR1Hn3CKdeme +K7AwaiFErVRjgQZyaxl8CdDdvXhOUG7y1Kw7jd+NPo5hnWPawq/5FzWOBm8KQbqD +zZ2LxMVemox5pBjNRcOhlOpsFTLFKPjhOHZ9R0A+G67lih1WVucHPrG5q6mwdBrT +9yBG55AraN6rl7YypoOAvHU7hTMMCfVZNQtd0fw362O6o9SfdKZvHiTHCYBhX3pX +apM7EcRjQu2Vw72Ws6Necu5yp7XdPW1nmS07b52ty0Yp42ekNBdVV75w1dhjWrSg +ZUV6DGSPQayKcqnMYZ0QsgVeBHhMTX3AynVZo6MdRBtoIWwanN8a3uRJ8SY4DFjC +KVMcw+ijgIjYVNLS+MT0Vkco94oAN00njcXBB1jQSCTJrCKuavnrlvRCmabMgvpm ++P2eR2C6pUUA6PDdH0CMBCCm1sDnAqnunC1QWB4inxV/bW3MiZpxK2DPXaRZvnWZ +/uLiaeY0i9CJAhwEEAECAAYFAlg9gDIACgkQTn5Zwb48Hlix3Q/+LPyAgQb9dhBS +E8L87fBPrLQNW/4bPib6WwscAcmKpw83Y+6NX1QZEiIUOy/rvY6D+qDHkS1hXHYT +8tMeyLx5H8cDtiFZhsapGhFo3MOR7J9Eh0x//czhWcv/iK/zTG/74PfP5vPWdJOF +gqGcfMbuGclka8h1+b4kZc/+crbE/rracAvzMDYNuaeV9/oeTeiDQ2jeCOgQnOPa +p4KCu228LCHEyzSHhvsUQMeFMsm9LICaQ+iAXnD1kBJN/70xsAZLSF8Mj7WZLGS4 +kmm8XCGgRp3Z0Gz0FTI72VYnUS/aXK0B93XxyOoVw/fRjMUDi6tuPKPV5dN9pSNo +DXsnA6ddJ+NzZzvWJTb7YDTl3iakW2sxewrIpN17xrvSyYyLOtWKXB6dPuEvpkMj +LChJ9uNI3xv457Sv+wmKmC+UWnSALmMm1Mq9mWT8d530nt0DmBvOjDKTitzTxhiu +esORBNsaTEvhrGAPADAlwfHoJSQEEdnhhA/UvEVz1psz7DASrlwnxROoqGVw5KPl +7oeSUNCGO0RCYIJvbMwyOU6qy3O/PpNlLMZj7LPVFnpPGqqfA3ETK8pN0GjOw52K +62nEk1oA/zO/COedDTjWVO+rLvALReEt649qbGEPFo/SJCRa1cfepomPTh7gTb1l +KYgxcb+GX/W1GjTJyBlztR6gEQsbFGSJAj0EEwEKACcFAlgUpdgCGwMFCQPCgtsF +CwkIBwMFFQoJCAsFFgIDAQACHgECF4AACgkQqzOtrOcQGVJ2ARAAhKseZMVPen/0 +blaP4cevEdoVIsLNHgbs/0bCUEj2N83IALTkNrN4XOQYX+5VenTD453CTtXglrT0 +bgquV7s9FRnCJPU1Xh1hck5nQrlh8VwP/fVpOMeBqyqytS2CVVcH60oJkiS+niS3 +pA4CxAkkcGUnY2MZYsW5jxSfV5QqV1S1i+qHjo7yVSVDyMWZJvm2BSBwklhF0aQM +64tysMJAcf6hcmBBtNfLBeqOf6S2E60EFW7CfXKxgbCdYLdNZz/3WlMZ3V7GSAdE +IoQ/8mM3nf54WB83QRDC2QO9bZsigJc8IuX4xO0o7YZaB1lw5YTXCriHPgz2khL4 +cGAGJeDnceNJyhZwUJt2mzB/eqYgvbbLHeFWDkk42ArbVtE9H9AbROtFMEub0u8a +qVR/uDMDiziAsJo3KWeK8C3TFRQSqwSKQu/XpD/4VYelfIV+EunmlMWkWcpBaGwM +iyO8/e9q5XyQBVFemfXXoXMFYmGPiTo39ajV4FNALbD/p9KnHVhDHafhx2bjjagA +j3rNAD/wG0q8H2niVEqsjxTOiWGJ9n0yhnO2+Rp2W+yaaHSiyarVwhfJ1GCTfBKD +fJF9SjLCwkHlqIbAJ+kRRoFYBtLcKW4N+tiIc3H26HH+vBjspMp2Ht4cKDLY14bL +q/GSzR1yUPQ8hIkKEfeBkPjItgSN97uJAj0EEwEKACcCGwMFCQPCgtsCHgECF4AF +AlhB99EFCwkIBwMFFQoJCAsFFgIDAQAACgkQqzOtrOcQGVKxRw/+KmDksqVijxpn +hagCGWbt4K0EpBzJdyEKdvmjOFR69TDMjaZX/l0How0r96b7gp8lD752+mumjKXF +H3wfD69MqkYA1og2K9zcEqup/DbiD7CAdAP+6z4R1vIdVDOAT9C05rDfSDVcIvcT +TS/sYBK4NLdlpnPSSxwXPOim/4V+LVV3hc9Eeq1mQvz57ReyVOfbJnd4fFHxTXi6 +cI9naANhr5oJhmpT+c9pQL5qReVjLABOSPDbwD07gfgf0EtWmZp6xcNEdzpugrt3 +Rz+3W2VaCALn5qkYrjj2YC+PtILJOWkvlV13N8y5hu+LyktE/1RSCTuf/dDa//mP +wg2DTT8Rp2cozmt4rEWDenFeQy/+M00UEGCalmAXo4MXnrQjunsQ3cTsyF3CgnIZ +unywXFioH2b7pNtuNm8XXYCQMSZoQG0kIlYYLpUt9ZRnJqUar71fKmzbVmSlu9tk +2zrF1Cia6BoX5hUNxcRg1SOg+ayU0z7aW0Y46wkj/+UxB6f19XknSAMZxRCONLYW +Wuxm+V969RZ58BhTWbZ7vuey+s2Q8ZA5fcVmbcRbVI1DUDtJDv9574DAiol5WHyA +Brvx08jh3AXKI9NL6P7cRS9P2BZguWZspwnsLdc9r++t8KOBLU0LAB3OEr+HMFLo +Tuhfxgwnb3EeQooa110w4ZpLL2IgVYiJAiIEEwEIAAwFAliqrisFgweGH4AACgkQ +0qeNkFtb4z3/qA//YoJKNDhAwLghEykQjgU/RubUvV/aWwD2nBnvL928ecoo1uxV +EhRaubpPL3syLIjD/4xgUywYA1z961RH5Qe+SCSHm/Pxp3c0MOC8upv9dKX9cwSK +S3bA+acpiwigzbmH2F4SwsktNR9RJPrHNv8/7IjIGQUcrOh4xZplXOFvsHx62YFO +tJYOMshWhas+5VjsfRLraj34Hacw423tprxh5CFQmaXlZsRqrHMAZ1qHNlaJE7iC +ftDwBD75zbsM2dPLLWl7oNHssmKUXogzopqHJ23ex6XBUfATTdEVLM2jwFWoL2r9 +J2ZrRDZtKwuQ25rRfw0rfFUMLMSkkajwk60ujKDrgiiWmmJ02ZeTQGA2YdCjB7vb +4YKua1jzQS4EbOQeHYd5RRrasa0jWvRcxIAFzsYClAkHy+/E4ivhYaDw8XKUIBHi +S6n5AkjjSZlfQ/IpXaBLH17TT/GpmZ1peVgGDDEgKuFNp54lrWQDdg75cRP+j4U3 +qnjDAaW/LxK5ta0P9GmCE453EYmFNTYjgzldumifgBlzEaNpHeAS62uhc+TKU6my +tCtjWNP9XDtss4yDyL1Nea5Mppuef60I+2brk801L0/fB1VlcXMK4vYD3iYDG07F +8JeePwUuhivvoPoC+5ish/erzjNGSvqYFNM3fqNSs3svKqeUDSvUrzWSHtuJAhwE +EAEKAAYFAljPz+EACgkQOyDN0dwaMa2fMA/6AuZHVxuID185BBDEjUMKV2193SGz +8r0QpRQdXhOxEp7NPU2e7uck55r3YDOkMMeNR0e3argOAXpRS2uCRlh1FGWGwRSQ +qqU8TyE9xYfwae+9uOpuQHWN7DXC4NstOkaOQMlSgYPU1YLR7iqhMh0oEwpemKah +6a6J6go87sPRw2lPQeyjzn8Rbym9ctIBlKfDd1UYbxqySDfQvsPRaMb9d4BTd5tq +CoqqjCwVaddMiVlqy7SvAmSgSeDKSHAR2iu2LmtmYNHibH5M4OSSHhlmrptgOPhQ +Je+vdtSEFcoD0BNY+39RBCT92UnZZnTIRkUqViaQdNg0JdIaIfWAU3DcIqbkgE9H +ZDRBkpSQU+uDTRDPwWB1eooQIOLIhVixG20J1HT7PbhOV0RNSIqyRhHPvI+PxLLv +ehKQLyTiCYbDuMWT+C/D+4voF8op3Qy0wKGyif0BJM4TCgii6TersiygWwe9hyb4 +30KgwjH7sSkdAhhRjIAT71SUu28WxYsPVq4BTb6AHnZ7hW1nMeJ2ds+NhuGprb3z +MfldVTPw9n385HjJ/VxJZTFLAo9YvwnZ61kuQypMiw8Y4gCNVkaEsYU0Bga6S8nj +u9AOcQX6wxClqpGUi9CabDP6mlSnb7gan7TRPLx39rLsSqrEdtWKGrurnEDgGAPv +eeS7ON7z848wNH+JAhwEEAEKAAYFAljQ6wsACgkQ/XEAX5eakm3+ohAAkLAO4Nqb +BjIpxXYOpZU9hAwsYzfztntFJH28yAxXlnPRWehfmLLDVt55KeeXrhgYiYKo4EMx +WZRKErke8EpJ0DlQEiApRMqFHC9zoVRkKns8Jwkv8MlNOODuBxBbyfvr8zRqfQGx +de8VzEqxxMGNLCXnwx8ES6nSMDpvb9choYj5bZYIOjICS5iNs13DpVxBGZ24371P +NnsoWWybeGe68zWcjLHUwtCcxD10Ek2G0RJXqaajoTd6CiOzZUTJLNDuREs6QBYR +I/2Sg9M2Mpz01hs33Z9WEU/W2YroggNgewZfUbs4pnfyhAIlpSOuv0KW8UDac/iy +kR9crBg74MWQ+cw+n34ksc/GXfRH8S+8f1EgJPjPn3rWcl5RNSgIvXmP/lKgu7Vd +VwFrGonkJKXCsNtHq/FUN6HS8lyYowUSjFD+6KxcFaniqGvfotdsWFGnEwlrGjnT +WjtnupAOMZbg7u2odIOW6BFzrfLElC9brHSeq7VGADh86WqlY1f2t6/aqDRNT9gi +FELoIqmUnlcROcIrtZCAeseoYEXOE4nL8N+bSfFMRXlWO4iGGC6gUck1kTwu2oQn +QAQlfb9WekfLl2vGjXKg9xdalTSCtSmMYNJMCEd9njrh4RUi921Q/+XI9Ctv+U+V +dvUHvlLQyQJpIZ/to+iOGd0/oW5D5VpZy5CJAhwEEAEKAAYFAljRALoACgkQ4Y45 +6+uBnbK2NhAAiXGDgNF+bhHWF2w6RI1tlWsjBi9WhRTJ+vwSbKOekrMlfW40ZhFp +4ISZtalo4f98K1is4FyWIhoUzBghL54UO95cmm64J3h42z4LmKSvracaVSGjxmFo +/AsJ+mX5YwqcRiXynCdubzqERVYv+mjTJVVdz/LrvtMS1U1eoURxnIIfjUHZe2J/ +0lG6tYmViPZYqWG2rQ73X92hwts/eQQDEIYhTSteaZLzxcYxbsiE59taWWGofpGA +qJr7hs+goxxzubAgULsaqsFsa1bd7f92xX6ZEy8ZqIqVPmDvoej7coQQcKtp9kAX +Ldsi7KHc/wXavTGSXNH7stix+yzL1PWFJzazy/tS5h4n1toOGKflhyGTAF7FEayZ +4UWV7ubtDq4e9F0f0X0boXDvFZi/P/SnxEJ1ZbFSJfMfjoGHEBHC9n9mH0dxXGPK +N+6jPisCyeSwEfajNJiaW3CAXQG2+QzpPdVrTYB81/Ho7iC4Ak/ac9niYwHZTMy1 +P1bgle5BWYLnekS3Q/oEAZZ3rCMu9rRJPOh7bnfWP/2m2qEpCDfDJljv3oOq1Ndt +RKwJ7u6wNiz0OJS9PRSNBLux5vmzc2Qbd4YHy/JfF8a1XXcl1FEPRurNBlASDoid +xDsAzewfjKosTZjxYcQ9h/xJ3W2P1Pzh6PJDiVeGSFKcH9L8km/iGOiJAhwEEwEK +AAYFAljRC8AACgkQJelWlRgPAdopwhAAnBr3oRXe+92/2MFSovbb/Lp9T+7gSSN1 +U6JNHCV2QkcZ3/4n66nRAOlVf5z7WgSgkrzkikUOjk2QbNK06bSnnwpBVI2Zi/zh +u5v2jBiYJFRg0N0vACLWBqIknik4zKZCM0yWIb/SlNyJBF85CtLN7q7V/Jq05w2F +ioMFRgtrLh7uT9SX+anUz1RNEEGP1v5KWgoFoV/qS8JTXckh+/buWsyU7q8Jirug +KSLJg0frAZWvdAv0PXb4aKjUD5f9gJR5875vSVvc7DHrlERexArg43YzhAPSq4FU +01iuCZr0mjBXF0nA9I+LuLZEHibQtBEHFvTSi5jp27ZYR8Ss133n3YiFmEyWKM0h +WO6w/b4QAl3krmTordn8uZdBc2aT8twO1ZYgliOb2MTc44VIER9r6cYuKwJSvPsD +eN3JPVvEcBYg0BKwGPxpVaSvC7CBQZxQecXhwUnh91x5Is0bwV0W7n+RDQZ58kiA +YXnOzHvPPxfgTIK6EcYiclGua7ncIYjhiKFrpw3JiIFj7EFvNO8e0OdxYj0BvryD +PVKdNmwd6gLwpg7C9gI1sF2yinjJoF0ZHeh59slkUXtovYzftRrfWET6OzGQPjkk +WZaUJtcKQdW8NYTcfHMRs1NRY2qWm5RG11+a8AEwgaCwxr2OAUF0edo2r7nwQTcD +nP9vmrwoVDuJAhwEEwEKAAYFAljSi6UACgkQquVOH75hDz/dtQ/8DMYE8GHAjI8r +8uLh4HVsHuScak5JJ2VaWcjLGu5RkUyHJInUk+9mUcryToInU/qkVEb8OscPcNpj +X6aqt80xqEQOh3q1nEKtfLpB6lsxgO94Pz9AKykw1mB36Eqf3SYft/7RLBjqjXuJ +LJlbtScsiEwtQfOvHdEb85cL9cQ9E1Ka+NBqt07zw0wZ4C1F2eEq1CJlyGc7uqu1 +OT0O4GFktLoII6KIjX4it5hJ1VtP5+VYMtDU5iRBjjwqVqlvg8+KFLTpE/Hqv7m2 +OUh0NnoUhTYsfr/XYepsLkqdefE77DamVUjx4uvtEEXqxUyEjrS5JkGYzbalYfH9 +SdeDFBu4EOJHwc7IGtK8RDY9DkRM0xZq7NXgeJ4QpO/zYPLS7g2fm4JRIaQxT0J/ +m+McdaGsCROOM+84z27f7QX3gguGZMRyUwBSQ9OhEWMCDDMjRZv615oGBrF3CRrk +XOK6MapOTM0eudqh8YcxwOOQG2UfNrOe/RCSmqeylJYBUNctEB4oJEoSA1lnpJM+ +J/wGD9vRPW2hLfin1jxcV7Fp27NqWqqfLW+GcxJPckZGC0wahOv0d6SU5Sms8HYh +bbz+0vEIPHKYYQEzH5ujahij9D/+mLWz16xPpKLHnkODv8R93WQBZWcSPFvBbltP +UmIO4ZiTOe9qYm0iwF4iz/4jhFziEPCJAjAEEwEKABoFAljRI6EDBQN4D4Y8W14+ +XStbQC5dMj4kAAAKCRD9cQBfl5qSbVKoEACI3Zm1arJg/+6vnNIB6s+yIgSNeUdA ++CHoyLiUccZfl3k0CCVl9oqTW4v0xYnMC6wN2DynLCqu44fJPr8T1JCw/Oii6KjB +OKX4/ImRGTDOhnusAunmQ99h+wwJnfH0HcvGItc0K1eqrj3VWnNPIfD4NC5NaC/U +Ge+mYQ6bkuWgE3CcvkpKGoA0986+6j5+KglHB9KWJRvZ7corxesSEg3JUb0hBIEa +UKQfoP9N6HmKbcum9phVWl7Qt4h7NdjhGrge20NcXnRDpHYu4CD9k/Tc+1qUXyCU +eJMx1LN3/5m020InGu+RK5nlcfKgfGPgYv8dMjRJFT8U4ajYwGjSwz2dzXHPJxOf +vfmT6yc8JMQw0H22zaIJCL/Ezk41Uyx3/5xKR+Iq8prIOuTFyHJTJdLAaBGu5JWc ++b728alJGSKCYQHK63GRdEYFvAyjJG92448x4SLeBomMD+W35uiQtTQ4ZrRewJR2 +7cQrwf4YoY0osGWFaIqL0nnn6HwZhTWkZhUmJX07tCZzmgNXXqQute1hRNwFJob3 +8KtHViPj+z7u2ytPrHEMH21nJ/oPOeB5dzHy5TwRCdLuSnX73+v7nKd1gh68PgWo +56wW74Gwr5+EN3GRkD2XHpZuCd3N49SHb4Aze6pc4aDtQjSDMWzetIUUZ300HyV5 +6EezNAJcXQV1xokCIgQTAQoADAUCWLUxFwWDB4YfgAAKCRDP9iO0cC9hfe22D/40 +ma2+sbo87H//lsuSLJ2nefcKh2azDVs/s/SWg4UGOC0tbYABArOCNAWiJReRsdD5 +8ghReurm79Ad7WNT4DiAQ/8liSWK0d+3B6lHKKmyjQC/fAOzZSYXkozqH+dPz8Ei +QXn/WFLXks4r34+AfIIgbHCBkWnVwixMkigFyvOJLu62SD8kACN3p48/AEbvNpFG +mVYQKi4wfXiV67KXY4uJ093gheWv/R5JhXoCecV2+cAeo+98re8Z3dLsO37Q0e7p +ay0mZKj7r5YTjBvrTdWJwMKgbBg7ejGHdnUPzZyZjeejl4kmcHESSSn58fMLuAGf +MWut1gI/9wMQaJ5RIHaxhXcesvhBv1rVngTCgBI6GiqxaOnfe1QC1hCNU5Y1xlcJ +VNvWpuaOBhUQ5+lZC+LJoUzJLv/GjRBteW55PBHxKZdDX/F6NlqR2JvPn1Lk/PAQ +YBn9gjYxRW3t0huJTcmGeOvy4NoBf48er8+SzPCp4m0rhO/sxC/tqzNJX/cVrJpI +JgbU8q3dbrC4VrFk1g/RhlwAW825wn1yFgVGfcrcmJRmFvsBLQH8xswb8XqVr+GV +cehZaqJniMqgKbavE5/TkBI4L8AmB2UIfGSl8yaYt/GYp/Am5wbHdgeEkyUnda1H +NnyJAmecFCtfEL+xyIgv4Nlvsm0wGqUjfuwrdvl8PIkCHAQQAQoABgUCWXB7WwAK +CRD2eV1Dx+kpCch+D/9WZ9qc0EVoEsYA/EOFOrA6QQ1aVQcs56FhxxuvV69XunQl +6jWo9Qf5hHi7zNejidV0ZUcEYlMAhmM29cUylqhd5zRKDCrIXydbSjQiRciUi0aW +UgymFugd8kkqeZtToyoQ1lipCWweVOfMad3guewe1EkLywWyHwt80YE90x0K67kC +eKr4uXCkdDWGA1oqld5XT61v4x+INtjFx/PYmU1q2wH2aFVRJAGmNDtPwhhKFI+c +Ci2aLs5aJfz3DO9a9fIx1M5JtkTuRqAZpl5iY0SeXdfjOQ050jr6V3jzQVoQprt/ +tP1bPX0/7WkqUzqnP8QXECWYODD86/YPbjcTBfFK0cGTbdFzCxzvD63nYnTzznNt +Jw6alrNxCJOamTqWhd4YBLrei6y06oO1NboNd1Riy3IENALMQFnDoMtV9tW6cv3/ +xeDT4244+yhbWrFHzT3gRULaIvBUQ6CP2RS9IU8dFlvwmvx/nndIv0DwdjUV8rJ0 +1wEaKjZZOSH82A6O5OWX0tx+1EGGd6xm7OugGWejtM2i1QBixSo7rLg0uzJqXt8X +xEGCA359B4m3Ko9jPxE8S4l3tUVMedV42X2hd7Cl2FrDIpjqG8FWsfb+hANjjKW9 +zZSMET3viF9Brlxf7yNlKFQ60tZf7finGHSAinsCICzfK1fyT42YgYBnNkIYDokC +HAQQAQoABgUCWXGsUAAKCRD2eV1Dx+kpCanvD/9fRGHu24Orc7vYv9xk6AjochRR +ia9q36SRIsoZRqDnfehXfjAFoudvJ/Tk3mJh4KT3K26pbFWE2mxoplM4y4YBpvvB +M5mTOMSdtluM4AW4q3HPlidM9ggI1d0GzO78A5I+4zbEwCLKq2CaB0Js3JfZkSVH +zfAs6gRvmUxAdfpT/9+mnxt4MRJYV6BUlirYcsnZAyo4GUjE5Qf1Vcv/Ji43hr/G +5H9HUels/Hb3aJzS0gJfuHC5gDIJdgELE0ww5qt7RglLEZpUVtOKE099g+DhNvxB +0KKGIXf090t9u7LfghGls6+QtxxQtGbJ+GVAvtL8IiChGNU6FrBycpbAXUQmSh7Q +cotuUEmmZ2vGDblWiA5tKyoRVIC5sZpFmVX+brMdK3PKS7pJAwKgUdG9h+NCyG9j +cvS7/LZgBxLnMc76zG0uC9TpDabXN8FOCy3wDTdARgihfSyK8Zjrqr/worU7GtFe +JYKIWgmsMpvVvch8J3vCkyy2Lr4IfZjndM5hn2RevsFx5+/bNUa92TNPHlczQjfE +X2mIvZ9o2cHAT9XAkfPG+w5mSMsajbIxLw5M9tXXCSwY5uIr7CVlxXLJZA3hbkRn +mnlarJ55XxkOeZ1emvB3i8Sst0H/kIAQ3wfK4lRM5Zeeu76OKcDt7WOvBEEQNfP4 +1uUB8E2JHdpNPsEW9LQ8RnJhbmNrIE5pamhvZiAoRGVhbGVyZGlyZWN0KSA8ZnJh +bmNrLm5pamhvZkBkZWFsZXJkaXJlY3Qubmw+iQJUBBMBCgA+AhsDAh4BAheABQsJ +CAcDBRUKCQgLBRYCAwEAFiEEcxxg1oDm6FDzHC6IqzOtrOcQGVIFAmB7J5YFCQwv +K6gACgkQqzOtrOcQGVI+pBAAzo/SXgru6PxyR60Lw5Cwqv11r7cfz638IQrrOs/V +dQFaiXni41UvSmLA4AmkjLpzHMPJtLScflUctJIURneWFULaOSQJnsD16Pd8PsUN +EKQFt9+z+R+t9E2IMdVh1Ez+QFhu1nUeCNkJxRfEck+82bIRpy9TxzCerhBQxMKL ++x8e4bIkF81f1xxtamj0/cLRfWX20PY2CFWlVAADHwjOvIq+x+PZTS8gqUJhs2sA +y/nIpCCHwLZPvlfkScCmzGefHO668iQ91rAEGLpHOM1EIiGS6EzWVqMlJ8RxTgtU +opSSczADoBViS3TMOWb2goCKuKCDII++4GDkkXCwdprsaEygprcjGTDtve7opYj9 +k3TNgv8XHxzkpMbFxX1uhLwc0wMtPek4rx6ECDqNMHHXCWdQNz3f0JPSLF4sqmxD +ofWCHmBYPaq6vTaZq9h8DH3QirV8b3E9wHP1iVkwcVEkWF/rUe6Ili8in2HdkAjb +XKeZd+IGoed+q5XwMJ2Z5LFx9GkvzUvzZ5IjY+X+EZ/qsiVtxqMqi7nE+j0cV+Mf +EWPz4IwZT6tMs5eTGmm14Rus42r9aNw3IyzYKSUa+xq6JJrPAYYR63lq2Z92u5oa +aWQsCvFWJLgP3/fEseGBjM9qGQJi1YGYC4Vo9h7V3Dv+9F5dY1o4iZ0kWmzazSp7 +ATWJAhwEEAECAAYFAlg9gDIACgkQTn5Zwb48HljZEQ//Xs+auwdxA7WkJy77r678 +B9Z0Fo3tA62cGcJnlOZ3g++cdPEi5dlBDdu01yFtaK4Yql3TXCQFDhcw6EUHQEyW +Na0oXUtccSNJluwjMhXv/flDObtWhAsW22AoPtMEnQci0yh8gvg/zq4quZQGbRS9 +86P0ZxWR1ublDG3Wtqo+i0/uhHvfy4KMR4dJmK4QPReZoh5lj8PXwEjmrqOrn2in +7tAkGtzhr/snqBdozMW6dx1/mDFM0So7fx7dxl0mjDXC2/9kIKfp0kZVk/VwYPYJ +JWzFUWG2zSH/XU0vhAjn/S0CDmlfcroAGU03IjIUoVW19V2b57orD80TwyStMyyw +JzoJn919thS6CcS1XJhVMjbZMw5TugQQBpnLiOXo/plk96xePv8PZAwYrKAtPLaw +I7rsbIINtmjCVCHq+K3QBohwpa5RWR3J1E2JgIdgofIGFQyIomFr9SF5vlrWjWIb +Bwk2Q6MJG61EzbtUIm5JZ6v2UV75bGvfxL+Osgx28IyT1B5EFv2MRwOFapBXJ1FD +AORXoYd2fv+/H5ss+WpL02+FDEwdEKakn/hXEDzLQLKOT4ABV6/OF7hPHMaXHho+ +8zBqSjbdhlK5MhO8AC633zg7Oqy2/VmDuXiObCQgWS9K+VcIGyh8s+O/4wxl2cRA +pFaf0tb1oN9VC/r+dOD4a6iJAj0EEwEKACcFAlg9ahICGwMFCQPCgtsFCwkIBwMF +FQoJCAsFFgIDAQACHgECF4AACgkQqzOtrOcQGVIWPg//TsC5+gAgKxjHFiBiBaVV +SU5tBmLdq9M5RshtdBbbeVTSyYaXlG2Er9sY+jLlOqFFMOVd/bPmKAC1y2EFM0LH +J0VPbz0c8gpbKLf+6CJ8/FSZXTotW96L3gcN/6IB6oXNeESHspcDxsQAG+MAE1De +w1n6dE/wG6P+7AE38OyC2PCjKMMJYeGKKWeDgydXxwwfvL6yl5mdCKbPP1wPYZKy +FUKvRopqpgvhjneoql7YP3TELWyqqkFIMHFOsCj4Y8Emcwcn4NqlGba2N97EMIFC +QY/jSkkBp2iucSd+dwwEloy7rgx9R/mA781xn8YMHsMjtQ6xcV0lhlV4fKGkOWIt +0ktZWhQSRsYFkKik370QPGiOrU9gRdiH7NE7PmtLJfSwN+k9si73rMWBkxlAkSDA +lGI1dd03nC0TlKmqZjplcuUNNKc0P2BUlohH/0CmQrBvUHRB+WIpQ/U26/OVlB2v +AdW8K0SlAYi5mv8fZMS3iXQX+lBHZdWS42I45l3ApjvZ4YGyVT54EDvnJIt7LZZe +bdMx8+VZbDlpGok1rVqgv3jmxEZjToQMtW32LoctEHOIhXuA7TlTi/k5CFV6cFJl +YcXuam4DVyfqPnb+YcmlIK8tuP0adezvt3di0y3GbqITgFxYpbU51B0GvRd8w1HB +l5DnQ419E12maUGoiyD/01uJAj0EEwEKACcCGwMFCQPCgtsCHgECF4AFAlhB99EF +CwkIBwMFFQoJCAsFFgIDAQAACgkQqzOtrOcQGVLfwQ/+NEnVELujyRvDAghEN97D +S+580gE2DzeKJ8wdK1muGSUvRRbFhoyAhg+eviQOrZFH8OPKSJKpX7/3gxunDU4k +FME/biR328cVZ856RFTtagbunF+cHqRsLR8xOxlI/vDbS69QCfxsfuZH9D6uj74E +oUJdawluqv8tvrIVAAmW68B8qINXwTKaDSmcSPgiggDUhSzcAPz41ops+XKEqLXJ +ymUDalUUo7Bu6rjdSvi5cvo8Ogy8EiveBKQq1ECJUdGw+xHx5zXGZokJYRoXcTSm +2A7gV55+Xpex1Fg6sjD1yQ/2qH1nxjpmAvZsmPkysV1uNEADuMDBuK0O7ug9Tik8 +XvJfxiIX7yYUK2D1MDcj3m7ObtpTG/uiAjehpBNKcppeSEZdA5cJvxF4KXfWYwxv +Aef6z7TzJ2Ke0yWLtVMNhv0NE5c0MTs5ps3EXuIvp1rMa+l/INbBqnNb7YTH8Q9Y +aN+gJMOcVLf/cV+dy5RzBeoAUWfUyWCPbL709Lq7u/MopwSjcckNTvLapUGuGIDo +WfH566YYdA+fQXEYzRtiPYd39/ZHfsRtW69l5BQcMvbRAsFYs8uyTxaHddb5ijTM +zqMlKH0hNGPAeSI4xoLIMzFMc/SrdNRvpoXeJrrwurpAGYidxfYJMJqUHFgquBs9 +3tl+sZrXeEWekFc/xW+gLQ+JAiIEEwEIAAwFAliqrisFgweGH4AACgkQ0qeNkFtb +4z35sg//WBXHg430Wrb2TuKs9er/LAX3N5t5S8EcVFkqsGdFtCtdHA6Pknper4cr +zPnkGvd/qF2DUr7Mt7SUY/rfYL0bpP9SPG/PK0xMcCkHfDxmNhx1ETM13jZLZSiF +cSwB1dLdQfhuw6KMU8gBqzG2MDIkhVLlGBNx3g2BDpwN8NJHMrbCmFWHwxu9WIye +nQ02NbNlZMunKrdxv+jWdfidVaR3LcyJvRcHNKxY5vXgR33IW0kSx+HKREgkA6JU +z83C94yQsQABDKNsQb3oKSZblhL6xuMTA1X/Q2JlBmDsbr8Sr93M++7i++21W0De +hu1pNPd55vJoY78oHZIwTd32Lk8/j5nMe/n1T/MtqWILzmrmxsrOV2Jo5FOMpQCa +g2qz2H6f0iIEzXwB/z/m0KbfTrmxGR+RVcyLNbdEsPkwNIUqN/iD5cEXFjRH9cXa +oyEt0+rELj9pObx4xFe5AzB8dnu2O97vdIBXaLHMJ5BvHfXbinJVZqoQITQPdO52 +9J8xxs+WpWB1hTusVPemX6tp4neUUYNSXnAKOwXr9KNCpeVjukMeZKDlIdDEtelv +t1i9IsALe6NWCg7Dp694sPHr23RcdLpECEYdSCYWbnnkkjtq7tvk2IM9dm82iGX5 +vm2PABU7SYacRDawohYCkNLSZ6yOMXAnzERHcb9M56LNvYths0WJAhwEEAEKAAYF +AljPz+IACgkQOyDN0dwaMa0UuQ/+KC4rNMNqa4sHGMDnCWFoJYHSvyf7iH0rkTP+ +9U55YFQFtJQrfYLS0Ilf9MJ14y8Zj37x7dlmFSdLfxXl8yA70C176E/Hh60vFYsp +y6pzvmyQoRdgCmRqFazcGog6jwqN9/paR6ChZo6tLDCjv7hyuvD3uaFKR6ZlGrM9 +H+xaOuE+rLFMseFd1FZ8bNQCN+mE95sh3Xzsh7zP83tZSzgyvP16TsoYvncbXa9v +pphikTUh+kpXtrla3qJNRcMxGzodDquRhVDS7mP9LOK3OiCrPcCqfVzPlc+oV3Pz +kHRcp6HQWDAqEitzOLOZwVRlNXx7zoTPSDzF3uL2on47yr1ydz1vhxRO40eQCf18 +sYIqCb7HpOptFKFeabGk/jtIGSTzHOl9iqrczBXbSaC3CjjUUqEHwZgAKbD8Pjmb ++uvm2F6j/Bo6FIEViFDMT/Cs8cR2GfcG61MFoBCs8YhN6zHP0WsgPCliiXGW1K7r +X3N5Zs7waDdPfGYsSCjLPBLeISzcECDhJqURnLaAKAPAbVqR7vHp5SXBUrwSgkTh +ljVGuL7N2fSwpCPx3f/n1gqMjXHoBi5/ACOF5oUMDysEU3YX5SkNcYxCDwkDqnSS +w56PJU702eU1OEaA4seIKLgwZx2TMqJMJm9oPutvdor0D6QDxcm+cf7A/NkdrOcJ +Ia9WweuJAhwEEAEKAAYFAljQ6wsACgkQ/XEAX5eakm1wiw//TwWSohYHzWEjWEpY +gh3iDZF2tnRyacce3u2boWbBD/V6Pdpe33/or/NH+brai2cMqUFEEmhv5smCFasn +yN9hjE1hrJ0mBx2ytapd8eUmTfrLhJoVcgW+vitit/WjzJi/pDj5ildzxmFkT2LH +Rn1TclBJrxp6IpVfxukYgY6y5qpnp0LnAClo5ziUW9eROTSx9TWBppeXcpOPjtUA +LqpmOHgL6D6EfoSEGCULI641QhLb5JbVvg+CS5xMnqPE5sTEr4g8q9r2tR2oGTxw +xow3okhA14sIRedyRxwWpta5PT0qOejoUTcGpcr4PLv+7xW+2aEtUk7HrG9FteA8 +4rRIju9HHsnbfMf5in7v5mGTpcR4wgqpiLMqa05UQZGMJ1QuRe8rXGBgeb6ErRna +lBdUMqG+sIyR8Qeadu7F/ZyCWQcPpS7alAQuPkpr6lJ0UVEfRijS00XDj4vGptxt +PvEsliSMBSmGZRoTIbF/dJJuMMrgv2HD42527+4fuTrPqljdo8CB6Zg/1jfPxxe+ +/i+WoHWIQlknBnAcbL/mpCZUQRHes3JHGiTfIZwIVD7KE6Hby8mmeq/+kGCvV06O +1RU8SFEz4xNInARcXs5kF8g3+Qfvbc0vpWAJw8EQAt8fJNJL1WFWv1+IzeV5spj3 +i+NYChA9/BotNC+DPgZ6jxYUR6iJAhwEEAEKAAYFAljRALoACgkQ4Y456+uBnbIl +rRAAllrwWf084btKEVERORl6ueNc28j58ncVs3OtbvMdONvYZJxfD6MaGWos6AwU +lPLTcVRLj2iUvQyhJpbLwP32FKDX6SBtOzsETRAezuiwGVwEnl3p5LmNJnZfJqoM +xDMj53ErDJwZfQC2C7jlhD1iFZVC6/iiT4CBI1A1EI29bA5liozTzBvU9mCil/eW +wCMk3uEYe+WbomRch9rhImnj6nAhqNnwFGRchwZj+8aAW5u668KEI+G/eIhxuJsv +uSRpApRu4hFJQ5ZFEmrHigCbHlsBoIGmjrquBrguO9MKkMxO3McgdQOi08DB90RD +0rEYmyKfl3jO/KX/zWdCTmMtI97/+/NgYqRxRWIbaA7YV30gQTxaPJQLwsl45glS +8ETNivy8vx5bzOk2zyCuGqHe+Ye3GCxMFN8rO/HjY82QEtwazQlWmU6d18mK06nA +0PBkM8rTllt2ktVYDHyN5IxH7yfeQTRrKt5yGk5EOF14xti3/hinoSQsXhP5PQhK +wsEGPDvGWnK1PprAvgKnAFZ7tbEhTaXcDfxj/BTiI3Gsr9nQcR6ahGRs3vPkwaSk +btpYApx1TxTXNzLaej691oEFnoO4V8EY4zIqLaMsTl2oZarmIEERPeEcNRAxwruS +hXsyRSiCXsC8STYH+Sl+965FkVnkwmwq676cofjmYNzVD7KJAhwEEwEKAAYFAljR +C8AACgkQJelWlRgPAdrarBAAjSfKO/DN4EJM6pjknrA9CrH0O+3bAWRqM+1D8uzf +45UGXQrbWxKsWO5JuXSwu79O14kHGytLAb3oWx8J2/+Q1ui9TMrhBkw+hgvkW188 +FWN8PIhnMSiJmTB1/K9UWgVgcLJxX9FFK8etOQCA8VGaYjVNR7BZ7Z71tJec3Bqs ++vLnV6yrbayvxuYokgjdhFeI2e41U6ImSbV9yRhHyIyMwwnPn1NyW35GtKc/GRvK +9TG6CwEBBb+DwWVsY0+QZO4E2SOD7Tvt7BCrtVXDEax+rTkcgxIww18+q2UIPwy0 +xhxL00y+C36RY7/CZH7ycN9z/umPMCnP6AVVxp9+RrjRLq5wY4pG8hkV9I3brHHA +FtxRilqO48UO0p2ekDfpzyvdFbOGXgEYTYbe9AbjQNP9LXW8uyjclVoYKOylE1k/ +aVT88v3bBhZR0PT4THys0RnYITxCEiowOaReLyY49IjaHLMGSolDWjWC16/Lz9w3 +dcuN9B0D4UbxtVTVEC7YbAkC0V1l4czuf1o/RKihOzR/TpYBSAzMCBOIzJjVb9AM +YS7FyFanIShexWuvD/lDsJ4ZJ9H8C3YBiv6eVOBDwzijS1P+vYAO+66ZFkFvN3Mi +J4Wi1gxrZ2bTOF/vBIdNGqlkmXJmrkVhEILgCR6pzwWXVVm4kAQ+4Fvbz8dLNu/g +HlCJAhwEEwEKAAYFAljSi6UACgkQquVOH75hDz84xg//XSFaoi72dts0TwiBN48k +kylxRfFO2BMPpf6iPWrppX7QIKYCggBgGKermlhfUAleSU2olIm09lnFiz8I9wXV +35p6HzzwI3QsFzz2KnsNeX7zhkjMIgbuV6lrdXrVE38/C7CvEp2dWkGgYxWacHaT +/D5eLCXF4ELjVHh/5ZneVnS34Dg/5BMuwehaTtk+SlGqTr+88PWAUwviiBO9h79B +VcAjGCaknW8o2JX4LBwkLv9/y0/grZn0THLcKwnKynRMYUyBrCXtuDqOgHymnyRd +ZBbAxyvXYEXsVGY7bu7u53pKYjOj1JP4X+qZSKARsEgDEzBlmxGtMke9qQmqtQlu +PEsGBAn5k5N+AznJsqL9tv6fAcSn7OmU0rf681VkDiyWvNgQeXJf3oGYF2SOWgo3 +J9nAnqBZfdpqM4tghWwlu93VglDZ62BViwCB9EDoBis2gxk+HUMYWtAu4dL34CKI +Blk5HITRvZEx24HF+w4pseGpirFzzOOU7jHVWRlSyWCWcuu0VtXQW3L0CC+Ak3mL +vFPxn7oCS7nq/9gcRSIaG/KpBDkXW2g99G14lu4CGlB5rttY6e90nfSsl3lnYTrJ +xPYZzar69z66Sxt/gur4rzDx8X67ZwaoeS7B3YDakdlbQZYP94CsA5HIy3Y/JCvQ +lRX/Gl0tpdZZZHX8R5FZmdyJAjAEEwEKABoFAljRI6EDBQN4D4Y8W14+XStbQC5d +Mj4kAAAKCRD9cQBfl5qSbf6GEADT41iQZrxAU/eh6ueqekI2vN7myd130KOWYklG +LJtWm8wYpqGKF83j7NIBuc8ASRwes38k6yENs1bcwK4dmYoOSJ7J6RrdVKNQMVXM +pbCvUD/0gsO9N3qKQa/g6Ta6iAedp1rhiSETYL/SUhCB0VMtfWzXtRiRrdsGSkqa +5r25zAZKYHBTyPW3VZI16VA6MdTeqhGvDEIRApUSXO4V8E5anImQsiIAtFbpq5mc ++neZa+4+pYcGEOccvWTiqeLNIDDKpHN92n8JinIOiL5/08tqIHbeVpEt9l74dtSL +0AIoAgMrM2xFQzBK5yXQg0r9+ufldpI0IN4b5Mf8Ol43d6N9XlfYUfoTCyDcUcwb +5vnVUjh+w8aeuz4G8SI8rKFLlrnB0XBhI/WEpEI2gxe7BWoyIti3FWtJNYdtvh48 +3GcspeqWsg1Mxe2NILC9IlsjNJr2g6gco1TeR6T5X3yuIkUpDbFdBpMilKGwPoH3 +J9KaezvmX0i70QpnkbN5HDcy+vnik2TgsIzM2XALmEZJwBtCCQEiBXKfuwKz2aII +F8fY/NfqpRwZX5Z9FI7nBkxKBYdEz6TXoikx1z3s6anSaN3Z2q29QYMfENzzx8LM +e0f5NyEvrtr3xAoZf8d9BKPcgL2HOa7hdkrTZtdQ9ilTw9I3eiz+RJOkqFW0g89X +vCFj2YkCIgQTAQoADAUCWLUxFwWDB4YfgAAKCRDP9iO0cC9hfTkpD/oCVc/gZcPA +Lbd7X8YvUP9ryMCjDtP/FGhNQCo5WmK+d/y+Yojka2Av0YMOdbmoLpD/ex9mP8kZ +0wIwcKoLWfy77f/I8NngFQEUaDX5vzzGByWXcHC+EhzkmPT+WKqHb29zS/GZmUzl +kXg3iwsLMob9r7xyqmo0EIDKviNTMw9Rm0uw7Sr+kbQTFxTstNjgoHXfZj+jfP6M +HCSi+DeRUhTRfDnXXTdip9hRTSQgseGe2u0N7vkexE5me2Vd/wiY8tO9KBs7gwS9 +cAdJWJKN0sFkvmSyCIJ0Pq5kjxhiemm0k4pluQfa8U++4t7NiQtLgQ/vjM0eYGWc +xdP5L5FkvX5gxp5Dz5U4fO9wsMNdPSQm9yBxK84rRP7BJGKfPC85TXyBqrJQEx68 +yX5Zlr8W9H1kC2oM3aCY+1LyxduENKlkGkmM9lyyBP5WJFCF6M+6aSEp9QRhaqjg +sgsmqGSmKrGWE7pmGcu+b7DV+0KplALU1+aQWuAgrRs/dofbU+aVhy9vriIla9hg +XJkO9R5+8N7kygwYMrHwilNbvGgQ1b8qErs8vxSZlTZqd6Vt4B+HRir6f4A5w1eo +jCRptUq0blYKqns9jYs96VQBrbiVkbYjVRRT3DqI3cSHKkvjj7C+AuLezFxQzYiR +7FtSQoKtDGUi6J7yA/LBFyvpIR4jEVYiXIkCHAQQAQoABgUCWXB7WwAKCRD2eV1D +x+kpCREOD/wIl/2ON+QjQZd6PFV/eIg5rGUAKgiriW5Wa/1EE3x7z179qkRIG4nF +nvgMXq36YQ+3RMZ+epqsIQk6mW47dXtsnJgjhRkwXNfeknDF2O2eFtDo5WWjOQhd ++eUTM949IsTsuCb7rRrjDjhxekAd1ZPFjy8uPGgqIXjYa8j/Q6DE5rwwkHgAjagc +kZEjGUei6nf9Jv1takIBDBcEEuRNoUnx97SOqwmwutXgfZgIahFC35ilK7ybEBzC +5Er/L0pw1WGcQBXBOhf8S837xtghEkYDkOIuEZINDIwZKSURdDabd1s9yTCmhBzh +SnDVWUjPQpDiqsdDrHcZGsrL7/N7XpkiV5eh1pXMPUwi7h6CgN4uSx8ZuC9hwFoy +h5Rz+rG7cscsuYjZQoAfvPMIHBCzbBK9XRcGR9LRcqRLux8mL7Qye1VEk3rrzn6v +rIu/bEHeUwqm5nw8nt4OrwEDPm8dzGyHZNvUghElPK4Ni4ksM3lJLG28MyTEQNWw +2bZYHWn2QGaQBnTKZkwiIni6vxY8HNKNrpsx6IcWWItFcfmyz0edjRz/BzlnDnFq +X/vO0GQIVI9F7Ol6SZh5tjUCet6yvA7pi5q1h9V+5RCokLOuu5hv2oB8bu3Vp/mb +YXppoumvKyQVK5ydsU0A8oPa/j95/0D9xXNqPk8FdwsT0/qjPBh1T4kCHAQQAQoA +BgUCWXGsUAAKCRD2eV1Dx+kpCZCWD/9XY4uG5hOuFpkDO5mCrfMjGIEDwMRsjhl2 ++jhC+zLj3vRP3C+zIj5CG2xd9eqJZHhNuxZ2EWULGEGUyKnyDAum6FcPr5OuqORm +81Vt1/kdg7krkgbag4vSdE9pmcIFqpu3YbGC/hFiN5HjK3W2itw13pVkuthC9AVS +Ima9+UL8dc0ezKioQJMtl06LglfpYXTn6LK9dNN2hPnP9T2oxtcGTd9bIl00nOrn +RpbHjNUtim3iTBYxFfcPNKSjV9RPMNUODhpkUY3q8ZNldbecd7u2s8MorPDbE/6R +AEL+0Tjbbg/NKEXbPmezd096Ib44CBXcXs+k4CnUZ4HyBIgERyv3qlYK9bMwr8rm +EhMJxVKVVnr4Ew5Rb5qQX4Jln45hdPaeMQ3/YkQB28enJMc8+ltUxC6Q40lXfIQi +3VYRd7Krsd9sT5va+0pa1ZDr7Gzz5MJnz0efbWcKgOSdEIVXhNd2p5rn4KwiuIyl +dGovOoThyeYH1at27D1RZZEX9E5LMfaDRKcDijilcGoBGz3VLykIGO6pb6AVhZT8 +GvA7q7rzX/wwlDszG/UxFE2WthsBezKWtyUnvMFg46DHZIJQEbga2zMI9rM2ewUb +2LokU/yT9TdV5mNCwc53ejKZHbCVKXQ/dP5w3sg7JPqL3s5DnzmfkOnYzlUdojtx +0nPBczqm+4kCMAQTAQoAGgUCWNEjngMFA3gPhjxbXj5dK1tALl0yPiQAAAoJEP1x +AF+XmpJtagMQAKiuG7wjNL1RKV0oPXphr83Hy2VDwY3rVAK15u9eV3AqM+tOpGZj +8SgFmjWtjhoRl5AOJ8846n2S7HtxlfB2iEzNCI9iMPT3oRSP0b+rmOhMLb8y2Air +qiuxz/e0AoEjz63E0btQIedzNwkY7dft/7u3xBhYCN3c7BNZJxIlMJcMD5NZVf82 +lIB8xemiKwgV/+5AI/8AHx+eU21uyd80j9j32DdTu8gvS/Hn8Hudbgl+kLOHA3Jf +ub6O+Yq+Y/E1AG0HH3gh3oSlVqdQZ5NnLJB5lhY0sSJEVkY2vK6bgC9ZDxtThX8R +YC5N7CY/IWT2mxw43TjGAViMoAV8BZbb4WecusLesPMoZYsX64JOqgn4qsj1oq0k +A+xrrmx/47X6Ixxe7v46gkGGgmU8rB9RmhawXlr4xsG0Y87Z4THzLtY5jp48gMu9 +HQXlMt2gylR/uoSmW6Gq5tu8LXjwk3i/O/y1ojkDDTOL8mUAI3BiDJ1SUl4cjOmI +2wl2gNaxqxRvx+fY/36j+1woEGKciO4M6WsZcyBLgHlK2A8xvnc79+JlU+fzLuZZ +WKGUJBv5c9o0nanBWsuV1qUSXncvKVa2o8+NvQoPcXXyD06xM1wYd6b59UmmsQsP +R8j1Y552crNuuBOgDuogg1DbWAPaj+1PAGqACPtZ5V+bqGF5HXwaFk8NiQIwBBMB +CgAaBQJY0SOhAwUDeA+GPFtePl0rW0AuXTI+JAAACgkQ/XEAX5eakm1GzRAAwODT +G4UlkKwhdXFEYMaUcFw7nsMYpurmthYSwG7EcqBvcbbQ1Wu2TWT2HXAFZu6oRYAr +6QuYl9vmSQfs9A9dAGaf71DNmnV24QG9pOnmRSEJO7A8y6qc5KIHvu+SZ43wD+KO +2vl09ZLMyDag9szeSED4VL2zrR8Zfe9iWx1LPevK7dOXyLHbicrXFqWxss0zgec5 +qT9iLmtVfSvAbI42fGzluBDlBdDPtYIYCNWPddW5wbh0pri3P+nu8IjWNxN/ko4H +UPqVG2B+Trx9NkM8vNemkQ1sE4XrNJpRy9A7goG1RuSwZHop8Zrqq5nyFxIELBPi +/pAAmylGNOSt0u/QcIDtM3moyN3lssTj2keEXobINkBFc0SNmEapEVTYTeI73dAC +IB6zb8V6f17bz8UNmqo2OecQe6wbVm2fQfD2dvyrfCCPJYbkcpyP30rRRtHx1HaY +WQz+JQrA/nGOPaG7QMIusGGj7f+yOHKPlbC3AkdLxcb7NyNTQbh9fFEzXRRg5icB +JilikJNHQgWwTeI46n+UnPZg9ADeLT/N3NrWk39MlTxAHmoCdeOPNbuXTbU3bnak +KudEh0iJ8nS2Haoxzn9izZnSLH/RUbmHEr2u0BlP2PV+zoeSlY8ybmKhXPFBACV0 +OMbHvPpN51xCPF1hXDVcTEAPmjZZZuuN0JZ82t6JAjAEEwEKABoFAljT75QDBQJ4 +D4Y8W14+XStbQC5dMj4kAAAKCRA7IM3R3BoxrV2pD/4tm4+F06/8jN1e0Dl12V+G +bgsoT34YIR+xPRNq+vGJRinwIqYUMYHNZo2rViOvOZFQVDRYyHUMXnKTZ5IbqaO9 +dT5C1OlMWvDISXl+rxEUTtzumH/TRv1aQ950MfHBQjpYq30VyNv6/Wdg5oHYmLNT +NLeughUB2yI4gHAPGabWnANYUn8izfEHvdidn+rSuBaP8fKuxF3VHRqU+Y2cyyxD +6fIYjSUpBW8EQFfvy9X1/z4QZ3HNtUYYabap/ZvBVWRgK43ELemkHI+PmKyU3Wbo +0FLWMDtQAq3cCZbQXFPe4wEOooRBmDIJv6PRsSxrdYCcG5lHd90sh7JIyscy5hJ+ +YO0SBW437aRJWCqyh3SbvxVrs5e3LM1nAysGlgoqftZ/04SXKaRZy47YoEfXC94i +xLvDE63XCWpdk9AFKJjQlNlW7XQzl5lvn8v78A/O9Ca31Kr/YnQv8jyt9X4KNhLr +RMwo/aC4XJ70gOxpVR94QPV9ffwXRlJyFc0LUBlGu5HFl+XWaSlHNdFPtHK9v27Y +ZWoNPqMxzdo3Ldtm+e4mP4A8Mgq640JDmV/sg11JwmjaE1tp9qAm2zm77+B11wVl +PiHtrctdVT/SJYpr+UUFaHjvWH8GDUPKWQ/IzZRVZjuWZi8Qe2GhKHXzekZUVGl9 +ebj4joK8GrVwV3oQvb0oWrQnRnJhbmNrIE5pamhvZiA8ZnJlbmNrQGFkZG9ucy5j +b21tdW5pdHk+iQJUBBMBCgA+AhsDBQsJCAcDBRUKCQgLBRYCAwEAAh4BAheAFiEE +cxxg1oDm6FDzHC6IqzOtrOcQGVIFAmB7J5YFCQwvK6gACgkQqzOtrOcQGVJwLA/+ +LChdyBJ44HGbSBgSyjYeVI0E2F6XiVroH11SjllH8HUfZazL5rexAqsX8O+IURTs +L5RIbKcTpzB9eyjynbIQuNo82jBGmqvNKnTB541yaJkBr1DKnO+KYG18ZS50qdw/ +Hpsxp3th1pVEXBpX81dW/rnidwphiRc5wYQXfRoSOrQoV3N3aDRo9G9y//uFJjzh +BbvF732k8rmVVfLfc+h7/IP8yqH2irSCEAPKKpL7Zohft7EsoUBqKZTqXm1jf1XJ +AnjbheUci621NO7ZqVO1ThMkMizLpUm5Wekl/VTnlq9xu84VSpforUrSJxS6fMMT +dR0MaIkrJkxZe+NX6nfwLZQLQOTw5snddS5P2i5ywdZg2dIVEBWyZtt2Gmm9un0i ++yuXHrfZTr7t0/r7x+N2b1vgoQByO5gBfxsFBytlh5L5x3AlpYYEiPW4/mrGdv8l +iJvRVizhsO32lX7x3v0DPZ0Wrv1hycC7hHp6Fr7lqk1ephMt3XdLmscs7/xeT6H8 +nAYuiVgLJVAXrc1QxfLhezYmCMw4IzNwTHLYvQY8YsPdo9CAn90YsR4SvkYtp6yP +tpFCoTD0YpFrSFw7g4n9tK2rglPosANQU5gXeF2VjtJm6iEQ3VEQxLeukRkBSAZR +r5/G0R4gjwmpfNy+Z14p+usnRugLqkqvC2Dr9RRRetm0PUZyYW5jayBOaWpob2Yg +KERlYWxlcmRpcmVjdCkgPGZyYW5jay5uaWpob2ZAZGVhbGVyZGlyZWN0LmNvbT6J +AlQEEwEKAD4CGwMFCwkIBwMFFQoJCAsFFgIDAQACHgECF4AWIQRzHGDWgOboUPMc +LoirM62s5xAZUgUCYHsnlwUJDC8rqAAKCRCrM62s5xAZUizXEACLo4nhloOIgFig +3HmbTYQ6/JiYK30zhKqbh/w0321q65HkaVM+rdWgzFS3zzDolJtdHDzkTW+OlAFN +p7qJetIhk1itZnrAedD0DGIUXPQh6ZRRUyhfvQefqF4UGcvqO/2o8s5XDKLa2XTk +Ax6eK1flIXxg/Zm07McRGRHf94TKZVgckMNZ139FduXPi2VD1tBCMbun7DWG2pg+ +/NMEozrtkr0fB162TRd3u2g4HhRaf93Aus5WG6dWh5xDxF7E2Vz3q1+VtElsc4Ct +l2sNNXbfQkYxTI3449UCY8YVYpumAX3eWyr8ITEghvnJcc5regWMGhx1l0XoU3jk +zNMUjbSJB/8SduRJlfQu1GvPj3f+EG9CAUPvL05sTT4smxYNQt5W7LUQQlDP3tjD +I8G7gRUpZtl0Jc8eUZGQaZzT6m0Sg6R3uEiEmmlTVjnQPhlWZiSa3AhgeyRtxfz5 +FmdD4zQrRU+1Kq6KyK4LeIHoTCWPoO0SjEdOsztUB7qGdoCyMFkkce6j8oyRUpIZ +ktkiLM4zJoSoRASXT/6LJt9HnxYE24O51OK6i4mEGrbfp2IW4WfVIqVmupdkrBYI +dSsYwnDuhmp8N+JSLFE/xDM/IdvauXNM2wZjVlzHz5mBcrJk2XFAQqE/zP4XBl0U +Wd6xIEFhVx3IQDkRQq3dQdgVPLpwkbQhRnJhbmNrIE5pamhvZiA8ZnJlbmNrQGZy +ZW5jay5kZXY+iQJUBBMBCgA+AhsDBQsJCAcDBRUKCQgLBRYCAwEAAh4BAheAFiEE +cxxg1oDm6FDzHC6IqzOtrOcQGVIFAmB7J5cFCQwvK6gACgkQqzOtrOcQGVL4aRAA +yu3KzG2Xruwl1G2cKFMzufZSYRid5IvaV+djMvK1JkOmiJ8T8UWv6mxVGoDd5zWq +PjQPcEJ2dSVem+x2BKSF0Cr51LP6c36uBZtG58G92hB+aGNLO5f9c5K8DC8YDk/t +ZzUuXP/cEzH6gvcK54WA6Q/7Iw8XMg2O2xEtpdbA6deiyYUvTW1bOrQ/AnAQeqot +x4SOhdMAvLMxEOKIXoLG9tQs6eHQfIeUveExEQW4PF82D19ikNgHm6xNQAgo4DyC +Bz7Dg9eunra8r4SUx4DKY+DQc9MWKQc1ae11YlOAeZEoVeS2mxVfFIgqyiw0Ugnp +7utCKXtmRJGzoQ5T532+0DXVurCD9Bdj9KmtczoVV47mqrZ3pnRFwyQU4oyxtOBE +wlGVTbiaZhE3oeFnhQ55rF7GYfOxhbxyqAOiR0o6OVp9blvy8QHDeK+RD5qt6xKK +lKcvtmKs/rTM4alJcdhbqqz5z+TiP+c6/cnr6WDzvTFAH3v3qqFZG3TU7SSGBpOG +EZ9i97VueR83y2vzrRhZPHaOHn85JJpp+73LIiy/PzK8d3vwVhLvtFczlAJPpG+y +VDLwdjWZraIO6Ae2IqUwvv6SyeX2IwE4g0cr3mwIV02X68G3ITh6ndj44zbiMMIo +7dB4r+P5iFeZONkskt32Q89rO7JTvITZWkB5SwP/1Aq0HkZyYW5jayBOaWpob2Yg +PGdpdEBmcmVuY2suZGV2PokCVAQTAQoAPgIbAwULCQgHAwUVCgkICwUWAgMBAAIe +AQIXgBYhBHMcYNaA5uhQ8xwuiKszraznEBlSBQJgeyeXBQkMLyuoAAoJEKszrazn +EBlSm9QQANa9WHGfPNDDAQyKCjEAAPLpkF1yX+hPAy21Qkq2TstFT4fCADo9d8uk +gQhViCAm8bUJB1GpTxUb6P9XlubNXSgQQSq4vROAr37/6bxG0svBmmq9ctLx7o2B +GwFkjCzyTfvVQrawotuI5f6xDrgHo+sGsYKAd2bdE3PQuYpOgHoj8knR5gbYvxhG +R23kwZ8hFRhMD2pEmZ/kYLZk8LoVy7AFDd5se9ufNw6QRLD1EVFYLayElc1CtHAR +xSiicIjJ/ZObmfdlLawIrove6RtGfBclgTFKUV0scjSL9pvJqlT1fddQCFKZPBPb +8d0FkgAVS5aBLK9XhNHXNbV/nnPmRLcYwcLtYAx4ftNXedBHJTmgxJ53Yl/Gjeah +3eMeN1neo+jjjFRgHsAqbM0L7VSCzlkb5e6LnF/3AU9cj5+IxFjSLXqp1AIUb6J8 +vE94l+8MkRomMqnb35HiQ6M11iZhreSdSfques6DJ1XiHTvH+53vQroA2PLGlHpV +F2VNKHyFX4KjeuxAuRgCBXIqFiScTwbOGrZ+S23VtkGm8/9DHp1Ypi9BxKPwQLUi +MXHNwUkq+aVcDeojzvI/m9PG2ZkCTPQHWUltCqn36IGrsT8zI1yWy9+aDXvLBsMM +au/QX0nhgWp9lAZLJLkHtm2KWtNE/j01xRqel+w03lckB3XZMPSOtDlGcmFuY2sg +TmlqaG9mIChIb21lIEFzc2lzdGFudCkgPGZyZW5ja0Bob21lLWFzc2lzdGFudC5p +bz6JAlQEEwEKAD4CGwMFCwkIBwMFFQoJCAsFFgIDAQACHgECF4AWIQRzHGDWgObo +UPMcLoirM62s5xAZUgUCYHsnlwUJDC8rqAAKCRCrM62s5xAZUvV+EACpUoHEPuJW +K8UqqHiiN2bsRttWS9QV8ThPMoc1q71g2I31KL9Bsrl9VWyTjTnfwTaxrGjsBJt7 +0jlDCNbNU0BZ3W9O4RmIX55aMLhIzYQHfF/Ci1Jg4DCqo5GciWlrDEcL8G9/toj1 +8iAqAm+7eqwPkQbM+QxGgjsUKYMVdHGU5QBQ3P4QNjzGsfJcz4LSdL4C9Q9qZQaS +c1ItyWZraEMcYYAewknALiN36mecxXFDBdEePmnPXLKoOV7wOS2h+kiBxdSfuUcN +unR2w0qfoWwL5bSGP165yZFvvF277URa93s++F4+Cmq/rcuSijtA3IOWLg6Emot9 +1R2Om5Az8tcBLVh3oYF20LULU7W93TEeEiBqUt0GSaX5viplW9PI4LUgyAYFcQGt +/8UG8hSb5Kfpa4pRUYj1mC6PpmpklFLbL5CW/8Lenh5UVRoS9JCvVDL7TgRXL0hP +Zycx7Y5EZp0IJVMJLTQaDT1Dz2oBu15ss8NIPsP/1nKt5bChsmRzPmlps0Ha9udq +YPe6xwdbRM32cpmXj8626rsE6Hi5TZ7kJj0OlHRKnDt5S4uh7pIbYH5Woy0qRRJV +S78DNhRIQDQnzMfwdDtoyLMa2V2SbxpIvMbdDaY7t5yET6OFX1FB0nCP19+Y4YZW +k7tVP/q0bWdekIb3GAn8Qul3/PTeDsdGOrQjRnJhbmNrIE5pamhvZiA8c2VjdXJp +dHlAZnJlbmNrLmRldj6JAlQEEwEKAD4CGwMFCwkIBwMFFQoJCAsFFgIDAQACHgEC +F4AWIQRzHGDWgOboUPMcLoirM62s5xAZUgUCYHsnlwUJDC8rqAAKCRCrM62s5xAZ +UnMgEACQ7kclykXpwMQGQZmINfvcurYn4M1fVpyIEG78zCQCFzyQrehemau1A7Fw +73IOhq3An5IN7hY9cfEFqDdae5Ebn2ogiAYwGAorz+yIvEOTGGd0Dyj73+HP/JQY +epPdYpY1M3ojIEVR3zvwnHqlGkNLvu0pGPBw9B2fAT/LR0QnRyDt7ZDCm2ZHkfZm +mQlhMwzZTW6ZQzFVJeX85Rj1KY4SR9PZs1iK8LxH8Ku1PJkm6JfJPDVoHOI1iF8l +QMG3/kq+WeAzAPjiS7MwXPzE2vCgZvRuBn5wh5CDBwkFZ+k6K8VVrmSBlnFQOfH3 +yGBNjLQRrvGf+bCFG+S8Un+9cVaC1ejALVrhxbjZzxzWNnN0+yY32ED+WPfKg5eW +dg7a0PitGAzQX1pGSxB81G4Tgeys/AJqjWSTFzCUHJDQBD7MQ4fR+vu9slNHdGRh +/Kv/P+K7sh9affW7DnPsyy1ZnzEPLERQmMAxvEiALVxgoFfaQTSi5aWclrUwO8O3 +HbhV4rXSOP0E9c5hhK1oUqRPCjzUOGHZu4DRmZ22Q6fkd5K0Xcv3TFj4t8n8bAUu +KXk8yh9I+C18rVI/qRhdAaWvmqyY3Sw+gQY5FD55mlLfz9qqh4b4w2ASwzPBRORj +LFtnSGbsldhyBWPpjinuVMwCC9P7QAQu4yubnHDy66RXvwUm/7kCDQRYDmLuARAA +szT8L8bN2gAhgGWD4flNEegD5xyfg1LU+AnN1b8ZbNeudrEPc7yfGyuNCMSOCRRn +F9u91ggQHHu3khnCMqxuuoUNKXn9CHUumimPTHAlsYOVFsp8Yy4EuDGajn0AfMn5 +L2sqbYmRI2zhmzoV0X+nwS95XRK1bFz/ntRVhGZVMTJ2wc2qoh7VOlACNzfXpnjt +i5XX2l76+p1Ap9V9VAZ2M0V+5aOXCOairMYLY0h6B4CKegD63SyXd+1vWAwGZTM4 +dPiZ2akn6Ufua2aepgW5mpOMdk7pd8tGjLjqcXnIM5W1FgXP4DfcLhIAX+5l0JXs +8H7WUvysENcwwMLM3nZY1gtz62tTlTWWIgyMat2BgjIO346p+9yOebeD9nxT4xQL +BZVLTfgKntih4o4l8lRpS7F/8vP5FUc3CN+zkPkwuT6GBrhali5qHGjoOEgHitC9 +NjoC346xf5lS9GA0Nz3Nyk9mNhV+q1fG2yoGNjZ4jIH//5LfdiGh5jXSSVXtSSec +nyEzY0bXdiv5dShReYb89azGOg4pepVyKK4gY/82G21HCUwCtOdaFWcWyyqxyq87 +kdkhxNdaKtvjkBBsp1trk3x4dQx3KC3on+Z+0T4VTBRggqfnCXeXHBPjFDV7czCQ +5/NeDausDKadq308lKZbndf/iS41jux/Zo8KFtjjXM0AEQEAAYkCJQQYAQoADwIb +DAUCWA54KwUJA8J8PQAKCRCrM62s5xAZUssFEADooDrkzg5NNpyHEExk6aaKWPlJ +NU6T9kbKUEbxkpVpUoBeM1ROdDIaU7Tdiu5j1EUF0xFL51y39WSY2kVeKMxtdq2f +2/ZWjM4C/fVcoS84FrQ0p7RQoq7n/dmV7Ui7hnh3iF+Cb6Oqcu4UbwoKqKYI32PC +Ul0cUwd4egIMi5YM0W7yY782rPSTL8y3Ba4sFgQnogHsLuxlBixdc6rhHwNiVseY +hH63d//MWRAdNl4q/3ICKdMfMLbJA4w/g1YF27cd2ei4g6gHQCC8TkD35+zCR8Zi +e1TcIdxYU+sPW1ULuYEYNwhRj0laFgm8jMPy5bFat60GVxWmA0VzNRxU+LSZXSXZ +g6dn3Ihc8ROpdoXHrzxqqu3dlWUCESQ9fQ0KWUuMRq8N0P9K7Dw1SBX+frZMbhqM +DBL1ImY9JkSwLlg/TiozTAW2CARgTwbSFM9Lzef4LXg/BsQg8/HClIYw50EqbUV+ +zUBmaZa2UEa5bJhvqrd3+aQ4eL1gMF7cTykm1eNpJtFwi4r99v+du4OAY533E4Z0 +c/GoaVyP5lI268qV+/N+oWQrvbMVXTfSKK5FMJGQYeE6W+ruWZ0YwAer0yKBVT38 +DPnlmveAEXQM817DM8rrKAz4gcaTq6jU684nuiWJZeraMY5FurK4r5V4RiDjPiWk +wfBQGVpskLpp4jEvrIkCHwQoAQoACQUCWKmriQIdAQAKCRCrM62s5xAZUshiEADh +wJXWCdATsf89/XB9E5FU/c0/pwZXhsKN8RqwSzQ1Pw2/jxAB0Dkiurgteeldbl5w +5vp+hCLq8afz196orS2cyFhEF4VYitcWhBVFoi2ggl4rdMeNYJFRtii49yafh0Mr +/c56boBziI3C9PGRlR3LAjAvsxph1QKi2q/J4VmlYhRBoZKFn/StivFxY390Itt4 +EsxF/iYktWto8FSDZqpB20LXEVuJ+3c4Ap0pl8bzCW2HR3O+oSM5Pgm0ysGpHgcu +4+sARqVeYodfP4RQF3tk0ifP+lOD0xPRlRxqcNdUHmc4qEaOkDprdUSfflWzjrJc +0CngkLsg8suXw3BcSH9nCgFcnDuHBgkHh78gztnH6JLAylq75yr3KT8a5HhjUmdU +ZYweQy5puVAAz/zfUqogcoL8DLsxg/hdF9THI7rzKWft/vBWb6qONr3ynJavFr++ +5MQzspUUwtBZZlY92g1MquYuzHdxvh+DBfqGiZeZkDqevxC5vfnAAVtUCtlFhjBp +LHqZs3a/mSxLQ3J/3J8V5MjegsTpWcWtfN2Egt2ELEbw/URx4yoCNc4dCwtu5/R2 +eWi0cu/OZ62rPzA0+AzaEOrM/0zDTEjDjI/DIMd+8jktkF5rjuOAkXgHBcfrXf5C +Z2stDjCwOPQ+ugORLhwkEy37NCE9RE7KzEUTUoMyvLkCDQRYDnh1ARAA1WNmHOGJ +2z3UIG/VP5KFecFhATnc1gWanMDw25CtdMFz/O/rr0TDcBAqxYRILuYEgsc/l2Jq +qC+iaTUo5GQnUbn+PuhWuV16yAQSKQbr3qjHyChPmkL3omUqFD23Kc5BgwucN7HF +RAYDaHAwMThGghgjaTVxLzAkn6xYR0ZRSyEGhnB9kez7CKxcVIYp2z+pTvJ/pjjc +whxQXOZ3XL4cLEjDRVs6FygZmZ02LkR/4xqffwSullkj6TylzdpNn7hzNWWN4Dfe +nB/azdmmXwrl0Q36Ow+bWmfMw2iD0rX47f0/CCkFFYICmi7NAS8Q564uY0+pmp9Y +cGb//BDRqhywic9XTokKG9GYIN5IrNzdS1LMsFCwWZnPOnhHtR3ygyKL7KzlOjzC +30pQqelRLe3Ht+swZuXVCC1o3C0IogOrNorE5TD79ra4YXJhxP4pJzY7qos2K+re +OIVe8yWFVPjyoiR6uBv3n9461U4Hk5G95/tMBbMpEQf7FNbm8IAcM8Cn3VPLbDuj +YtZAitMkX0MVV9i4ra4GwC3STxn7GGDRSjKJvJCW5Qh/SABkcP2Qd5K02jnW+Dya +Utlv/qqC26sd/6X1LC7A8epkQxC11McGRsK6P81fRl7XgNLuTuJu4bGzH1fF78xW +/QktLzRSz/QIdzNHWE50QRxauSNBfCCuEdUAEQEAAYkERAQYAQoADwUCWA54dQIb +AgUJA8JnAAIpCRCrM62s5xAZUsFdIAQZAQoABgUCWA54dQAKCRAdTm0kxcWL2cmi +D/4/OBYRUNpCFsDWzdCqj19HoMQizy5/7prikHGMsZhnGt0RAP2hzLpgoZs6J1I9 +NDCWrqYiD1XdbYu/RK5mT4xWqYiTcKIGVBrK+X9SOuzAe+f2ktpnsCk0WLPXSpap +yp4adqDqsh78+Qwsd6K7vhxt7ImEXtghUucivBLi0pnTya700hviSFhF22Go9y9i +cx8ZulCu/AF+7NJ1zWgAAuRw4GriN9xKYJCp+rHYOTrZImwAQQ8EeTEGuoDGgpyE +MTryxFyiG1gzjpWwhOKTgEviTceEgA+wA32MJswPwtcYspgKf1RT4KNo6BdZKr2u +kPTDCUZXrUalr1hAw+YKynB3DOg72904LPStCmGq7qSWrEQ0739LscLOCZ/9uXVj +0JSJXleiRoujx7lqJyp3djubWF1IhlGCFomnP/hckrYVStCDSIO2lIYxZeftHZFY +ROSAltxG/rAEizbxvyyrNz2kjpbUm/FzItROSj0PwS5X+WqoJR8vNedZFD+dQBIU +IjKLukhufKQQyd5cCm1OIipkhcAT5gyA06uG6R2YCCQ/QksK6OLaofzC/mTKtPpA +ktgY3ZhPUl/XBEfAkO5qk3lVvuAo2316SxGGtD5KbbZMlb3ejPPXzezBWo2+xAm+ +0XBgOH1g/WQbhzkPPeEWZKP7x7Myky2G6y+uwIbcb67RCNKZD/9VOfpwPuZ7ma7b +GWzXZ2wPZK+/xLIZlR/kSfjKW60OJJ2pE/TBsFdjqBjiksO8ooWW4gVuz6EBoPjp +GoKGBxrvucbuHSa75J9hWMkdrzU3Rkq0X5qHKg6Sg/FnmLtVerP/dar6/XcwyNMm +AWnacyAFS4FvOGWcryLQxlZRN5HNI66hum/FWYuOaKDasCb3RqsUyrXFJO5xNIr9 +KmzPbexqVk2e8wjd4wN0tVwVaQ4pfVzo1TPQdPMmxJzLY8IxtDmEdhGAO5XslNzu +HzZ5k4UlfzcIVxhTPxjBtBHhjkt+eMBNPGRmPt3YFYrE/ya4xvrFatnxkbRy5+SD +3ieuT3DBz+pFokE2/pJdDwJEAPdhbaQH12Uina36d1Jx9FRnQTZynJ0tfUInXwkP +vpJ/2D7DwshjEuz/j67yqu1wBvAtMgGEAOjGzZeHSavY5KyiRmSRGnxflsYR8jg2 +cIB/epm2ERlT8TPkUk6wBnfBgnAmxVa+hVzzIRV2ILLu0aKah/juXyB0gbEG3gy4 +gGt1wfcuzwaVqUYwiWCyLjOhGNKiorM0b6wyh/+p3mkfCCU8v/aPFB6D7lJILPgs +bLuDf1sec2yyKPdagI/v7IuF5Nma13Q0qUPxrrE8rOxsWSAQ7p8zdAXuJcQRSbPt +OKCpn3eA0i6UOSk6fpf9xMzKDXtalYkCHwQoAQoACQUCWKmrqwIdAQAKCRCrM62s +5xAZUj0BEADiWBG7EBgSGPvjcQ2jqBfpwAkxVmg0l+24UN5XIQNy4xqX0OC/kaPL +to5K2SMhb2F8LZLYnnIBJeRVNGZzgRnIraXrP1JPWqYduyCCjZeMSeUhl8eSDwKz +Ckb/F0lMEVUDwwNZeOtLEFW61ASev2Tm4y02VV3U1di8Du6jMGUSX7FfMkYEhZhG +OZcBjQxsl0AowEpESjrCgWdcaSC6ssBa+f5IEl1cqBntx37NYxAM4oH5oee4GpU2 +CqQqmD9KDWA1QlrLf+TYJ45OmmCqxKINjnfJxmBYUh8A3QW6u4Dh+1vnWo9irbkz +RVDj8en5KvBu4Q01A9FiPuk8XFAQVnFxPqyQf2TE0MetG8iWTC7t7KBEkj2XmxVe +3NIz5i6Wdqzuxt6FyN7cr12K2M3/uE5qc3cedAAdd40WyqOaK0j7eIhy0n4XSxTx +FOEOUmyqz3lSoWs/sKhSdzcw1F+Kctwg+gVMxoBeyb0xoPsh7tuzuFto3nO2Q7Nr +EHqipqIw4XKSq2eI3kMN0lXqM+yxer7KyWGViIuoK+D2XacZtWuqdNE4oKSQRcvz +4ZX16LDm1otNqoDqVvncG3alZ4381+Xf59zB+AmtwJyeYxrdXPxnumC604V3LzIK +dRMCiFodibiGDDVuLl5vbJDUOfvISc0FT4f8VWP7341LqkOvMzulArkCDQRYFKeo +ARAA1isTL3Zr6XXMramZr26cKtZcE7Wmng+bHL1yFpm9netjfQIIT0gYCnApbgNz +NyKdbiWOty+FGTv1kmKAmO6LupDhIwhk7s2kn7/YYVgErHBRh7G4ToEZO5LSksts +qfDpB3r07MrU5ayGhp/tnVqPWt30PC6YJh+NX6aDAxIoEAv41izb0cDyKg+vgwMO +PujaX2RlXJik1E8qxT7N7pi+iDyAbCgzv+gGkIgMcCKOopryrN0vf0Wc00zkKXEB +WLoaiizDIyzv60oAoqkKd8E7sRlonmA7LKivQDTWeM08uZrDXHIRO+0PivdeIJUu +/ulvx61Smk9badHKT8NyCkq5ILGXHquXyxOkyFzjxDzdI6wjPb49jjzrkyAyEr3+ +gGP3e+kzvwsKMfUGxSHxyfJOGEIZro94JQDJxmcCDLdEAx3loZoA4grQYpt+cJQq +Cf/Ay1/vplN8gG+vU/CFtEuGLzJzhwzh19MH57OwivljzoOduQ1X/FT0D3JfEzFE +z8O6HMkn0IRr4+cR9t8TIJIHtGQv+u2iJoDk5C6eNiCgQDgTMMmSAHmGRC0rlvRM +NflveKiM/HSkpUMyRLItJhrwWd3+0rR7bOpDgVAZs3JcEH8iPUjBTTFrzXPu5foQ +3EjfCFji7DsE46GTO+jnIBSXyUMtKYEakw50UDDH+76fffsAEQEAAYkCJQQYAQoA +DwUCWBSnqAIbIAUJA8JnAAAKCRCrM62s5xAZUh9mEACIYEW1MMFvL10/xhzen35e +CkyPFTZxEf7j6Kj/w8LdKgK7qaUfovbxR0r1hTdm64yPGZy/ctYaNeiHvWtG2dxz +A+SmXPpJlXjVGVZvE5kLH+62HttMxT1j/31DB8wSeKpUkkaxUMVJuHVW5C19VwHF +kjsDegO+mab1fKZzSu1cRRK9Or37a5w1KU+9tf5psUTtlTJryZGY1ViTdY2d4rOd +qutzfED0LAMSNwmxIFn2PWr9VMjyGm2aJXrsSrzQs+foWsemOF1CvQ/nBibv2Fsa +3R5avyEPW8PXnhJ4tVKsQe5btkLHy/WvvsGwlTsXXg9wYTHkeaK1KV1Mb6FsxJZB +HuO0zVBu4+wlqrDqeRtwyTniufuBHJeJt7HTdvmgy5/IH15H0JvXoaU6lmvN15CC +4Q3p2dp5+jHyTmlrwiUrRLVfiL9Q6K1nvolaxFzUJTV7uFkkFDUDYKje1s328Kw1 +kNuJmsATW1O8bbUTe9qmOjFq6Z94m5SrZOI281OJPzHK3k6rT+VkZnmqmOfAUIbH +IeAcLK8rFEtdE6iuqIuGHK+hkT2oCGKlnUvd6gvhvon+oahYl8bGYdD0hi90JY8V +Sa9uRGYuRHTmGiusjmHGY1+9A1DP4fsEhWxT08ogxMPtjWcCdy1rZxTWjm4IBFzN +LggifE3amFrNoJeIgdZ/k4kCHwQoAQoACQUCWKmrzgIdAQAKCRCrM62s5xAZUgM/ +D/47W1zBp5Q9BOqBmjpy5CaOTjBK3MxhPsj43RZykBoJ52EdEw28/z3CK6u9DEj7 +tuR/f40qMUOWu98iplMLZlKK6DEX/JpUIgBp5X5uH8xae2tIeU2TNiq1fgND6eDo +MtgCG/oUpUSAdJCsOkD8JRy6Kks9nQTcCPzcvGUNhp+TkW2prJz2Z1gACFSNd9Hj +KuJMyg91Y07EbC6/VA4LOlgPYXRCq5MdCGvtJ8bZcRTx4pI+FZCN0CU7ZyvKu8QR +6TtA0THk9izOKUolSGxnT8DpEyfMxoyBG0pVB5D6dUAsrLkAk+tIzsm8Jh2lwniK +l+fpluBn+lkqhzBzVL5PaXv5D3T2dFk36m/KgYJ0G7KLGfKbX0VtS7FlhHgva7g7 +uIYpBWL0Jb1bgy+YTOxoIeHONVPpptfG9zJYyi+xm+am3Ld3PRvnRustc8JzKqr1 +qs2lr3mmt+ns1K91V375AvFYb+0diIFQWDl0BTjNv6QexgBFESc2BPGw85JPNyKx +Luug6XItTP4BUqQGxkxaxnUWujnbPYOgR79r0LHHPEsPrJNGss7CEDpJDiMfY88s +V7pYRlVwhe+NFh+x7L8DfIQDoAFAB04doRap8tWXVBkd+/YHyXS4vVJku5vTQWZZ +7/Yiu9TCmc1A0omQxvXjmDfaryOL/NGrrfO6nUlK/9PDFokCMAQTAQoAGgUCWNEj +ngMFA3gPhjxbXj5dK1tALl0yPiQAAAoJEP1xAF+XmpJtagMQAKiuG7wjNL1RKV0o +PXphr83Hy2VDwY3rVAK15u9eV3AqM+tOpGZj8SgFmjWtjhoRl5AOJ8846n2S7Htx +lfB2iEzNCI9iMPT3oRSP0b+rmOhMLb8y2Airqiuxz/e0AoEjz63E0btQIedzNwkY +7dft/7u3xBhYCN3c7BNZJxIlMJcMD5NZVf82lIB8xemiKwgV/+5AI/8AHx+eU21u +yd80j9j32DdTu8gvS/Hn8Hudbgl+kLOHA3Jfub6O+Yq+Y/E1AG0HH3gh3oSlVqdQ +Z5NnLJB5lhY0sSJEVkY2vK6bgC9ZDxtThX8RYC5N7CY/IWT2mxw43TjGAViMoAV8 +BZbb4WecusLesPMoZYsX64JOqgn4qsj1oq0kA+xrrmx/47X6Ixxe7v46gkGGgmU8 +rB9RmhawXlr4xsG0Y87Z4THzLtY5jp48gMu9HQXlMt2gylR/uoSmW6Gq5tu8LXjw +k3i/O/y1ojkDDTOL8mUAI3BiDJ1SUl4cjOmI2wl2gNaxqxRvx+fY/36j+1woEGKc +iO4M6WsZcyBLgHlK2A8xvnc79+JlU+fzLuZZWKGUJBv5c9o0nanBWsuV1qUSXncv +KVa2o8+NvQoPcXXyD06xM1wYd6b59UmmsQsPR8j1Y552crNuuBOgDuogg1DbWAPa +j+1PAGqACPtZ5V+bqGF5HXwaFk8NiQIwBBMBCgAaBQJY0SOhAwUDeA+GPFtePl0r +W0AuXTI+JAAACgkQ/XEAX5eakm1GzRAAwODTG4UlkKwhdXFEYMaUcFw7nsMYpurm +thYSwG7EcqBvcbbQ1Wu2TWT2HXAFZu6oRYAr6QuYl9vmSQfs9A9dAGaf71DNmnV2 +4QG9pOnmRSEJO7A8y6qc5KIHvu+SZ43wD+KO2vl09ZLMyDag9szeSED4VL2zrR8Z +fe9iWx1LPevK7dOXyLHbicrXFqWxss0zgec5qT9iLmtVfSvAbI42fGzluBDlBdDP +tYIYCNWPddW5wbh0pri3P+nu8IjWNxN/ko4HUPqVG2B+Trx9NkM8vNemkQ1sE4Xr +NJpRy9A7goG1RuSwZHop8Zrqq5nyFxIELBPi/pAAmylGNOSt0u/QcIDtM3moyN3l +ssTj2keEXobINkBFc0SNmEapEVTYTeI73dACIB6zb8V6f17bz8UNmqo2OecQe6wb +Vm2fQfD2dvyrfCCPJYbkcpyP30rRRtHx1HaYWQz+JQrA/nGOPaG7QMIusGGj7f+y +OHKPlbC3AkdLxcb7NyNTQbh9fFEzXRRg5icBJilikJNHQgWwTeI46n+UnPZg9ADe +LT/N3NrWk39MlTxAHmoCdeOPNbuXTbU3bnakKudEh0iJ8nS2Haoxzn9izZnSLH/R +UbmHEr2u0BlP2PV+zoeSlY8ybmKhXPFBACV0OMbHvPpN51xCPF1hXDVcTEAPmjZZ +ZuuN0JZ82t6JAjAEEwEKABoFAljT75QDBQJ4D4Y8W14+XStbQC5dMj4kAAAKCRA7 +IM3R3BoxrV2pD/4tm4+F06/8jN1e0Dl12V+GbgsoT34YIR+xPRNq+vGJRinwIqYU +MYHNZo2rViOvOZFQVDRYyHUMXnKTZ5IbqaO9dT5C1OlMWvDISXl+rxEUTtzumH/T +Rv1aQ950MfHBQjpYq30VyNv6/Wdg5oHYmLNTNLeughUB2yI4gHAPGabWnANYUn8i +zfEHvdidn+rSuBaP8fKuxF3VHRqU+Y2cyyxD6fIYjSUpBW8EQFfvy9X1/z4QZ3HN +tUYYabap/ZvBVWRgK43ELemkHI+PmKyU3Wbo0FLWMDtQAq3cCZbQXFPe4wEOooRB +mDIJv6PRsSxrdYCcG5lHd90sh7JIyscy5hJ+YO0SBW437aRJWCqyh3SbvxVrs5e3 +LM1nAysGlgoqftZ/04SXKaRZy47YoEfXC94ixLvDE63XCWpdk9AFKJjQlNlW7XQz +l5lvn8v78A/O9Ca31Kr/YnQv8jyt9X4KNhLrRMwo/aC4XJ70gOxpVR94QPV9ffwX +RlJyFc0LUBlGu5HFl+XWaSlHNdFPtHK9v27YZWoNPqMxzdo3Ldtm+e4mP4A8Mgq6 +40JDmV/sg11JwmjaE1tp9qAm2zm77+B11wVlPiHtrctdVT/SJYpr+UUFaHjvWH8G +DUPKWQ/IzZRVZjuWZi8Qe2GhKHXzekZUVGl9ebj4joK8GrVwV3oQvb0oWrkCDQRY +QcMgARAA02sPkrOD/Orl6pZmTMVqEvPNfCxddFt0A9b1j3DTgvES6Rj6lhmaN+Gc +l/dHJxgjVLoFsJUjeuAe8undVqIvl8+UI9EWIvhSLhfc/Ciup0bCmoyV5PAJ9OwX +awzVQacVsrsFPaWYU1ZGn52gxNVKdWkZ4VsLEEE6eQMjKZk3jWwl40Tdl9tMbw+5 +2NjSpP0LDYPLB12HRwhN3OkyW14eQ5Li6d+W8qMQTuMIGw+JAy+SqMNk2pTclX/Q +pKNUooZR5Ox+ZWaWHcJNN8oaQxeEaUC0vsUuChhKnHG+W67tw5vA7cGg12qwHhZm +FxUaBZN8jAoj2E8hPHzAcxIRtVglBXM8aQR2fPK+/9FSUkojYjIz6vJFnVR+HTeo +NgYTTEDngI6SUpr23Fj6wh93vU/iigOxM1TzSRdPt5C/B68x4C10hqirrD4gIb2b +rOCWVHmRHqJaqGgq4eRrredJvnys82IXF9e4kCD0GoeREgfYQSizjsTW9UhPiNdt +VliqWKFB7nY1iDU02ISfiXMKQ8XLCChY+D0VA3Y8KrxWCwNeDZFLtfjFyLWJToRB +v/Jy1inua3a26W90qBCBGUP1DEt/ZUs38ARZEi1taGVeg1O/EBxxI21z+4e2ujfI +I76X4X//bKeLeRSm+RbjC1TeVZUz3Tp1NzA5sqZLINcLwtbp+WMAEQEAAYkEWwQY +AQoAJgIbAhYhBHMcYNaA5uhQ8xwuiKszraznEBlSBQJgeye/BQkKGpgfAinBXSAE +GQEKAAYFAlhBwyAACgkQ1iWDuoqxHKNAcg//VGTdvuDHGU46QcydFMGDQxU6boJK +4VLCqjf6uEarHZtro14clJGu7nAE+CTwrDlOvqlruwG8WH86rre6wvUfcszeYqgk +u5OWGGxu13vEMq1b95WAg8W1ik+bLMykvAV5bHCKAbEaO66QJkc097YXMZbFrYOk +Ei8nc8bjZKwHotG+LrLhx5WiA0bdTCMI9t0/ymerPIFSoAIkeYQKSY82zwH7Vs6t +geEW7IvFaTQx1p9Z2YOFfNQO+TAM4l4GqOPgnY6y7FrS1jyjoP9Ev3v3zAuU3WLP +NiqKItpPVL0J98cBwZ8ZRU7Q+NwKBesAk8IkvhLkAYXyEJIS2+ufBq3uiDrqYyf8 +co6NkXhps8pAeNGY2ULBGADpxhMeZbYMP/9UxWZ1KOdJ5jFjRNT8mWXUtGfOc+oe +ALdDZ5unF0HqrK36r+rIx/AKBSDdodjI/6VqADVI6OFrUUXfDZZfNhhMJHfGp9QV +SsVTzNt5dHRP7UL1mF1F8g4Pp472cGZ/BujqiAyoouBnkGmvqhbrWNwoBXBMoWHr +SvGncXDBa8bbFzDB3iDRYU7wvxa92C+pB4esm5OatkuKeX9db35Xz3SBuEbKCtGD +fLMnhA5iEvhY4ddwW2g4f9f4jr+iAmB0Lnv+kQ4m3jNfPELkp2Z51QGViMVbjziH +84jVoQhd0VUKnwIJEKszraznEBlS764QAK57tr7rzjNrJeVy9SS9Ix6+AR+mIu84 +oRh9YjFLoxqTYga0nBMEn/xEN6dEz/+4yO4QO0/YLGZweVyEfLMoH1YaPRVc7kNS +tPi91E981NJ2BgsavNuPGtOC2HPWPBmFwDTD9bhnu5v2C+KqcbRUPz5xiFNUBat9 +f8eHEnP8DTZhuqG9Xp1cR38IfkPv1Goe/6h1cormIRlIf87tX1ur8HElYmzFH/us +4lwwrnHuts3WfIyRP8/TmkIpLlfFYuMf9kiTR65KY7lM6uvWB9loZvxrUMbd/uAp +BVwVfgaffRLItMQ4HY86jT8FrNNep+uJJX6AJHB3TV89tQO6LxIbpBBtZS7iZo2B +XjWTuhYmm8welxkmSFNj3wvGWTzF9WeJiQs1geIYFY+tx7adjClzqxO4BKf6S/uf +tOsUdnDGQpwdfSu3/8Mw9bLWUEnv6+ADRXGnXT8M/h0LqOlevZp2AlHHmg/VCkJf +GjIh+itdYjrqqG9/pgcm2nPer31b0jXYp30mmNBnCEpOz8WwoF6qcgFPnNnMo6ex +I2RtsI4fUexftYvubzW+9hddAOTCFgD5vQqYJKRE6pW7AlydEQ0vJuQ9mWz04EOx +SMjxRpEKmw3TO/QVSfU11XX6vG1RC8yqrBWlf3aV0c4bjWQuIM0izjWvam6xL+5F +sQf7opPb0GpAuQINBFhBw1sBEACwPc5HbNzvj/UF7Ty13ksDgfDTacpaGqIPuWqG +9fFpVmwDeGQ3oBjgL2IuMg7CF4ChcqocF9tFA5f3Kl6RgMV4rXDdplhW5jIc8TSX +mv6ERUxI40U5NurCNSNS7ma6AVsPgNNeTEC6EvwHu1DaZuGhACQGhkZyRJWgCttM +2tiCgDXHaFXtK+SBCKmQog3Q+4juNPP2Q/DWGKRHLdB22y4h6Ekd1icCkVrggdnh +plfB2cG3xRtPrdt/jkLD5AM0r8RyNIEHD6v8MGvLi94QsEh4YAvwnttGC2IckhNu +uvRV5gbj3PIGhmZBS5n0WlK8mB7fNtfx0LZjEHO9Z1hi5VDo93+WgvewWyW03bRE +OVgAW1R8M8L6MGHrOJWDBB2FgLWZhFcR5SfsDhUKuNDAspYsOE4ZOJcA8WHEt5Yr +uEJhzV4XZKj28H4mE8l1kRWLxAJHiHQWGgXb5LqBBu8kdntDIRxWAVVZST24QBkS +s+nkFOSp34NFY9uCS5sbN29MxkG6xX8fFZgM+9+GeSRFcAFmYQnWNyDD1zyYAkLC +JbiSDbrusEBXu9LcT50hMjay5gaYYEQ7euFATVHJgNqMw++YiLjEzKO35J9y3FI4 +rhGb9dkO/vUzx3pTZlE0DnZmyyS8NT0DNqTd6MWH+rH0DolCzuQp+pqvSzwgzRrL +ynWuLwARAQABiQI8BBgBCgAmAhsMFiEEcxxg1oDm6FDzHC6IqzOtrOcQGVIFAmB7 +J8YFCQoal+sACgkQqzOtrOcQGVJmAhAA3aIF4QQ+CwONZd67Jq88XJb4S79vx6wo +UBCtW9blmQ0dvo3NFaSbyu1fWOmG3OJxyPHa9Uabt1bl6i4vMs6akfyamFzC28vM +uk4H9FCwwKh56JPO41Xdj5ZDP8MExMG1UVj1Zz9kwDWqOBCLEqbIU2TeS0lLERF+ +LkOQ3ZsDAZgnZfbvo6ZOqscx6ktmq/dVu7vVLCBvbECitRyAaHrl6vTzyPDS+64E ++PRR3DbAN0yYMMpwsJ3nNppXHuTqCbHRjlnOmAGHRTV6pcA/MKYFptzEEdxjaZ+o +72mLvwRDeJxWLjrHO2N32iSmVoOVDQ0IyPkM/+t8Q09hxvtBahhddy1EtQRtItcg +0OnhA0eJJBAMRr9/wNG+tiJAxUm/RpyGtTerFOv3Bxu08erzAHS1IelKOjj2nNfG +gX5iT+boiWBoz3++Lts+xIXPmeiW8CeW3bbq54knD1ScA1GKYr2lbMRe/DV+PkUK +k3OEZoZT7FsZNDhE/Ifj52Brs2pYuBV7uDUxlUV1r4IFP76/isOl7IkBFGnfIfI/ +5bZdCld8zAznOXkzVzSHPD5ge0IudhAq/vn8VCQxDsx3d9JkS9rfLUz5FPTf5fl0 +EjIwx2Hg8/h6TAelvmYIUMIq5EhdY4nW74yzWUVwTryCgv4LZGwyLiDTLmJ4uxF0 +dG/puyu6c3e5Ag0EWEHDbQEQALY7vnt3MIbSUwVi9Pi8DT23kddQwaFf6oPakSy5 +U99IxwUDgdU4SQM+qddRhtdA9oQC+seMqUPLYfrIBLqIjOU7UfY/Jl2heerQ0WKD +dnlMR9UYPP/3jne2yptKfU6NJFG3/mUxUuWJwdrY6trJrF0/Ihb7aPdxD8oKeYKY +jDeW63ElY/IKrRGD7x6KedeKXaoG9WqPJLaorFm2We/38mHX9TVSgpzesWEiS8HI +28oGC6IbdrZR5Me7aeTOZUz6eGaslfsNfuSQvT/Euw2Z3c2OyusSrveS40mgr7qx +Shxg8B8ow9xZ1iAJCZRtlpA5wdBgcz94h8XyY0vjtUy+tzPlCxg8oac6wgV9Ak8c +uQBjiy8F3gq+aPmgfH4/dJphlyfS46dIxSF+u+5N/zd5f+xem5XOD89Swa4XxfVW +tx7NVGU19gUmmbcPoIUyOqojGkFvleczE2T02AEMiCO7xEqmSDT91KcocJPBy+Mt +9OxXb4yxIXa9o6Xx8RtcX42QcMYR7+/JpYmq2rEaMkXd+QyxQptPYpmQZ8pczGBp +NtPBQ5PUOg6q/4P3zw7gfju5RbR8INTl8/wPLFL4J97uOVzAzVxVpQvrgrpJES/E +uXhMOH9ag3qpd/GpaB0v5IVgEKhfueiccIBE1rV0sSRXIE6E7EjawxSqmHmPA8cf +4umLABEBAAGJAjwEGAEKACYCGyAWIQRzHGDWgOboUPMcLoirM62s5xAZUgUCYHsn +zwUJChqX4gAKCRCrM62s5xAZUioND/0aylw8RS7/fXlFAFhw58wbimmvBehFWFFR +DsoTWS51yuM+zduKAslFFwEQCucJkx/dRvymPTyQIZ53ZZ9pSZxSD2K3Lrdv887G +8y29i5oYrSNd5sdN0YS0C45ooH94/OvWcKcEEf27xBMEgax0+zsyvEPNWMwvom7o +W7JsiEujUD9lemqjWJ2stBFfOv00vkmgAHg+BDsPQyy9BGlpSbkfbEBlz1OH1kWy +9ZNBtAaPrL5xwT6S+NT0JyCWedajpoiorhVYOkm+JmXC8MX6+zx8om7QSOs309Oo +TP/4Rpz271aJwtiHiqEWD+02xbr7SbcGF8c7yBjnJZMV+O4sVwUtrnwpcZlEuzoQ +eRvOUqEt4iWMVORv8yVFaSSS6crqMqsTDpP4JajP6JOvhDWeUUchMclScXYJWLKe +cc8aSoYzqI0E+XHGdDPxIvnq0DKadvwCLbghTaPSni6e235bga8Yh6dg3rWfwPi6 +NI4DBsWARhwJVRyn5YOkTmnLMkgOal7lkbrLl+RWfJ+9W1AIzr/hFCnFZaAvM+gd +h4UJzKZHmqobr+qknfVilY/LMVmGgsTmCDcZRT3kzP5BmeBZrWQbe23BZy66jGQC +lGUFWhY2rpcBUdNCFo4R05odn0PCt1gzB2fBHLOV7GwMu3vfb22pe/zN0Rk+/ChF +9f1qWfS1d4kCMAQTAQoAGgUCWNEjngMFA3gPhjxbXj5dK1tALl0yPiQAAAoJEP1x +AF+XmpJtagMQAKiuG7wjNL1RKV0oPXphr83Hy2VDwY3rVAK15u9eV3AqM+tOpGZj +8SgFmjWtjhoRl5AOJ8846n2S7HtxlfB2iEzNCI9iMPT3oRSP0b+rmOhMLb8y2Air +qiuxz/e0AoEjz63E0btQIedzNwkY7dft/7u3xBhYCN3c7BNZJxIlMJcMD5NZVf82 +lIB8xemiKwgV/+5AI/8AHx+eU21uyd80j9j32DdTu8gvS/Hn8Hudbgl+kLOHA3Jf +ub6O+Yq+Y/E1AG0HH3gh3oSlVqdQZ5NnLJB5lhY0sSJEVkY2vK6bgC9ZDxtThX8R +YC5N7CY/IWT2mxw43TjGAViMoAV8BZbb4WecusLesPMoZYsX64JOqgn4qsj1oq0k +A+xrrmx/47X6Ixxe7v46gkGGgmU8rB9RmhawXlr4xsG0Y87Z4THzLtY5jp48gMu9 +HQXlMt2gylR/uoSmW6Gq5tu8LXjwk3i/O/y1ojkDDTOL8mUAI3BiDJ1SUl4cjOmI +2wl2gNaxqxRvx+fY/36j+1woEGKciO4M6WsZcyBLgHlK2A8xvnc79+JlU+fzLuZZ +WKGUJBv5c9o0nanBWsuV1qUSXncvKVa2o8+NvQoPcXXyD06xM1wYd6b59UmmsQsP +R8j1Y552crNuuBOgDuogg1DbWAPaj+1PAGqACPtZ5V+bqGF5HXwaFk8NiQIwBBMB +CgAaBQJY0SOhAwUDeA+GPFtePl0rW0AuXTI+JAAACgkQ/XEAX5eakm1GzRAAwODT +G4UlkKwhdXFEYMaUcFw7nsMYpurmthYSwG7EcqBvcbbQ1Wu2TWT2HXAFZu6oRYAr +6QuYl9vmSQfs9A9dAGaf71DNmnV24QG9pOnmRSEJO7A8y6qc5KIHvu+SZ43wD+KO +2vl09ZLMyDag9szeSED4VL2zrR8Zfe9iWx1LPevK7dOXyLHbicrXFqWxss0zgec5 +qT9iLmtVfSvAbI42fGzluBDlBdDPtYIYCNWPddW5wbh0pri3P+nu8IjWNxN/ko4H +UPqVG2B+Trx9NkM8vNemkQ1sE4XrNJpRy9A7goG1RuSwZHop8Zrqq5nyFxIELBPi +/pAAmylGNOSt0u/QcIDtM3moyN3lssTj2keEXobINkBFc0SNmEapEVTYTeI73dAC +IB6zb8V6f17bz8UNmqo2OecQe6wbVm2fQfD2dvyrfCCPJYbkcpyP30rRRtHx1HaY +WQz+JQrA/nGOPaG7QMIusGGj7f+yOHKPlbC3AkdLxcb7NyNTQbh9fFEzXRRg5icB +JilikJNHQgWwTeI46n+UnPZg9ADeLT/N3NrWk39MlTxAHmoCdeOPNbuXTbU3bnak +KudEh0iJ8nS2Haoxzn9izZnSLH/RUbmHEr2u0BlP2PV+zoeSlY8ybmKhXPFBACV0 +OMbHvPpN51xCPF1hXDVcTEAPmjZZZuuN0JZ82t6JAjAEEwEKABoFAljT75QDBQJ4 +D4Y8W14+XStbQC5dMj4kAAAKCRA7IM3R3BoxrV2pD/4tm4+F06/8jN1e0Dl12V+G +bgsoT34YIR+xPRNq+vGJRinwIqYUMYHNZo2rViOvOZFQVDRYyHUMXnKTZ5IbqaO9 +dT5C1OlMWvDISXl+rxEUTtzumH/TRv1aQ950MfHBQjpYq30VyNv6/Wdg5oHYmLNT +NLeughUB2yI4gHAPGabWnANYUn8izfEHvdidn+rSuBaP8fKuxF3VHRqU+Y2cyyxD +6fIYjSUpBW8EQFfvy9X1/z4QZ3HNtUYYabap/ZvBVWRgK43ELemkHI+PmKyU3Wbo +0FLWMDtQAq3cCZbQXFPe4wEOooRBmDIJv6PRsSxrdYCcG5lHd90sh7JIyscy5hJ+ +YO0SBW437aRJWCqyh3SbvxVrs5e3LM1nAysGlgoqftZ/04SXKaRZy47YoEfXC94i +xLvDE63XCWpdk9AFKJjQlNlW7XQzl5lvn8v78A/O9Ca31Kr/YnQv8jyt9X4KNhLr +RMwo/aC4XJ70gOxpVR94QPV9ffwXRlJyFc0LUBlGu5HFl+XWaSlHNdFPtHK9v27Y +ZWoNPqMxzdo3Ldtm+e4mP4A8Mgq640JDmV/sg11JwmjaE1tp9qAm2zm77+B11wVl +PiHtrctdVT/SJYpr+UUFaHjvWH8GDUPKWQ/IzZRVZjuWZi8Qe2GhKHXzekZUVGl9 +ebj4joK8GrVwV3oQvb0oWg== +=dRLN +-----END PGP PUBLIC KEY BLOCK----- +``` diff --git a/.github/autolabeler.yml b/.github/autolabeler.yml deleted file mode 100644 index 3ce5703..0000000 --- a/.github/autolabeler.yml +++ /dev/null @@ -1,2 +0,0 @@ ---- -"Type: Documentation": ["*.md", "*.j2"] diff --git a/.github/config.yml b/.github/config.yml deleted file mode 100644 index 71d2f6d..0000000 --- a/.github/config.yml +++ /dev/null @@ -1,50 +0,0 @@ ---- -# Configuration for request-info - https://github.com/behaviorbot/request-info - -# *OPTIONAL* Comment to reply with -# Can be either a string : -requestInfoReplyComment: - - "We would appreciate it if you could provide us with more info about this issue/pr!" - - "Hmmm... That issue/PR is kinda low on text. Could you please provide some more content?" - -# *OPTIONAL* default titles to check against for lack of descriptiveness -# MUST BE ALL LOWERCASE -requestInfoDefaultTitles: [] - -# *OPTIONAL* Label to be added to Issues and Pull Requests with insufficient information given -requestInfoLabelToAdd: "Incomplete" - -# *OPTIONAL* Require Pull Requests to contain more information than what is provided in the PR template -# Will fail if the pull request's body is equal to the provided template -checkPullRequestTemplate: true - -# *OPTIONAL* Only warn about insufficient information on these events type -# Keys must be lowercase. Valid values are 'issue' and 'pullRequest' -requestInfoOn: - pullRequest: true - issue: true - -# *OPTIONAL* Add a list of people whose Issues/PRs will not be commented on -# keys must be GitHub usernames -requestInfoUserstoExclude: [] - -# Configuration for new-issue-welcome - https://github.com/behaviorbot/new-issue-welcome - -# Comment to be posted to on first time issues -newIssueWelcomeComment: > - :wave: Thanks for opening your first issue here! - If you're reporting a :bug: bug, please make sure you include steps to reproduce it. - Also, logs, error messages and information about your hardware might be usefull. - -# Configuration for new-pr-welcome - https://github.com/behaviorbot/new-pr-welcome - -# Comment to be posted to on PRs from first time contributors in your repository -newPRWelcomeComment: > - :sparkling_heart: Thanks for opening this pull request! :sparkling_heart: - If your PR gets accepted and merged in, we will invite you to the project :tada: - -# Configuration for first-pr-merge - https://github.com/behaviorbot/first-pr-merge - -# Comment to be posted to on pull requests merged by a first time user -firstPRMergeComment: > - Congrats on merging your first pull request! :tada::tada::tada: diff --git a/.github/invite-contributors.yml b/.github/invite-contributors.yml deleted file mode 100644 index 25eb31a..0000000 --- a/.github/invite-contributors.yml +++ /dev/null @@ -1,10 +0,0 @@ ---- -# If true, this will add new contributors as outside collaborators -# to the repo their PR was merged in. Team name is ignored if this -# flag is set to true. -isOutside: false - -# Specify team name to add new contributors to a specific team -# within your organization. -# Use team name or team-name-slug -team: Contributors diff --git a/.github/lock.yml b/.github/lock.yml deleted file mode 100644 index 4b1e816..0000000 --- a/.github/lock.yml +++ /dev/null @@ -1,20 +0,0 @@ ---- -# Configuration for lock-threads - https://github.com/dessant/lock-threads -# Number of days of inactivity before a closed issue or pull request is locked -daysUntilLock: 30 - -# Comment to post before locking. Set to `false` to disable -lockComment: > - This thread has been automatically locked because it has not had recent - activity. Please open a new issue for related bugs and link to relevant - comments in this thread. - -# Issues or pull requests with these labels will not be locked -# exemptLabels: -# - no-locking - -# Limit to only `issues` or `pulls` -# only: issues - -# Add a label when locking. Set to `false` to disable -lockLabel: false diff --git a/.github/move.yml b/.github/move.yml deleted file mode 100644 index 0c2276a..0000000 --- a/.github/move.yml +++ /dev/null @@ -1,20 +0,0 @@ ---- -# Delete the command comment when it contains no other content -deleteCommand: true - -# Close the source issue after moving -closeSourceIssue: true - -# Lock the source issue after moving -lockSourceIssue: true - -# Mention issue and comment authors -mentionAuthors: true - -# Preserve mentions in the issue content -keepContentMentions: false - -# Set custom aliases for targets -# aliases: -# r: repo -# or: owner/repo diff --git a/.github/no-response.yml b/.github/no-response.yml deleted file mode 100644 index bb9f0f2..0000000 --- a/.github/no-response.yml +++ /dev/null @@ -1,13 +0,0 @@ ---- -# Configuration for probot-no-response - https://github.com/probot/no-response -# Number of days of inactivity before an Issue is closed for lack of response -daysUntilClose: 14 -# Label requiring a response -responseRequiredLabel: "Status: Awaiting response" -# Comment to post when closing an Issue for lack of response. Set to `false` to disable -closeComment: > - This issue has been automatically closed because there has been no response - to our request for more information from the original author. With only the - information that is currently in the issue, we don't have enough information - to take action. Please reach out if you have or find the answers we need so - that we can investigate further. diff --git a/.github/potential-duplicates.yml b/.github/potential-duplicates.yml deleted file mode 100644 index 00c7c0f..0000000 --- a/.github/potential-duplicates.yml +++ /dev/null @@ -1,14 +0,0 @@ ---- -# Label name and color to set, when potential duplicates are detected -issueLabel: "Potential duplicate" -labelColor: e6e6e6 - -# If similarity is higher than this threshold, issue will be marked as duplicate -threshold: 0.70 - -# Comment to post when potential duplicates are detected -referenceComment: > - Potential duplicates found: - {{#issues}} - - [#{{ number }}] {{ title }} ({{ accuracy }}%) - {{/issues}} diff --git a/.github/renovate.json b/.github/renovate.json new file mode 100644 index 0000000..66059a2 --- /dev/null +++ b/.github/renovate.json @@ -0,0 +1,150 @@ +{ + "$schema": "https://docs.renovatebot.com/renovate-schema.json", + "rebaseWhen": "behind-base-branch", + "dependencyDashboard": true, + "labels": ["dependencies", "no-stale"], + "commitMessagePrefix": "⬆️", + "commitMessageTopic": "{{depName}}", + "customManagers": [ + { + "customType": "regex", + "fileMatch": ["/Dockerfile$", "/build.yaml$"], + "matchStringsStrategy": "any", + "matchStrings": [ + "ARG BUILD_FROM=(?.*?):(?.*?)\\s+", + "(aarch64|amd64|armhf|armv7|i386):\\s[\"']?(?.*?):(?.*?)[\"']?\\s" + ], + "datasourceTemplate": "docker" + }, + { + "customType": "regex", + "fileMatch": ["/Dockerfile$"], + "matchStringsStrategy": "any", + "matchStrings": [ + "\\s\\s(?[a-z0-9][a-z0-9-]+)=(?[a-z0-9-:_+~.]+)\\s+" + ], + "versioningTemplate": "deb", + "datasourceTemplate": "repology", + "depNameTemplate": "debian_12/{{{replace 'openssh-client' 'openssh' package}}}" + }, + { + "customType": "regex", + "fileMatch": ["/Dockerfile$"], + "matchStrings": [ + "ARG CODE_SERVER_VERSION=[\"']?(?.+?)[\"']?\\s+" + ], + "datasourceTemplate": "github-releases", + "depNameTemplate": "cdr/code-server" + }, + { + "customType": "regex", + "fileMatch": ["/Dockerfile$"], + "matchStrings": [ + "ARG HA_CLI_VERSION=[\"']?(?.+?)[\"']?\\s+" + ], + "datasourceTemplate": "github-releases", + "depNameTemplate": "home-assistant/cli", + "versioningTemplate": "loose" + }, + { + "customType": "regex", + "fileMatch": ["vscode/vscode.extensions$"], + "matchStrings": ["emilast\\.LogFileHighlighter#(?.+)\\s"], + "datasourceTemplate": "github-releases", + "depNameTemplate": "emilast/vscode-logfile-highlighter" + }, + { + "customType": "regex", + "fileMatch": ["vscode/vscode.extensions$"], + "matchStrings": ["esbenp\\.prettier-vscode#(?.+)\\s"], + "datasourceTemplate": "github-releases", + "depNameTemplate": "prettier/prettier-vscode", + "extractVersionTemplate": "^v(?.*)$" + }, + { + "customType": "regex", + "fileMatch": ["vscode/vscode.extensions$"], + "matchStrings": ["ESPHome\\.esphome-vscode#(?.+)\\s"], + "datasourceTemplate": "github-releases", + "depNameTemplate": "esphome/esphome-vscode", + "versioningTemplate": "loose", + "extractVersionTemplate": "^v(?.*)$" + }, + { + "customType": "regex", + "fileMatch": ["vscode/vscode.extensions$"], + "matchStrings": [ + "keesschollaart\\.vscode-home-assistant#(?.+)\\s" + ], + "datasourceTemplate": "github-releases", + "depNameTemplate": "keesschollaart81/vscode-home-assistant", + "extractVersionTemplate": "^v(?.*)$" + }, + { + "customType": "regex", + "fileMatch": ["vscode/vscode.extensions$"], + "matchStrings": [ + "lukas-tr\\.materialdesignicons-intellisense#(?.+)\\s" + ], + "datasourceTemplate": "github-releases", + "depNameTemplate": "lukas-tr/vscode-materialdesignicons-intellisense", + "extractVersionTemplate": "^v(?.*)$" + }, + { + "customType": "regex", + "fileMatch": ["vscode/vscode.extensions$"], + "matchStrings": ["netcorext\\.uuid-generator#(?.+)\\s"], + "datasourceTemplate": "github-releases", + "depNameTemplate": "arenchen/vscode-uuid-generator" + }, + { + "customType": "regex", + "fileMatch": ["vscode/vscode.extensions$"], + "matchStrings": ["usernamehw\\.errorlens#(?.+)\\s"], + "datasourceTemplate": "github-releases", + "depNameTemplate": "usernamehw/vscode-error-lens", + "extractVersionTemplate": "^v(?.*)$" + } + ], + "packageRules": [ + { + "matchDatasources": ["repology"], + "automerge": true + }, + { + "groupName": "Add-on base image", + "matchDatasources": ["docker"] + }, + { + "groupName": "Add-on base image", + "matchDatasources": ["docker"], + "matchUpdateTypes": ["minor", "patch"], + "automerge": true + }, + { + "matchDatasources": ["github-releases"], + "matchDepNames": ["coder/code-server"], + "matchUpdateTypes": ["minor", "patch"], + "automerge": true + }, + { + "matchDatasources": ["github-releases"], + "matchDepNames": ["home-assistant/cli"], + "automerge": true + }, + { + "matchManagers": ["pip_requirements"], + "addLabels": ["python"] + }, + { + "matchManagers": ["pip_requirements"], + "matchDepTypes": ["dev"], + "rangeStrategy": "pin" + }, + { + "matchManagers": ["pip_requirements"], + "matchUpdateTypes": ["minor", "patch"], + "automerge": true + } + ] +} diff --git a/.github/settings.yml b/.github/settings.yml deleted file mode 100644 index 01dbf6a..0000000 --- a/.github/settings.yml +++ /dev/null @@ -1,150 +0,0 @@ ---- -repository: - description: "Visual Studio Code - Community Hass.io Add-on for Home Assistant" - homepage: https://addons.community - topics: vscode, ide, code-server, hassio-addons, hassio, hass, home-assistant, homeassistant - private: false - has_issues: true - has_projects: false - has_wiki: false - has_downloads: false - default_branch: master - allow_squash_merge: true - allow_merge_commit: false - allow_rebase_merge: true -labels: - # Priority labels - - name: "Priority: Critical" - color: ee0701 - description: "This should be dealt with ASAP. Not fixing this issue would be a serious error." - - name: "Priority: High" - color: b60205 - description: "After critical issues are fixed, these should be dealt with before any further issues." - - name: "Priority: Medium" - color: 0e8a16 - description: "This issue may be useful, and needs some attention." - - name: "Priority: Low" - color: e4ea8a - description: "Nice addition, maybe... someday..." - - # Type labels - - name: "Type: Bug" - color: ee0701 - description: "Inconsistencies or issues which will cause a problem for users or implementors." - - name: "Type: Documentation" - color: 0052cc - description: "Solely about the documentation of the project." - - name: "Type: Enhancement" - color: 1d76db - description: "Enhancement of the code, not introducing new features." - - name: "Type: Feature" - color: 0e8a16 - description: "New features or options." - - name: "Type: Support" - color: 5319e7 - description: "Marks an issue as an support ticket." - - name: "Type: Discussion" - color: d4c5f9 - description: "Marks an issue as an generic discussion ticket." - - name: "Type: Maintaince" - color: 2af79e - description: "Generic maintaince tasks, e.g., package updates." - - # Additional markers - - name: "Security" - color: ee0701 - description: "Marks an security issues that needs to be resolved asap." - - name: "Idea" - color: fef2c0 - description: "Marks an idea, which might be excepted and implemented." - - name: "Incomplete" - color: fef2c0 - description: "Marks an PR or issue that is missing information." - - name: "Pull request" - color: fbca04 - description: "There is an PR opened for this issue." - - name: "Accepted" - color: c2e0c6 - description: "This issue or PR has been accepted." - - name: "Declined" - color: f9d0c4 - description: "This issue or PR has been declined." - - name: "Potential duplicate" - color: e6e6e6 - description: "This issue has been automatically marked as a potential duplicate." - - # Ongoing Status labels - - name: "Status: Triage" - color: fbca04 - description: "This issue needs to be triaged." - - name: "Status: On hold" - color: cccccc - description: "Issue or PR that has been placed on hold for now." - - name: "Status: In progress" - color: fbca04 - description: "Issue is currently being resolved by a developer." - - name: "Status: Stale" - color: fef2c0 - description: "There has not been activity on this issue or PR for quite some time." - - name: "Status: Awaiting response" - color: fef2c0 - description: "Issue or PR awaits response from the creator." - - name: "Status: Blocked" - color: fef2c0 - description: "Progress on this issue is currently not possible." - - # Closing status labels - - name: "Closed: Known limitation" - color: e6e6e6 - description: "Issue is closed, it is a known limitation." - - name: "Closed: Expected behavior" - color: e6e6e6 - description: "Issues is closed, it is expected behavior." - - name: "Closed: Duplicate" - color: e6e6e6 - description: "Issue is closed, duplicate of an existing issue." - - name: "Closed: Invalid" - color: e6e6e6 - description: "Issue is closed, marked as not a valid issue (e.g., an user error)." - - name: "Closed: Wrong repository" - color: e6e6e6 - description: "Issue is closed, was created in the wrong repository." - - name: "Closed: Won't Fix" - color: e6e6e6 - description: "Issue is closed, it won't be fixed." - - name: "Closed: Done" - color: c2e0c6 - description: "Issue closed, work on this issue has been marked complete." - - # Others - - name: "Beginner Friendly" - color: 0e8a16 - description: "Good first issue for people wanting to contribute to the project." - - name: "Help wanted" - color: 0e8a16 - description: "We need some extra helping hands or expertise in order to resolve this." - - name: "Hacktoberfest" - description: "Issues/PRs are participating in the Hacktoberfest" - color: fbca04 - -branches: - - name: master - protection: - required_pull_request_reviews: - # required_approving_review_count: 1 - dismiss_stale_reviews: true - require_code_owner_reviews: true - dismissal_restrictions: - users: [] - teams: - - Admins - - Masters - required_status_checks: - strict: false - contexts: [] - enforce_admins: false - restrictions: - users: [] - teams: - - Admins - - Masters diff --git a/.github/stale.yml b/.github/stale.yml deleted file mode 100644 index 36938bb..0000000 --- a/.github/stale.yml +++ /dev/null @@ -1,61 +0,0 @@ ---- -# Configuration for probot-stale - https://github.com/probot/stale - -# Number of days of inactivity before an Issue or Pull Request becomes stale -daysUntilStale: 60 - -# Number of days of inactivity before a stale Issue or Pull Request is closed. -# Set to false to disable. If disabled, issues still need to be closed manually, but will remain marked as stale. -daysUntilClose: 7 - -# Issues or Pull Requests with these labels will never be considered stale. Set to `[]` to disable -exemptLabels: - - "Status: On hold" - - "Status: In progress" - - "Status: Awaiting response" - - "Status: Blocked" - - "Idea" - - "Security" - -# Set to true to ignore issues in a project (defaults to false) -exemptProjects: false - -# Set to true to ignore issues in a milestone (defaults to false) -exemptMilestones: false - -# Label to use when marking as stale -staleLabel: "Status: Stale" - -# Comment to post when marking as stale. Set to `false` to disable -markComment: > - This issue has been automatically marked as stale because it has not had - recent activity. It will be closed if no further activity occurs. Thank you - for your contributions. - -# Comment to post when removing the stale label. -# unmarkComment: > -# Your comment here. -unmarkComment: false - -# Comment to post when closing a stale Issue or Pull Request. -# closeComment: > -# Your comment here. -closeComment: false - -# Limit the number of actions per hour, from 1-30. Default is 30 -limitPerRun: 30 - -# Limit to only `issues` or `pulls` -only: issues - -# Optionally, specify configuration settings that are specific to just 'issues' or 'pulls': -# pulls: -# daysUntilStale: 30 -# markComment: > -# This pull request has been automatically marked as stale because it has not had -# recent activity. It will be closed if no further activity occurs. Thank you -# for your contributions. - -# issues: -# exemptLabels: -# - confirmed diff --git a/.github/support.yml b/.github/support.yml deleted file mode 100644 index 27e688f..0000000 --- a/.github/support.yml +++ /dev/null @@ -1,22 +0,0 @@ ---- -# Configuration for support-requests - https://github.com/dessant/support-requests - -# Label used to mark issues as support requests -supportLabel: "Type: Support" - -# Comment to post on issues marked as support requests. Add a link -# to a support page, or set to `false` to disable -supportComment: > - :wave: We use the issue tracker exclusively for bug reports and feature requests. - However, this issue appears to be a support request. Please use our - support channels to get help with the project. - - Head over to the - [Home Assistant community forum](https://community.home-assistant.io/?u=frenck) - or join our [Discord](https://discord.me/hassioaddons) chat. - -# Close issues marked as support requests -close: true - -# Lock issues marked as support requests -lock: false diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml new file mode 100644 index 0000000..60ce9a5 --- /dev/null +++ b/.github/workflows/ci.yaml @@ -0,0 +1,16 @@ +--- +name: CI + +# yamllint disable-line rule:truthy +on: + push: + pull_request: + types: + - opened + - reopened + - synchronize + workflow_dispatch: + +jobs: + workflows: + uses: hassio-addons/workflows/.github/workflows/addon-ci.yaml@main diff --git a/.github/workflows/deploy.yaml b/.github/workflows/deploy.yaml new file mode 100644 index 0000000..21b20da --- /dev/null +++ b/.github/workflows/deploy.yaml @@ -0,0 +1,19 @@ +--- +name: Deploy + +# yamllint disable-line rule:truthy +on: + release: + types: + - published + workflow_run: + workflows: ["CI"] + branches: [main] + types: + - completed + +jobs: + workflows: + uses: hassio-addons/workflows/.github/workflows/addon-deploy.yaml@main + secrets: + DISPATCH_TOKEN: ${{ secrets.DISPATCH_TOKEN }} diff --git a/.github/workflows/labels.yaml b/.github/workflows/labels.yaml new file mode 100644 index 0000000..8691ec9 --- /dev/null +++ b/.github/workflows/labels.yaml @@ -0,0 +1,12 @@ +--- +name: Sync labels + +# yamllint disable-line rule:truthy +on: + schedule: + - cron: "34 5 * * *" + workflow_dispatch: + +jobs: + workflows: + uses: hassio-addons/workflows/.github/workflows/labels.yaml@main diff --git a/.github/workflows/lock.yaml b/.github/workflows/lock.yaml new file mode 100644 index 0000000..1d4303c --- /dev/null +++ b/.github/workflows/lock.yaml @@ -0,0 +1,12 @@ +--- +name: Lock + +# yamllint disable-line rule:truthy +on: + schedule: + - cron: "0 9 * * *" + workflow_dispatch: + +jobs: + workflows: + uses: hassio-addons/workflows/.github/workflows/lock.yaml@main diff --git a/.github/workflows/pr-labels.yaml b/.github/workflows/pr-labels.yaml new file mode 100644 index 0000000..393617b --- /dev/null +++ b/.github/workflows/pr-labels.yaml @@ -0,0 +1,15 @@ +--- +name: PR Labels + +# yamllint disable-line rule:truthy +on: + pull_request_target: + types: + - opened + - labeled + - unlabeled + - synchronize + +jobs: + workflows: + uses: hassio-addons/workflows/.github/workflows/pr-labels.yaml@main diff --git a/.github/workflows/release-drafter.yaml b/.github/workflows/release-drafter.yaml new file mode 100644 index 0000000..5769e10 --- /dev/null +++ b/.github/workflows/release-drafter.yaml @@ -0,0 +1,12 @@ +--- +name: Release Drafter + +# yamllint disable-line rule:truthy +on: + push: + branches: + - main + +jobs: + workflows: + uses: hassio-addons/workflows/.github/workflows/release-drafter.yaml@main diff --git a/.github/workflows/stale.yaml b/.github/workflows/stale.yaml new file mode 100644 index 0000000..31e1542 --- /dev/null +++ b/.github/workflows/stale.yaml @@ -0,0 +1,12 @@ +--- +name: Stale + +# yamllint disable-line rule:truthy +on: + schedule: + - cron: "0 8 * * *" + workflow_dispatch: + +jobs: + workflows: + uses: hassio-addons/workflows/.github/workflows/stale.yaml@main diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml deleted file mode 100644 index 05f61df..0000000 --- a/.gitlab-ci.yml +++ /dev/null @@ -1,16 +0,0 @@ ---- -include: https://raw.githubusercontent.com/hassio-addons/organization/master/gitlabci/addon.yml - -variables: - ADDON_GITHUB_REPO: "hassio-addons/addon-vscode" - ADDON_SLUG: "vscode" - ADDON_TARGET: "vscode" - - ADDON_LEGACY_TAGS: "true" - - ADDON_AARCH64: "false" - ADDON_ARMHF: "false" - ADDON_ARMV7: "false" - ADDON_I386: "false" - - ADDON_AMD64_BASE: "hassioaddons/ubuntu-base-amd64:3.0.0" diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md deleted file mode 100644 index 0ac232b..0000000 --- a/CODE_OF_CONDUCT.md +++ /dev/null @@ -1,74 +0,0 @@ -# Code of conduct - -## Our pledge - -In the interest of fostering an open and welcoming environment, we as -contributors and maintainers pledge to making participation in our project and -our community a harassment-free experience for everyone, regardless of age, body -size, disability, ethnicity, gender identity and expression, level of experience, -nationality, personal appearance, race, religion, or sexual identity and -orientation. - -## Our standards - -Examples of behavior that contributes to creating a positive environment -include: - -- Using welcoming and inclusive language -- Being respectful of differing viewpoints and experiences -- Gracefully accepting constructive criticism -- Focusing on what is best for the community -- Showing empathy towards other community members - -Examples of unacceptable behavior by participants include: - -- The use of sexualized language or imagery and unwelcome sexual attention - or advances -- Trolling, insulting/derogatory comments, and personal or political attacks -- Public or private harassment -- Publishing others' private information, such as a physical or - electronic address, without explicit permission -- Other conduct which could reasonably be considered inappropriate - in a professional setting - -## Our responsibilities - -Project maintainers are responsible for clarifying the standards of acceptable -behavior and are expected to take appropriate and fair corrective action in -response to any instances of unacceptable behavior. - -Project maintainers have the right and responsibility to remove, edit, or -reject comments, commits, code, wiki edits, issues, and other contributions -that are not aligned to this Code of Conduct, or to ban temporarily or -permanently any contributor for other behaviors that they deem inappropriate, -threatening, offensive, or harmful. - -## Scope - -This Code of Conduct applies both within project spaces and in public spaces -when an individual is representing the project or its community. Examples of -representing a project or community include using an official project e-mail -address, posting via an official social media account, or acting as an appointed -representative at an online or offline event. Representation of a project may be -further defined and clarified by project maintainers. - -## Enforcement - -Instances of abusive, harassing, or otherwise unacceptable behavior may be -reported by contacting the project lead at frenck@addons.community. All -complaints will be reviewed and investigated and will result in a response that -is deemed necessary and appropriate to the circumstances. The project lead is -obligated to maintain confidentiality with regard to the reporter of an incident. -Further details of specific enforcement policies may be posted separately. - -Project maintainers who do not follow or enforce the Code of Conduct in good -faith may face temporary or permanent repercussions as determined by other -members of the project's leadership. - -## Attribution - -This Code of Conduct is adapted from the [Contributor Covenant][homepage], -version 1.4, available at [http://contributor-covenant.org/version/1/4][version] - -[homepage]: http://contributor-covenant.org -[version]: http://contributor-covenant.org/version/1/4/ diff --git a/LICENSE.md b/LICENSE.md index 05c00f7..04e4457 100644 --- a/LICENSE.md +++ b/LICENSE.md @@ -1,6 +1,6 @@ # MIT License -Copyright (c) 2019 Franck Nijhof +Copyright (c) 2019-2025 Franck Nijhof Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/README.md b/README.md index b41a5c1..82f1055 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Community Hass.io Add-ons: Visual Studio Code +# Home Assistant Community Add-on: Studio Code Server [![GitHub Release][releases-shield]][releases] ![Project Stage][project-stage-shield] @@ -10,189 +10,33 @@ ![Supports armv7 Architecture][armv7-shield] ![Supports i386 Architecture][i386-shield] -[![GitLab CI][gitlabci-shield]][gitlabci] +[![Github Actions][github-actions-shield]][github-actions] ![Project Maintenance][maintenance-shield] [![GitHub Activity][commits-shield]][commits] [![Discord][discord-shield]][discord] [![Community Forum][forum-shield]][forum] -[![Buy me a coffee][buymeacoffee-shield]][buymeacoffee] +[![Sponsor Frenck via GitHub Sponsors][github-sponsors-shield]][github-sponsors] -[![Support my work on Patreon][patreon-shield]][patreon] +[![Support Frenck on Patreon][patreon-shield]][patreon] -Visual Studio Code, accessible through the browser. +A VSCode experience, accessible through the browser. + +![Studio Code Server in the Home Assistant Frontend](images/screenshot.png) ## About -This add-on runs Visual Studio Code, allowing you to edit your Home Assistant -configuration directly from your web browser and can be embedded straight -into the Home Assistant frontend UI. +This add-on runs [code-server](https://github.com/cdr/code-server), which +gives you a Visual Studio Code experience straight from the browser. It allows +you to edit your Home Assistant configuration directly from your web browser, +directly from within the Home Assistant frontend. -Visual Studio Code runs as a remote server using `code-server`, and is a -fully fledged VSCode experience. - -The add-on has the Home Assistant and MDI icons extensions pre-installed +The add-on has the Home Assistant, MDI icons and YAML extensions pre-installed and pre-configured right out of the box. This means that auto-completion works instantly, without the need for configuring anything. -![Visual Studio Code in the Home Assistant Frontend](images/screenshot.png) - -## Installation - -The installation of this add-on is pretty straightforward and not different in -comparison to installing any other Hass.io add-on. - -1. [Add our Hass.io add-ons repository][repository] to your Hass.io instance. -1. Install the "Visual Studio Code" add-on. -1. Configure a "password" in the add-on settings. -1. Start the "Visual Studio Code" add-on. -1. Check the logs of the "Visual Studio Code" add-on to see if everything went - well. - -**NOTE**: Do not add this repository to Hass.io, please use: -`https://github.com/hassio-addons/repository`. - -## Configuration - -**Note**: _Remember to restart the add-on when the configuration is changed._ - -Example add-on configuration: - -```json -{ - "log_level": "info", - "password": "ChooChooHomie", - "ssl": false, - "certfile": "fullchain.pem", - "keyfile": "privkey.pem", - "packages": [ - "mariadb-client" - ], - "init_commands": [ - "pip3 install yamllint" - ] -} -``` - -**Note**: _This is just an example, don't copy and paste it! Create your own!_ - -### Option: `log_level` - -The `log_level` option controls the level of log output by the addon and can -be changed to be more or less verbose, which might be useful when you are -dealing with an unknown issue. Possible values are: - -- `trace`: Show every detail, like all called internal functions. -- `debug`: Shows detailed debug information. -- `info`: Normal (usually) interesting events. -- `warning`: Exceptional occurrences that are not errors. -- `error`: Runtime errors that do not require immediate action. -- `fatal`: Something went terribly wrong. Add-on becomes unusable. - -Please note that each level automatically includes log messages from a -more severe level, e.g., `debug` also shows `info` messages. By default, -the `log_level` is set to `info`, which is the recommended setting unless -you are troubleshooting. - -### Option: `password` - -Password needed to login into the Visual Studio Code. - -**Note**: _This option support secrets, e.g., `!secret vscode_password`._ - -### Option: `ssl` - -Enables/Disables SSL (HTTPS). Set it `true` to enable it, `false` otherwise. - -### Option: `certfile` - -The certificate file to use for SSL. - -**Note**: _The file MUST be stored in `/ssl/`, which is default for Hass.io_ - -### Option: `keyfile` - -The private key file to use for SSL. - -**Note**: _The file MUST be stored in `/ssl/`, which is default for Hass.io_ - -### Option: `packages` - -Allows you to specify additional [Ubuntu packages][ubuntu-packages] to be -installed in your shell environment (e.g., Python, PHP, Go). - -**Note**: _Adding many packages will result in a longer start-up -time for the add-on._ - -### Option: `init_commands` - -Customize your VSCode environment even more with the `init_commands` option. -Add one or more shell commands to the list, and they will be executed every -single time this add-on starts. - -### Option: `leave_front_door_open` - -Adding this option to the add-on configuration allows you to disable -authentication on the VSCode by setting it to `true`. - -**Note**: _We STRONGLY suggest, not to use this, even if this add-on is -only exposed to your internal network. USE AT YOUR OWN RISK!_ - -### Option: `i_like_to_be_pwned` - -Adding this option to the add-on configuration allows to you bypass the -HaveIBeenPwned password requirement by setting it to `true`. - -**Note**: _We STRONGLY suggest picking a stronger/safer password instead of -using this option! USE AT YOUR OWN RISK!_ - -## Embedding into Home Assistant - -It is possible to embed VSCode directly into Home Assistant, allowing -you to access your VSCode through the Home Assistant frontend. - -Home Assistant provides the `panel_iframe` component, for these purposes. - -Example configuration: - -```yaml -panel_iframe: - vscode: - title: Visual Studio Code - icon: mdi:visual-studio-code - url: https://address.to.your.hass.io:1337 -``` - -## Known issues and limitations - -- This add-on currently only supports AMD64 machines, although we hope - we are able to support ARM devices in the future, it is most likely that - most devices will lack the resources to run this add-on (e.g., Raspberry Pi). -- "Visual Studio Code is unable to watch for file changes in this large - workspace" (error ENOSPC) - - This issue is caused by your system not having enough file handles, - which causes VSCode to be unable to watch all your files. For HassOS, - currently the only option is to click on the little cog when the - notification appears and tell it to not show again. In case you have - a generic Linux setup (e.g., Ubuntu), follow this guide by Microsoft: - - - -## Changelog & Releases - -This repository keeps a change log using [GitHub's releases][releases] -functionality. The format of the log is based on -[Keep a Changelog][keepchangelog]. - -Releases are based on [Semantic Versioning][semver], and use the format -of ``MAJOR.MINOR.PATCH``. In a nutshell, the version will be incremented -based on the following: - -- ``MAJOR``: Incompatible or major changes. -- ``MINOR``: Backwards-compatible new features and enhancements. -- ``PATCH``: Backwards-compatible bugfixes and package updates. +[:books: Read the full add-on documentation][docs] ## Support @@ -200,7 +44,7 @@ Got questions? You have several options to get them answered: -- The [Community Hass.io Add-ons Discord chat server][discord] for add-on +- The [Home Assistant Community Add-ons Discord chat server][discord] for add-on support and feature requests. - The [Home Assistant Discord chat server][discord-ha] for general Home Assistant discussions and questions. @@ -215,7 +59,7 @@ This is an active open-source project. We are always open to people who want to use the code or contribute to it. We have set up a separate document containing our -[contribution guidelines](CONTRIBUTING.md). +[contribution guidelines](.github/CONTRIBUTING.md). Thank you for being involved! :heart_eyes: @@ -226,18 +70,18 @@ The original setup of this repository is by [Franck Nijhof][frenck]. For a full list of all authors and contributors, check [the contributor's page][contributors]. -## We have got some Hass.io add-ons for you +## We have got some Home Assistant add-ons for you -Want some more functionality to your Hass.io Home Assistant instance? +Want some more functionality to your Home Assistant instance? -We have created multiple add-ons for Hass.io. For a full list, check out +We have created multiple add-ons for Home Assistant. For a full list, check out our [GitHub Repository][repository]. ## License MIT License -Copyright (c) 2019 Franck Nijhof +Copyright (c) 2019-2025 Franck Nijhof Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -257,35 +101,32 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -[aarch64-shield]: https://img.shields.io/badge/aarch64-no-red.svg +[aarch64-shield]: https://img.shields.io/badge/aarch64-yes-green.svg [amd64-shield]: https://img.shields.io/badge/amd64-yes-green.svg [armhf-shield]: https://img.shields.io/badge/armhf-no-red.svg [armv7-shield]: https://img.shields.io/badge/armv7-no-red.svg -[buymeacoffee-shield]: https://www.buymeacoffee.com/assets/img/guidelines/download-assets-sm-2.svg -[buymeacoffee]: https://www.buymeacoffee.com/frenck [commits-shield]: https://img.shields.io/github/commit-activity/y/hassio-addons/addon-vscode.svg -[commits]: https://github.com/hassio-addons/addon-vscode/commits/master +[commits]: https://github.com/hassio-addons/addon-vscode/commits/main [contributors]: https://github.com/hassio-addons/addon-vscode/graphs/contributors [discord-ha]: https://discord.gg/c5DvZ4e [discord-shield]: https://img.shields.io/discord/478094546522079232.svg [discord]: https://discord.me/hassioaddons +[docs]: https://github.com/hassio-addons/addon-vscode/blob/main/vscode/DOCS.md [forum-shield]: https://img.shields.io/badge/community-forum-brightgreen.svg -[forum]: https://community.home-assistant.io/?u=frenck +[forum]: https://community.home-assistant.io/t/home-assistant-community-add-on-visual-studio-code/107863?u=frenck [frenck]: https://github.com/frenck -[gitlabci-shield]: https://gitlab.com/hassio-addons/addon-vscode/badges/master/pipeline.svg -[gitlabci]: https://gitlab.com/hassio-addons/addon-vscode/pipelines -[home-assistant]: https://home-assistant.io +[github-actions-shield]: https://github.com/hassio-addons/addon-vscode/workflows/CI/badge.svg +[github-actions]: https://github.com/hassio-addons/addon-vscode/actions +[github-sponsors-shield]: https://frenck.dev/wp-content/uploads/2019/12/github_sponsor.png +[github-sponsors]: https://github.com/sponsors/frenck [i386-shield]: https://img.shields.io/badge/i386-no-red.svg [issue]: https://github.com/hassio-addons/addon-vscode/issues -[keepchangelog]: http://keepachangelog.com/en/1.0.0/ [license-shield]: https://img.shields.io/github/license/hassio-addons/addon-vscode.svg -[maintenance-shield]: https://img.shields.io/maintenance/yes/2019.svg -[patreon-shield]: https://www.frenck.nl/images/patreon.png +[maintenance-shield]: https://img.shields.io/maintenance/yes/2025.svg +[patreon-shield]: https://frenck.dev/wp-content/uploads/2019/12/patreon.png [patreon]: https://www.patreon.com/frenck -[project-stage-shield]: https://img.shields.io/badge/project%20stage-experimental-yellow.svg +[project-stage-shield]: https://img.shields.io/badge/project%20stage-production%20ready-brightgreen.svg [reddit]: https://reddit.com/r/homeassistant [releases-shield]: https://img.shields.io/github/release/hassio-addons/addon-vscode.svg [releases]: https://github.com/hassio-addons/addon-vscode/releases [repository]: https://github.com/hassio-addons/repository -[semver]: http://semver.org/spec/v2.0.0.htm -[ubuntu-packages]: https://packages.ubuntu.com diff --git a/renovate.json b/renovate.json deleted file mode 100644 index 2b8ed04..0000000 --- a/renovate.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "extends": [ - "config:base" - ], - "commitMessageAction": "Updates", - "commitMessageTopic": "{{depName}}", - "commitMessagePrefix": ":arrow_up:", - "labels": [ - "Type: Maintaince" - ] -} diff --git a/vscode/.README.j2 b/vscode/.README.j2 index 09355e2..54cbbe1 100644 --- a/vscode/.README.j2 +++ b/vscode/.README.j2 @@ -1,12 +1,12 @@ -# Community Hass.io Add-ons: Visual Studio Code +# Home Assistant Community Add-on: Visual Studio Code [![Release][release-shield]][release] ![Project Stage][project-stage-shield] ![Project Maintenance][maintenance-shield] [![Discord][discord-shield]][discord] [![Community Forum][forum-shield]][forum] -[![Buy me a coffee][buymeacoffee-shield]][buymeacoffee] +[![Sponsor Frenck via GitHub Sponsors][github-sponsors-shield]][github-sponsors] -[![Support my work on Patreon][patreon-shield]][patreon] +[![Support Frenck on Patreon][patreon-shield]][patreon] Visual Studio Code, accessible through the browser. @@ -19,19 +19,17 @@ into the Home Assistant frontend UI. Visual Studio Code runs as a remote server using `code-server`, and is a fully fledged VSCode experience. -The add-on has the Home Assistant and MDI icons extensions pre-installed -and pre-configured right out of the box. This means that autocompletion works +The add-on has the Home Assistant, MDI icons and YAML extensions pre-installed +and pre-configured right out of the box. This means that auto-completion works instantly, without the need for configuring anything. -[Click here for the full documentation][docs] - -![Visual Studio Code in the Home Assistant Frontend][screenshot] +![Studio Code Server in the Home Assistant Frontend][screenshot] {% if channel == "edge" %} ## WARNING! THIS IS AN EDGE VERSION! -This Hass.io Add-ons repository contains edge builds of add-ons. Edge builds -add-ons are based upon the latest development version. +This Home Assistant Add-ons repository contains edge builds of add-ons. +Edge builds add-ons are based upon the latest development version. - They may not work at all. - They might stop working at any time. @@ -51,7 +49,7 @@ If you are more interested in stable releases of our add-ons: {% if channel == "beta" %} ## WARNING! THIS IS A BETA VERSION! -This Hass.io Add-ons repository contains beta releases of add-ons. +This Home Assistant Add-ons repository contains beta releases of add-ons. - They might stop working at any time. - They could have a negative impact on your system. @@ -66,17 +64,16 @@ If you are more interested in stable releases of our add-ons: {% endif %} -[buymeacoffee-shield]: https://www.buymeacoffee.com/assets/img/guidelines/download-assets-sm-2.svg -[buymeacoffee]: https://www.buymeacoffee.com/frenck [discord-shield]: https://img.shields.io/discord/478094546522079232.svg [discord]: https://discord.me/hassioaddons -[docs]: {{ repo }}/blob/{{ version }}/README.md [forum-shield]: https://img.shields.io/badge/community-forum-brightgreen.svg -[forum]: https://community.home-assistant.io/?u=frenck -[maintenance-shield]: https://img.shields.io/maintenance/yes/2019.svg -[patreon-shield]: https://www.frenck.nl/images/patreon.png +[forum]: https://community.home-assistant.io/t/home-assistant-community-add-on-visual-studio-code/107863?u=frenck +[github-sponsors-shield]: https://frenck.dev/wp-content/uploads/2019/12/github_sponsor.png +[github-sponsors]: https://github.com/sponsors/frenck +[maintenance-shield]: https://img.shields.io/maintenance/yes/2025.svg +[patreon-shield]: https://frenck.dev/wp-content/uploads/2019/12/patreon.png [patreon]: https://www.patreon.com/frenck -[project-stage-shield]: https://img.shields.io/badge/project%20stage-experimental-yellow.svg +[project-stage-shield]: https://img.shields.io/badge/project%20stage-production%20ready-brightgreen.svg [release-shield]: https://img.shields.io/badge/version-{{ version }}-blue.svg [release]: {{ repo }}/tree/{{ version }} -[screenshot]: {{ repo }}/raw/master/images/screenshot.png +[screenshot]: {{ repo }}/raw/main/images/screenshot.png diff --git a/vscode/DOCS.md b/vscode/DOCS.md new file mode 100644 index 0000000..4670bf0 --- /dev/null +++ b/vscode/DOCS.md @@ -0,0 +1,188 @@ +# Home Assistant Community Add-on: Studio Code Server + +This add-on runs [code-server](https://github.com/coder/code-server), which +gives you a Visual Studio Code experience straight from the browser. It allows +you to edit your Home Assistant configuration directly from your web browser, +directly from within the Home Assistant frontend. + +The add-on has the Home Assistant, MDI icons and YAML extensions pre-installed +and pre-configured right out of the box. This means that auto-completion works +instantly, without the need for configuring anything. + +## Installation + +The installation of this add-on is pretty straightforward and not different in +comparison to installing any other Home Assistant add-on. + +1. Click the Home Assistant My button below to open the add-on on your Home + Assistant instance. + + [![Open this add-on in your Home Assistant instance.][addon-badge]][addon] + +1. Click the "Install" button to install the add-on. +1. Start the "Studio Code Server" add-on. +1. Check the logs of the "Studio Code Server" add-on to see if everything went + well. +1. Click the "OPEN WEB UI" button to open Studio Code Server. + +## Configuration + +**Note**: _Remember to restart the add-on when the configuration is changed._ + +Example add-on configuration: + +```yaml +log_level: info +config_path: /share/my_path +packages: + - mariadb-client +init_commands: + - ls -la +``` + +**Note**: _This is just an example, don't copy and paste it! Create your own!_ + +### Option: `log_level` + +The `log_level` option controls the level of log output by the addon and can +be changed to be more or less verbose, which might be useful when you are +dealing with an unknown issue. Possible values are: + +- `trace`: Show every detail, like all called internal functions. +- `debug`: Shows detailed debug information. +- `info`: Normal (usually) interesting events. +- `warning`: Exceptional occurrences that are not errors. +- `error`: Runtime errors that do not require immediate action. +- `fatal`: Something went terribly wrong. Add-on becomes unusable. + +Please note that each level automatically includes log messages from a +more severe level, e.g., `debug` also shows `info` messages. By default, +the `log_level` is set to `info`, which is the recommended setting unless +you are troubleshooting. + +### Option: `config_path` + +This option allows you to override the default path the add-on will open +when accessing the web interface. For example, use a different +configuration directory like `/share/myconfig` instead of `/config`. If set +to `/root` then all the common folders of HA such as `/config`, `/ssl`, +`/share`, etc. will appear as subfolders for each access. + +When not configured, the addon will automatically use the default: `/config` + +### Option: `packages` + +Allows you to specify additional [Ubuntu packages][ubuntu-packages] to be +installed in your shell environment (e.g., Python, PHP, Go). + +**Note**: _Adding many packages will result in a longer start-up +time for the add-on._ + +### Option: `init_commands` + +Customize your VSCode environment even more with the `init_commands` option. +Add one or more shell commands to the list, and they will be executed every +single time this add-on starts. + +## Resetting your VSCode settings to the add-on defaults + +The add-on updates your settings to be optimized for use with Home Assistant. +As soon as you change a setting, the add-on will stop doing that since it +might be destructive. However, in case you changed some things, but want to +return to the defaults as delivered by this add-on, do the following: + +1. Open the Visual Studio Code editor. +1. Click on `Terminal` in the top menu bar and click on `New Terminal`. +1. Execute the following command in the terminal window: `reset-settings`. +1. Done! + +## Known issues and limitations + +- Can this add-on run on a Raspberry Pi? Yes, but only if you run a 64 bits + operating system. Also, see point below. +- This add-on currently only supports AMD64 and aarch64/ARM64 machines. + Although we support ARM devices, please be aware, that this add-on is quite + heavy to run, and requires quite a bit of RAM. We do not recommended to run + it on devices with less than 4Gb of memory. +- "Visual Studio Code is unable to watch for file changes in this large + workspace" (error ENOSPC) + + This issue is caused by your system not having enough file handles, + which causes VSCode to be unable to watch all your files. For HassOS, + currently the only option is to click on the little cog when the + notification appears and tell it to not show again. In case you have + a generic Linux setup (e.g., Ubuntu), follow this guide by Microsoft: + + + +## Changelog & Releases + +This repository keeps a change log using [GitHub's releases][releases] +functionality. + +Releases are based on [Semantic Versioning][semver], and use the format +of `MAJOR.MINOR.PATCH`. In a nutshell, the version will be incremented +based on the following: + +- `MAJOR`: Incompatible or major changes. +- `MINOR`: Backwards-compatible new features and enhancements. +- `PATCH`: Backwards-compatible bugfixes and package updates. + +## Support + +Got questions? + +You have several options to get them answered: + +- The [Home Assistant Community Add-ons Discord chat server][discord] for add-on + support and feature requests. +- The [Home Assistant Discord chat server][discord-ha] for general Home + Assistant discussions and questions. +- The Home Assistant [Community Forum][forum]. +- Join the [Reddit subreddit][reddit] in [/r/homeassistant][reddit] + +You could also [open an issue here][issue] GitHub. + +## Authors & contributors + +The original setup of this repository is by [Franck Nijhof][frenck]. + +For a full list of all authors and contributors, +check [the contributor's page][contributors]. + +## License + +MIT License + +Copyright (c) 2019-2025 Franck Nijhof + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +[addon-badge]: https://my.home-assistant.io/badges/supervisor_addon.svg +[addon]: https://my.home-assistant.io/redirect/supervisor_addon/?addon=a0d7b954_vscode&repository_url=https%3A%2F%2Fgithub.com%2Fhassio-addons%2Frepository +[contributors]: https://github.com/hassio-addons/addon-vscode/graphs/contributors +[discord-ha]: https://discord.gg/c5DvZ4e +[discord]: https://discord.me/hassioaddons +[forum]: https://community.home-assistant.io/t/home-assistant-community-add-on-visual-studio-code/107863?u=frenck +[frenck]: https://github.com/frenck +[issue]: https://github.com/hassio-addons/addon-vscode/issues +[reddit]: https://reddit.com/r/homeassistant +[releases]: https://github.com/hassio-addons/addon-vscode/releases +[semver]: https://semver.org/spec/v2.0.0 +[ubuntu-packages]: https://packages.ubuntu.com diff --git a/vscode/Dockerfile b/vscode/Dockerfile index 9b7a4bc..4eea0cc 100755 --- a/vscode/Dockerfile +++ b/vscode/Dockerfile @@ -1,49 +1,13 @@ -ARG BUILD_FROM=hassioaddons/ubuntu-base:3.0.0 -############################################################################### -# Build container to get custom vscode extensions. -############################################################################### -# hadolint ignore=DL3006 -FROM ${BUILD_FROM} as vscode - -# Copy in extensions list -COPY vscode.extensions /root/vscode.extensions - -# Install the actual VSCode to download configs and extensions -# hadolint ignore=DL3015 -RUN \ - apt-get update \ - \ - && apt-get install -y --no-install-recommends \ - libx11-xcb1=2:1.6.4-3ubuntu0.2 \ - libasound2=1.1.3-5ubuntu0.2 \ - \ - && curl \ - -o vscode-amd64.deb \ - -L https://vscode-update.azurewebsites.net/latest/linux-deb-x64/stable \ - \ - && dpkg -i vscode-amd64.deb || true \ - && apt-get install -y -f \ - && rm -f vscode-amd64.deb \ - \ - && code -v --user-data-dir /root/.config/Code - -RUN \ - while read -r ext; do \ - echo "Installing vscode extension: ${ext}"; \ - code --user-data-dir /root/.config/Code --install-extension "${ext}"; \ - done < /root/vscode.extensions \ - && ls -la /root/.vscode/extensions - -############################################################################### -# Build the actual add-on. -############################################################################### +ARG BUILD_FROM=ghcr.io/hassio-addons/debian-base:7.8.2 # hadolint ignore=DL3006 FROM ${BUILD_FROM} # Confiure locale ENV \ LANG=en_US.UTF-8 \ - LC_ALL=en_US.UTF-8 + LANGUAGE=en_US:en \ + LC_ALL=en_US.UTF-8 \ + PIP_BREAK_SYSTEM_PACKAGES=1 # Set shell SHELL ["/bin/bash", "-o", "pipefail", "-c"] @@ -51,56 +15,92 @@ SHELL ["/bin/bash", "-o", "pipefail", "-c"] # Copy Python requirements file COPY requirements.txt /tmp/requirements.txt +# Copy in extensions list +COPY vscode.extensions /root/vscode.extensions + # Setup base system -ARG BUILD_ARCH +ARG BUILD_ARCH=amd64 +ARG CODE_SERVER_VERSION="v4.99.3" +ARG HA_CLI_VERSION="4.38.0" +# hadolint ignore=SC2181, DL3008 RUN \ apt-get update \ \ && apt-get install -y --no-install-recommends \ - build-essential=12.4ubuntu1 \ - colordiff=1.0.18-1 \ - git=1:2.17.1-1ubuntu0.4 \ - libnginx-mod-http-lua=1.14.0-0ubuntu1.2 \ - locales=2.27-3ubuntu1 \ - luarocks=2.4.2+dfsg-1 \ - mosquitto-clients=1.4.15-2ubuntu0.18.04.2 \ - net-tools=1.60+git20161116.90da8a0-1ubuntu1 \ - nginx=1.14.0-0ubuntu1.2 \ - nmap=7.60-1ubuntu5 \ - openssh-client=1:7.6p1-4ubuntu0.3 \ - openssl=1.1.0g-2ubuntu4.3 \ - python3-dev=3.6.7-1~18.04 \ - python3=3.6.7-1~18.04 \ - wget=1.19.4-1ubuntu2.1 \ - zsh=5.4.2-3ubuntu3.1 \ + ack=3.6.0-1 \ + libarchive-tools=3.6.2-1+deb12u2 \ + build-essential=12.9 \ + colordiff=1.0.20-1 \ + git=1:2.39.5-0+deb12u2 \ + iputils-ping=3:20221126-1+deb12u1 \ + locales=2.36-9+deb12u7 \ + mariadb-client=1:10.11.11-0+deb12u1 \ + mosquitto-clients=2.0.11-1.2+deb12u1 \ + net-tools=2.10-0.1 \ + nmap=7.93+dfsg1-1 \ + openssh-client=1:9.2p1-2+deb12u5 \ + openssl=3.0.15-1~deb12u1 \ + python3-dev=3.11.2-1+b1 \ + python3-venv=3.11.2-1+b1 \ + python3=3.11.2-1+b1 \ + unzip=6.0-28 \ + uuid-runtime=2.38.1-5+deb12u1 \ + wget>=1.21.3-1+b2 \ + zip=3.0-13 \ + zsh=5.9-4+b5 \ + less=590-2.1~deb12u2 \ \ - && luarocks install lua-resty-http 0.13-0 \ + && sed -i -e 's/# en_US.UTF-8 UTF-8/en_US.UTF-8 UTF-8/' /etc/locale.gen \ + && locale-gen \ \ && curl https://bootstrap.pypa.io/get-pip.py | python3 \ \ - && locale-gen en_US.UTF-8 \ - \ + && if [[ "${BUILD_ARCH}" = "aarch64" ]]; then ARCH="arm64"; fi \ + && if [[ "${BUILD_ARCH}" = "amd64" ]]; then ARCH="amd64"; fi \ && curl -J -L -o /tmp/code.tar.gz \ - "https://github.com/codercom/code-server/releases/download/1.32.0-310/code-server-1.32.0-310-linux-x64.tar.gz" \ + "https://github.com/coder/code-server/releases/download/${CODE_SERVER_VERSION}/code-server-${CODE_SERVER_VERSION#v}-linux-${ARCH}.tar.gz" \ + && mkdir -p /usr/local/lib/code-server \ && tar zxvf \ /tmp/code.tar.gz \ - --strip 1 -C /tmp \ + --strip 1 -C /usr/local/lib/code-server \ \ - && mv /tmp/code-server /usr/local/bin/code-server \ - && chmod a+x /usr/local/bin/code-server \ + && ln -s /usr/local/lib/code-server/bin/code-server /usr/local/bin/code-server \ \ - && curl -L -s -o /usr/bin/hassio \ - "https://github.com/home-assistant/hassio-cli/releases/download/2.1.0/hassio_${BUILD_ARCH}" \ - && chmod a+x /usr/bin/hassio \ + && mkdir -p /root/.code-server/extensions \ + && uuid=$(uuidgen) \ + && while read -r ext; do \ + extention="${ext%%#*}" \ + vendor="${extention%%.*}"; \ + slug="${extention#*.}"; \ + version="${ext##*#}"; \ + \ + echo "Installing vscode extension: ${slug} by ${vendor} @ ${version} "; \ + \ + echo "https://marketplace.visualstudio.com/_apis/public/gallery/publishers/${vendor}/vsextensions/${slug}/${version}/vspackage"; \ + curl -JL --retry 5 -o "/tmp/${extention}-${version}.vsix" \ + -H "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36" \ + -H "x-market-user-id: ${uuid}" \ + "https://marketplace.visualstudio.com/_apis/public/gallery/publishers/${vendor}/vsextensions/${slug}/${version}/vspackage"; \ + mkdir -p "/usr/local/lib/code-server/lib/vscode/extensions/${extention}-${version}"; \ + bsdtar --strip-components=1 -xf "/tmp/${extention}-${version}.vsix" \ + -C "/usr/local/lib/code-server/lib/vscode/extensions/${extention}-${version}" extension; \ + [ $? -ne 0 ] && exit 1; \ + sleep 1; \ + done < /root/vscode.extensions \ + && ls -la /usr/local/lib/code-server/lib/vscode/extensions/ \ + \ + && curl -L -s -o /usr/bin/ha \ + "https://github.com/home-assistant/cli/releases/download/${HA_CLI_VERSION}/ha_${BUILD_ARCH}" \ + && chmod a+x /usr/bin/ha \ \ && git clone --branch master --single-branch --depth 1 \ - "git://github.com/robbyrussell/oh-my-zsh.git" ~/.oh-my-zsh \ + "https://github.com/robbyrussell/oh-my-zsh.git" ~/.oh-my-zsh \ \ && git clone --branch master --single-branch --depth 1 \ - "git://github.com/zsh-users/zsh-autosuggestions" \ + "https://github.com/zsh-users/zsh-autosuggestions" \ ~/.oh-my-zsh/custom/plugins/zsh-autosuggestions \ && git clone --branch master --single-branch --depth 1 \ - "git://github.com/zsh-users/zsh-syntax-highlighting.git" \ + "https://github.com/zsh-users/zsh-syntax-highlighting.git" \ ~/.oh-my-zsh/custom/plugins/zsh-syntax-highlighting \ \ && sed -i -e "s#bin/bash#bin/zsh#" /etc/passwd \ @@ -112,15 +112,17 @@ RUN \ \ && apt-get purge -y --auto-remove \ build-essential \ - luarocks \ + libarchive-tools \ python3-dev \ + uuid-runtime \ \ - && find /usr/local/lib/python3.6/ -type d -name tests -depth -exec rm -rf {} \; \ - && find /usr/local/lib/python3.6/ -type d -name test -depth -exec rm -rf {} \; \ - && find /usr/local/lib/python3.6/ -name __pycache__ -depth -exec rm -rf {} \; \ - && find /usr/local/lib/python3.6/ -name "*.pyc" -depth -exec rm -f {} \; \ + && find /usr/local \ + \( -type d -a -name test -o -name tests -o -name '__pycache__' \) \ + -o \( -type f -a -name '*.pyc' -o -name '*.pyo' \) \ + -exec rm -rf '{}' + \ \ && rm -fr \ + /root/.cache \ /tmp/* \ /var/{cache,log}/* \ /var/lib/apt/lists/* @@ -128,28 +130,35 @@ RUN \ # Copy root filesystem COPY rootfs / -# Get the custom extensions -COPY --from=vscode /root/.vscode/extensions /root/.code-server/extensions +# Health check +HEALTHCHECK \ + CMD curl --fail http://127.0.0.1:1337/healthz || exit 1 # Build arguments +ARG BUILD_ARCH ARG BUILD_DATE +ARG BUILD_DESCRIPTION +ARG BUILD_NAME ARG BUILD_REF +ARG BUILD_REPOSITORY ARG BUILD_VERSION # Labels LABEL \ - io.hass.name="Visual Studio Code" \ - io.hass.description="Visual Studio Code, accessible through the browser." \ + io.hass.name="${BUILD_NAME}" \ + io.hass.description="${BUILD_DESCRIPTION}" \ io.hass.arch="${BUILD_ARCH}" \ io.hass.type="addon" \ io.hass.version=${BUILD_VERSION} \ maintainer="Franck Nijhof " \ - org.label-schema.description="Visual Studio Code, accessible through the browser." \ - org.label-schema.build-date=${BUILD_DATE} \ - org.label-schema.name="Visual Studio Code" \ - org.label-schema.schema-version="1.0" \ - org.label-schema.url="https://community.home-assistant.io/?u=frenck" \ - org.label-schema.usage="https://github.com/hassio-addons/addon-vscode/tree/master/README.md" \ - org.label-schema.vcs-ref=${BUILD_REF} \ - org.label-schema.vcs-url="https://github.com/hassio-addons/addon-vscode" \ - org.label-schema.vendor="Community Hass.io Add-ons" + org.opencontainers.image.title="${BUILD_NAME}" \ + org.opencontainers.image.description="${BUILD_DESCRIPTION}" \ + org.opencontainers.image.vendor="Home Assistant Community Add-ons" \ + org.opencontainers.image.authors="Franck Nijhof " \ + org.opencontainers.image.licenses="MIT" \ + org.opencontainers.image.url="https://addons.community" \ + org.opencontainers.image.source="https://github.com/${BUILD_REPOSITORY}" \ + org.opencontainers.image.documentation="https://github.com/${BUILD_REPOSITORY}/blob/main/README.md" \ + org.opencontainers.image.created=${BUILD_DATE} \ + org.opencontainers.image.revision=${BUILD_REF} \ + org.opencontainers.image.version=${BUILD_VERSION} diff --git a/vscode/build.json b/vscode/build.json deleted file mode 100644 index 1a64553..0000000 --- a/vscode/build.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "build_from": { - "amd64": "hassioaddons/ubuntu-base-amd64:3.0.0" - }, - "args": {} -} diff --git a/vscode/build.yaml b/vscode/build.yaml new file mode 100644 index 0000000..30d90d3 --- /dev/null +++ b/vscode/build.yaml @@ -0,0 +1,7 @@ +--- +build_from: + aarch64: ghcr.io/hassio-addons/debian-base:7.8.2 + amd64: ghcr.io/hassio-addons/debian-base:7.8.2 +codenotary: + base_image: codenotary@frenck.dev + signer: codenotary@frenck.dev diff --git a/vscode/config.json b/vscode/config.json deleted file mode 100755 index 7179eca..0000000 --- a/vscode/config.json +++ /dev/null @@ -1,46 +0,0 @@ -{ - "name": "Visual Studio Code", - "version": "dev", - "slug": "vscode", - "description": "Fully featured VSCode experience, to edit your HA config in the browser, including auto-completion!", - "url": "https://github.com/hassio-addons/addon-vscode", - "webui": "[PROTO:ssl]://[HOST]:[PORT:1337]", - "startup": "services", - "arch": [ - "amd64" - ], - "boot": "auto", - "hassio_api": true, - "auth_api": true, - "hassio_role": "manager", - "homeassistant_api": true, - "host_network": false, - "auto_uart": true, - "ports": { - "1337/tcp": 1337 - }, - "map": [ - "config:rw", - "ssl:rw", - "addons:rw", - "share:rw", - "backup:rw" - ], - "options": { - "ssl": true, - "certfile": "fullchain.pem", - "keyfile": "privkey.pem", - "packages": [], - "init_commands": [] - }, - "schema": { - "log_level": "match(^(trace|debug|info|notice|warning|error|fatal)$)?", - "ssl": "bool", - "certfile": "str", - "keyfile": "str", - "packages": ["str"], - "init_commands": ["str"], - "leave_front_door_open": "bool?", - "i_like_to_be_pwned": "bool?" - } -} diff --git a/vscode/config.yaml b/vscode/config.yaml new file mode 100644 index 0000000..0921ef8 --- /dev/null +++ b/vscode/config.yaml @@ -0,0 +1,49 @@ +--- +name: Studio Code Server +version: dev +slug: vscode +description: Fully featured Visual Studio Code (VSCode) experience integrated in the Home Assistant frontend. +url: https://github.com/hassio-addons/addon-vscode +codenotary: codenotary@frenck.dev +ingress: true +ingress_port: 1337 +ingress_stream: true +panel_icon: mdi:microsoft-visual-studio-code +startup: services +init: false +arch: + - aarch64 + - amd64 +uart: true +hassio_api: true +hassio_role: manager +homeassistant_api: true +map: + - type: addons + read_only: false + - type: all_addon_configs + read_only: false + - type: backup + read_only: false + - type: homeassistant_config + read_only: false + path: /config + - type: media + read_only: false + - type: share + read_only: false + - type: ssl + read_only: false +services: + - mysql:want + - mqtt:want +options: + packages: [] + init_commands: [] +schema: + log_level: list(trace|debug|info|notice|warning|error|fatal)? + config_path: str? + packages: + - str + init_commands: + - str diff --git a/vscode/icon.png b/vscode/icon.png index b3225e4..e33d6ee 100644 Binary files a/vscode/icon.png and b/vscode/icon.png differ diff --git a/vscode/logo.png b/vscode/logo.png index 57a2ca2..e33d6ee 100644 Binary files a/vscode/logo.png and b/vscode/logo.png differ diff --git a/vscode/requirements.txt b/vscode/requirements.txt index b0b1802..0493acc 100644 --- a/vscode/requirements.txt +++ b/vscode/requirements.txt @@ -1,2 +1,2 @@ -homeassistant_cli==0.6.0 -yamllint==1.15.0 +esphome==2025.4.1 +yamllint==1.37.0 diff --git a/vscode/rootfs/etc/cont-init.d/10-requirements.sh b/vscode/rootfs/etc/cont-init.d/10-requirements.sh deleted file mode 100644 index f722ae9..0000000 --- a/vscode/rootfs/etc/cont-init.d/10-requirements.sh +++ /dev/null @@ -1,6 +0,0 @@ -#!/usr/bin/with-contenv bashio -# ============================================================================== -# Community Hass.io Add-ons: Visual Studio Code -# This files check if all user configuration requirements are met -# ============================================================================== -bashio::config.require.ssl diff --git a/vscode/rootfs/etc/cont-init.d/11-nginx.sh b/vscode/rootfs/etc/cont-init.d/11-nginx.sh deleted file mode 100644 index 422b5a9..0000000 --- a/vscode/rootfs/etc/cont-init.d/11-nginx.sh +++ /dev/null @@ -1,17 +0,0 @@ -#!/usr/bin/with-contenv bashio -# ============================================================================== -# Community Hass.io Add-ons: Visual Studio Code -# Configures NGINX for use with code-server -# ============================================================================== -declare certfile -declare keyfile - -mkdir -p /var/log/nginx - -if bashio::config.true 'ssl'; then - certfile=$(bashio::config 'certfile') - keyfile=$(bashio::config 'keyfile') - - sed -i "s/%%certfile%%/${certfile}/g" /etc/nginx/nginx-ssl.conf - sed -i "s/%%keyfile%%/${keyfile}/g" /etc/nginx/nginx-ssl.conf -fi diff --git a/vscode/rootfs/etc/cont-init.d/20-link-common-dirs.sh b/vscode/rootfs/etc/cont-init.d/20-link-common-dirs.sh deleted file mode 100644 index fa66d22..0000000 --- a/vscode/rootfs/etc/cont-init.d/20-link-common-dirs.sh +++ /dev/null @@ -1,11 +0,0 @@ -#!/usr/bin/with-contenv bashio -# ============================================================================== -# Community Hass.io Add-ons: Visual Studio Code -# Links some common directories to the user's home folder for convenience -# ============================================================================== -readonly -a directories=(addons backup config share ssl) - -for dir in "${directories[@]}"; do - ln -s "/${dir}" "${HOME}/${dir}" \ - || bashio::log.warning "Failed linking common directory: ${dir}" -done diff --git a/vscode/rootfs/etc/cont-init.d/30-defaults.sh b/vscode/rootfs/etc/cont-init.d/30-defaults.sh deleted file mode 100644 index 2e3af84..0000000 --- a/vscode/rootfs/etc/cont-init.d/30-defaults.sh +++ /dev/null @@ -1,37 +0,0 @@ -#!/usr/bin/with-contenv bashio -# ============================================================================== -# Community Hass.io Add-ons: Visual Studio Code -# Updates/installs build-in extensions and set up initial user configuration. -# ============================================================================== - -# Ensure persistent data folder exists -if ! bashio::fs.directory_exists '/data/vscode'; then - mkdir -p /data/vscode/extensions \ - || bashio::exit.nok "Could not create persistent storage folder." -fi - -# Copy in the extensions we deliver -cp -R /root/.code-server/extensions/* /data/vscode/extensions - -# Sets up default user settings on first start. -if ! bashio::fs.file_exists '/data/vscode/User/settings.json'; then - mkdir -p /data/vscode/User \ - || bashio::exit.nok "Could not create persistent storage folder." - - cp /root/.code-server/settings.json /data/vscode/User/settings.json -fi - -# Workaround workspace bug for code-server -# https://github.com/codercom/code-server/issues/121 -if ! bashio::fs.file_exists '/data/vscode/Backups/workspaces.json'; then - mkdir -p /data/vscode/Backups \ - || bashio::exit.nok "Could not create persistent storage folder." - cp /root/.code-server/workspaces.json /data/vscode/Backups/workspaces.json -fi - -# Workaround workspace bug for code-server (same as above, part 2) -# https://github.com/codercom/code-server/issues/121 -if ! bashio::fs.file_exists '/data/vscode/User/workspaceStorage'; then - mkdir -p /data/vscode/User/workspaceStorage \ - || bashio::exit.nok "Could not create persistent storage folder." -fi diff --git a/vscode/rootfs/etc/cont-init.d/50-user-ssh-folder.sh b/vscode/rootfs/etc/cont-init.d/50-user-ssh-folder.sh deleted file mode 100644 index dfb40e9..0000000 --- a/vscode/rootfs/etc/cont-init.d/50-user-ssh-folder.sh +++ /dev/null @@ -1,17 +0,0 @@ -#!/usr/bin/with-contenv bashio -# ============================================================================== -# Community Hass.io Add-ons: Visual Studio Code -# Sets up the users .ssh folder to be persistent -# ============================================================================== -readonly SSH_USER_PATH=/data/.ssh - -if ! bashio::fs.directory_exists "${SSH_USER_PATH}"; then - mkdir -p "${SSH_USER_PATH}" \ - || bashio::exit.nok 'Failed to create a persistent .ssh folder' - - chmod 700 "${SSH_USER_PATH}" \ - || bashio::exit.nok \ - 'Failed setting permissions on persistent .ssh folder' -fi - -ln -s "${SSH_USER_PATH}" ~/.ssh diff --git a/vscode/rootfs/etc/cont-init.d/51-git-config.sh b/vscode/rootfs/etc/cont-init.d/51-git-config.sh deleted file mode 100644 index 0f3fda3..0000000 --- a/vscode/rootfs/etc/cont-init.d/51-git-config.sh +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/with-contenv bashio -# ============================================================================== -# Community Hass.io Add-ons: Visual Studio Code -# Sets up the users git global config to be persistent -# ============================================================================== -readonly GIT_USER_PATH=/data/git - -if ! bashio::fs.directory_exists "${GIT_USER_PATH}"; then - mkdir -p "${GIT_USER_PATH}" \ - || bashio::exit.nok 'Failed to create a persistent git folder' - - chmod 700 "${GIT_USER_PATH}" \ - || bashio::exit.nok \ - 'Failed setting permissions on persistent git folder' -fi - -if ! bashio::fs.file_exists "${GIT_USER_PATH}/.gitconfig"; then - touch "${GIT_USER_PATH}/.gitconfig" \ - || bashio::exit.nok 'Failed to create .gitconfig' -fi - -ln -s "${GIT_USER_PATH}/.gitconfig" ~/.gitconfig diff --git a/vscode/rootfs/etc/cont-init.d/80-user-packages.sh b/vscode/rootfs/etc/cont-init.d/80-user-packages.sh deleted file mode 100644 index 835fba6..0000000 --- a/vscode/rootfs/etc/cont-init.d/80-user-packages.sh +++ /dev/null @@ -1,14 +0,0 @@ -#!/usr/bin/with-contenv bashio -# ============================================================================== -# Community Hass.io Add-ons: Visual Studio Code -# Install user configured/requested packages -# ============================================================================== -if bashio::config.has_value 'packages'; then - apt update \ - || bashio::exit.nok 'Failed updating Ubuntu packages repository indexes' - - for package in $(bashio::config 'packages'); do - apt-get install -y "$package" \ - || bashio::exit.nok "Failed installing package ${package}" - done -fi diff --git a/vscode/rootfs/etc/cont-init.d/81-user-scripts.sh b/vscode/rootfs/etc/cont-init.d/81-user-scripts.sh deleted file mode 100644 index c72c425..0000000 --- a/vscode/rootfs/etc/cont-init.d/81-user-scripts.sh +++ /dev/null @@ -1,11 +0,0 @@ -#!/usr/bin/with-contenv bashio -# ============================================================================== -# Community Hass.io Add-ons: Visual Studio Code -# Executes user configured/requested commands on startup -# ============================================================================== -if bashio::config.has_value 'init_commands'; then - while read -r cmd; do - eval "${cmd}" \ - || bashio::exit.nok "Failed executing init command: ${cmd}" - done <<< "$(bashio::config 'init_commands')" -fi diff --git a/vscode/rootfs/etc/motd b/vscode/rootfs/etc/motd index b64ad92..df098a9 100755 --- a/vscode/rootfs/etc/motd +++ b/vscode/rootfs/etc/motd @@ -1,12 +1,11 @@ - _ _ _ - | | | | (_) - | |__| | __ _ ___ ___ _ ___ - | __ |/ _` / __/ __| | |/ _ \ - | | | | (_| \__ \__ \_| | (_) | - |_| |_|\__,_|___/___(_)_|\___/ + _ _ _ _ _ +| | | | /\ (_) | | | | +| |__| | ___ _ __ ___ ___ / \ ___ ___ _ ___| |_ __ _ _ __ | |_ +| __ |/ _ \| '_ ` _ \ / _ \ / /\ \ / __/ __| / __| __/ _` | '_ \| __| +| | | | (_) | | | | | | __/ / ____ \\__ \__ \ \__ \ || (_| | | | | |_ +|_| |_|\___/|_| |_| |_|\___| /_/ \_\___/___/_|___/\__\__,_|_| |_|\__| -Our Cli: -$ hassio help - +Our command line: +$ ha help diff --git a/vscode/rootfs/etc/nginx/ha-auth.lua b/vscode/rootfs/etc/nginx/ha-auth.lua deleted file mode 100644 index 4c9ca91..0000000 --- a/vscode/rootfs/etc/nginx/ha-auth.lua +++ /dev/null @@ -1,83 +0,0 @@ -local http = require "resty.http" -local auths = ngx.shared.auths - -function authenticate() - - --- Test Authentication header is set and with a value - local header = ngx.req.get_headers()['Authorization'] - if header == nil or header:find(" ") == nil then - return false - end - - local divider = header:find(' ') - if header:sub(0, divider-1) ~= 'Basic' then - return false - end - - local auth = ngx.decode_base64(header:sub(divider+1)) - if auth == nil or auth:find(':') == nil then - return false - end - - divider = auth:find(':') - local username = auth:sub(0, divider-1) - local password = auth:sub(divider+1) - - --- Check if authentication is cached - if auths:get(username) == password then - ngx.log(ngx.DEBUG, "Authenticated user against Home Assistant (cache).") - return true - end - - --- HTTP request against Hassio API - local httpc = http.new() - local res, err = httpc:request_uri("http://hassio/auth", { - method = "POST", - body = ngx.encode_args({["username"]=username, ["password"]=password}), - headers = { - ["Content-Type"] = "application/x-www-form-urlencoded", - ["X-HASSIO-KEY"] = os.getenv("HASSIO_TOKEN"), - }, - keepalive_timeout = 60, - keepalive_pool = 10 - }) - - --- Error during API request - if err then - ngx.log(ngx.WARN, "Error during Hassio user authentication.", err) - return false - end - - --- No result? Something went wrong... - if not res then - ngx.log(ngx.WARN, "Error during Hassio user authentication.") - return false - end - - --- Valid response, the username/password is valid - if res.status == 200 then - ngx.log(ngx.INFO, "Authenticated user against Home Assistant.") - auths:set(username, password, 60) - return true - end - - --- Whatever the response is, it is invalid - ngx.log(ngx.WARN, "Authentication against Home Assistant failed!") - return false -end - --- Only authenticate if its not disabled -if not os.getenv('DISABLE_HA_AUTHENTICATION') then - - --- Try to authenticate against HA - local authenticated = authenticate() - - --- If authentication failed, throw a basic auth - if not authenticated then - ngx.header.content_type = 'text/plain' - ngx.header.www_authenticate = 'Basic realm="Home Assistant"' - ngx.status = ngx.HTTP_UNAUTHORIZED - ngx.say('401 Access Denied') - ngx.exit(ngx.HTTP_UNAUTHORIZED) - end -end diff --git a/vscode/rootfs/etc/nginx/nginx-ssl.conf b/vscode/rootfs/etc/nginx/nginx-ssl.conf deleted file mode 100644 index bfea197..0000000 --- a/vscode/rootfs/etc/nginx/nginx-ssl.conf +++ /dev/null @@ -1,71 +0,0 @@ -worker_processes 1; -pid /var/run/nginx.pid; -error_log stderr; -env HASSIO_TOKEN; -env DISABLE_HA_AUTHENTICATION; -load_module "/usr/lib/nginx/modules/ndk_http_module.so"; -load_module "/usr/lib/nginx/modules/ngx_http_lua_module.so"; - -events { - worker_connections 1024; -} - -http { - access_log stdout; - include mime.types; - default_type application/octet-stream; - sendfile on; - keepalive_timeout 65; - lua_shared_dict auths 16k; - resolver 127.0.0.11; - - upstream code { - ip_hash; - server 127.0.0.1:8443; - } - - map $http_upgrade $connection_upgrade { - default upgrade; - '' close; - } - - server { - server_name hassio.local; - listen 1337 default_server ssl; - root /dev/null; - - ssl_certificate /ssl/%%certfile%%; - ssl_certificate_key /ssl/%%keyfile%%; - ssl_protocols TLSv1.2; - ssl_prefer_server_ciphers on; - ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:DHE-RSA-AES256-SHA; - ssl_ecdh_curve secp384r1; - ssl_session_timeout 10m; - ssl_session_cache shared:SSL:10m; - ssl_session_tickets off; - ssl_stapling on; - ssl_stapling_verify on; - - add_header X-Content-Type-Options nosniff; - add_header X-XSS-Protection "1; mode=block"; - add_header X-Robots-Tag none; - - location / { - access_by_lua_file /etc/nginx/ha-auth.lua; - - proxy_redirect off; - proxy_pass http://code; - - proxy_http_version 1.1; - proxy_set_header Upgrade $http_upgrade; - proxy_set_header Connection $connection_upgrade; - proxy_set_header Authorization ""; - - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; - proxy_set_header Host $http_host; - proxy_set_header X-NginX-Proxy true; - } - } -} diff --git a/vscode/rootfs/etc/nginx/nginx.conf b/vscode/rootfs/etc/nginx/nginx.conf deleted file mode 100644 index a0f8ccf..0000000 --- a/vscode/rootfs/etc/nginx/nginx.conf +++ /dev/null @@ -1,57 +0,0 @@ -worker_processes 1; -pid /var/run/nginx.pid; -error_log stderr; -env HASSIO_TOKEN; -env DISABLE_HA_AUTHENTICATION; -load_module "/usr/lib/nginx/modules/ndk_http_module.so"; -load_module "/usr/lib/nginx/modules/ngx_http_lua_module.so"; - -events { - worker_connections 1024; -} - -http { - access_log stdout; - include mime.types; - default_type application/octet-stream; - sendfile on; - keepalive_timeout 65; - lua_shared_dict auths 16k; - resolver 127.0.0.11; - - upstream code { - ip_hash; - server 127.0.0.1:8443; - } - - map $http_upgrade $connection_upgrade { - default upgrade; - '' close; - } - - server { - server_name hassio.local; - listen 1337 default_server; - root /dev/null; - - location / { - access_by_lua_file /etc/nginx/ha-auth.lua; - - proxy_redirect off; - proxy_pass http://code; - - proxy_http_version 1.1; - proxy_set_header Upgrade $http_upgrade; - proxy_set_header Connection $connection_upgrade; - proxy_set_header Authorization ""; - - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; - proxy_set_header Host $http_host; - proxy_set_header X-NginX-Proxy true; - proxy_read_timeout 86400s; - proxy_send_timeout 86400s; - } - } -} diff --git a/.gitignore b/vscode/rootfs/etc/s6-overlay/s6-rc.d/code-server/dependencies.d/init-code-server similarity index 100% rename from .gitignore rename to vscode/rootfs/etc/s6-overlay/s6-rc.d/code-server/dependencies.d/init-code-server diff --git a/vscode/rootfs/etc/s6-overlay/s6-rc.d/code-server/dependencies.d/init-user b/vscode/rootfs/etc/s6-overlay/s6-rc.d/code-server/dependencies.d/init-user new file mode 100644 index 0000000..e69de29 diff --git a/vscode/rootfs/etc/s6-overlay/s6-rc.d/code-server/finish b/vscode/rootfs/etc/s6-overlay/s6-rc.d/code-server/finish new file mode 100755 index 0000000..7dc933d --- /dev/null +++ b/vscode/rootfs/etc/s6-overlay/s6-rc.d/code-server/finish @@ -0,0 +1,26 @@ +#!/command/with-contenv bashio +# shellcheck shell=bash +# ============================================================================== +# Home Assistant Community Add-on: Studio Code Server +# Take down the S6 supervision tree when the code server fails +# ============================================================================== +readonly exit_code_container=$( /run/s6-linux-init-container-results/exitcode + fi + [[ "${exit_code_signal}" -eq 15 ]] && exec /run/s6/basedir/bin/halt +elif [[ "${exit_code_service}" -ne 0 ]]; then + if [[ "${exit_code_container}" -eq 0 ]]; then + echo "${exit_code_service}" > /run/s6-linux-init-container-results/exitcode + fi + exec /run/s6/basedir/bin/halt +fi diff --git a/vscode/rootfs/etc/s6-overlay/s6-rc.d/code-server/run b/vscode/rootfs/etc/s6-overlay/s6-rc.d/code-server/run new file mode 100755 index 0000000..dbc0af2 --- /dev/null +++ b/vscode/rootfs/etc/s6-overlay/s6-rc.d/code-server/run @@ -0,0 +1,33 @@ +#!/command/with-contenv bashio +# shellcheck shell=bash +# ============================================================================== +# Home Assistant Community Add-on: Studio Code Server +# Runs the code-server +# ============================================================================== +declare -a options +declare config_path + +bashio::log.info 'Starting code-server...' + +config_path="/config" +if bashio::config.has_value 'config_path'; then + config_path=$(bashio::config 'config_path') +fi + +options+=(--port 1337) +options+=(--user-data-dir "/data/vscode") +options+=(--extensions-dir "/data/vscode/extensions") +options+=(--host 0.0.0.0) +options+=(--disable-telemetry) +options+=(--disable-update-check) + +# Disable code authentication, we use HA authentication +options+=(--auth none) + +# Export env variables for the Home Assistant extension +export HASS_SERVER="http://supervisor/core" +export HASS_TOKEN="${SUPERVISOR_TOKEN:-}" + +# Run the code server +cd "${config_path}" || bashio::exit.nok "Could not change working directory" +exec code-server "${options[@]}" "${config_path}" diff --git a/vscode/rootfs/etc/s6-overlay/s6-rc.d/code-server/type b/vscode/rootfs/etc/s6-overlay/s6-rc.d/code-server/type new file mode 100644 index 0000000..5883cff --- /dev/null +++ b/vscode/rootfs/etc/s6-overlay/s6-rc.d/code-server/type @@ -0,0 +1 @@ +longrun diff --git a/vscode/rootfs/etc/s6-overlay/s6-rc.d/init-code-server/dependencies.d/base b/vscode/rootfs/etc/s6-overlay/s6-rc.d/init-code-server/dependencies.d/base new file mode 100644 index 0000000..e69de29 diff --git a/vscode/rootfs/etc/s6-overlay/s6-rc.d/init-code-server/run b/vscode/rootfs/etc/s6-overlay/s6-rc.d/init-code-server/run new file mode 100755 index 0000000..d49fc52 --- /dev/null +++ b/vscode/rootfs/etc/s6-overlay/s6-rc.d/init-code-server/run @@ -0,0 +1,61 @@ +#!/command/with-contenv bashio +# shellcheck shell=bash +# ============================================================================== +# Home Assistant Community Add-on: Studio Code Server +# Sets up code-server. +# ============================================================================== +declare config_path + +# List of previous config hashes, to allow upgrade "default" configs. +readonly -a PREVIOUS_DEFAULT_CONFIG_HASHES=( + 86776df88391c3d94f79f62b430f9ff8538960628d5e04fb660165a5a46640d2e74f89cd68b3e6985dc59101ae2dda00a1e25aa48381acfd4736858c5f23878b + 2be4c50575c05711d30121c3a1320698d3dbb034523c481be3aad3b638af3e0a46113d8c3f8cfc1b0f01e4cc10f32da3a30feca161c31b5b27177aeb7231bf70 + d4745002643a0168f65bc5b465a9baff59af0fb4783b50553e1a4e8b3f1a569fc4905df19b7743f7f313a5809a5128d997fc4b5e0a0e5db0a01f47b3b7bec39d + 6ed36f832778926fa614fc12eec97b8f813bbb1a04f709769c9e5f54bc8e3cfc05a110155921a3b2ae47fc8389d24fa2bd385e4ce5a6c94850813791a6ac1c82 + 944d9ba57968666353df7e9dc78ec5d94b9b052e1abf863b51bc1f372d9f35cb2d93259f153e9ab3b3dd1b520bfcd7bddb54803bcfd9eb65975ae8fb5553663c + 4ef960e3d6e795adda51d5cbeb18d309fee87ba5cd177292a21b5a70a71a4726ae7053c3793cddc6d63d3b4dacc180ad3ea12d005fc8d63a1bc4cb29f9a17f18 + c5b8acf06ef6d9a2435e9ddb92cb9fce7cfbfe4a2206b0e0c3c4ed514cc926f8d3c662e694a995d102b5ba939056f93201c220558e06e1cd0872bfb1995ba148 + 08d86c84a0d80720b22712e878963e90cbb34b659330dad8a823f3c5c7f0ae043d197a5e3020dd7ab4fda3625e17f794675ec074984951e7107db2488898a8d0 + 5243d7664d30b5aa0c45fbe1089cccdf85c5ade17cddd97e21b3a29ccb37b20d20bdfecc141ad6e1a7aa5ea8ee61695a79a43140a2d53f9f91687bc61f7e496c + e5106aaaff5f67a693fd49deb7dd52f1cc0f7ba542b33c99c0099bf58f1a33c789d1c5e3803dea2942540c07c734f3ca317c3cc91673aff388cb79ee7112db0b + b28a299111ac74cc9498f76ce2cb437b2cf5e8e7bb9388d9929347e2948bd56591bd499d5de04638553f6e12fa77c53320a046e96cffce9fa4f8c924d5c91581 + dbe905f0935b2fea8bb5ba379bff78db9d056ea6d0965c68aa9b07938a52cbbf117186452b2b6c766aa4cf93cc3494ad91b763e8500e515e41d8cde31a3821ae + 2212babaa9dc46d38ba239052c9c05151abe517cc8b493d0d351a96bf70c1efa4f7479f6ed0b75811429ba649906eb5657d73b0732b460e718a5c66603dcdbda +) + +if bashio::config.has_value 'config_path'; then + config_path=$(bashio::config 'config_path') + if ! bashio::fs.directory_exists "${config_path}"; then + bashio::exit.nok "Configured config path does not exists" + fi +fi + +# Ensure persistent data folder exists. +if ! bashio::fs.directory_exists '/data/vscode'; then + mkdir -p /data/vscode/extensions \ + || bashio::exit.nok "Could not create persistent storage folder." +fi + +# Clean up copies of extensions we deliver from the persistent storage +while read -r ext; do + extension="${ext%%#*}" + # shellcheck disable=SC2086 + rm -f -r /data/vscode/extensions/${extension,,}* +done < /root/vscode.extensions + +# Ensure user extensions folder exists +mkdir -p /data/vscode/extensions + +# Sets up default user settings on first start. +if ! bashio::fs.file_exists '/data/vscode/User/settings.json'; then + mkdir -p /data/vscode/User \ + || bashio::exit.nok "Could not create persistent storage folder." + + cp /root/.code-server/settings.json /data/vscode/User/settings.json +fi + +# Upgrade settings.json is still default from previous version. +current=$(sha512sum /data/vscode/User/settings.json|cut -d " " -f 1) +if [[ " ${PREVIOUS_DEFAULT_CONFIG_HASHES[*]} " == *" ${current} "* ]]; then + cp /root/.code-server/settings.json /data/vscode/User/settings.json +fi diff --git a/vscode/rootfs/etc/s6-overlay/s6-rc.d/init-code-server/type b/vscode/rootfs/etc/s6-overlay/s6-rc.d/init-code-server/type new file mode 100644 index 0000000..bdd22a1 --- /dev/null +++ b/vscode/rootfs/etc/s6-overlay/s6-rc.d/init-code-server/type @@ -0,0 +1 @@ +oneshot diff --git a/vscode/rootfs/etc/s6-overlay/s6-rc.d/init-code-server/up b/vscode/rootfs/etc/s6-overlay/s6-rc.d/init-code-server/up new file mode 100644 index 0000000..3b22ac9 --- /dev/null +++ b/vscode/rootfs/etc/s6-overlay/s6-rc.d/init-code-server/up @@ -0,0 +1 @@ +/etc/s6-overlay/s6-rc.d/init-code-server/run diff --git a/vscode/rootfs/etc/s6-overlay/s6-rc.d/init-mosquitto/dependencies.d/base b/vscode/rootfs/etc/s6-overlay/s6-rc.d/init-mosquitto/dependencies.d/base new file mode 100644 index 0000000..e69de29 diff --git a/vscode/rootfs/etc/s6-overlay/s6-rc.d/init-mosquitto/run b/vscode/rootfs/etc/s6-overlay/s6-rc.d/init-mosquitto/run new file mode 100755 index 0000000..5148c3e --- /dev/null +++ b/vscode/rootfs/etc/s6-overlay/s6-rc.d/init-mosquitto/run @@ -0,0 +1,28 @@ +#!/command/with-contenv bashio +# shellcheck shell=bash +# ============================================================================== +# Home Assistant Community Add-on: Studio Code Server +# Pre-configures the Mosquitto clients, if the service is available +# ============================================================================== +declare host +declare password +declare port +declare username + +if bashio::services.available "mqtt"; then + host=$(bashio::services "mqtt" "host") + password=$(bashio::services "mqtt" "password") + port=$(bashio::services "mqtt" "port") + username=$(bashio::services "mqtt" "username") + + mkdir -p /root/.config + { + echo "-h ${host}" + echo "--pw ${password}" + echo "--port ${port}" + echo "--username ${username}" + } > /root/.config/mosquitto_sub + + ln -s /root/.config/mosquitto_sub /root/.config/mosquitto_pub + ln -s /root/.config/mosquitto_sub /root/.config/mosquitto_rr +fi diff --git a/vscode/rootfs/etc/s6-overlay/s6-rc.d/init-mosquitto/type b/vscode/rootfs/etc/s6-overlay/s6-rc.d/init-mosquitto/type new file mode 100644 index 0000000..bdd22a1 --- /dev/null +++ b/vscode/rootfs/etc/s6-overlay/s6-rc.d/init-mosquitto/type @@ -0,0 +1 @@ +oneshot diff --git a/vscode/rootfs/etc/s6-overlay/s6-rc.d/init-mosquitto/up b/vscode/rootfs/etc/s6-overlay/s6-rc.d/init-mosquitto/up new file mode 100644 index 0000000..b662c5d --- /dev/null +++ b/vscode/rootfs/etc/s6-overlay/s6-rc.d/init-mosquitto/up @@ -0,0 +1 @@ +/etc/s6-overlay/s6-rc.d/init-mosquitto/run diff --git a/vscode/rootfs/etc/s6-overlay/s6-rc.d/init-mysql/dependencies.d/base b/vscode/rootfs/etc/s6-overlay/s6-rc.d/init-mysql/dependencies.d/base new file mode 100644 index 0000000..e69de29 diff --git a/vscode/rootfs/etc/s6-overlay/s6-rc.d/init-mysql/run b/vscode/rootfs/etc/s6-overlay/s6-rc.d/init-mysql/run new file mode 100755 index 0000000..0894a8a --- /dev/null +++ b/vscode/rootfs/etc/s6-overlay/s6-rc.d/init-mysql/run @@ -0,0 +1,26 @@ +#!/command/with-contenv bashio +# shellcheck shell=bash +# ============================================================================== +# Home Assistant Community Add-on: Studio Code Server +# Pre-configures the MySQL clients, if the service is available +# ============================================================================== +declare host +declare password +declare port +declare username + +if bashio::services.available "mysql"; then + host=$(bashio::services "mysql" "host") + password=$(bashio::services "mysql" "password") + port=$(bashio::services "mysql" "port") + username=$(bashio::services "mysql" "username") + + mkdir -p /root/.config + { + echo "[client]" + echo "host=${host}" + echo "password=\"${password}\"" + echo "port=${port}" + echo "user=\"${username}\"" + } > /etc/mysql/conf.d/service.cnf +fi diff --git a/vscode/rootfs/etc/s6-overlay/s6-rc.d/init-mysql/type b/vscode/rootfs/etc/s6-overlay/s6-rc.d/init-mysql/type new file mode 100644 index 0000000..bdd22a1 --- /dev/null +++ b/vscode/rootfs/etc/s6-overlay/s6-rc.d/init-mysql/type @@ -0,0 +1 @@ +oneshot diff --git a/vscode/rootfs/etc/s6-overlay/s6-rc.d/init-mysql/up b/vscode/rootfs/etc/s6-overlay/s6-rc.d/init-mysql/up new file mode 100644 index 0000000..feb7e01 --- /dev/null +++ b/vscode/rootfs/etc/s6-overlay/s6-rc.d/init-mysql/up @@ -0,0 +1 @@ +/etc/s6-overlay/s6-rc.d/init-mysql/run diff --git a/vscode/rootfs/etc/s6-overlay/s6-rc.d/init-user/dependencies.d/base b/vscode/rootfs/etc/s6-overlay/s6-rc.d/init-user/dependencies.d/base new file mode 100644 index 0000000..e69de29 diff --git a/vscode/rootfs/etc/s6-overlay/s6-rc.d/init-user/run b/vscode/rootfs/etc/s6-overlay/s6-rc.d/init-user/run new file mode 100755 index 0000000..1c35507 --- /dev/null +++ b/vscode/rootfs/etc/s6-overlay/s6-rc.d/init-user/run @@ -0,0 +1,80 @@ +#!/command/with-contenv bashio +# shellcheck shell=bash +# ============================================================================== +# Home Assistant Community Add-on: Studio Code Server +# Persists user settings and installs custom user packages. +# ============================================================================== +readonly -a DIRECTORIES=(addon_configs addons backup homeassistant media share ssl) +readonly GIT_USER_PATH=/data/git +readonly SSH_USER_PATH=/data/.ssh +readonly ZSH_HISTORY_FILE=/root/.zsh_history +readonly ZSH_HISTORY_PERSISTANT_FILE=/data/.zsh_history + +# Links some common directories to the user's home folder for convenience +for dir in "${DIRECTORIES[@]}"; do + ln -sn "/${dir}" "${HOME}/${dir}" \ + || bashio::log.warning "Failed linking common directory: ${dir}" +done + +# Some links to old locations, to not mess with the user's muscle memory +ln -sn "/config" "${HOME}/config" \ + || bashio::log.warning "Failed linking common directory: ${HOME}/config" +ln -sn "/config" "/homeassistant" \ + || bashio::log.warning "Failed linking common directory: /homeassistant" + +# Store SSH settings in add-on data folder +if ! bashio::fs.directory_exists "${SSH_USER_PATH}"; then + mkdir -p "${SSH_USER_PATH}" \ + || bashio::exit.nok 'Failed to create a persistent .ssh folder' + + chmod 700 "${SSH_USER_PATH}" \ + || bashio::exit.nok \ + 'Failed setting permissions on persistent .ssh folder' +fi +ln -sn "${SSH_USER_PATH}" ~/.ssh || bashio::log.warning "Failed linking .ssh" + +# Sets up ZSH shell +touch "${ZSH_HISTORY_PERSISTANT_FILE}" \ + || bashio::exit.nok 'Failed creating a persistent ZSH history file' + +chmod 600 "$ZSH_HISTORY_PERSISTANT_FILE" \ + || bashio::exit.nok \ + 'Failed setting the correct permissions to the ZSH history file' + +ln -s -f "$ZSH_HISTORY_PERSISTANT_FILE" "$ZSH_HISTORY_FILE" \ + || bashio::exit.nok 'Failed linking the persistant ZSH history file' + +# Store user GIT settings in add-on data folder +if ! bashio::fs.directory_exists "${GIT_USER_PATH}"; then + mkdir -p "${GIT_USER_PATH}" \ + || bashio::exit.nok 'Failed to create a persistent git folder' + + chmod 700 "${GIT_USER_PATH}" \ + || bashio::exit.nok \ + 'Failed setting permissions on persistent git folder' +fi + +if ! bashio::fs.file_exists "${GIT_USER_PATH}/.gitconfig"; then + touch "${GIT_USER_PATH}/.gitconfig" \ + || bashio::exit.nok 'Failed to create .gitconfig' +fi +ln -s "${GIT_USER_PATH}/.gitconfig" ~/.gitconfig || bashio::log.warning "Failed linking .gitconfig" + +# Install user configured/requested packages +if bashio::config.has_value 'packages'; then + apt update \ + || bashio::exit.nok 'Failed updating Ubuntu packages repository indexes' + + for package in $(bashio::config 'packages'); do + apt-get install -y "$package" \ + || bashio::exit.nok "Failed installing package ${package}" + done +fi + +# Executes user configured/requested commands on startup +if bashio::config.has_value 'init_commands'; then + while read -r cmd; do + eval "${cmd}" \ + || bashio::exit.nok "Failed executing init command: ${cmd}" + done <<< "$(bashio::config 'init_commands')" +fi diff --git a/vscode/rootfs/etc/s6-overlay/s6-rc.d/init-user/type b/vscode/rootfs/etc/s6-overlay/s6-rc.d/init-user/type new file mode 100644 index 0000000..bdd22a1 --- /dev/null +++ b/vscode/rootfs/etc/s6-overlay/s6-rc.d/init-user/type @@ -0,0 +1 @@ +oneshot diff --git a/vscode/rootfs/etc/s6-overlay/s6-rc.d/init-user/up b/vscode/rootfs/etc/s6-overlay/s6-rc.d/init-user/up new file mode 100644 index 0000000..b977248 --- /dev/null +++ b/vscode/rootfs/etc/s6-overlay/s6-rc.d/init-user/up @@ -0,0 +1 @@ +/etc/s6-overlay/s6-rc.d/init-user/run diff --git a/vscode/rootfs/etc/s6-overlay/s6-rc.d/user/contents.d/code-server b/vscode/rootfs/etc/s6-overlay/s6-rc.d/user/contents.d/code-server new file mode 100644 index 0000000..e69de29 diff --git a/vscode/rootfs/etc/s6-overlay/s6-rc.d/user/contents.d/init-code-server b/vscode/rootfs/etc/s6-overlay/s6-rc.d/user/contents.d/init-code-server new file mode 100644 index 0000000..e69de29 diff --git a/vscode/rootfs/etc/s6-overlay/s6-rc.d/user/contents.d/init-mosquitto b/vscode/rootfs/etc/s6-overlay/s6-rc.d/user/contents.d/init-mosquitto new file mode 100644 index 0000000..e69de29 diff --git a/vscode/rootfs/etc/s6-overlay/s6-rc.d/user/contents.d/init-mysql b/vscode/rootfs/etc/s6-overlay/s6-rc.d/user/contents.d/init-mysql new file mode 100644 index 0000000..e69de29 diff --git a/vscode/rootfs/etc/s6-overlay/s6-rc.d/user/contents.d/init-user b/vscode/rootfs/etc/s6-overlay/s6-rc.d/user/contents.d/init-user new file mode 100644 index 0000000..e69de29 diff --git a/vscode/rootfs/etc/services.d/code/finish b/vscode/rootfs/etc/services.d/code/finish deleted file mode 100644 index eb3f950..0000000 --- a/vscode/rootfs/etc/services.d/code/finish +++ /dev/null @@ -1,9 +0,0 @@ -#!/usr/bin/execlineb -S0 -# ============================================================================== -# Community Hass.io Add-ons: Visual Studio Code -# Take down the S6 supervision tree when the code server fails -# ============================================================================== -if -n { s6-test $# -ne 0 } -if -n { s6-test ${1} -eq 256 } - -s6-svscanctl -t /var/run/s6/services diff --git a/vscode/rootfs/etc/services.d/code/run b/vscode/rootfs/etc/services.d/code/run deleted file mode 100644 index 4506982..0000000 --- a/vscode/rootfs/etc/services.d/code/run +++ /dev/null @@ -1,23 +0,0 @@ -#!/usr/bin/with-contenv bashio -# ============================================================================== -# Community Hass.io Add-ons: Visual Studio Code -# Runs the code server -# ============================================================================== -declare -a options - -bashio::log.info 'Starting the code server...' - -options+=(--port 8443) -options+=(--data-dir "/data/vscode") -options+=(--host 127.0.0.1) -options+=(--allow-http) - -# Disable code authentication, we use HA authentication -options+=(--no-auth) - -# Export env variables for the Home Assistant extension -export HASS_SERVER="http://hassio/homeassistant" -export HASS_TOKEN="${HASSIO_TOKEN:-}" - -# Run the code server -exec code-server "${options[@]}" /config diff --git a/vscode/rootfs/etc/services.d/nginx/finish b/vscode/rootfs/etc/services.d/nginx/finish deleted file mode 100644 index 9fe3ffb..0000000 --- a/vscode/rootfs/etc/services.d/nginx/finish +++ /dev/null @@ -1,9 +0,0 @@ -#!/usr/bin/execlineb -S0 -# ============================================================================== -# Community Hass.io Add-ons: Visual Studio Code -# Take down the S6 supervision tree when Nginx fails -# ============================================================================== -if -n { s6-test $# -ne 0 } -if -n { s6-test ${1} -eq 256 } - -s6-svscanctl -t /var/run/s6/services diff --git a/vscode/rootfs/etc/services.d/nginx/run b/vscode/rootfs/etc/services.d/nginx/run deleted file mode 100644 index 653a417..0000000 --- a/vscode/rootfs/etc/services.d/nginx/run +++ /dev/null @@ -1,28 +0,0 @@ -#!/usr/bin/with-contenv bashio -# ============================================================================== -# Community Hass.io Add-ons: Visual Studio Code -# Runs the Nginx daemon -# ============================================================================== -declare -a options - -# Wait for code-server to become available -s6-svwait -u -t 5000 /var/run/s6/services/code -timeout 15 \ - bash -c \ - 'until echo > /dev/tcp/localhost/8443 ; do sleep 0.5; done' \ - > /dev/null 2>&1 - -bashio::log.info "Starting NGinx..." - -# Disable HA Authentication if front door is open -if bashio::config.true 'leave_front_door_open'; then - export DISABLE_HA_AUTHENTICATION=true -fi - -options+=(-g "daemon off;") - -if bashio::config.true 'ssl'; then - options+=(-c /etc/nginx/nginx-ssl.conf) -fi - -exec nginx "${options[@]}" diff --git a/vscode/rootfs/root/.code-server/settings.json b/vscode/rootfs/root/.code-server/settings.json index c65a119..b93fdae 100644 --- a/vscode/rootfs/root/.code-server/settings.json +++ b/vscode/rootfs/root/.code-server/settings.json @@ -1,12 +1,99 @@ { - "files.watcherExclude": { - "**/__pycache__/**": true, - "**/deps/**": true - }, - "search.exclude": { - "**/__pycache__/**": true, - "**/deps/**": true - }, - "editor.selectionClipboard": false, - "terminal.integrated.copyOnSelection": true + "files.associations": { + "*.dash": "yaml", + "**/esphome/*.yaml": "esphome", + "**/esphome/**/*.yaml": "esphome", + "*.yaml": "home-assistant" + }, + "files.watcherExclude": { + ".nfs**": true, + ".Trash-0/**": true, + "**/__pycache__/**": true, + "**/._*": true, + "**/.cloud": true, + "**/.git/objects/**": true, + "**/.git/subtree-cache/**": true, + "**/.HA_VERSION": true, + "**/.storage": true, + "**/*.db-shm": true, + "**/*.db-wal": true, + "**/*.db": true, + "**/*.log": true, + "**/deps/**": true, + "**/node_modules": true, + "**/OZW_Log.txt": true, + "**/pyozw.sqlite": true + }, + "search.exclude": { + ".Trash-0/**": true, + "**/__pycache__/**": true, + "**/._*": true, + "**/.cloud": true, + "**/.git/objects/**": true, + "**/.git/subtree-cache/**": true, + "**/.git": true, + "**/.HA_VERSION": true, + "**/.storage": true, + "**/*.db-shm": true, + "**/*.db-wal": true, + "**/*.db": true, + "**/*.log": true, + "**/deps/**": true, + "**/node_modules": true, + "**/OZW_Log.txt": true, + "**/pyozw.sqlite": true + }, + "files.exclude": { + ".Trash-0/**": true, + "**/__pycache__": true, + "**/.cloud": true, + "**/.DS_Store": true, + "**/.git": true, + "**/.HA_VERSION": true, + "**/.storage": true, + "**/*.db-shm": true, + "**/*.db-wal": true, + "**/*.db": true, + "**/deps/**": true, + "**/node_modules": true + }, + "yaml.customTags": [ + "!env_var scalar", + "!include_dir_list scalar", + "!include_dir_merge_list scalar", + "!include_dir_merge_named scalar", + "!include_dir_named scalar", + "!include scalar", + "!secret scalar" + ], + "[yaml]": { + "editor.autoIndent": "full", + "editor.insertSpaces": true, + "editor.tabSize": 2, + "editor.quickSuggestions": { + "other": true, + "comments": false, + "strings": true + } + }, + "[home-assistant]": { + "editor.autoIndent": "full", + "editor.insertSpaces": true, + "editor.tabSize": 2, + "editor.defaultFormatter": "esbenp.prettier-vscode", + "editor.formatOnSave": true, + "editor.formatOnPaste": true + }, + "editor.renderWhitespace": "boundary", + "esphome.validator": "local", + "telemetry.enableTelemetry": false, + "terminal.integrated.copyOnSelection": true, + "terminal.integrated.shell.linux": "/usr/bin/zsh", + "update.mode": "none", + "vsicons.dontShowNewVersionMessage": true, + "vsicons.projectDetection.disableDetect": true, + "workbench.iconTheme": "vs-seti", + "yaml.format.enable": true, + "editor.defaultFormatter": "esbenp.prettier-vscode", + "editor.rulers": [80, 88, 100, 120] } diff --git a/vscode/rootfs/root/.code-server/workspaces.json b/vscode/rootfs/root/.code-server/workspaces.json index 32f99f2..219b4fe 100644 --- a/vscode/rootfs/root/.code-server/workspaces.json +++ b/vscode/rootfs/root/.code-server/workspaces.json @@ -1 +1,6 @@ -{"rootWorkspaces":[],"folderURIWorkspaces":[],"emptyWorkspaceInfos":[],"emptyWorkspaces":[]} +{ + "rootWorkspaces": [], + "folderURIWorkspaces": [], + "emptyWorkspaceInfos": [], + "emptyWorkspaces": [] +} diff --git a/vscode/rootfs/root/.zshrc b/vscode/rootfs/root/.zshrc index e4721be..63fd50c 100755 --- a/vscode/rootfs/root/.zshrc +++ b/vscode/rootfs/root/.zshrc @@ -1,3 +1,4 @@ +# shellcheck disable=SC1090,SC2034,SC2086 # If you come from bash you might have to change your $PATH. # export PATH=$HOME/bin:/usr/local/bin:$PATH @@ -62,6 +63,7 @@ plugins=( zsh-syntax-highlighting ) +# shellcheck disable=SC1091 source $ZSH/oh-my-zsh.sh # User configuration @@ -92,9 +94,10 @@ source $ZSH/oh-my-zsh.sh # Example aliases # alias zshconfig="mate ~/.zshrc" # alias ohmyzsh="mate ~/.oh-my-zsh" +alias reset-settings="cp /root/.code-server/settings.json /data/vscode/User/settings.json && echo 'Setting restored!'" # Home Assistant CLI -eval "$(_HASS_CLI_COMPLETE=source_zsh hass-cli)" +source <(ha completion zsh) && compdef _ha ha # Show motd on start cat /etc/motd diff --git a/vscode/rootfs/usr/local/bin/code b/vscode/rootfs/usr/local/bin/code new file mode 100755 index 0000000..ea03034 --- /dev/null +++ b/vscode/rootfs/usr/local/bin/code @@ -0,0 +1,3 @@ +#!/bin/sh + +exec /usr/local/lib/code-server/bin/code-server "${@}" diff --git a/vscode/vscode.extensions b/vscode/vscode.extensions index 2db10e0..8e02abe 100644 --- a/vscode/vscode.extensions +++ b/vscode/vscode.extensions @@ -1,2 +1,9 @@ -keesschollaart.vscode-home-assistant -lukas-tr.materialdesignicons-intellisense +emilast.LogFileHighlighter#3.4.0 +esbenp.prettier-vscode#11.0.0 +ESPHome.esphome-vscode#2023.9.0 +keesschollaart.vscode-home-assistant#1.43.0 +lukas-tr.materialdesignicons-intellisense#4.1.0 +netcorext.uuid-generator#0.0.5 +oderwat.indent-rainbow#8.3.1 +redhat.vscode-yaml#1.11.10112022 +usernamehw.errorlens#3.6.0