diff --git a/.drone.sec b/.drone.sec deleted file mode 100644 index a83bfc1e0..000000000 --- a/.drone.sec +++ /dev/null @@ -1 +0,0 @@ -eyJhbGciOiJSU0EtT0FFUCIsImVuYyI6IkExMjhHQ00ifQ.pr9ZMRbPGFZ6rTQOAmHQJN4RRE8Hmnl6Sn6ek2DogiLA6qIZCCei6RHLppto2tpM1ApM5pLpW64TjGf_mCLIesk_GtnUF6baxrHodcI8EB3VV3CsXU3EJF3_FOk3uSJUOi7hbtn54ztMBL2QKeccUiO-KBC2BHiD8VVpjnY5C-TLYV-1Td2fUZc3QB4eoqeTlvglu0nSvHHGCL89RQU0ZEW_-h_tXXaDrvXS648g-U2B9uwnVgBgBPhQqOzP02cW2-ojgkAC7xNpO_BOWoYouT56kkeM5MEx1XyJ-tAdP0AU8mG3x6mRBbng2nwTiXt9RqIJ01RKysMdgth17SZQ8A.apeQnLTu98uqD1Xl.se-xrnl2-B63chHdq719TO98hjxVIN6qTkCnTv5y__LM7ku-FBmlUnZLKy6jDZfO3Fz0jUNwSxuU2LGJWuJ5-PEQkqhsjJuDNBbrAKbt9oqFpXUKXOyu5yw8f64GHgG0bmlrZS6X04P4JAx6t9pXE0rKV5yktoYLLcTgoHnWm3C8eX7H1ayewDJ_CD2ricdZ5J-YAe4sz1AR2mRPRiyx-LTheTc2sALqZv39_ctOI9weNIGy013Jc_6MchmERmT2c4QKlIhy2ra9CPZsOgyn6d008qse14Q32IP97VJ3KLCq69P7u3y28KGz6btjfurLFP1EuipKhWxpIsE4YWQcf_l-eXxpd-l2SUPFMMNBI6aXItKpPofgjMAPeJzlIkhkXCtfRRWIgDaHlS_eAk0nWaXSQyUljUnR7qaVyCqh.FAYZK3PkD_9u3cXwsD8WSw diff --git a/.drone.sec.example b/.drone.sec.example deleted file mode 100644 index 4e12cc654..000000000 --- a/.drone.sec.example +++ /dev/null @@ -1,7 +0,0 @@ -environment: - DOCKER_USERNAME: "" - DOCKER_PASSWORD: "" - DOCKER_EMAIL: "" - SLACK_WEBHOOK: "" - SLACK_CHANNEL: "" - GITHUB_API_KEY: "" diff --git a/.drone.yml b/.drone.yml deleted file mode 100644 index ff3ac6a3d..000000000 --- a/.drone.yml +++ /dev/null @@ -1,61 +0,0 @@ -build: - crosscompilation: - image: arduino/golang-cross - auth_config: - username: $$DOCKER_USERNAME - password: $$DOCKER_PASSWORD - email: $$DOCKER_EMAIL - commands: - - go get github.com/kardianos/govendor - - govendor vet +local - - govendor test +local - # Linux amd64 - - GOOS=linux GOARCH=amd64 CC=gcc CXX=gcc CGO_ENABLED=1 go build -o artifacts/linux-amd64/arduino-create-agent - - cp config.ini artifacts/linux-amd64 - # Darwin amd64 - - GOOS=darwin GOARCH=amd64 CC=o64-clang CXX=o64-clang CGO_ENABLED=1 go build -o artifacts/osx/arduino-create-agent - - cp config.ini artifacts/osx - # Windows 386 - - GOOS=windows GOARCH=386 CC=i686-w64-mingw32-gcc CXX=i686-w64-mingw32-gcc CGO_ENABLED=1 go build -o artifacts/windows/arduino-create-agent.exe -ldflags -H=windowsgui - - cp config.ini artifacts/windows - - zip -r arduino-create-agent.zip artifacts/* - linux32: - image: arduino/golang-linux-32 - commands: - - GOOS=linux GOARCH=386 CC=gcc CXX=gcc CGO_ENABLED=1 go build -o artifacts/linux-386/arduino-create-agent - - cp config.ini artifacts/linux-386 -notify: - slack: - webhook_url: $$SLACK_WEBHOOK - channel: $$SLACK_CHANNEL - username: drone - when: - event: pull_request - template: | - {{#success build.status}} - [{{ repo.name}}] Congrats {{ build.author }}! Your PR works: {{ build.link_url}} - {{else}} - [{{ repo.name}}] Damn {{ build.author }}! Something went wrong with your PR: {{ build.link_url}} - {{/success}} -publish: - github_release: - api_key: $$GITHUB_API_KEY - files: - - arduino-create-agent.zip - checksum: - - md5 - when: - event: tag -notify: - slack: - webhook_url: $$SLACK_WEBHOOK - channel: $$SLACK_CHANNEL - username: drone - when: - event: tag - template: | - {{#success build.status}} - [{{ repo.name}}/{{ build.branch }}] A new release is available: {{ build.link_url}} - {{else}} - [{{ repo.name}}/{{ build.branch }}] Something went wrong while building a new release: {{ build.link_url}} - {{/success}} diff --git a/.github/ISSUE_TEMPLATE/bug-report.yml b/.github/ISSUE_TEMPLATE/bug-report.yml new file mode 100644 index 000000000..3ff41f764 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug-report.yml @@ -0,0 +1,92 @@ +# Source: https://github.com/arduino/tooling-project-assets/blob/main/issue-templates/forms/platform-dependent/bug-report.yml +# See: https://docs.github.com/communities/using-templates-to-encourage-useful-issues-and-pull-requests/syntax-for-issue-forms + +name: Bug report +description: Report a problem with the code or documentation in this repository. +labels: + - "type: imperfection" +body: + - type: textarea + id: description + attributes: + label: Describe the problem + validations: + required: true + - type: textarea + id: reproduce + attributes: + label: To reproduce + description: Provide the specific set of steps we can follow to reproduce the problem. + validations: + required: true + - type: textarea + id: expected + attributes: + label: Expected behavior + description: What would you expect to happen after following those instructions? + validations: + required: true + - type: input + id: project-version + attributes: + label: Arduino Create Agent version + description: | + Which version of Arduino Create Agent are you using? + _This should be the most recent version available._ + validations: + required: true + - type: dropdown + id: os + attributes: + label: Operating system + description: Which operating system(s) are you using on your computer? + multiple: true + options: + - Windows + - Linux + - macOS + - N/A + validations: + required: true + - type: input + id: os-version + attributes: + label: Operating system version + description: Which version of the operating system are you using on your computer? + validations: + required: true + - type: input + id: browser + attributes: + label: Browser + description: | + Which web browser(s) are you using on your computer? + (e.g., Chrome, Safari) + validations: + required: true + - type: input + id: browser-version + attributes: + label: Browser version + description: Which version of the web browser are you using on your computer? + validations: + required: true + - type: textarea + id: additional + attributes: + label: Additional context + description: Add any additional information here. + validations: + required: false + - type: checkboxes + id: checklist + attributes: + label: Issue checklist + description: Please double-check that you have done each of the following things before submitting the issue. + options: + - label: I searched for previous reports in [the issue tracker](https://github.com/arduino/arduino-create-agent/issues?q=) + required: true + - label: I verified the problem still occurs when using the latest version + required: true + - label: My report contains all necessary details + required: true diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md deleted file mode 100644 index 79e35830c..000000000 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ /dev/null @@ -1,26 +0,0 @@ ---- -name: 🐛 Bug report -about: Create a report to help us improve ---- - -## Bug Report - -### Describe the bug - - -### To Reproduce - - -### Expected behavior - - -## Environment (please complete the following information): - - OS [e.g. Windows]: - - OS version - - Browser [e.g. chrome, safari]: - - Browser Version: - - Agent Version [e.g. 1.0.0]: - - CPU architecture [e.g. amd64] - -## Additional context - diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 000000000..8301c8bbc --- /dev/null +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1,17 @@ +# Source: https://github.com/arduino/tooling-project-assets/blob/main/issue-templates/template-choosers/general/config.yml +# See: https://docs.github.com/communities/using-templates-to-encourage-useful-issues-and-pull-requests/configuring-issue-templates-for-your-repository#configuring-the-template-chooser + +blank_issues_enabled: true +contact_links: + - name: Install Arduino Create Agent + url: https://create.arduino.cc/getting-started/plugin/welcome + about: This guided installer provides easy installation. + - name: Learn about using this project + url: https://github.com/arduino/arduino-create-agent#readme + about: Detailed usage documentation is available here. + - name: Support request + url: https://forum.arduino.cc/c/software/editor/134 + about: We can help you out on the Arduino Forum! + - name: Discuss development work on the project + url: https://groups.google.com/a/arduino.cc/g/developers + about: Arduino Developers Mailing List diff --git a/.github/ISSUE_TEMPLATE/feature-request.yml b/.github/ISSUE_TEMPLATE/feature-request.yml new file mode 100644 index 000000000..b9a47d376 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature-request.yml @@ -0,0 +1,87 @@ +# Source: https://github.com/arduino/tooling-project-assets/blob/main/issue-templates/forms/platform-dependent/bug-report.yml +# See: https://docs.github.com/communities/using-templates-to-encourage-useful-issues-and-pull-requests/syntax-for-issue-forms + +name: Feature request +description: Suggest an enhancement to this project. +labels: + - "type: enhancement" +body: + - type: textarea + id: description + attributes: + label: Describe the request + validations: + required: true + - type: textarea + id: current + attributes: + label: Describe the current behavior + description: | + What is the current behavior of Arduino Create Agent in relation to your request? + How can we reproduce that behavior? + validations: + required: true + - type: input + id: project-version + attributes: + label: Arduino Create Agent version + description: | + Which version of Arduino Create Agent are you using? + _This should be the most recent version available._ + validations: + required: true + - type: dropdown + id: os + attributes: + label: Operating system + description: Which operating system(s) are you using on your computer? + multiple: true + options: + - Windows + - Linux + - macOS + - N/A + validations: + required: true + - type: input + id: os-version + attributes: + label: Operating system version + description: Which version of the operating system are you using on your computer? + validations: + required: true + - type: input + id: browser + attributes: + label: Browser + description: | + Which web browser(s) are you using on your computer? + (e.g., Chrome, Safari) + validations: + required: true + - type: input + id: browser-version + attributes: + label: Browser version + description: Which version of the web browser are you using on your computer? + validations: + required: true + - type: textarea + id: additional + attributes: + label: Additional context + description: Add any additional information here. + validations: + required: false + - type: checkboxes + id: checklist + attributes: + label: Issue checklist + description: Please double-check that you have done each of the following things before submitting the issue. + options: + - label: I searched for previous requests in [the issue tracker](https://github.com/arduino/arduino-create-agent/issues?q=) + required: true + - label: I verified the feature was still missing when using the latest version + required: true + - label: My request contains all necessary details + required: true diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 000000000..a596de422 --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,24 @@ +version: 2 +updates: +- package-ecosystem: gomod + directory: "/" + schedule: + interval: daily + open-pull-requests-limit: 10 + ignore: + - dependency-name: go.bug.st/serial + versions: + - 1.1.2 + - 1.1.3 + - dependency-name: github.com/sirupsen/logrus + versions: + - 1.7.1 + labels: + - "topic: infrastructure" +- package-ecosystem: github-actions + directory: "/" + schedule: + interval: daily + open-pull-requests-limit: 10 + labels: + - "topic: infrastructure" diff --git a/.github/label-configuration-files/labels.yml b/.github/label-configuration-files/labels.yml new file mode 100644 index 000000000..2942afd63 --- /dev/null +++ b/.github/label-configuration-files/labels.yml @@ -0,0 +1,11 @@ +# Used by the "Sync Labels" workflow +# See: https://github.com/Financial-Times/github-label-sync#label-config-file + +# Added by the "Close stale issues" workflow. +- name: "conclusion: stale" + color: "940404" + description: Closed due to lack of activity +# Added by the "Close stale issues" workflow. +- name: "status: stale" + color: "940404" + description: Pending closure due to lack of activity diff --git a/.github/workflows/check-certificates.yml b/.github/workflows/check-certificates.yml index 8776ee28b..694792dcd 100644 --- a/.github/workflows/check-certificates.yml +++ b/.github/workflows/check-certificates.yml @@ -1,60 +1,76 @@ -name: Check for issues with signing certificates +# Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/check-certificates.md +name: Check Certificates +# See: https://docs.github.com/en/actions/reference/events-that-trigger-workflows on: + push: + paths: + - ".github/workflows/check-certificates.ya?ml" + pull_request: + paths: + - ".github/workflows/check-certificates.ya?ml" schedule: - # run every 10 hours + # Run every 10 hours. - cron: "0 */10 * * *" - # workflow_dispatch event allows the workflow to be triggered manually. - # This could be used to run an immediate check after updating certificate secrets. - # See: https://docs.github.com/en/actions/reference/events-that-trigger-workflows#workflow_dispatch workflow_dispatch: + repository_dispatch: env: - # Begin notifications when there are less than this many days remaining before expiration + # Begin notifications when there are less than this many days remaining before expiration. EXPIRATION_WARNING_PERIOD: 30 jobs: check-certificates: - runs-on: ubuntu-18.04 + name: ${{ matrix.certificate.identifier }} + # Only run when the workflow will have access to the certificate secrets. + if: > + (github.event_name != 'pull_request' && github.repository == 'arduino/arduino-create-agent') || + (github.event_name == 'pull_request' && github.event.pull_request.head.repo.full_name == 'arduino/arduino-create-agent') + runs-on: ubuntu-22.04 strategy: fail-fast: false matrix: certificate: - - identifier: macOS signing certificate # Text used to identify the certificate in notifications - certificate-secret: INSTALLER_CERT_MAC_P12 # The name of the secret that contains the certificate - password-secret: INSTALLER_CERT_MAC_PASSWORD # The name of the secret that contains the certificate password + # Additional certificate definitions can be added to this list. + - identifier: macOS signing certificate # Text used to identify certificate in notifications. + certificate-secret: INSTALLER_CERT_MAC_P12 # Name of the secret that contains the certificate. + password-secret: INSTALLER_CERT_MAC_PASSWORD # Name of the secret that contains the certificate password. + type: pkcs12 - identifier: Windows signing certificate - certificate-secret: INSTALLER_CERT_WINDOWS_PFX - password-secret: INSTALLER_CERT_WINDOWS_PASSWORD + certificate-secret: INSTALLER_CERT_WINDOWS_CER + # The password for the Windows certificate is not needed, because its not a container, but a single certificate. + type: x509 steps: - name: Set certificate path environment variable run: | - # See: https://docs.github.com/en/free-pro-team@latest/actions/reference/workflow-commands-for-github-actions#setting-an-environment-variable + # See: https://docs.github.com/en/actions/reference/workflow-commands-for-github-actions#setting-an-environment-variable echo "CERTIFICATE_PATH=${{ runner.temp }}/certificate.p12" >> "$GITHUB_ENV" + - name: Decode certificate env: CERTIFICATE: ${{ secrets[matrix.certificate.certificate-secret] }} run: | echo "${{ env.CERTIFICATE }}" | base64 --decode > "${{ env.CERTIFICATE_PATH }}" + - name: Verify certificate env: CERTIFICATE_PASSWORD: ${{ secrets[matrix.certificate.password-secret] }} run: | ( - openssl pkcs12 \ + openssl ${{ matrix.certificate.type }} \ -in "${{ env.CERTIFICATE_PATH }}" \ - -noout -passin env:CERTIFICATE_PASSWORD + -noout -passin env:CERTIFICATE_PASSWORD \ + -legacy ) || ( echo "::error::Verification of ${{ matrix.certificate.identifier }} failed!!!" exit 1 ) - # See: https://github.com/rtCamp/action-slack-notify + - name: Slack notification of certificate verification failure if: failure() - uses: rtCamp/action-slack-notify@v2.1.0 env: SLACK_WEBHOOK: ${{ secrets.TEAM_CREATE_CHANNEL_SLACK_WEBHOOK }} SLACK_MESSAGE: | @@ -63,36 +79,59 @@ jobs: :warning::warning::warning::warning: SLACK_COLOR: danger MSG_MINIMAL: true + uses: rtCamp/action-slack-notify@v2 - name: Get days remaining before certificate expiration date env: CERTIFICATE_PASSWORD: ${{ secrets[matrix.certificate.password-secret] }} id: get-days-before-expiration run: | - EXPIRATION_DATE="$( - ( - openssl pkcs12 \ - -in "${{ env.CERTIFICATE_PATH }}" \ - -clcerts \ - -nodes \ - -passin env:CERTIFICATE_PASSWORD - ) | ( - openssl x509 \ - -noout \ - -enddate - ) | ( - grep \ - --max-count=1 \ - --only-matching \ - --perl-regexp \ - 'notAfter=(\K.*)' - ) - )" + if [[ ${{ matrix.certificate.type }} == "pkcs12" ]]; then + EXPIRATION_DATE="$( + ( + openssl pkcs12 \ + -in ${{ env.CERTIFICATE_PATH }} \ + -clcerts \ + -nodes \ + -passin env:CERTIFICATE_PASSWORD \ + -legacy + ) | ( + openssl x509 \ + -noout \ + -enddate + ) | ( + grep \ + --max-count=1 \ + --only-matching \ + --perl-regexp \ + 'notAfter=(\K.*)' + ) + )" + elif [[ ${{ matrix.certificate.type }} == "x509" ]]; then + EXPIRATION_DATE="$( + ( + openssl x509 \ + -in ${{ env.CERTIFICATE_PATH }} \ + -noout \ + -enddate + ) | ( + grep \ + --max-count=1 \ + --only-matching \ + --perl-regexp \ + 'notAfter=(\K.*)' + ) + )" + fi + DAYS_BEFORE_EXPIRATION="$((($(date --utc --date="$EXPIRATION_DATE" +%s) - $(date --utc +%s)) / 60 / 60 / 24))" - # Display the expiration information in the log + + # Display the expiration information in the log. echo "Certificate expiration date: $EXPIRATION_DATE" echo "Days remaining before expiration: $DAYS_BEFORE_EXPIRATION" - echo "::set-output name=days::$DAYS_BEFORE_EXPIRATION" + + echo "days=$DAYS_BEFORE_EXPIRATION" >> $GITHUB_OUTPUT + - name: Check if expiration notification period has been reached id: check-expiration run: | @@ -100,10 +139,10 @@ jobs: echo "::error::${{ matrix.certificate.identifier }} will expire in ${{ steps.get-days-before-expiration.outputs.days }} days!!!" exit 1 fi + - name: Slack notification of pending certificate expiration - # Don't send spurious expiration notification if verification fails + # Don't send spurious expiration notification if verification fails. if: failure() && steps.check-expiration.outcome == 'failure' - uses: rtCamp/action-slack-notify@v2.1.0 env: SLACK_WEBHOOK: ${{ secrets.TEAM_CREATE_CHANNEL_SLACK_WEBHOOK }} SLACK_MESSAGE: | @@ -111,4 +150,5 @@ jobs: WARNING: ${{ github.repository }} ${{ matrix.certificate.identifier }} will expire in ${{ steps.get-days-before-expiration.outputs.days }} days!!! :warning::warning::warning::warning: SLACK_COLOR: danger - MSG_MINIMAL: true \ No newline at end of file + MSG_MINIMAL: true + uses: rtCamp/action-slack-notify@v2 diff --git a/.github/workflows/check-go-dependencies-task.yml b/.github/workflows/check-go-dependencies-task.yml new file mode 100644 index 000000000..417c525e5 --- /dev/null +++ b/.github/workflows/check-go-dependencies-task.yml @@ -0,0 +1,156 @@ +# Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/check-go-dependencies-task.md +name: Check Go Dependencies + +env: + # See: https://github.com/actions/setup-go/tree/v3#readme + GO_VERSION: "1.23" + +# See: https://docs.github.com/actions/using-workflows/events-that-trigger-workflows +on: + create: + push: + paths: + - ".github/workflows/check-go-dependencies-task.ya?ml" + - ".licenses/**" + - ".licensed.json" + - ".licensed.ya?ml" + - "Taskfile.ya?ml" + - "**/.gitmodules" + - "**/go.mod" + - "**/go.sum" + pull_request: + paths: + - ".github/workflows/check-go-dependencies-task.ya?ml" + - ".licenses/**" + - ".licensed.json" + - ".licensed.ya?ml" + - "Taskfile.ya?ml" + - "**/.gitmodules" + - "**/go.mod" + - "**/go.sum" + schedule: + # Run periodically to catch breakage caused by external changes. + - cron: "0 8 * * WED" + workflow_dispatch: + repository_dispatch: + +jobs: + run-determination: + runs-on: ubuntu-latest + outputs: + result: ${{ steps.determination.outputs.result }} + steps: + - name: Determine if the rest of the workflow should run + id: determination + run: | + RELEASE_BRANCH_REGEX="refs/heads/[0-9]+.[0-9]+.x" + # The `create` event trigger doesn't support `branches` filters, so it's necessary to use Bash instead. + if [[ + "${{ github.event_name }}" != "create" || + "${{ github.ref }}" =~ $RELEASE_BRANCH_REGEX + ]]; then + # Run the other jobs. + RESULT="true" + else + # There is no need to run the other jobs. + RESULT="false" + fi + + echo "result=$RESULT" >> $GITHUB_OUTPUT + + check-cache: + needs: run-determination + if: needs.run-determination.outputs.result == 'true' + runs-on: ubuntu-latest + + env: + CACHE_PATH: .licenses/ + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + with: + submodules: recursive + + # This is required to allow licensee/setup-licensed to install Licensed via Ruby gem. + - name: Install Ruby + uses: ruby/setup-ruby@v1 + with: + ruby-version: ruby # Install latest version + + - name: Install licensed + uses: licensee/setup-licensed@v1.3.2 + with: + github_token: ${{ secrets.GITHUB_TOKEN }} + version: 5.x + + - name: Install Go + uses: actions/setup-go@v5 + with: + go-version: ${{ env.GO_VERSION }} + + - name: Install Task + uses: arduino/setup-task@v2 + with: + repo-token: ${{ secrets.GITHUB_TOKEN }} + version: 3.x + + - name: Update dependencies license metadata cache + run: task --silent general:cache-dep-licenses + + - name: Check for outdated cache + id: diff + run: | + git add . + if ! git diff --cached --color --exit-code "${{ env.CACHE_PATH }}"; then + echo + echo "::error::Dependency license metadata out of sync. See: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/check-go-dependencies-task.md#metadata-cache" + exit 1 + fi + + # Some might find it convenient to have CI generate the cache rather than setting up for it locally + - name: Upload cache to workflow artifact + if: failure() && steps.diff.outcome == 'failure' + uses: actions/upload-artifact@v4 + with: + if-no-files-found: error + include-hidden-files: true + name: dep-licenses-cache + path: ${{ env.CACHE_PATH }} + + check-deps: + needs: run-determination + if: needs.run-determination.outputs.result == 'true' + runs-on: ubuntu-latest + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + with: + submodules: recursive + + # This is required to allow licensee/setup-licensed to install Licensed via Ruby gem. + - name: Install Ruby + uses: ruby/setup-ruby@v1 + with: + ruby-version: ruby # Install latest version + + - name: Install licensed + uses: licensee/setup-licensed@v1.3.2 + with: + github_token: ${{ secrets.GITHUB_TOKEN }} + version: 5.x + + - name: Install Go + uses: actions/setup-go@v5 + with: + go-version: ${{ env.GO_VERSION }} + + - name: Install Task + uses: arduino/setup-task@v2 + with: + repo-token: ${{ secrets.GITHUB_TOKEN }} + version: 3.x + + - name: Check for dependencies with unapproved licenses + run: task --silent general:check-dep-licenses diff --git a/.github/workflows/check-go-task.yml b/.github/workflows/check-go-task.yml new file mode 100644 index 000000000..21478d23e --- /dev/null +++ b/.github/workflows/check-go-task.yml @@ -0,0 +1,231 @@ +# Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/check-go-task.md +name: Check Go + +env: + # See: https://github.com/actions/setup-go/tree/main#supported-version-syntax + GO_VERSION: "1.23" + +# See: https://docs.github.com/actions/using-workflows/events-that-trigger-workflows +on: + create: + push: + paths: + - ".github/workflows/check-go-task.ya?ml" + - "Taskfile.ya?ml" + - "**/go.mod" + - "**/go.sum" + - "**.go" + pull_request: + paths: + - ".github/workflows/check-go-task.ya?ml" + - "Taskfile.ya?ml" + - "**/go.mod" + - "**/go.sum" + - "**.go" + schedule: + # Run periodically to catch breakage caused by external changes. + - cron: "0 7 * * WED" + workflow_dispatch: + repository_dispatch: + +jobs: + run-determination: + runs-on: ubuntu-latest + outputs: + result: ${{ steps.determination.outputs.result }} + steps: + - name: Determine if the rest of the workflow should run + id: determination + run: | + RELEASE_BRANCH_REGEX="refs/heads/[0-9]+.[0-9]+.x" + # The `create` event trigger doesn't support `branches` filters, so it's necessary to use Bash instead. + if [[ + "${{ github.event_name }}" != "create" || + "${{ github.ref }}" =~ $RELEASE_BRANCH_REGEX + ]]; then + # Run the other jobs. + RESULT="true" + else + # There is no need to run the other jobs. + RESULT="false" + fi + + echo "result=$RESULT" >> $GITHUB_OUTPUT + + check-errors: + name: check-errors (${{ matrix.module.path }}) + needs: run-determination + if: needs.run-determination.outputs.result == 'true' + runs-on: ubuntu-latest + + strategy: + fail-fast: false + + matrix: + module: + # TODO: add paths of all Go modules here + - path: ./ + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Install Go + uses: actions/setup-go@v5 + with: + go-version: ${{ env.GO_VERSION }} + + - name: Install Task + uses: arduino/setup-task@v2 + with: + repo-token: ${{ secrets.GITHUB_TOKEN }} + version: 3.x + + - name: Install Dependencies + run: sudo apt update && sudo apt install -y --no-install-recommends build-essential libgtk-3-dev libwebkit2gtk-4.1-0 libappindicator3-dev + + - name: Check for errors + env: + GO_MODULE_PATH: ${{ matrix.module.path }} + run: task go:vet + + check-outdated: + name: check-outdated (${{ matrix.module.path }}) + needs: run-determination + if: needs.run-determination.outputs.result == 'true' + runs-on: ubuntu-latest + + strategy: + fail-fast: false + + matrix: + module: + # TODO: add paths of all Go modules here + - path: ./ + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Install Go + uses: actions/setup-go@v5 + with: + go-version: ${{ env.GO_VERSION }} + + - name: Install Task + uses: arduino/setup-task@v2 + with: + repo-token: ${{ secrets.GITHUB_TOKEN }} + version: 3.x + + - name: Modernize usages of outdated APIs + env: + GO_MODULE_PATH: ${{ matrix.module.path }} + run: task go:fix + + - name: Check if any fixes were needed + run: git diff --color --exit-code + + check-style: + name: check-style (${{ matrix.module.path }}) + needs: run-determination + if: needs.run-determination.outputs.result == 'true' + runs-on: ubuntu-latest + + strategy: + fail-fast: false + + matrix: + module: + # TODO: add paths of all Go modules here + - path: ./ + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Install Go + uses: actions/setup-go@v5 + with: + go-version: ${{ env.GO_VERSION }} + + - name: Install Task + uses: arduino/setup-task@v2 + with: + repo-token: ${{ secrets.GITHUB_TOKEN }} + version: 3.x + + - name: Install golint + run: go install golang.org/x/lint/golint@latest + + - name: Check style + env: + GO_MODULE_PATH: ${{ matrix.module.path }} + run: task --silent go:lint + + check-formatting: + name: check-formatting (${{ matrix.module.path }}) + needs: run-determination + if: needs.run-determination.outputs.result == 'true' + runs-on: ubuntu-latest + + strategy: + fail-fast: false + + matrix: + module: + # TODO: add paths of all Go modules here + - path: ./ + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Install Go + uses: actions/setup-go@v5 + with: + go-version: ${{ env.GO_VERSION }} + + - name: Install Task + uses: arduino/setup-task@v2 + with: + repo-token: ${{ secrets.GITHUB_TOKEN }} + version: 3.x + + - name: Format code + env: + GO_MODULE_PATH: ${{ matrix.module.path }} + run: task go:format + + - name: Check formatting + run: git diff --color --exit-code + + check-config: + name: check-config (${{ matrix.module.path }}) + needs: run-determination + if: needs.run-determination.outputs.result == 'true' + runs-on: ubuntu-latest + + strategy: + fail-fast: false + + matrix: + module: + # TODO: add paths of all Go modules here + - path: ./ + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Install Go + uses: actions/setup-go@v5 + with: + go-version: ${{ env.GO_VERSION }} + + - name: Run go mod tidy + working-directory: ${{ matrix.module.path }} + run: go mod tidy + + - name: Check whether any tidying was needed + run: git diff --color --exit-code diff --git a/.github/workflows/check-license.yml b/.github/workflows/check-license.yml new file mode 100644 index 000000000..5a7ce5daf --- /dev/null +++ b/.github/workflows/check-license.yml @@ -0,0 +1,96 @@ +# Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/check-license.md +name: Check License + +env: + EXPECTED_LICENSE_FILENAME: LICENSE.txt + # SPDX identifier: https://spdx.org/licenses/ + EXPECTED_LICENSE_TYPE: AGPL-3.0 + +# See: https://docs.github.com/actions/using-workflows/events-that-trigger-workflows +on: + create: + push: + paths: + - ".github/workflows/check-license.ya?ml" + # See: https://github.com/licensee/licensee/blob/master/docs/what-we-look-at.md#detecting-the-license-file + - "[cC][oO][pP][yY][iI][nN][gG]*" + - "[cC][oO][pP][yY][rR][iI][gG][hH][tH]*" + - "[lL][iI][cC][eE][nN][cCsS][eE]*" + - "[oO][fF][lL]*" + - "[pP][aA][tT][eE][nN][tT][sS]*" + pull_request: + paths: + - ".github/workflows/check-license.ya?ml" + - "[cC][oO][pP][yY][iI][nN][gG]*" + - "[cC][oO][pP][yY][rR][iI][gG][hH][tH]*" + - "[lL][iI][cC][eE][nN][cCsS][eE]*" + - "[oO][fF][lL]*" + - "[pP][aA][tT][eE][nN][tT][sS]*" + schedule: + # Run periodically to catch breakage caused by external changes. + - cron: "0 6 * * WED" + workflow_dispatch: + repository_dispatch: + +jobs: + run-determination: + runs-on: ubuntu-latest + outputs: + result: ${{ steps.determination.outputs.result }} + steps: + - name: Determine if the rest of the workflow should run + id: determination + run: | + RELEASE_BRANCH_REGEX="refs/heads/[0-9]+.[0-9]+.x" + # The `create` event trigger doesn't support `branches` filters, so it's necessary to use Bash instead. + if [[ + "${{ github.event_name }}" != "create" || + "${{ github.ref }}" =~ $RELEASE_BRANCH_REGEX + ]]; then + # Run the other jobs. + RESULT="true" + else + # There is no need to run the other jobs. + RESULT="false" + fi + + echo "result=$RESULT" >> $GITHUB_OUTPUT + + check-license: + needs: run-determination + if: needs.run-determination.outputs.result == 'true' + runs-on: ubuntu-latest + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Install Ruby + uses: ruby/setup-ruby@v1 + with: + ruby-version: ruby # Install latest version + + - name: Install licensee + run: gem install licensee + + - name: Check license file + run: | + EXIT_STATUS=0 + # See: https://github.com/licensee/licensee + LICENSEE_OUTPUT="$(licensee detect --json --confidence=100)" + + DETECTED_LICENSE_FILE="$(echo "$LICENSEE_OUTPUT" | jq .matched_files[0].filename | tr --delete '\r')" + echo "Detected license file: $DETECTED_LICENSE_FILE" + if [ "$DETECTED_LICENSE_FILE" != "\"${EXPECTED_LICENSE_FILENAME}\"" ]; then + echo "::error file=${DETECTED_LICENSE_FILE}::detected license file $DETECTED_LICENSE_FILE doesn't match expected: $EXPECTED_LICENSE_FILENAME" + EXIT_STATUS=1 + fi + + DETECTED_LICENSE_TYPE="$(echo "$LICENSEE_OUTPUT" | jq .matched_files[0].matched_license | tr --delete '\r')" + echo "Detected license type: $DETECTED_LICENSE_TYPE" + if [ "$DETECTED_LICENSE_TYPE" != "\"${EXPECTED_LICENSE_TYPE}\"" ]; then + echo "::error file=${DETECTED_LICENSE_FILE}::detected license type $DETECTED_LICENSE_TYPE doesn't match expected \"${EXPECTED_LICENSE_TYPE}\"" + EXIT_STATUS=1 + fi + + exit $EXIT_STATUS diff --git a/.github/workflows/close-stale-issues.yml b/.github/workflows/close-stale-issues.yml index 43d6be22a..06850e563 100644 --- a/.github/workflows/close-stale-issues.yml +++ b/.github/workflows/close-stale-issues.yml @@ -1,18 +1,24 @@ name: Close stale issues on: + workflow_dispatch: schedule: - cron: '30 8 * * mon' +permissions: + issues: write + jobs: stale: runs-on: ubuntu-latest steps: - - uses: actions/stale@v3 + - uses: actions/stale@v9 with: - stale-issue-message: 'This issue has been marked as stale because it has been open 14 days with no activity. Remove stale label or comment, otherwise it will be closed in 7 days ' - close-issue-message: 'This issue has been closed becasue has been stale for 7 days. If you think this issue deserves some attention feel free to reopen it' + stale-issue-message: 'This issue has been marked as stale because it has been open for more than 14 days with no activity. Remove stale label or comment, otherwise it will be closed in 7 days ' + stale-issue-label: 'status: stale' + close-issue-message: 'This issue has been closed becasue has been stale for more than 7 days. If you think this issue deserves some attention feel free to reopen it' + close-issue-label: 'conclusion: stale' days-before-stale: 14 days-before-close: 7 days-before-pr-close: -1 - only-labels: 'waiting for feedback' + only-labels: 'status: waiting for information' debug-only: false diff --git a/.github/workflows/publish-go-tester-task.yml b/.github/workflows/publish-go-tester-task.yml new file mode 100644 index 000000000..89d5c2b45 --- /dev/null +++ b/.github/workflows/publish-go-tester-task.yml @@ -0,0 +1,157 @@ +# Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/publish-go-tester-task.md +name: Publish Tester Build + +# See: https://docs.github.com/en/free-pro-team@latest/actions/reference/events-that-trigger-workflows +on: + create: + push: + paths: + - ".github/workflows/publish-go-tester-task.ya?ml" + - "go.mod" + - "go.sum" + - "Taskfile.ya?ml" + - "DistTasks.ya?ml" + - "**.go" + - "icon/**" + - "config.ini" + - "manifest.xml" + pull_request: + paths: + - ".github/workflows/publish-go-tester-task.ya?ml" + - "go.mod" + - "go.sum" + - "Taskfile.ya?ml" + - "DistTasks.ya?ml" + - "**.go" + - "icon/**" + - "config.ini" + - "manifest.xml" + workflow_dispatch: + repository_dispatch: + +env: + PROJECT_NAME: arduino-cloud-agent + GO_VERSION: "1.23" + +jobs: + run-determination: + runs-on: ubuntu-latest + outputs: + result: ${{ steps.determination.outputs.result }} + steps: + - name: Determine if the rest of the workflow should run + id: determination + run: | + RELEASE_BRANCH_REGEX="refs/heads/[0-9]+.[0-9]+.x" + # The `create` event trigger doesn't support `branches` filters, so it's necessary to use Bash instead. + if [[ \ + "${{ github.event_name }}" != "create" || \ + "${{ github.ref }}" =~ $RELEASE_BRANCH_REGEX \ + ]]; then + # Run the other jobs. + RESULT="true" + else + # There is no need to run the other jobs. + RESULT="false" + fi + + echo "result=$RESULT" >> $GITHUB_OUTPUT + + #this job is heavily customized because the build is quite a bit different from other tooling team projects + build: + needs: run-determination + if: needs.run-determination.outputs.result == 'true' + + #use the strategy instead because we still use the native build + strategy: + matrix: + os: [ubuntu-22.04, windows-2019, macos-13] + arch: [-amd64] + include: + - os: windows-2019 + arch: -386 + + defaults: + run: + shell: bash + + runs-on: ${{ matrix.os }} + + steps: + - name: Set env vars + run: | + echo $(go env GOPATH)/bin >> $GITHUB_PATH + + - name: Disable EOL conversions + run: git config --global core.autocrlf false + + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Install Go + uses: actions/setup-go@v5 + with: + go-version: ${{ env.GO_VERSION }} + + - name: Install Task + uses: arduino/setup-task@v2 + with: + repo-token: ${{ secrets.GITHUB_TOKEN }} + version: 3.x + + - name: Build the Agent for linux + run: task go:build + if: runner.os == 'Linux' + + # the manifest is required by windows GUI apps, otherwise the binary will crash with: "Unable to create main window: TTM_ADDTOOL failed" (for reference https://github.com/lxn/walk/issues/28) + # rsrc will produce a *.syso file that should get automatically recognized by go build command and linked into an executable. + - name: Download tool to embed manifest in win binary + run: go install github.com/akavel/rsrc@latest + if: runner.os == 'Windows' + + # building the agent for win requires a different task because of an extra flag + - name: Build the Agent for win32 + env: + GOARCH: 386 # 32bit architecture (for support) + run: task go:build-win + if: runner.os == 'Windows' && matrix.arch == '-386' + + - name: Build the Agent for win64 + run: task go:build-win # GOARCH=amd64 by default on the runners + if: runner.os == 'Windows' && matrix.arch == '-amd64' + + - name: Build the Agent for macos amd 64 + env: + MACOSX_DEPLOYMENT_TARGET: 10.15 # minimum supported version for mac + CGO_CFLAGS: -mmacosx-version-min=10.15 + CGO_LDFLAGS: -mmacosx-version-min=10.15 + run: | + task go:build + mv ${{ env.PROJECT_NAME }} ${{ env.PROJECT_NAME}}_amd64 + if: runner.os == 'macOS' + + - name: Build the Agent for macos arm 64 + env: + MACOSX_DEPLOYMENT_TARGET: 10.15 # minimum supported version for mac + CGO_CFLAGS: -mmacosx-version-min=10.15 + CGO_LDFLAGS: -mmacosx-version-min=10.15 + GOARCH: arm64 + CGO_ENABLED: 1 + run: | + task go:build + mv ${{ env.PROJECT_NAME }} ${{ env.PROJECT_NAME}}_arm64 + if: runner.os == 'macOS' + + - name: Create universal macos executable + run: | + lipo -create -output ${{ env.PROJECT_NAME }} ${{ env.PROJECT_NAME}}_amd64 ${{ env.PROJECT_NAME}}_arm64 + rm ${{ env.PROJECT_NAME}}_amd64 ${{ env.PROJECT_NAME}}_arm64 + if: runner.os == 'macOS' + + - name: Upload artifacts + uses: actions/upload-artifact@v4 + with: + name: ${{ env.PROJECT_NAME}}-${{ matrix.os }}${{ matrix.arch }} + path: | + ${{ env.PROJECT_NAME}}* + if-no-files-found: error diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 7107094f3..12b3781ba 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -1,41 +1,56 @@ -name: release +name: Release on: push: tags: - "[0-9]+.[0-9]+.[0-9]+*" +permissions: + contents: write + id-token: write # This is required for requesting the JWT + env: - TARGET: "/CreateAgent/Stable" - OLD_TARGET: "/CreateBridge/" # compatibility with older releases (we can't change config.ini) + # As defined by the Taskfile's PROJECT_NAME variable + PROJECT_NAME: arduino-cloud-agent + TARGET: "/CreateAgent/Stable/" VERSION_TARGET: "arduino-create-static/agent-metadata/" - AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} - AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} AWS_REGION: "us-east-1" # or https://github.com/aws/aws-cli/issues/5623 KEYCHAIN: "sign.keychain" + KEYCHAIN_PASSWORD: keychainpassword # Arbitrary password for a keychain that exists only for the duration of the job, so not secret + GON_CONFIG_PATH: gon.config.hcl INSTALLER_CERT_MAC_PATH: "/tmp/ArduinoCerts2020.p12" AC_USERNAME: ${{ secrets.AC_USERNAME }} # used by gon AC_PASSWORD: ${{ secrets.AC_PASSWORD }} # used by gon + AC_PROVIDER: ${{ secrets.AC_PROVIDER }} # used by gon + # See: https://github.com/actions/setup-go/tree/v3#readme + GO_VERSION: "1.23" jobs: # The build job is responsible for: configuring the environment, testing and compiling process build: + outputs: + prerelease: ${{ steps.prerelease.outputs.IS_PRE }} strategy: matrix: - os: [ubuntu-18.04, windows-2019, macos-10.15] - arch: [-amd64] + os: [ubuntu-22.04, windows-2019, macos-13] + arch: [amd64] include: - - os: windows-2019 - arch: -386 - ext: ".exe" - - os: windows-2019 - ext: ".exe" + - os: windows-2019 + arch: 386 + ext: ".exe" + - os: windows-2019 + ext: ".exe" defaults: run: shell: bash + # by default disable CGO, it's not needed (except on macos) + env: + CGO_ENABLED: 0 + runs-on: ${{ matrix.os }} + environment: production steps: - name: Set env vars @@ -47,430 +62,583 @@ jobs: # This is a workaround while waiting for create-release action to implement auto pre-release based on tag id: prerelease run: | - curl -L -s https://github.com/fsaintjacques/semver-tool/archive/3.1.0.zip -o /tmp/3.1.0.zip + curl -L -s https://github.com/fsaintjacques/semver-tool/archive/3.1.0.zip -o /tmp/3.1.0.zip unzip -p /tmp/3.1.0.zip semver-tool-3.1.0/src/semver >/tmp/semver && chmod +x /tmp/semver - if [[ $(/tmp/semver get prerel ${GITHUB_REF/refs\/tags\//}) ]]; then echo "::set-output name=IS_PRE::true"; fi + if [[ $(/tmp/semver get prerel ${GITHUB_REF/refs\/tags\//}) ]]; then echo "IS_PRE=true" >> $GITHUB_OUTPUT; fi - name: Disable EOL conversions run: git config --global core.autocrlf false - name: Checkout - uses: actions/checkout@v2 + uses: actions/checkout@v4 - name: Install Go - uses: actions/setup-go@v2 + uses: actions/setup-go@v5 with: - go-version: "1.14" - - # dependencies used for compiling the GUI - - name: Install Dependencies (Linux) - run: sudo apt update && sudo apt install -y --no-install-recommends build-essential libgtk-3-dev libwebkit2gtk-4.0-dev libappindicator3-dev - if: matrix.os == 'ubuntu-18.04' + go-version: ${{ env.GO_VERSION }} - name: Install Go deps - # Since 10/23/2019 pwsh is the default shell - # on Windows, but pwsh fails to install protoc-gen-go so - # we force bash as default shell for all OSes in this task - run: | - go get github.com/golangci/govet - go get golang.org/x/lint/golint - go get -u github.com/sanbornm/go-selfupdate/... + run: go install github.com/sanbornm/go-selfupdate/...@latest - name: Install Taskfile - uses: arduino/setup-task@v1 + uses: arduino/setup-task@v2 with: - version: '3.x' + version: "3.x" repo-token: ${{ secrets.GITHUB_TOKEN }} - - name: Check the code is good - run: task check - - - name: Run unit tests - run: task test-unit - - name: Build the Agent for linux - run: task build - if: matrix.os == 'ubuntu-18.04' - - # build the agent without GUI support (no tray icon) - - name: Build the Agent-cli - run: task build-cli - if: matrix.os == 'ubuntu-18.04' + run: task go:build + if: matrix.os == 'ubuntu-22.04' # the manifest is required by windows GUI apps, otherwise the binary will crash with: "Unable to create main window: TTM_ADDTOOL failed" (for reference https://github.com/lxn/walk/issues/28) # rsrc will produce a *.syso file that should get automatically recognized by go build command and linked into an executable. - name: Download tool to embed manifest in win binary - run: go get github.com/akavel/rsrc + run: go install github.com/akavel/rsrc@latest if: matrix.os == 'windows-2019' # building the agent for win requires a different task because of an extra flag - name: Build the Agent for win32 env: - GOARCH: 386 # 32bit architecture (for support) - GO386: 387 # support old instruction sets without MMX (used in the Pentium 4) (will be deprecated in GO > 1.15 https://golang.org/doc/go1.15) - run: task build-win - if: matrix.os == 'windows-2019' && matrix.arch == '-386' + GOARCH: 386 # 32bit architecture (for support) + run: task go:build-win + if: matrix.os == 'windows-2019' && matrix.arch == '386' - name: Build the Agent for win64 - run: task build-win # GOARCH=amd64 by default on the runners - if: matrix.os == 'windows-2019' && matrix.arch == '-amd64' + run: task go:build-win # GOARCH=amd64 by default on the runners + if: matrix.os == 'windows-2019' && matrix.arch == 'amd64' - - name: Build the Agent for macos + - name: Build the Agent for macos amd64 env: - MACOSX_DEPLOYMENT_TARGET: 10.11 # minimum supported version for mac - CGO_CFLAGS: -mmacosx-version-min=10.11 - CGO_LDFLAGS: -mmacosx-version-min=10.11 - run: task build - if: matrix.os == 'macos-10.15' - - - name: Install Python - uses: actions/setup-python@v2 - with: - python-version: '3.9' - architecture: 'x64' - if: matrix.os == 'macos-10.15' + CGO_ENABLED: 1 + MACOSX_DEPLOYMENT_TARGET: 10.15 # minimum supported version for mac + CGO_CFLAGS: -mmacosx-version-min=10.15 + CGO_LDFLAGS: -mmacosx-version-min=10.15 + run: | + task go:build + mv ${{ env.PROJECT_NAME }} ${{ env.PROJECT_NAME }}_amd64 + if: matrix.os == 'macos-13' + + - name: Build the Agent for macos arm64 + env: + CGO_ENABLED: 1 + MACOSX_DEPLOYMENT_TARGET: 10.15 # minimum supported version for mac + CGO_CFLAGS: -mmacosx-version-min=10.15 + CGO_LDFLAGS: -mmacosx-version-min=10.15 + GOARCH: arm64 + run: | + task go:build + mv ${{ env.PROJECT_NAME }} ${{ env.PROJECT_NAME }}_arm64 + if: matrix.os == 'macos-13' - - name: Run e2e tests + - name: Create universal macos executable run: | - pip install poetry - task test-e2e - if: matrix.os == 'macos-10.15' + lipo -create -output ${{ env.PROJECT_NAME }} ${{ env.PROJECT_NAME }}_amd64 ${{ env.PROJECT_NAME }}_arm64 + rm ${{ env.PROJECT_NAME }}_amd64 ${{ env.PROJECT_NAME }}_arm64 + if: matrix.os == 'macos-13' # this will create `public/` dir with compressed full bin (/-.gz) and a json file - name: Create autoupdate files - run: go-selfupdate arduino-create-agent${{ matrix.ext }} ${TAG_VERSION} - if: matrix.arch != '-386' && steps.prerelease.outputs.IS_PRE != 'true' + run: go-selfupdate ${{ env.PROJECT_NAME }}${{ matrix.ext }} ${TAG_VERSION} + if: matrix.arch != '386' && steps.prerelease.outputs.IS_PRE != 'true' + + - name: Copy autoupdate file for darwin-arm64 (m1 arch) + working-directory: public/ + run: | + cp darwin-amd64.json darwin-arm64.json + cp ${TAG_VERSION}/darwin-amd64.gz ${TAG_VERSION}/darwin-arm64.gz + if: matrix.os == 'macos-13' && steps.prerelease.outputs.IS_PRE != 'true' - name: Create autoupdate files for win32 - run: go-selfupdate -platform windows${{ matrix.arch }} arduino-create-agent${{ matrix.ext }} ${TAG_VERSION} - if: matrix.arch == '-386' && matrix.os == 'windows-2019' && steps.prerelease.outputs.IS_PRE != 'true' + run: go-selfupdate -platform windows-${{ matrix.arch }} ${{ env.PROJECT_NAME }}${{ matrix.ext }} ${TAG_VERSION} + if: matrix.arch == '386' && matrix.os == 'windows-2019' && steps.prerelease.outputs.IS_PRE != 'true' + + - name: configure aws credentials + uses: aws-actions/configure-aws-credentials@v4 + with: + role-to-assume: ${{ secrets.AWS_ROLE_TO_ASSUME }} + role-session-name: "github_${{ env.PROJECT_NAME }}" + aws-region: ${{ env.AWS_REGION }} + if: steps.prerelease.outputs.IS_PRE != 'true' - name: Upload autoupdate files to Arduino downloads servers run: | aws s3 sync public/ s3://${{ secrets.DOWNLOADS_BUCKET }}${{ env.TARGET }} - aws s3 sync public/ s3://${{ secrets.DOWNLOADS_BUCKET }}${{ env.OLD_TARGET }} if: steps.prerelease.outputs.IS_PRE != 'true' - # config.ini is required by the executable when it's run - name: Upload artifacts - uses: actions/upload-artifact@v2 + uses: actions/upload-artifact@v4 with: - name: arduino-create-agent-${{ matrix.os }}${{ matrix.arch }} + name: ${{ env.PROJECT_NAME }}-${{ matrix.os }}-${{ matrix.arch }} path: | - arduino-create-agent* - config.ini + ${{ env.PROJECT_NAME }}* if-no-files-found: error - # The code-sign-mac-executable job will download the macos artifact from the previous job, sign e notarize the binary and re-upload it. - code-sign-mac-executable: + create-macos-bundle: needs: build + + # for now they are exaclty the same strategy: - matrix: # to allow support for future architectures - os: [macos-10.15] - arch: [-amd64] + matrix: + arch: [amd64, arm64] - runs-on: ${{ matrix.os }} + runs-on: macos-13 + env: + EXE_PATH: "skel/ArduinoCloudAgent.app/Contents/MacOS/" steps: + - name: Checkout + uses: actions/checkout@v4 + with: + repository: "bcmi-labs/arduino-create-agent-installer" # the repo which contains the bundle structure and icons + token: ${{ secrets.ARDUINO_CREATE_AGENT_CI_PAT }} + - name: Download artifact - uses: actions/download-artifact@v2 + uses: actions/download-artifact@v4 with: - name: arduino-create-agent-${{ matrix.os }}${{ matrix.arch }} - path: arduino-create-agent + name: ${{ env.PROJECT_NAME }}-macos-13-amd64 # if we want to support darwin-arm64 in the future for real this has to change. + path: ${{ env.EXE_PATH }} + + - name: Remove placeholder file + run: rm -rf ${{ env.EXE_PATH }}.empty + + # zip artifacts do not mantain executable permission + - name: Make executable + run: chmod -v +x ${{ env.EXE_PATH }}${{ env.PROJECT_NAME }} + + - name: Rename executable to Arduino_Cloud_Agent + run: mv -v ${{ env.EXE_PATH }}${{ env.PROJECT_NAME }} ${{ env.EXE_PATH }}Arduino_Cloud_Agent + + - name: get year + run: echo "YEAR=$(date "+%Y")" >> $GITHUB_ENV + + - name: Generate Info.plist for MacOS + run: | + cat > skel/ArduinoCloudAgent.app/Contents/Info.plist <CFBundlePackageTypeAPPLCFBundleInfoDictionaryVersion6.0 + + CFBundleIconFile AppIcon.icns + + CFBundleName Arduino Cloud Agent + CFBundleExecutable Arduino_Cloud_Agent + CFBundleIdentifier create.arduino.cc + + CFBundleVersion ${GITHUB_REF##*/} + NSHumanReadableCopyright © Copyright ${{ env.YEAR }} Arduino LLC + CFBundleShortVersionString ${GITHUB_REF##*/} + LSUIElement + + NSPrincipalClassNSApplication + NSMainNibFileMainMenu + + + EOF + + - name: Tar bundle to keep permissions + run: tar -cvf ArduinoCloudAgent.app_${{ matrix.arch }}.tar -C skel/ . + + - name: Upload artifacts + uses: actions/upload-artifact@v4 + with: + if-no-files-found: error + name: ArduinoCloudAgent.app_${{ matrix.arch }} + path: ArduinoCloudAgent.app_${{ matrix.arch }}.tar + + # The notarize-macos job will download the macos bundle from the previous job, sign, notarize and re-upload it, uploading it also on s3 download servers for the autoupdate. + notarize-macos: + name: Notarize bundle + + # for now they are exaclty the same + strategy: + matrix: + arch: [amd64, arm64] + + runs-on: macos-13 + env: + GON_PATH: ${{ github.workspace }}/gon + needs: [build, create-macos-bundle] + environment: production + + steps: + - name: Install Go + uses: actions/setup-go@v5 + with: + go-version: ${{ env.GO_VERSION }} + + - name: Download artifact + uses: actions/download-artifact@v4 + with: + name: ArduinoCloudAgent.app_${{ matrix.arch }} + + - name: un-Tar bundle + run: tar -xvf ArduinoCloudAgent.app_${{ matrix.arch }}.tar - name: Import Code-Signing Certificates run: | - echo "${{ secrets.INSTALLER_CERT_MAC_P12 }}" | base64 --decode > ${{ env.INSTALLER_CERT_MAC_PATH }} - security create-keychain -p ${{ secrets.KEYCHAIN_PASSWORD }} ${{ env.KEYCHAIN }} - security default-keychain -s ${{ env.KEYCHAIN }} - security unlock-keychain -p ${{ secrets.KEYCHAIN_PASSWORD }} ${{ env.KEYCHAIN }} - security import ${{ env.INSTALLER_CERT_MAC_PATH }} -k ${{ env.KEYCHAIN }} -f pkcs12 -A -T /usr/bin/codesign -P ${{ secrets.INSTALLER_CERT_MAC_PASSWORD }} - security set-key-partition-list -S apple-tool:,apple: -s -k ${{ secrets.KEYCHAIN_PASSWORD }} ${{ env.KEYCHAIN }} + echo "${{ secrets.INSTALLER_CERT_MAC_P12 }}" | base64 --decode > "${{ env.INSTALLER_CERT_MAC_PATH }}" + security create-keychain -p "${{ env.KEYCHAIN_PASSWORD }}" "${{ env.KEYCHAIN }}" + security default-keychain -s "${{ env.KEYCHAIN }}" + security unlock-keychain -p "${{ env.KEYCHAIN_PASSWORD }}" "${{ env.KEYCHAIN }}" + security import \ + "${{ env.INSTALLER_CERT_MAC_PATH }}" \ + -k "${{ env.KEYCHAIN }}" \ + -f pkcs12 \ + -A \ + -T "/usr/bin/codesign" \ + -P "${{ secrets.INSTALLER_CERT_MAC_PASSWORD }}" + security set-key-partition-list \ + -S apple-tool:,apple: \ + -s \ + -k "${{ env.KEYCHAIN_PASSWORD }}" \ + "${{ env.KEYCHAIN }}" + + - name: Install gon for code signing + uses: actions/checkout@v4 + with: + repository: darkvertex/gon #this fork has support for --deep notarization + path: ${{ env.GON_PATH }} + ref: deep_sign_support - - name: Install gon for code signing and app notarization + - name: Build gon + working-directory: ${{ env.GON_PATH }}/cmd/gon/ run: | - wget -q https://github.com/mitchellh/gon/releases/download/v0.2.3/gon_macos.zip - unzip gon_macos.zip -d /usr/local/bin + ls -lah + go build + mv gon /usr/local/bin - name: Write gon config to file # gon does not allow env variables in config file (https://github.com/mitchellh/gon/issues/20) run: | - cat > gon.config.hcl < "${{ env.GON_CONFIG_PATH }}" < "${{ env.GON_CONFIG_PATH }}" < darwin-${{ matrix.arch }}-bundle.json < /tmp/license.xml - - name: get year - run: echo "YEAR=$(date "+%Y")" >> $GITHUB_ENV - if: matrix.os == 'macos-10.15' + - name: Launch Bitrock installbuilder + run: ${{ env.INSTALLBUILDER_PATH }} build installer.xml ${{ matrix.installbuilder-name }} --verbose --license /tmp/license.xml --setvars ${{ env.INSTALLER_VARS }} architecture=${{ matrix.arch }} - - name: Generate Info.plist for MacOS - run: | - cat > skel/ArduinoCreateAgent.app/Contents/Info.plist <CFBundlePackageTypeAPPLCFBundleInfoDictionaryVersion6.0 + - name: Generate archive + run: tar -czvf ArduinoCloudAgent-${GITHUB_REF##*/}-${{ matrix.platform-name }}-${{ matrix.arch }}-installer.tar.gz ArduinoCloudAgent-${GITHUB_REF##*/}-${{ matrix.platform-name }}-${{ matrix.arch }}-installer${{matrix.installer-extension}} + if: matrix.os == 'ubuntu-22.04' - CFBundleIconFile AppIcon.icns + - name: Upload artifacts + uses: actions/upload-artifact@v4 + with: + name: ArduinoCloudAgent-${{ matrix.platform-name }}-${{ matrix.arch }} + path: ArduinoCloudAgent* + if-no-files-found: error - CFBundleName Arduino Create Agent - CFBundleExecutable Arduino_Create_Agent - CFBundleIdentifier create.arduino.cc + # This job will sign the Windows installer + sign-windows: + runs-on: [self-hosted, windows-sign-pc] + needs: package - CFBundleVersion ${GITHUB_REF##*/} - NSHumanReadableCopyright © Copyright ${{ env.YEAR }} Arduino LLC - CFBundleShortVersionString ${GITHUB_REF##*/} - LSUIElement - - NSPrincipalClassNSApplication - NSMainNibFileMainMenu + defaults: + run: + shell: bash - - EOF - if: matrix.os == 'macos-10.15' + env: + INSTALLER_CERT_WINDOWS_CER: "/tmp/cert.cer" + # We are hardcoding the path for signtool because is not present on the windows PATH env var by default. + # Keep in mind that this path could change when upgrading to a new runner version + SIGNTOOL_PATH: "C:/Program Files (x86)/Windows Kits/10/bin/10.0.19041.0/x86/signtool.exe" - - name: Save InstallBuilder license to file - run: echo "${{ secrets.INSTALLER_LICENSE }}" > /tmp/license.xml + strategy: + matrix: + arch: [amd64, 386] - - name: Save Win signing certificate to file - run: echo "${{ secrets.INSTALLER_CERT_WINDOWS_PFX }}" | base64 --decode > ${{ env.INSTALLER_CERT_WINDOWS_PFX}} - if: matrix.os == 'windows-2019' + steps: + - name: Download artifact + uses: actions/download-artifact@v4 + with: + name: ArduinoCloudAgent-windows-${{ matrix.arch }} - - name: Save macos signing certificate to file - run: echo "${{ secrets.INSTALLER_CERT_MAC_P12 }}" | base64 --decode > ${{ env.INSTALLER_CERT_MAC_P12 }} - if: matrix.os == 'macos-10.15' + - name: Save Win signing certificate to file + run: echo "${{ secrets.INSTALLER_CERT_WINDOWS_CER }}" | base64 --decode > ${{ env.INSTALLER_CERT_WINDOWS_CER}} - # win(edge),mac(safari) -> CERT_INSTALL and win,mac:(ff,chrome) -> CHOICE_CERT_INSTALL - # installbuilder reads the env vars with certs paths and use it to sign the installer. - - name: Launch Bitrock installbuilder-20 with CERT_INSTALL && CHOICE_CERT_INSTALL - run: | - ${{ env.INSTALLBUILDER_PATH }} build installer.xml ${{ matrix.install-builder-name }} --verbose --license /tmp/license.xml --setvars ${{ env.INSTALLER_VARS }} ${{ env.CERT_INSTALL }} - mv -v ArduinoCreateAgent-${GITHUB_REF##*/}-${{ matrix.install-builder-name }}-installer-CI${{matrix.installer-extension}} ArduinoCreateAgent-${GITHUB_REF##*/}-${{ matrix.install-builder-name }}${{ matrix.arch }}-installer-${{matrix.browser}}${{matrix.installer-extension}} - ${{ env.INSTALLBUILDER_PATH }} build installer.xml ${{ matrix.install-builder-name }} --verbose --license /tmp/license.xml --setvars ${{ env.INSTALLER_VARS }} ${{ env.CHOICE_CERT_INSTALL }} - cp -vr ArduinoCreateAgent-${GITHUB_REF##*/}-${{ matrix.install-builder-name }}-installer-CC${{matrix.installer-extension}} ArduinoCreateAgent-${GITHUB_REF##*/}-${{ matrix.install-builder-name }}${{ matrix.arch }}-installer-chrome${{matrix.installer-extension}} - mv -v ArduinoCreateAgent-${GITHUB_REF##*/}-${{ matrix.install-builder-name }}-installer-CC${{matrix.installer-extension}} ArduinoCreateAgent-${GITHUB_REF##*/}-${{ matrix.install-builder-name }}${{ matrix.arch }}-installer-firefox${{matrix.installer-extension}} - rm -r ArduinoCreateAgent-${GITHUB_REF##*/}-${{ matrix.install-builder-name }}-installer-C* - if: matrix.os == 'windows-2019' || matrix.os == 'macos-10.15' - - # linux - - name: Launch Bitrock installbuilder-20 with NO_CERT_INSTALL + - name: Sign EXE + env: + CERT_PASSWORD: ${{ secrets.INSTALLER_CERT_WINDOWS_PASSWORD }} + CONTAINER_NAME: ${{ secrets.INSTALLER_CERT_WINDOWS_CONTAINER }} + # https://stackoverflow.com/questions/17927895/automate-extended-validation-ev-code-signing-with-safenet-etoken run: | - ${{ env.INSTALLBUILDER_PATH }} build installer.xml linux-x64 --verbose --license /tmp/license.xml --setvars ${{ env.INSTALLER_VARS }} ${{ env.NO_CERT_INSTALL }} - cp -v ArduinoCreateAgent-${GITHUB_REF##*/}-linux-x64-installer-CS.run ArduinoCreateAgent-${GITHUB_REF##*/}-${{ matrix.install-builder-name }}${{ matrix.arch }}-installer-chrome.run - mv -v ArduinoCreateAgent-${GITHUB_REF##*/}-linux-x64-installer-CS.run ArduinoCreateAgent-${GITHUB_REF##*/}-${{ matrix.install-builder-name }}${{ matrix.arch }}-installer-firefox.run - cp -v ArduinoCreateAgent-${GITHUB_REF##*/}-linux-x64-installer-CS.tar.gz ArduinoCreateAgent-${GITHUB_REF##*/}-${{ matrix.install-builder-name }}${{ matrix.arch }}-installer-chrome.tar.gz - mv -v ArduinoCreateAgent-${GITHUB_REF##*/}-linux-x64-installer-CS.tar.gz ArduinoCreateAgent-${GITHUB_REF##*/}-${{ matrix.install-builder-name }}${{ matrix.arch }}-installer-firefox.tar.gz - if: matrix.os == 'ubuntu-18.04' + "${{ env.SIGNTOOL_PATH }}" sign -d "Arduino Cloud Agent" -f ${{ env.INSTALLER_CERT_WINDOWS_CER}} -csp "eToken Base Cryptographic Provider" -k "[{{${{ env.CERT_PASSWORD }}}}]=${{ env.CONTAINER_NAME }}" -fd sha256 -tr http://timestamp.digicert.com -td SHA256 -v "ArduinoCloudAgent-${GITHUB_REF##*/}-windows-${{ matrix.arch }}-installer.exe" - name: Upload artifacts - uses: actions/upload-artifact@v2 + uses: actions/upload-artifact@v4 with: - name: ArduinoCreateAgent-${{ matrix.install-builder-name }}${{ matrix.arch }} - path: ArduinoCreateAgent* if-no-files-found: error + name: ArduinoCloudAgent-windows-${{ matrix.arch }}-signed + path: ArduinoCloudAgent-*-windows-${{ matrix.arch }}-installer.exe - # This job will sign and notarize mac installers - code-sign-mac-installers: - needs: package + # This step is needed because the self hosted runner does not delete files automatically + - name: Clean up EXE + run: rm ArduinoCloudAgent-*-windows-${{ matrix.arch }}-installer.exe + + # This job will generate a dmg mac installer, sign/notarize it. + generate-sign-dmg: + needs: notarize-macos strategy: matrix: - browser: [safari, firefox, chrome] - arch: [-amd64] + arch: [amd64] - runs-on: macos-10.15 + runs-on: macos-13 steps: + - name: Checkout repo with icons/background + uses: actions/checkout@v4 + with: + repository: "bcmi-labs/arduino-create-agent-installer" # the repo which contains the icons/background + token: ${{ secrets.ARDUINO_CREATE_AGENT_CI_PAT }} + - name: Download artifact - uses: actions/download-artifact@v2 + uses: actions/download-artifact@v4 with: - name: ArduinoCreateAgent-osx${{ matrix.arch }} - path: ArduinoCreateAgent-osx + name: ArduinoCloudAgent.app_${{ matrix.arch }}_notarized + path: ArduinoCloudAgent.app - # zip artifacts do not mantain executable permission - - name: Make executable - run: chmod -v +x ArduinoCreateAgent-osx/ArduinoCreateAgent-${GITHUB_REF##*/}-osx${{ matrix.arch }}-installer-${{ matrix.browser }}.app/Contents/MacOS/* + - name: unzip artifact + working-directory: ArduinoCloudAgent.app + run: | + unzip ArduinoCreateAgent.app_${{ matrix.arch }}_notarized.zip + rm ArduinoCreateAgent.app_${{ matrix.arch }}_notarized.zip + + - name: Install create-dmg + run: brew install create-dmg + + - name: Generate DMG + run: | + create-dmg \ + --volname "ArduinoCloudAgent" \ + --background "installer_icons/background.tiff" \ + --window-pos 200 120 \ + --window-size 500 320 \ + --icon-size 80 \ + --icon "ArduinoCloudAgent.app" 125 150 \ + --app-drop-link 375 150 \ + "ArduinoCloudAgent-${GITHUB_REF##*/}-osx-${{ matrix.arch }}-installer.dmg" \ + "ArduinoCloudAgent.app" - name: Import Code-Signing Certificates run: | - echo "${{ secrets.INSTALLER_CERT_MAC_P12 }}" | base64 --decode > ${{ env.INSTALLER_CERT_MAC_PATH }} - security create-keychain -p ${{ secrets.KEYCHAIN_PASSWORD }} ${{ env.KEYCHAIN }} - security default-keychain -s ${{ env.KEYCHAIN }} - security unlock-keychain -p ${{ secrets.KEYCHAIN_PASSWORD }} ${{ env.KEYCHAIN }} - security import ${{ env.INSTALLER_CERT_MAC_PATH }} -k ${{ env.KEYCHAIN }} -f pkcs12 -A -T /usr/bin/codesign -P ${{ secrets.INSTALLER_CERT_MAC_PASSWORD }} - security set-key-partition-list -S apple-tool:,apple: -s -k ${{ secrets.KEYCHAIN_PASSWORD }} ${{ env.KEYCHAIN }} + echo "${{ secrets.INSTALLER_CERT_MAC_P12 }}" | base64 --decode > "${{ env.INSTALLER_CERT_MAC_PATH }}" + security create-keychain -p "${{ env.KEYCHAIN_PASSWORD }}" "${{ env.KEYCHAIN }}" + security default-keychain -s "${{ env.KEYCHAIN }}" + security unlock-keychain -p "${{ env.KEYCHAIN_PASSWORD }}" "${{ env.KEYCHAIN }}" + security import \ + "${{ env.INSTALLER_CERT_MAC_PATH }}" \ + -k "${{ env.KEYCHAIN }}" \ + -f pkcs12 \ + -A \ + -T "/usr/bin/codesign" \ + -P "${{ secrets.INSTALLER_CERT_MAC_PASSWORD }}" + security set-key-partition-list \ + -S apple-tool:,apple: \ + -s \ + -k "${{ env.KEYCHAIN_PASSWORD }}" \ + "${{ env.KEYCHAIN }}" - name: Install gon for code signing and app notarization run: | - wget -q https://github.com/mitchellh/gon/releases/download/v0.2.3/gon_macos.zip + wget -q https://github.com/Bearer/gon/releases/download/v0.0.36/gon_macos.zip unzip gon_macos.zip -d /usr/local/bin - name: Write gon config to file # gon does not allow env variables in config file (https://github.com/mitchellh/gon/issues/20) run: | cat > gon.config_installer.hcl </tmp/semver && chmod +x /tmp/semver - if [[ $(/tmp/semver get prerel ${GITHUB_REF/refs\/tags\//}) ]]; then echo "::set-output name=IS_PRE::true"; fi + - name: Download artifact + uses: actions/download-artifact@v4 # download all the artifacts # mandatory step because upload-release-action does not support multiple folders - name: prepare artifacts for the release run: | mkdir release - chmod -v +x ArduinoCreateAgent-linux-amd64/*.run - mv -v ArduinoCreateAgent-linux-amd64/* release/ - cat ArduinoCreateAgent-osx-amd64/*.tar | tar -xvf - -i -C release/ - rm -v release/._ArduinoCreateAgent*.dmg - mv -v ArduinoCreateAgent-windows*/* release/ + chmod -v +x ArduinoCloudAgent-linux-amd64/*.run + mv -v ArduinoCloudAgent-linux-amd64/* release/ + cat ArduinoCloudAgent-osx-amd64/*.tar | tar -xvf - -i -C release/ + rm -v release/._ArduinoCloudAgent*.dmg + mv -v ArduinoCloudAgent-windows*-signed/* release/ - name: VirusTotal Scan id: virustotal_step - uses: crazy-max/ghaction-virustotal@v2 + uses: crazy-max/ghaction-virustotal@v4 with: vt_api_key: ${{ secrets.VIRUSTOTAL_API_KEY }} update_release_body: false # `true` won't work because trigger type is not release files: | release/*.exe - arduino-create-agent-windows-2019-386/arduino-create-agent.exe - arduino-create-agent-windows-2019-amd64/arduino-create-agent.exe + ${{ env.PROJECT_NAME }}-windows-2019-386/${{ env.PROJECT_NAME }}.exe + ${{ env.PROJECT_NAME }}-windows-2019-amd64/${{ env.PROJECT_NAME }}.exe - name: Create changelog uses: arduino/create-changelog@v1 @@ -483,43 +651,42 @@ jobs: - name: Organize release body message #use sed to clean and format the output markdown style id: release_body run: | - body=$(cat CHANGELOG.md) - body="${body//'%'/'%25'}" - body="${body//$'\n'/'%0A'}" - body="${body//$'\r'/'%0D'}" - vt_title_pre="
\nVirusTotal analysis 🛡\n\n" - vt_links="$(echo ${{ steps.virustotal_step.outputs.analysis}} | sed 's/release\///g' | sed 's/,/\n/g' | sed 's/^/- [/' | sed 's/=/](/' | sed 's/$/)/')" - vt_title_post="\n
" - vt_title_pre="${vt_title_pre//'\n'/'%0A'}" - vt_links="${vt_links//$'\n'/'%0A'}" # replace \n with a special character -> generates a single lines, \n will be reintroduced later - vt_title_post="${vt_title_post//'\n'/'%0A'}" - echo "::set-output name=RBODY::$body'%0A'$vt_title_pre$vt_links$vt_title_post" - - - name: Create Github Release - uses: actions/create-release@v1 - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + echo "RBODY<> $GITHUB_OUTPUT + echo "$(cat CHANGELOG.md)" >> $GITHUB_OUTPUT + echo "
" >> $GITHUB_OUTPUT + echo "VirusTotal analysis 🛡" >> $GITHUB_OUTPUT + echo "" >> $GITHUB_OUTPUT + echo "$(echo ${{ steps.virustotal_step.outputs.analysis}} | sed 's/release\///g' | sed 's/,/\n/g' | sed 's/^/- [/' | sed 's/=/](/' | sed 's/$/)/')" >> $GITHUB_OUTPUT + echo "
" >> $GITHUB_OUTPUT + echo "EOF" >> $GITHUB_OUTPUT + + - name: Create Github Release and upload artifacts + uses: ncipollo/release-action@v1 with: - tag_name: ${{ github.ref }} - release_name: ${{ github.ref }} + token: ${{ secrets.GITHUB_TOKEN }} body: ${{ steps.release_body.outputs.RBODY}} draft: false - prerelease: ${{ steps.prerelease.outputs.IS_PRE }} + prerelease: ${{ needs.build.outputs.prerelease }} + # NOTE: "Artifact is a directory" warnings are expected and don't indicate a problem + # (all the files we need are in the DIST_DIR root) + artifacts: release/* - - name: Upload release files on Github - uses: svenstaro/upload-release-action@v2 + - name: configure aws credentials + uses: aws-actions/configure-aws-credentials@v4 with: - repo_token: ${{ secrets.GITHUB_TOKEN }} - tag: ${{ github.ref }} - file_glob: true # If set to true, the file argument can be a glob pattern - file: release/* + role-to-assume: ${{ secrets.AWS_ROLE_TO_ASSUME }} + role-session-name: "github_${{ env.PROJECT_NAME }}" + aws-region: ${{ env.AWS_REGION }} + if: ${{ needs.build.outputs.prerelease != 'true' }} - name: Upload release files on Arduino downloads servers run: aws s3 sync release/ s3://${{ secrets.DOWNLOADS_BUCKET }}${{ env.TARGET }} - if: steps.prerelease.outputs.IS_PRE != 'true' + if: ${{ needs.build.outputs.prerelease != 'true' }} - name: Update version file (used by frontend to trigger autoupdate and create filename) run: | echo {\"Version\": \"${GITHUB_REF##*/}\"} > /tmp/agent-version.json + # TODO remove this when we will have a new frontend aws s3 cp /tmp/agent-version.json s3://${{ env.VERSION_TARGET }} - if: steps.prerelease.outputs.IS_PRE != 'true' + aws s3 cp /tmp/agent-version.json s3://${{ secrets.DOWNLOADS_BUCKET }}/agent-metadata/ + if: ${{ needs.build.outputs.prerelease != 'true' }} diff --git a/.github/workflows/sync-labels.yml b/.github/workflows/sync-labels.yml new file mode 100644 index 000000000..184a42077 --- /dev/null +++ b/.github/workflows/sync-labels.yml @@ -0,0 +1,140 @@ +# Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/sync-labels.md +name: Sync Labels + +# See: https://docs.github.com/en/actions/reference/events-that-trigger-workflows +on: + push: + paths: + - ".github/workflows/sync-labels.ya?ml" + - ".github/label-configuration-files/*.ya?ml" + pull_request: + paths: + - ".github/workflows/sync-labels.ya?ml" + - ".github/label-configuration-files/*.ya?ml" + schedule: + # Run daily at 8 AM UTC to sync with changes to shared label configurations. + - cron: "0 8 * * *" + workflow_dispatch: + repository_dispatch: + +env: + CONFIGURATIONS_FOLDER: .github/label-configuration-files + CONFIGURATIONS_ARTIFACT: label-configuration-files + +jobs: + check: + runs-on: ubuntu-latest + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Download JSON schema for labels configuration file + id: download-schema + uses: carlosperate/download-file-action@v2 + with: + file-url: https://raw.githubusercontent.com/arduino/tooling-project-assets/main/workflow-templates/assets/sync-labels/arduino-tooling-gh-label-configuration-schema.json + location: ${{ runner.temp }}/label-configuration-schema + + - name: Install JSON schema validator + run: | + sudo npm install \ + --global \ + ajv-cli \ + ajv-formats + + - name: Validate local labels configuration + run: | + # See: https://github.com/ajv-validator/ajv-cli#readme + ajv validate \ + --all-errors \ + -c ajv-formats \ + -s "${{ steps.download-schema.outputs.file-path }}" \ + -d "${{ env.CONFIGURATIONS_FOLDER }}/*.{yml,yaml}" + + download: + needs: check + runs-on: ubuntu-latest + + strategy: + matrix: + filename: + # Filenames of the shared configurations to apply to the repository in addition to the local configuration. + # https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/assets/sync-labels + - universal.yml + - tooling.yml + + steps: + - name: Download + uses: carlosperate/download-file-action@v2 + with: + file-url: https://raw.githubusercontent.com/arduino/tooling-project-assets/main/workflow-templates/assets/sync-labels/${{ matrix.filename }} + + - name: Pass configuration files to next job via workflow artifact + uses: actions/upload-artifact@v4 + with: + path: | + *.yaml + *.yml + if-no-files-found: error + name: ${{ env.CONFIGURATIONS_ARTIFACT }}-${{ matrix.filename }} + + sync: + needs: download + runs-on: ubuntu-latest + + steps: + - name: Set environment variables + run: | + # See: https://docs.github.com/en/actions/reference/workflow-commands-for-github-actions#setting-an-environment-variable + echo "MERGED_CONFIGURATION_PATH=${{ runner.temp }}/labels.yml" >> "$GITHUB_ENV" + + - name: Determine whether to dry run + id: dry-run + if: > + github.event_name == 'pull_request' || + ( + ( + github.event_name == 'push' || + github.event_name == 'workflow_dispatch' + ) && + github.ref != format('refs/heads/{0}', github.event.repository.default_branch) + ) + run: | + # Use of this flag in the github-label-sync command will cause it to only check the validity of the + # configuration. + echo "flag=--dry-run" >> $GITHUB_OUTPUT + + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Download configuration files artifact + uses: actions/download-artifact@v4 + with: + pattern: ${{ env.CONFIGURATIONS_ARTIFACT }}-* # Download all configuration files + path: ${{ env.CONFIGURATIONS_FOLDER }} + merge-multiple: true + + - name: Remove unneeded artifact + uses: geekyeggo/delete-artifact@v5 + with: + name: ${{ env.CONFIGURATIONS_ARTIFACT }} + + - name: Merge label configuration files + run: | + # Merge all configuration files + shopt -s extglob + cat "${{ env.CONFIGURATIONS_FOLDER }}"/*.@(yml|yaml) > "${{ env.MERGED_CONFIGURATION_PATH }}" + + - name: Install github-label-sync + run: sudo npm install --global github-label-sync + + - name: Sync labels + env: + GITHUB_ACCESS_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + # See: https://github.com/Financial-Times/github-label-sync + github-label-sync \ + --labels "${{ env.MERGED_CONFIGURATION_PATH }}" \ + ${{ steps.dry-run.outputs.flag }} \ + ${{ github.repository }} diff --git a/.github/workflows/test-go-integration-task.yml b/.github/workflows/test-go-integration-task.yml new file mode 100644 index 000000000..7eeb8e55f --- /dev/null +++ b/.github/workflows/test-go-integration-task.yml @@ -0,0 +1,106 @@ +# Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/test-go-integration-task.md +name: Test Integration + +env: + # See: https://github.com/actions/setup-go/tree/v2#readme + GO_VERSION: "1.23" + # See: https://github.com/actions/setup-python/tree/v2#available-versions-of-python + PYTHON_VERSION: "3.9" + +# See: https://docs.github.com/en/free-pro-team@latest/actions/reference/events-that-trigger-workflows +on: + create: + push: + paths: + - ".github/workflows/test-go-integration-task.ya?ml" + - "Taskfile.ya?ml" + - "**.go" + - "go.mod" + - "go.sum" + - "poetry.lock" + - "pyproject.toml" + - "tests/**" + pull_request: + paths: + - ".github/workflows/test-go-integration-task.ya?ml" + - "Taskfile.ya?ml" + - "**.go" + - "go.mod" + - "go.sum" + - "poetry.lock" + - "pyproject.toml" + - "tests/**" + workflow_dispatch: + repository_dispatch: + +jobs: + run-determination: + runs-on: ubuntu-latest + outputs: + result: ${{ steps.determination.outputs.result }} + steps: + - name: Determine if the rest of the workflow should run + id: determination + run: | + RELEASE_BRANCH_REGEX="refs/heads/[0-9]+.[0-9]+.x" + # The `create` event trigger doesn't support `branches` filters, so it's necessary to use Bash instead. + if [[ \ + "${{ github.event_name }}" != "create" || \ + "${{ github.ref }}" =~ $RELEASE_BRANCH_REGEX \ + ]]; then + # Run the other jobs. + RESULT="true" + else + # There is no need to run the other jobs. + RESULT="false" + fi + + echo "result=$RESULT" >> $GITHUB_OUTPUT + + test: + needs: run-determination + if: needs.run-determination.outputs.result == 'true' + + strategy: + matrix: + operating-system: + - ubuntu-latest + - windows-latest + - macos-latest + + runs-on: ${{ matrix.operating-system }} + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Install Go + uses: actions/setup-go@v5 + with: + go-version: ${{ env.GO_VERSION }} + + - name: Install Python + uses: actions/setup-python@v5 + with: + python-version: ${{ env.PYTHON_VERSION }} + + - name: Install Poetry + run: pip install poetry + + - name: Install Task + uses: arduino/setup-task@v2 + with: + repo-token: ${{ secrets.GITHUB_TOKEN }} + version: 3.x + + # build the agent for integration testing + - name: Build the Agent-cli + run: task go:build + if: matrix.operating-system != 'windows-latest' + + - name: Build the Agent-cli for win + run: task go:build-win-cli + if: matrix.operating-system == 'windows-latest' + + - name: Run integration tests + run: task go:test-integration diff --git a/.github/workflows/test-go-task.yml b/.github/workflows/test-go-task.yml new file mode 100644 index 000000000..cbb95655f --- /dev/null +++ b/.github/workflows/test-go-task.yml @@ -0,0 +1,121 @@ +# Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/test-go-task.md +name: Test Go + +env: + # See: https://github.com/actions/setup-go/tree/v2#readme + GO_VERSION: "1.23" + +# See: https://docs.github.com/en/free-pro-team@latest/actions/reference/events-that-trigger-workflows +on: + create: + push: + paths: + - ".github/workflows/test-go-task.ya?ml" + - "codecov.ya?ml" + - "**/go.mod" + - "**/go.sum" + - "Taskfile.ya?ml" + - "**.go" + - "**/testdata/**" + pull_request: + paths: + - ".github/workflows/test-go-task.ya?ml" + - "codecov.ya?ml" + - "**/go.mod" + - "**/go.sum" + - "Taskfile.ya?ml" + - "**.go" + - "**/testdata/**" + workflow_dispatch: + repository_dispatch: + +jobs: + run-determination: + runs-on: ubuntu-latest + outputs: + result: ${{ steps.determination.outputs.result }} + steps: + - name: Determine if the rest of the workflow should run + id: determination + run: | + RELEASE_BRANCH_REGEX="refs/heads/[0-9]+.[0-9]+.x" + # The `create` event trigger doesn't support `branches` filters, so it's necessary to use Bash instead. + if [[ \ + "${{ github.event_name }}" != "create" || \ + "${{ github.ref }}" =~ $RELEASE_BRANCH_REGEX \ + ]]; then + # Run the other jobs. + RESULT="true" + else + # There is no need to run the other jobs. + RESULT="false" + fi + + echo "result=$RESULT" >> $GITHUB_OUTPUT + + test: + name: test (${{ matrix.module.path }} - ${{ matrix.operating-system }}) + needs: run-determination + if: needs.run-determination.outputs.result == 'true' + + strategy: + fail-fast: false + + matrix: + operating-system: + - ubuntu-latest + - windows-latest + - macos-latest + module: + - path: ./ + codecov-flags: unit + + runs-on: ${{ matrix.operating-system }} + + steps: + # By default, actions/checkout converts the repo's LF line endings to CRLF on the Windows runner. + - name: Disable EOL conversions + run: git config --global core.autocrlf false + + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Install Go + uses: actions/setup-go@v5 + with: + go-version: ${{ env.GO_VERSION }} + + - name: Install Task + uses: arduino/setup-task@v2 + with: + repo-token: ${{ secrets.GITHUB_TOKEN }} + version: 3.x + + - name: Run tests + env: + GO_MODULE_PATH: ${{ matrix.module.path }} + run: task go:test + + # A token is used to avoid intermittent spurious job failures caused by rate limiting. + - name: Set up Codecov upload token + if: runner.os == 'Linux' + run: | + if [[ "${{ github.repository }}" == "arduino/arduino-create-agent" ]]; then + # In order to avoid uploads of data from forks, only use the token for runs in the arduino/arduino-create-agent repo. + # Token is intentionally exposed. + # See: https://community.codecov.com/t/upload-issues-unable-to-locate-build-via-github-actions-api/3954 + CODECOV_TOKEN=fe64847a-368e-4f95-9212-1f7a6835043f + else + # codecov/codecov-action does unauthenticated upload if empty string is passed via the `token` input. + CODECOV_TOKEN="" + fi + echo "CODECOV_TOKEN=$CODECOV_TOKEN" >> "$GITHUB_ENV" + + - name: Send unit tests coverage to Codecov + if: runner.os == 'Linux' + uses: codecov/codecov-action@v4 + with: + token: ${{ env.CODECOV_TOKEN }} + files: ${{ matrix.module.path }}coverage_unit.txt + flags: ${{ matrix.module.codecov-flags }} + fail_ci_if_error: ${{ github.repository == 'arduino/arduino-create-agent' }} diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml deleted file mode 100644 index 3c29107fb..000000000 --- a/.github/workflows/test.yml +++ /dev/null @@ -1,115 +0,0 @@ -name: test - -on: - pull_request: - -jobs: - test-matrix: - strategy: - matrix: - os: [ubuntu-18.04, windows-2019, macos-10.15] - arch: [-amd64] - include: - - os: windows-2019 - arch: -386 - - defaults: - run: - shell: bash - - runs-on: ${{ matrix.os }} - - steps: - - name: Disable EOL conversions - run: git config --global core.autocrlf false - - - name: Checkout - uses: actions/checkout@v2 - - - name: Install Go - uses: actions/setup-go@v2 - with: - go-version: "1.14" - - # dependencies used for compiling the GUI - - name: Install Dependencies (Linux) - run: sudo apt update && sudo apt install -y --no-install-recommends build-essential libgtk-3-dev libwebkit2gtk-4.0-dev libappindicator3-dev - if: matrix.os == 'ubuntu-18.04' - - - name: Install Go deps - # Since 10/23/2019 pwsh is the default shell - # on Windows, but pwsh fails to install protoc-gen-go so - # we force bash as default shell for all OSes in this task - run: | - go get github.com/golangci/govet - go get golang.org/x/lint/golint - - - name: Install Taskfile - uses: arduino/setup-task@v1 - with: - version: '3.x' - repo-token: ${{ secrets.GITHUB_TOKEN }} - - - name: Check the code is good - run: task check - - - name: Run unit tests - run: task test-unit - - - name: Build the Agent for linux - run: task build - if: matrix.os == 'ubuntu-18.04' - - # build the agent without GUI support (no tray icon) - - name: Build the Agent-cli - run: task build-cli - if: matrix.os == 'ubuntu-18.04' - - # the manifest is required by windows GUI apps, otherwise the binary will crash with: "Unable to create main window: TTM_ADDTOOL failed" (for reference https://github.com/lxn/walk/issues/28) - # rsrc will produce a *.syso file that should get automatically recognized by go build command and linked into an executable. - - name: Download tool to embed manifest in win binary - run: go get github.com/akavel/rsrc - if: matrix.os == 'windows-2019' - - # building the agent for win requires a different task because of an extra flag - - name: Build the Agent for win32 - env: - GOARCH: 386 # 32bit architecture (for support) - GO386: 387 # support old instruction sets without MMX (used in the Pentium 4) (will be deprecated in GO > 1.15 https://golang.org/doc/go1.15) - run: task build-win - if: matrix.os == 'windows-2019' && matrix.arch == '-386' - - - name: Build the Agent for win64 - run: task build-win # GOARCH=amd64 by default on the runners - if: matrix.os == 'windows-2019' && matrix.arch == '-amd64' - - - name: Build the Agent for macos - env: - MACOSX_DEPLOYMENT_TARGET: 10.11 # minimum supported version for mac - CGO_CFLAGS: -mmacosx-version-min=10.11 - CGO_LDFLAGS: -mmacosx-version-min=10.11 - run: task build - if: matrix.os == 'macos-10.15' - - - name: Install Python - uses: actions/setup-python@v2 - with: - python-version: '3.9' - architecture: 'x64' - if: matrix.os == 'macos-10.15' - - - name: Run e2e tests - run: | - pip install poetry - task test-e2e - if: matrix.os == 'macos-10.15' - - # config.ini is required by the executable when it's run - - name: Upload artifacts - uses: actions/upload-artifact@v2 - with: - name: arduino-create-agent-${{ matrix.os }}${{ matrix.arch }} - path: | - arduino-create-agent* - config.ini - if-no-files-found: error diff --git a/.gitignore b/.gitignore index ea46fe4ee..c1926ca22 100644 --- a/.gitignore +++ b/.gitignore @@ -1,7 +1,8 @@ bufferflow_tinyg_old.md -arduino-create-agent* +/arduino-cloud-agent* +!/arduino-cloud-agent*/ rsrc.syso snapshot/* diff --git a/.licensed.yml b/.licensed.yml new file mode 100644 index 000000000..12e7395a3 --- /dev/null +++ b/.licensed.yml @@ -0,0 +1,136 @@ +# See: https://github.com/github/licensed/blob/master/docs/configuration.md +sources: + go: true + +apps: + - source_path: ./ + +reviewed: + go: + - golang.org/x/net/html + - golang.org/x/net/html/atom + - golang.org/x/crypto/curve25519 + - golang.org/x/sys/unix + - github.com/ProtonMail/go-crypto/bitcurves + - github.com/ProtonMail/go-crypto/brainpool + - github.com/ProtonMail/go-crypto/eax + - github.com/ProtonMail/go-crypto/internal/byteutil + - github.com/ProtonMail/go-crypto/ocb + - github.com/ProtonMail/go-crypto/openpgp + - github.com/ProtonMail/go-crypto/openpgp/aes/keywrap + - github.com/ProtonMail/go-crypto/openpgp/armor + - github.com/ProtonMail/go-crypto/openpgp/ecdh + - github.com/ProtonMail/go-crypto/openpgp/ecdsa + - github.com/ProtonMail/go-crypto/openpgp/ed25519 + - github.com/ProtonMail/go-crypto/openpgp/ed448 + - github.com/ProtonMail/go-crypto/openpgp/eddsa + - github.com/ProtonMail/go-crypto/openpgp/elgamal + - github.com/ProtonMail/go-crypto/openpgp/errors + - github.com/ProtonMail/go-crypto/openpgp/internal/algorithm + - github.com/ProtonMail/go-crypto/openpgp/internal/ecc + - github.com/ProtonMail/go-crypto/openpgp/internal/ecc/curve25519 + - github.com/ProtonMail/go-crypto/openpgp/internal/ecc/curve25519/field + - github.com/ProtonMail/go-crypto/openpgp/internal/encoding + - github.com/ProtonMail/go-crypto/openpgp/packet + - github.com/ProtonMail/go-crypto/openpgp/s2k + - github.com/ProtonMail/go-crypto/openpgp/symmetric + - github.com/ProtonMail/go-crypto/openpgp/x25519 + - github.com/ProtonMail/go-crypto/openpgp/x448 + - github.com/cloudflare/circl/dh/x25519 + - github.com/cloudflare/circl/dh/x448 + - github.com/cloudflare/circl/ecc/goldilocks + - github.com/cloudflare/circl/internal/conv + - github.com/cloudflare/circl/internal/sha3 + - github.com/cloudflare/circl/math + - github.com/cloudflare/circl/math/fp25519 + - github.com/cloudflare/circl/math/fp448 + - github.com/cloudflare/circl/math/mlsbset + - github.com/cloudflare/circl/sign + - github.com/cloudflare/circl/sign/ed25519 + - github.com/cloudflare/circl/sign/ed448 + - golang.org/x/crypto/argon2 + - golang.org/x/crypto/blake2b + - golang.org/x/crypto/sha3 + - golang.org/x/net/internal/socks + - golang.org/x/net/proxy + +# Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/assets/check-dependencies/AGPL-3.0/.licensed.yml +allowed: + # The following are based on: https://www.gnu.org/licenses/license-list.html#GPLCompatibleLicenses + - gpl-1.0-or-later + - gpl-1.0+ # Deprecated ID for `gpl-1.0-or-later` + - gpl-2.0 + - gpl-2.0-or-later + - gpl-2.0+ # Deprecated ID for `gpl-2.0-or-later` + - gpl-3.0-only + - gpl-3.0 # Deprecated ID for `gpl-3.0-only` + - gpl-3.0-or-later + - gpl-3.0+ # Deprecated ID for `gpl-3.0-or-later` + - lgpl-2.0-or-later + - lgpl-2.0+ # Deprecated ID for `lgpl-2.0-or-later` + - lgpl-2.1-only + - lgpl-2.1 # Deprecated ID for `lgpl-2.1-only` + - lgpl-2.1-or-later + - lgpl-2.1+ # Deprecated ID for `lgpl-2.1-or-later` + - lgpl-3.0-only + - lgpl-3.0 # Deprecated ID for `lgpl-3.0-only` + - lgpl-3.0-or-later + - lgpl-3.0+ # Deprecated ID for `lgpl-3.0-or-later` + - agpl-1.0-or-later + - agpl-3.0-only + - agpl-3.0 # Deprecated ID for `agpl-3.0-only` + - agpl-3.0-or-later + - fsfap + - apache-2.0 + - artistic-2.0 + - clartistic + - sleepycat + - bsl-1.0 + - bsd-3-clause + - cecill-2.0 + - bsd-3-clause-clear + # "Cryptix General License" - no SPDX ID (https://github.com/spdx/license-list-XML/issues/456) + - ecos-2.0 + - ecl-2.0 + - efl-2.0 + - eudatagrid + - mit + - bsd-2-clause # Subsumed by `bsd-2-clause-views` + - bsd-2-clause-netbsd # Deprecated ID for `bsd-2-clause` + - bsd-2-clause-views # This is the version linked from https://www.gnu.org/licenses/license-list.html#FreeBSD + - bsd-2-clause-freebsd # Deprecated ID for `bsd-2-clause-views` + - ftl + - hpnd + - imatix + - imlib2 + - ijg + # "Informal license" - this is a general class of license + - intel + - isc + - mpl-2.0 + - ncsa + # "License of Netscape JavaScript" - no SPDX ID + - oldap-2.7 + # "License of Perl 5 and below" - possibly `Artistic-1.0-Perl` ? + - cc0-1.0 + - cc-pddc + - psf-2.0 + - ruby + - sgi-b-2.0 + - smlnj + - standardml-nj # Deprecated ID for `smlnj` + - unicode-dfs-2015 + - upl-1.0 + - unlicense + - vim + - w3c + - wtfpl + - lgpl-2.0-or-later with wxwindows-exception-3.1 + - wxwindows # Deprecated ID for `lgpl-2.0-or-later with wxwindows-exception-3.1` + - x11 + - xfree86-1.1 + - zlib + - zpl-2.0 + - zpl-2.1 + # The following are based on individual license text + - eupl-1.2 diff --git a/.licenses/arduino-create-agent/go/fyne.io/systray.dep.yml b/.licenses/arduino-create-agent/go/fyne.io/systray.dep.yml new file mode 100644 index 000000000..b36391cdd --- /dev/null +++ b/.licenses/arduino-create-agent/go/fyne.io/systray.dep.yml @@ -0,0 +1,214 @@ +--- +name: fyne.io/systray +version: v1.10.0 +type: go +summary: Package systray is a cross-platform Go library to place an icon and menu + in the notification area. +homepage: https://pkg.go.dev/fyne.io/systray +license: apache-2.0 +licenses: +- sources: LICENSE + text: |2 + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2014 Brave New Software Project, Inc. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +notices: [] diff --git a/.licenses/arduino-create-agent/go/fyne.io/systray/internal/generated/menu.dep.yml b/.licenses/arduino-create-agent/go/fyne.io/systray/internal/generated/menu.dep.yml new file mode 100644 index 000000000..314410260 --- /dev/null +++ b/.licenses/arduino-create-agent/go/fyne.io/systray/internal/generated/menu.dep.yml @@ -0,0 +1,213 @@ +--- +name: fyne.io/systray/internal/generated/menu +version: v1.10.0 +type: go +summary: Code generated by dbus-codegen-go DO NOT EDIT. +homepage: https://pkg.go.dev/fyne.io/systray/internal/generated/menu +license: apache-2.0 +licenses: +- sources: systray@v1.10.0/LICENSE + text: |2 + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2014 Brave New Software Project, Inc. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +notices: [] diff --git a/.licenses/arduino-create-agent/go/fyne.io/systray/internal/generated/notifier.dep.yml b/.licenses/arduino-create-agent/go/fyne.io/systray/internal/generated/notifier.dep.yml new file mode 100644 index 000000000..e03d14275 --- /dev/null +++ b/.licenses/arduino-create-agent/go/fyne.io/systray/internal/generated/notifier.dep.yml @@ -0,0 +1,213 @@ +--- +name: fyne.io/systray/internal/generated/notifier +version: v1.10.0 +type: go +summary: Code generated by dbus-codegen-go DO NOT EDIT. +homepage: https://pkg.go.dev/fyne.io/systray/internal/generated/notifier +license: apache-2.0 +licenses: +- sources: systray@v1.10.0/LICENSE + text: |2 + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2014 Brave New Software Project, Inc. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +notices: [] diff --git a/.licenses/arduino-create-agent/go/github.com/ProtonMail/go-crypto/bitcurves.dep.yml b/.licenses/arduino-create-agent/go/github.com/ProtonMail/go-crypto/bitcurves.dep.yml new file mode 100644 index 000000000..ff1d983d0 --- /dev/null +++ b/.licenses/arduino-create-agent/go/github.com/ProtonMail/go-crypto/bitcurves.dep.yml @@ -0,0 +1,62 @@ +--- +name: github.com/ProtonMail/go-crypto/bitcurves +version: v1.1.0-alpha.5-proton +type: go +summary: +homepage: https://pkg.go.dev/github.com/ProtonMail/go-crypto/bitcurves +license: other +licenses: +- sources: go-crypto@v1.1.0-alpha.5-proton/LICENSE + text: | + Copyright (c) 2009 The Go Authors. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following disclaimer + in the documentation and/or other materials provided with the + distribution. + * Neither the name of Google Inc. nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +- sources: go-crypto@v1.1.0-alpha.5-proton/PATENTS + text: | + Additional IP Rights Grant (Patents) + + "This implementation" means the copyrightable works distributed by + Google as part of the Go project. + + Google hereby grants to You a perpetual, worldwide, non-exclusive, + no-charge, royalty-free, irrevocable (except as stated in this section) + patent license to make, have made, use, offer to sell, sell, import, + transfer and otherwise run, modify and propagate the contents of this + implementation of Go, where such license applies only to those patent + claims, both currently owned or controlled by Google and acquired in + the future, licensable by Google that are necessarily infringed by this + implementation of Go. This grant does not include claims that would be + infringed only as a consequence of further modification of this + implementation. If you or your agent or exclusive licensee institute or + order or agree to the institution of patent litigation against any + entity (including a cross-claim or counterclaim in a lawsuit) alleging + that this implementation of Go or any code incorporated within this + implementation of Go constitutes direct or contributory patent + infringement, or inducement of patent infringement, then any patent + rights granted to you under this License for this implementation of Go + shall terminate as of the date such litigation is filed. +notices: [] diff --git a/.licenses/arduino-create-agent/go/github.com/ProtonMail/go-crypto/brainpool.dep.yml b/.licenses/arduino-create-agent/go/github.com/ProtonMail/go-crypto/brainpool.dep.yml new file mode 100644 index 000000000..9ec1b1cef --- /dev/null +++ b/.licenses/arduino-create-agent/go/github.com/ProtonMail/go-crypto/brainpool.dep.yml @@ -0,0 +1,62 @@ +--- +name: github.com/ProtonMail/go-crypto/brainpool +version: v1.1.0-alpha.5-proton +type: go +summary: Package brainpool implements Brainpool elliptic curves. +homepage: https://pkg.go.dev/github.com/ProtonMail/go-crypto/brainpool +license: other +licenses: +- sources: go-crypto@v1.1.0-alpha.5-proton/LICENSE + text: | + Copyright (c) 2009 The Go Authors. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following disclaimer + in the documentation and/or other materials provided with the + distribution. + * Neither the name of Google Inc. nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +- sources: go-crypto@v1.1.0-alpha.5-proton/PATENTS + text: | + Additional IP Rights Grant (Patents) + + "This implementation" means the copyrightable works distributed by + Google as part of the Go project. + + Google hereby grants to You a perpetual, worldwide, non-exclusive, + no-charge, royalty-free, irrevocable (except as stated in this section) + patent license to make, have made, use, offer to sell, sell, import, + transfer and otherwise run, modify and propagate the contents of this + implementation of Go, where such license applies only to those patent + claims, both currently owned or controlled by Google and acquired in + the future, licensable by Google that are necessarily infringed by this + implementation of Go. This grant does not include claims that would be + infringed only as a consequence of further modification of this + implementation. If you or your agent or exclusive licensee institute or + order or agree to the institution of patent litigation against any + entity (including a cross-claim or counterclaim in a lawsuit) alleging + that this implementation of Go or any code incorporated within this + implementation of Go constitutes direct or contributory patent + infringement, or inducement of patent infringement, then any patent + rights granted to you under this License for this implementation of Go + shall terminate as of the date such litigation is filed. +notices: [] diff --git a/.licenses/arduino-create-agent/go/github.com/ProtonMail/go-crypto/eax.dep.yml b/.licenses/arduino-create-agent/go/github.com/ProtonMail/go-crypto/eax.dep.yml new file mode 100644 index 000000000..e086227d1 --- /dev/null +++ b/.licenses/arduino-create-agent/go/github.com/ProtonMail/go-crypto/eax.dep.yml @@ -0,0 +1,65 @@ +--- +name: github.com/ProtonMail/go-crypto/eax +version: v1.1.0-alpha.5-proton +type: go +summary: 'Package eax provides an implementation of the EAX (encrypt-authenticate-translate) + mode of operation, as described in Bellare, Rogaway, and Wagner "THE EAX MODE OF + OPERATION: A TWO-PASS AUTHENTICATED-ENCRYPTION SCHEME OPTIMIZED FOR SIMPLICITY AND + EFFICIENCY." In FSE''04, volume 3017 of LNCS, 2004' +homepage: https://pkg.go.dev/github.com/ProtonMail/go-crypto/eax +license: other +licenses: +- sources: go-crypto@v1.1.0-alpha.5-proton/LICENSE + text: | + Copyright (c) 2009 The Go Authors. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following disclaimer + in the documentation and/or other materials provided with the + distribution. + * Neither the name of Google Inc. nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +- sources: go-crypto@v1.1.0-alpha.5-proton/PATENTS + text: | + Additional IP Rights Grant (Patents) + + "This implementation" means the copyrightable works distributed by + Google as part of the Go project. + + Google hereby grants to You a perpetual, worldwide, non-exclusive, + no-charge, royalty-free, irrevocable (except as stated in this section) + patent license to make, have made, use, offer to sell, sell, import, + transfer and otherwise run, modify and propagate the contents of this + implementation of Go, where such license applies only to those patent + claims, both currently owned or controlled by Google and acquired in + the future, licensable by Google that are necessarily infringed by this + implementation of Go. This grant does not include claims that would be + infringed only as a consequence of further modification of this + implementation. If you or your agent or exclusive licensee institute or + order or agree to the institution of patent litigation against any + entity (including a cross-claim or counterclaim in a lawsuit) alleging + that this implementation of Go or any code incorporated within this + implementation of Go constitutes direct or contributory patent + infringement, or inducement of patent infringement, then any patent + rights granted to you under this License for this implementation of Go + shall terminate as of the date such litigation is filed. +notices: [] diff --git a/.licenses/arduino-create-agent/go/github.com/ProtonMail/go-crypto/internal/byteutil.dep.yml b/.licenses/arduino-create-agent/go/github.com/ProtonMail/go-crypto/internal/byteutil.dep.yml new file mode 100644 index 000000000..1d0b837c3 --- /dev/null +++ b/.licenses/arduino-create-agent/go/github.com/ProtonMail/go-crypto/internal/byteutil.dep.yml @@ -0,0 +1,62 @@ +--- +name: github.com/ProtonMail/go-crypto/internal/byteutil +version: v1.1.0-alpha.5-proton +type: go +summary: +homepage: https://pkg.go.dev/github.com/ProtonMail/go-crypto/internal/byteutil +license: other +licenses: +- sources: go-crypto@v1.1.0-alpha.5-proton/LICENSE + text: | + Copyright (c) 2009 The Go Authors. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following disclaimer + in the documentation and/or other materials provided with the + distribution. + * Neither the name of Google Inc. nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +- sources: go-crypto@v1.1.0-alpha.5-proton/PATENTS + text: | + Additional IP Rights Grant (Patents) + + "This implementation" means the copyrightable works distributed by + Google as part of the Go project. + + Google hereby grants to You a perpetual, worldwide, non-exclusive, + no-charge, royalty-free, irrevocable (except as stated in this section) + patent license to make, have made, use, offer to sell, sell, import, + transfer and otherwise run, modify and propagate the contents of this + implementation of Go, where such license applies only to those patent + claims, both currently owned or controlled by Google and acquired in + the future, licensable by Google that are necessarily infringed by this + implementation of Go. This grant does not include claims that would be + infringed only as a consequence of further modification of this + implementation. If you or your agent or exclusive licensee institute or + order or agree to the institution of patent litigation against any + entity (including a cross-claim or counterclaim in a lawsuit) alleging + that this implementation of Go or any code incorporated within this + implementation of Go constitutes direct or contributory patent + infringement, or inducement of patent infringement, then any patent + rights granted to you under this License for this implementation of Go + shall terminate as of the date such litigation is filed. +notices: [] diff --git a/.licenses/arduino-create-agent/go/github.com/ProtonMail/go-crypto/ocb.dep.yml b/.licenses/arduino-create-agent/go/github.com/ProtonMail/go-crypto/ocb.dep.yml new file mode 100644 index 000000000..f24f78fe7 --- /dev/null +++ b/.licenses/arduino-create-agent/go/github.com/ProtonMail/go-crypto/ocb.dep.yml @@ -0,0 +1,65 @@ +--- +name: github.com/ProtonMail/go-crypto/ocb +version: v1.1.0-alpha.5-proton +type: go +summary: 'Package ocb provides an implementation of the OCB (offset codebook) mode + of operation, as described in RFC-7253 of the IRTF and in Rogaway, Bellare, Black + and Krovetz - OCB: A BLOCK-CIPHER MODE OF OPERATION FOR EFFICIENT AUTHENTICATED + ENCRYPTION (2003).' +homepage: https://pkg.go.dev/github.com/ProtonMail/go-crypto/ocb +license: other +licenses: +- sources: go-crypto@v1.1.0-alpha.5-proton/LICENSE + text: | + Copyright (c) 2009 The Go Authors. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following disclaimer + in the documentation and/or other materials provided with the + distribution. + * Neither the name of Google Inc. nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +- sources: go-crypto@v1.1.0-alpha.5-proton/PATENTS + text: | + Additional IP Rights Grant (Patents) + + "This implementation" means the copyrightable works distributed by + Google as part of the Go project. + + Google hereby grants to You a perpetual, worldwide, non-exclusive, + no-charge, royalty-free, irrevocable (except as stated in this section) + patent license to make, have made, use, offer to sell, sell, import, + transfer and otherwise run, modify and propagate the contents of this + implementation of Go, where such license applies only to those patent + claims, both currently owned or controlled by Google and acquired in + the future, licensable by Google that are necessarily infringed by this + implementation of Go. This grant does not include claims that would be + infringed only as a consequence of further modification of this + implementation. If you or your agent or exclusive licensee institute or + order or agree to the institution of patent litigation against any + entity (including a cross-claim or counterclaim in a lawsuit) alleging + that this implementation of Go or any code incorporated within this + implementation of Go constitutes direct or contributory patent + infringement, or inducement of patent infringement, then any patent + rights granted to you under this License for this implementation of Go + shall terminate as of the date such litigation is filed. +notices: [] diff --git a/.licenses/arduino-create-agent/go/github.com/ProtonMail/go-crypto/openpgp.dep.yml b/.licenses/arduino-create-agent/go/github.com/ProtonMail/go-crypto/openpgp.dep.yml new file mode 100644 index 000000000..af72530c0 --- /dev/null +++ b/.licenses/arduino-create-agent/go/github.com/ProtonMail/go-crypto/openpgp.dep.yml @@ -0,0 +1,62 @@ +--- +name: github.com/ProtonMail/go-crypto/openpgp +version: v1.1.0-alpha.5-proton +type: go +summary: Package openpgp implements high level operations on OpenPGP messages. +homepage: https://pkg.go.dev/github.com/ProtonMail/go-crypto/openpgp +license: other +licenses: +- sources: go-crypto@v1.1.0-alpha.5-proton/LICENSE + text: | + Copyright (c) 2009 The Go Authors. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following disclaimer + in the documentation and/or other materials provided with the + distribution. + * Neither the name of Google Inc. nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +- sources: go-crypto@v1.1.0-alpha.5-proton/PATENTS + text: | + Additional IP Rights Grant (Patents) + + "This implementation" means the copyrightable works distributed by + Google as part of the Go project. + + Google hereby grants to You a perpetual, worldwide, non-exclusive, + no-charge, royalty-free, irrevocable (except as stated in this section) + patent license to make, have made, use, offer to sell, sell, import, + transfer and otherwise run, modify and propagate the contents of this + implementation of Go, where such license applies only to those patent + claims, both currently owned or controlled by Google and acquired in + the future, licensable by Google that are necessarily infringed by this + implementation of Go. This grant does not include claims that would be + infringed only as a consequence of further modification of this + implementation. If you or your agent or exclusive licensee institute or + order or agree to the institution of patent litigation against any + entity (including a cross-claim or counterclaim in a lawsuit) alleging + that this implementation of Go or any code incorporated within this + implementation of Go constitutes direct or contributory patent + infringement, or inducement of patent infringement, then any patent + rights granted to you under this License for this implementation of Go + shall terminate as of the date such litigation is filed. +notices: [] diff --git a/.licenses/arduino-create-agent/go/github.com/ProtonMail/go-crypto/openpgp/aes/keywrap.dep.yml b/.licenses/arduino-create-agent/go/github.com/ProtonMail/go-crypto/openpgp/aes/keywrap.dep.yml new file mode 100644 index 000000000..7cc6fb0d4 --- /dev/null +++ b/.licenses/arduino-create-agent/go/github.com/ProtonMail/go-crypto/openpgp/aes/keywrap.dep.yml @@ -0,0 +1,62 @@ +--- +name: github.com/ProtonMail/go-crypto/openpgp/aes/keywrap +version: v1.1.0-alpha.5-proton +type: go +summary: Package keywrap is an implementation of the RFC 3394 AES key wrapping algorithm. +homepage: https://pkg.go.dev/github.com/ProtonMail/go-crypto/openpgp/aes/keywrap +license: other +licenses: +- sources: go-crypto@v1.1.0-alpha.5-proton/LICENSE + text: | + Copyright (c) 2009 The Go Authors. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following disclaimer + in the documentation and/or other materials provided with the + distribution. + * Neither the name of Google Inc. nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +- sources: go-crypto@v1.1.0-alpha.5-proton/PATENTS + text: | + Additional IP Rights Grant (Patents) + + "This implementation" means the copyrightable works distributed by + Google as part of the Go project. + + Google hereby grants to You a perpetual, worldwide, non-exclusive, + no-charge, royalty-free, irrevocable (except as stated in this section) + patent license to make, have made, use, offer to sell, sell, import, + transfer and otherwise run, modify and propagate the contents of this + implementation of Go, where such license applies only to those patent + claims, both currently owned or controlled by Google and acquired in + the future, licensable by Google that are necessarily infringed by this + implementation of Go. This grant does not include claims that would be + infringed only as a consequence of further modification of this + implementation. If you or your agent or exclusive licensee institute or + order or agree to the institution of patent litigation against any + entity (including a cross-claim or counterclaim in a lawsuit) alleging + that this implementation of Go or any code incorporated within this + implementation of Go constitutes direct or contributory patent + infringement, or inducement of patent infringement, then any patent + rights granted to you under this License for this implementation of Go + shall terminate as of the date such litigation is filed. +notices: [] diff --git a/.licenses/arduino-create-agent/go/github.com/ProtonMail/go-crypto/openpgp/armor.dep.yml b/.licenses/arduino-create-agent/go/github.com/ProtonMail/go-crypto/openpgp/armor.dep.yml new file mode 100644 index 000000000..982a14505 --- /dev/null +++ b/.licenses/arduino-create-agent/go/github.com/ProtonMail/go-crypto/openpgp/armor.dep.yml @@ -0,0 +1,62 @@ +--- +name: github.com/ProtonMail/go-crypto/openpgp/armor +version: v1.1.0-alpha.5-proton +type: go +summary: Package armor implements OpenPGP ASCII Armor, see RFC 4880. +homepage: https://pkg.go.dev/github.com/ProtonMail/go-crypto/openpgp/armor +license: other +licenses: +- sources: go-crypto@v1.1.0-alpha.5-proton/LICENSE + text: | + Copyright (c) 2009 The Go Authors. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following disclaimer + in the documentation and/or other materials provided with the + distribution. + * Neither the name of Google Inc. nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +- sources: go-crypto@v1.1.0-alpha.5-proton/PATENTS + text: | + Additional IP Rights Grant (Patents) + + "This implementation" means the copyrightable works distributed by + Google as part of the Go project. + + Google hereby grants to You a perpetual, worldwide, non-exclusive, + no-charge, royalty-free, irrevocable (except as stated in this section) + patent license to make, have made, use, offer to sell, sell, import, + transfer and otherwise run, modify and propagate the contents of this + implementation of Go, where such license applies only to those patent + claims, both currently owned or controlled by Google and acquired in + the future, licensable by Google that are necessarily infringed by this + implementation of Go. This grant does not include claims that would be + infringed only as a consequence of further modification of this + implementation. If you or your agent or exclusive licensee institute or + order or agree to the institution of patent litigation against any + entity (including a cross-claim or counterclaim in a lawsuit) alleging + that this implementation of Go or any code incorporated within this + implementation of Go constitutes direct or contributory patent + infringement, or inducement of patent infringement, then any patent + rights granted to you under this License for this implementation of Go + shall terminate as of the date such litigation is filed. +notices: [] diff --git a/.licenses/arduino-create-agent/go/github.com/ProtonMail/go-crypto/openpgp/ecdh.dep.yml b/.licenses/arduino-create-agent/go/github.com/ProtonMail/go-crypto/openpgp/ecdh.dep.yml new file mode 100644 index 000000000..9107dd71b --- /dev/null +++ b/.licenses/arduino-create-agent/go/github.com/ProtonMail/go-crypto/openpgp/ecdh.dep.yml @@ -0,0 +1,63 @@ +--- +name: github.com/ProtonMail/go-crypto/openpgp/ecdh +version: v1.1.0-alpha.5-proton +type: go +summary: Package ecdh implements ECDH encryption, suitable for OpenPGP, as specified + in RFC 6637, section 8. +homepage: https://pkg.go.dev/github.com/ProtonMail/go-crypto/openpgp/ecdh +license: other +licenses: +- sources: go-crypto@v1.1.0-alpha.5-proton/LICENSE + text: | + Copyright (c) 2009 The Go Authors. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following disclaimer + in the documentation and/or other materials provided with the + distribution. + * Neither the name of Google Inc. nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +- sources: go-crypto@v1.1.0-alpha.5-proton/PATENTS + text: | + Additional IP Rights Grant (Patents) + + "This implementation" means the copyrightable works distributed by + Google as part of the Go project. + + Google hereby grants to You a perpetual, worldwide, non-exclusive, + no-charge, royalty-free, irrevocable (except as stated in this section) + patent license to make, have made, use, offer to sell, sell, import, + transfer and otherwise run, modify and propagate the contents of this + implementation of Go, where such license applies only to those patent + claims, both currently owned or controlled by Google and acquired in + the future, licensable by Google that are necessarily infringed by this + implementation of Go. This grant does not include claims that would be + infringed only as a consequence of further modification of this + implementation. If you or your agent or exclusive licensee institute or + order or agree to the institution of patent litigation against any + entity (including a cross-claim or counterclaim in a lawsuit) alleging + that this implementation of Go or any code incorporated within this + implementation of Go constitutes direct or contributory patent + infringement, or inducement of patent infringement, then any patent + rights granted to you under this License for this implementation of Go + shall terminate as of the date such litigation is filed. +notices: [] diff --git a/.licenses/arduino-create-agent/go/github.com/ProtonMail/go-crypto/openpgp/ecdsa.dep.yml b/.licenses/arduino-create-agent/go/github.com/ProtonMail/go-crypto/openpgp/ecdsa.dep.yml new file mode 100644 index 000000000..26ae39b99 --- /dev/null +++ b/.licenses/arduino-create-agent/go/github.com/ProtonMail/go-crypto/openpgp/ecdsa.dep.yml @@ -0,0 +1,63 @@ +--- +name: github.com/ProtonMail/go-crypto/openpgp/ecdsa +version: v1.1.0-alpha.5-proton +type: go +summary: Package ecdsa implements ECDSA signature, suitable for OpenPGP, as specified + in RFC 6637, section 5. +homepage: https://pkg.go.dev/github.com/ProtonMail/go-crypto/openpgp/ecdsa +license: other +licenses: +- sources: go-crypto@v1.1.0-alpha.5-proton/LICENSE + text: | + Copyright (c) 2009 The Go Authors. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following disclaimer + in the documentation and/or other materials provided with the + distribution. + * Neither the name of Google Inc. nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +- sources: go-crypto@v1.1.0-alpha.5-proton/PATENTS + text: | + Additional IP Rights Grant (Patents) + + "This implementation" means the copyrightable works distributed by + Google as part of the Go project. + + Google hereby grants to You a perpetual, worldwide, non-exclusive, + no-charge, royalty-free, irrevocable (except as stated in this section) + patent license to make, have made, use, offer to sell, sell, import, + transfer and otherwise run, modify and propagate the contents of this + implementation of Go, where such license applies only to those patent + claims, both currently owned or controlled by Google and acquired in + the future, licensable by Google that are necessarily infringed by this + implementation of Go. This grant does not include claims that would be + infringed only as a consequence of further modification of this + implementation. If you or your agent or exclusive licensee institute or + order or agree to the institution of patent litigation against any + entity (including a cross-claim or counterclaim in a lawsuit) alleging + that this implementation of Go or any code incorporated within this + implementation of Go constitutes direct or contributory patent + infringement, or inducement of patent infringement, then any patent + rights granted to you under this License for this implementation of Go + shall terminate as of the date such litigation is filed. +notices: [] diff --git a/.licenses/arduino-create-agent/go/github.com/ProtonMail/go-crypto/openpgp/ed25519.dep.yml b/.licenses/arduino-create-agent/go/github.com/ProtonMail/go-crypto/openpgp/ed25519.dep.yml new file mode 100644 index 000000000..b98f3d6ff --- /dev/null +++ b/.licenses/arduino-create-agent/go/github.com/ProtonMail/go-crypto/openpgp/ed25519.dep.yml @@ -0,0 +1,63 @@ +--- +name: github.com/ProtonMail/go-crypto/openpgp/ed25519 +version: v1.1.0-alpha.5-proton +type: go +summary: Package ed25519 implements the ed25519 signature algorithm for OpenPGP as + defined in the Open PGP crypto refresh. +homepage: https://pkg.go.dev/github.com/ProtonMail/go-crypto/openpgp/ed25519 +license: other +licenses: +- sources: go-crypto@v1.1.0-alpha.5-proton/LICENSE + text: | + Copyright (c) 2009 The Go Authors. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following disclaimer + in the documentation and/or other materials provided with the + distribution. + * Neither the name of Google Inc. nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +- sources: go-crypto@v1.1.0-alpha.5-proton/PATENTS + text: | + Additional IP Rights Grant (Patents) + + "This implementation" means the copyrightable works distributed by + Google as part of the Go project. + + Google hereby grants to You a perpetual, worldwide, non-exclusive, + no-charge, royalty-free, irrevocable (except as stated in this section) + patent license to make, have made, use, offer to sell, sell, import, + transfer and otherwise run, modify and propagate the contents of this + implementation of Go, where such license applies only to those patent + claims, both currently owned or controlled by Google and acquired in + the future, licensable by Google that are necessarily infringed by this + implementation of Go. This grant does not include claims that would be + infringed only as a consequence of further modification of this + implementation. If you or your agent or exclusive licensee institute or + order or agree to the institution of patent litigation against any + entity (including a cross-claim or counterclaim in a lawsuit) alleging + that this implementation of Go or any code incorporated within this + implementation of Go constitutes direct or contributory patent + infringement, or inducement of patent infringement, then any patent + rights granted to you under this License for this implementation of Go + shall terminate as of the date such litigation is filed. +notices: [] diff --git a/.licenses/arduino-create-agent/go/github.com/ProtonMail/go-crypto/openpgp/ed448.dep.yml b/.licenses/arduino-create-agent/go/github.com/ProtonMail/go-crypto/openpgp/ed448.dep.yml new file mode 100644 index 000000000..a3ec2359a --- /dev/null +++ b/.licenses/arduino-create-agent/go/github.com/ProtonMail/go-crypto/openpgp/ed448.dep.yml @@ -0,0 +1,63 @@ +--- +name: github.com/ProtonMail/go-crypto/openpgp/ed448 +version: v1.1.0-alpha.5-proton +type: go +summary: Package ed448 implements the ed448 signature algorithm for OpenPGP as defined + in the Open PGP crypto refresh. +homepage: https://pkg.go.dev/github.com/ProtonMail/go-crypto/openpgp/ed448 +license: other +licenses: +- sources: go-crypto@v1.1.0-alpha.5-proton/LICENSE + text: | + Copyright (c) 2009 The Go Authors. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following disclaimer + in the documentation and/or other materials provided with the + distribution. + * Neither the name of Google Inc. nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +- sources: go-crypto@v1.1.0-alpha.5-proton/PATENTS + text: | + Additional IP Rights Grant (Patents) + + "This implementation" means the copyrightable works distributed by + Google as part of the Go project. + + Google hereby grants to You a perpetual, worldwide, non-exclusive, + no-charge, royalty-free, irrevocable (except as stated in this section) + patent license to make, have made, use, offer to sell, sell, import, + transfer and otherwise run, modify and propagate the contents of this + implementation of Go, where such license applies only to those patent + claims, both currently owned or controlled by Google and acquired in + the future, licensable by Google that are necessarily infringed by this + implementation of Go. This grant does not include claims that would be + infringed only as a consequence of further modification of this + implementation. If you or your agent or exclusive licensee institute or + order or agree to the institution of patent litigation against any + entity (including a cross-claim or counterclaim in a lawsuit) alleging + that this implementation of Go or any code incorporated within this + implementation of Go constitutes direct or contributory patent + infringement, or inducement of patent infringement, then any patent + rights granted to you under this License for this implementation of Go + shall terminate as of the date such litigation is filed. +notices: [] diff --git a/.licenses/arduino-create-agent/go/github.com/ProtonMail/go-crypto/openpgp/eddsa.dep.yml b/.licenses/arduino-create-agent/go/github.com/ProtonMail/go-crypto/openpgp/eddsa.dep.yml new file mode 100644 index 000000000..77cb4464e --- /dev/null +++ b/.licenses/arduino-create-agent/go/github.com/ProtonMail/go-crypto/openpgp/eddsa.dep.yml @@ -0,0 +1,63 @@ +--- +name: github.com/ProtonMail/go-crypto/openpgp/eddsa +version: v1.1.0-alpha.5-proton +type: go +summary: Package eddsa implements EdDSA signature, suitable for OpenPGP, as specified + in https://datatracker.ietf.org/doc/html/draft-ietf-openpgp-crypto-refresh-06#section-13.7 +homepage: https://pkg.go.dev/github.com/ProtonMail/go-crypto/openpgp/eddsa +license: other +licenses: +- sources: go-crypto@v1.1.0-alpha.5-proton/LICENSE + text: | + Copyright (c) 2009 The Go Authors. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following disclaimer + in the documentation and/or other materials provided with the + distribution. + * Neither the name of Google Inc. nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +- sources: go-crypto@v1.1.0-alpha.5-proton/PATENTS + text: | + Additional IP Rights Grant (Patents) + + "This implementation" means the copyrightable works distributed by + Google as part of the Go project. + + Google hereby grants to You a perpetual, worldwide, non-exclusive, + no-charge, royalty-free, irrevocable (except as stated in this section) + patent license to make, have made, use, offer to sell, sell, import, + transfer and otherwise run, modify and propagate the contents of this + implementation of Go, where such license applies only to those patent + claims, both currently owned or controlled by Google and acquired in + the future, licensable by Google that are necessarily infringed by this + implementation of Go. This grant does not include claims that would be + infringed only as a consequence of further modification of this + implementation. If you or your agent or exclusive licensee institute or + order or agree to the institution of patent litigation against any + entity (including a cross-claim or counterclaim in a lawsuit) alleging + that this implementation of Go or any code incorporated within this + implementation of Go constitutes direct or contributory patent + infringement, or inducement of patent infringement, then any patent + rights granted to you under this License for this implementation of Go + shall terminate as of the date such litigation is filed. +notices: [] diff --git a/.licenses/arduino-create-agent/go/github.com/ProtonMail/go-crypto/openpgp/elgamal.dep.yml b/.licenses/arduino-create-agent/go/github.com/ProtonMail/go-crypto/openpgp/elgamal.dep.yml new file mode 100644 index 000000000..30c4e4652 --- /dev/null +++ b/.licenses/arduino-create-agent/go/github.com/ProtonMail/go-crypto/openpgp/elgamal.dep.yml @@ -0,0 +1,64 @@ +--- +name: github.com/ProtonMail/go-crypto/openpgp/elgamal +version: v1.1.0-alpha.5-proton +type: go +summary: Package elgamal implements ElGamal encryption, suitable for OpenPGP, as specified + in "A Public-Key Cryptosystem and a Signature Scheme Based on Discrete Logarithms," + IEEE Transactions on Information Theory, v. +homepage: https://pkg.go.dev/github.com/ProtonMail/go-crypto/openpgp/elgamal +license: bsd-3-clause +licenses: +- sources: go-crypto@v1.1.0-alpha.5-proton/LICENSE + text: | + Copyright (c) 2009 The Go Authors. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following disclaimer + in the documentation and/or other materials provided with the + distribution. + * Neither the name of Google Inc. nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +- sources: go-crypto@v1.1.0-alpha.5-proton/PATENTS + text: | + Additional IP Rights Grant (Patents) + + "This implementation" means the copyrightable works distributed by + Google as part of the Go project. + + Google hereby grants to You a perpetual, worldwide, non-exclusive, + no-charge, royalty-free, irrevocable (except as stated in this section) + patent license to make, have made, use, offer to sell, sell, import, + transfer and otherwise run, modify and propagate the contents of this + implementation of Go, where such license applies only to those patent + claims, both currently owned or controlled by Google and acquired in + the future, licensable by Google that are necessarily infringed by this + implementation of Go. This grant does not include claims that would be + infringed only as a consequence of further modification of this + implementation. If you or your agent or exclusive licensee institute or + order or agree to the institution of patent litigation against any + entity (including a cross-claim or counterclaim in a lawsuit) alleging + that this implementation of Go or any code incorporated within this + implementation of Go constitutes direct or contributory patent + infringement, or inducement of patent infringement, then any patent + rights granted to you under this License for this implementation of Go + shall terminate as of the date such litigation is filed. +notices: [] diff --git a/.licenses/arduino-create-agent/go/github.com/ProtonMail/go-crypto/openpgp/errors.dep.yml b/.licenses/arduino-create-agent/go/github.com/ProtonMail/go-crypto/openpgp/errors.dep.yml new file mode 100644 index 000000000..81688cd2f --- /dev/null +++ b/.licenses/arduino-create-agent/go/github.com/ProtonMail/go-crypto/openpgp/errors.dep.yml @@ -0,0 +1,62 @@ +--- +name: github.com/ProtonMail/go-crypto/openpgp/errors +version: v1.1.0-alpha.5-proton +type: go +summary: Package errors contains common error types for the OpenPGP packages. +homepage: https://pkg.go.dev/github.com/ProtonMail/go-crypto/openpgp/errors +license: bsd-3-clause +licenses: +- sources: go-crypto@v1.1.0-alpha.5-proton/LICENSE + text: | + Copyright (c) 2009 The Go Authors. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following disclaimer + in the documentation and/or other materials provided with the + distribution. + * Neither the name of Google Inc. nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +- sources: go-crypto@v1.1.0-alpha.5-proton/PATENTS + text: | + Additional IP Rights Grant (Patents) + + "This implementation" means the copyrightable works distributed by + Google as part of the Go project. + + Google hereby grants to You a perpetual, worldwide, non-exclusive, + no-charge, royalty-free, irrevocable (except as stated in this section) + patent license to make, have made, use, offer to sell, sell, import, + transfer and otherwise run, modify and propagate the contents of this + implementation of Go, where such license applies only to those patent + claims, both currently owned or controlled by Google and acquired in + the future, licensable by Google that are necessarily infringed by this + implementation of Go. This grant does not include claims that would be + infringed only as a consequence of further modification of this + implementation. If you or your agent or exclusive licensee institute or + order or agree to the institution of patent litigation against any + entity (including a cross-claim or counterclaim in a lawsuit) alleging + that this implementation of Go or any code incorporated within this + implementation of Go constitutes direct or contributory patent + infringement, or inducement of patent infringement, then any patent + rights granted to you under this License for this implementation of Go + shall terminate as of the date such litigation is filed. +notices: [] diff --git a/.licenses/arduino-create-agent/go/github.com/ProtonMail/go-crypto/openpgp/internal/algorithm.dep.yml b/.licenses/arduino-create-agent/go/github.com/ProtonMail/go-crypto/openpgp/internal/algorithm.dep.yml new file mode 100644 index 000000000..6d96f4443 --- /dev/null +++ b/.licenses/arduino-create-agent/go/github.com/ProtonMail/go-crypto/openpgp/internal/algorithm.dep.yml @@ -0,0 +1,62 @@ +--- +name: github.com/ProtonMail/go-crypto/openpgp/internal/algorithm +version: v1.1.0-alpha.5-proton +type: go +summary: +homepage: https://pkg.go.dev/github.com/ProtonMail/go-crypto/openpgp/internal/algorithm +license: other +licenses: +- sources: go-crypto@v1.1.0-alpha.5-proton/LICENSE + text: | + Copyright (c) 2009 The Go Authors. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following disclaimer + in the documentation and/or other materials provided with the + distribution. + * Neither the name of Google Inc. nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +- sources: go-crypto@v1.1.0-alpha.5-proton/PATENTS + text: | + Additional IP Rights Grant (Patents) + + "This implementation" means the copyrightable works distributed by + Google as part of the Go project. + + Google hereby grants to You a perpetual, worldwide, non-exclusive, + no-charge, royalty-free, irrevocable (except as stated in this section) + patent license to make, have made, use, offer to sell, sell, import, + transfer and otherwise run, modify and propagate the contents of this + implementation of Go, where such license applies only to those patent + claims, both currently owned or controlled by Google and acquired in + the future, licensable by Google that are necessarily infringed by this + implementation of Go. This grant does not include claims that would be + infringed only as a consequence of further modification of this + implementation. If you or your agent or exclusive licensee institute or + order or agree to the institution of patent litigation against any + entity (including a cross-claim or counterclaim in a lawsuit) alleging + that this implementation of Go or any code incorporated within this + implementation of Go constitutes direct or contributory patent + infringement, or inducement of patent infringement, then any patent + rights granted to you under this License for this implementation of Go + shall terminate as of the date such litigation is filed. +notices: [] diff --git a/.licenses/arduino-create-agent/go/github.com/ProtonMail/go-crypto/openpgp/internal/ecc.dep.yml b/.licenses/arduino-create-agent/go/github.com/ProtonMail/go-crypto/openpgp/internal/ecc.dep.yml new file mode 100644 index 000000000..81e8f7cb5 --- /dev/null +++ b/.licenses/arduino-create-agent/go/github.com/ProtonMail/go-crypto/openpgp/internal/ecc.dep.yml @@ -0,0 +1,62 @@ +--- +name: github.com/ProtonMail/go-crypto/openpgp/internal/ecc +version: v1.1.0-alpha.5-proton +type: go +summary: Package ecc implements a generic interface for ECDH, ECDSA, and EdDSA. +homepage: https://pkg.go.dev/github.com/ProtonMail/go-crypto/openpgp/internal/ecc +license: other +licenses: +- sources: go-crypto@v1.1.0-alpha.5-proton/LICENSE + text: | + Copyright (c) 2009 The Go Authors. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following disclaimer + in the documentation and/or other materials provided with the + distribution. + * Neither the name of Google Inc. nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +- sources: go-crypto@v1.1.0-alpha.5-proton/PATENTS + text: | + Additional IP Rights Grant (Patents) + + "This implementation" means the copyrightable works distributed by + Google as part of the Go project. + + Google hereby grants to You a perpetual, worldwide, non-exclusive, + no-charge, royalty-free, irrevocable (except as stated in this section) + patent license to make, have made, use, offer to sell, sell, import, + transfer and otherwise run, modify and propagate the contents of this + implementation of Go, where such license applies only to those patent + claims, both currently owned or controlled by Google and acquired in + the future, licensable by Google that are necessarily infringed by this + implementation of Go. This grant does not include claims that would be + infringed only as a consequence of further modification of this + implementation. If you or your agent or exclusive licensee institute or + order or agree to the institution of patent litigation against any + entity (including a cross-claim or counterclaim in a lawsuit) alleging + that this implementation of Go or any code incorporated within this + implementation of Go constitutes direct or contributory patent + infringement, or inducement of patent infringement, then any patent + rights granted to you under this License for this implementation of Go + shall terminate as of the date such litigation is filed. +notices: [] diff --git a/.licenses/arduino-create-agent/go/github.com/ProtonMail/go-crypto/openpgp/internal/ecc/curve25519.dep.yml b/.licenses/arduino-create-agent/go/github.com/ProtonMail/go-crypto/openpgp/internal/ecc/curve25519.dep.yml new file mode 100644 index 000000000..ce6e3efe5 --- /dev/null +++ b/.licenses/arduino-create-agent/go/github.com/ProtonMail/go-crypto/openpgp/internal/ecc/curve25519.dep.yml @@ -0,0 +1,63 @@ +--- +name: github.com/ProtonMail/go-crypto/openpgp/internal/ecc/curve25519 +version: v1.1.0-alpha.5-proton +type: go +summary: Package curve25519 implements custom field operations without clamping for + forwarding. +homepage: https://pkg.go.dev/github.com/ProtonMail/go-crypto/openpgp/internal/ecc/curve25519 +license: other +licenses: +- sources: go-crypto@v1.1.0-alpha.5-proton/LICENSE + text: | + Copyright (c) 2009 The Go Authors. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following disclaimer + in the documentation and/or other materials provided with the + distribution. + * Neither the name of Google Inc. nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +- sources: go-crypto@v1.1.0-alpha.5-proton/PATENTS + text: | + Additional IP Rights Grant (Patents) + + "This implementation" means the copyrightable works distributed by + Google as part of the Go project. + + Google hereby grants to You a perpetual, worldwide, non-exclusive, + no-charge, royalty-free, irrevocable (except as stated in this section) + patent license to make, have made, use, offer to sell, sell, import, + transfer and otherwise run, modify and propagate the contents of this + implementation of Go, where such license applies only to those patent + claims, both currently owned or controlled by Google and acquired in + the future, licensable by Google that are necessarily infringed by this + implementation of Go. This grant does not include claims that would be + infringed only as a consequence of further modification of this + implementation. If you or your agent or exclusive licensee institute or + order or agree to the institution of patent litigation against any + entity (including a cross-claim or counterclaim in a lawsuit) alleging + that this implementation of Go or any code incorporated within this + implementation of Go constitutes direct or contributory patent + infringement, or inducement of patent infringement, then any patent + rights granted to you under this License for this implementation of Go + shall terminate as of the date such litigation is filed. +notices: [] diff --git a/.licenses/arduino-create-agent/go/github.com/ProtonMail/go-crypto/openpgp/internal/ecc/curve25519/field.dep.yml b/.licenses/arduino-create-agent/go/github.com/ProtonMail/go-crypto/openpgp/internal/ecc/curve25519/field.dep.yml new file mode 100644 index 000000000..8df0ed080 --- /dev/null +++ b/.licenses/arduino-create-agent/go/github.com/ProtonMail/go-crypto/openpgp/internal/ecc/curve25519/field.dep.yml @@ -0,0 +1,62 @@ +--- +name: github.com/ProtonMail/go-crypto/openpgp/internal/ecc/curve25519/field +version: v1.1.0-alpha.5-proton +type: go +summary: Package field implements fast arithmetic modulo 2^255-19. +homepage: https://pkg.go.dev/github.com/ProtonMail/go-crypto/openpgp/internal/ecc/curve25519/field +license: other +licenses: +- sources: go-crypto@v1.1.0-alpha.5-proton/LICENSE + text: | + Copyright (c) 2009 The Go Authors. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following disclaimer + in the documentation and/or other materials provided with the + distribution. + * Neither the name of Google Inc. nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +- sources: go-crypto@v1.1.0-alpha.5-proton/PATENTS + text: | + Additional IP Rights Grant (Patents) + + "This implementation" means the copyrightable works distributed by + Google as part of the Go project. + + Google hereby grants to You a perpetual, worldwide, non-exclusive, + no-charge, royalty-free, irrevocable (except as stated in this section) + patent license to make, have made, use, offer to sell, sell, import, + transfer and otherwise run, modify and propagate the contents of this + implementation of Go, where such license applies only to those patent + claims, both currently owned or controlled by Google and acquired in + the future, licensable by Google that are necessarily infringed by this + implementation of Go. This grant does not include claims that would be + infringed only as a consequence of further modification of this + implementation. If you or your agent or exclusive licensee institute or + order or agree to the institution of patent litigation against any + entity (including a cross-claim or counterclaim in a lawsuit) alleging + that this implementation of Go or any code incorporated within this + implementation of Go constitutes direct or contributory patent + infringement, or inducement of patent infringement, then any patent + rights granted to you under this License for this implementation of Go + shall terminate as of the date such litigation is filed. +notices: [] diff --git a/.licenses/arduino-create-agent/go/github.com/ProtonMail/go-crypto/openpgp/internal/encoding.dep.yml b/.licenses/arduino-create-agent/go/github.com/ProtonMail/go-crypto/openpgp/internal/encoding.dep.yml new file mode 100644 index 000000000..990da1aa3 --- /dev/null +++ b/.licenses/arduino-create-agent/go/github.com/ProtonMail/go-crypto/openpgp/internal/encoding.dep.yml @@ -0,0 +1,63 @@ +--- +name: github.com/ProtonMail/go-crypto/openpgp/internal/encoding +version: v1.1.0-alpha.5-proton +type: go +summary: Package encoding implements openpgp packet field encodings as specified in + RFC 4880 and 6637. +homepage: https://pkg.go.dev/github.com/ProtonMail/go-crypto/openpgp/internal/encoding +license: other +licenses: +- sources: go-crypto@v1.1.0-alpha.5-proton/LICENSE + text: | + Copyright (c) 2009 The Go Authors. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following disclaimer + in the documentation and/or other materials provided with the + distribution. + * Neither the name of Google Inc. nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +- sources: go-crypto@v1.1.0-alpha.5-proton/PATENTS + text: | + Additional IP Rights Grant (Patents) + + "This implementation" means the copyrightable works distributed by + Google as part of the Go project. + + Google hereby grants to You a perpetual, worldwide, non-exclusive, + no-charge, royalty-free, irrevocable (except as stated in this section) + patent license to make, have made, use, offer to sell, sell, import, + transfer and otherwise run, modify and propagate the contents of this + implementation of Go, where such license applies only to those patent + claims, both currently owned or controlled by Google and acquired in + the future, licensable by Google that are necessarily infringed by this + implementation of Go. This grant does not include claims that would be + infringed only as a consequence of further modification of this + implementation. If you or your agent or exclusive licensee institute or + order or agree to the institution of patent litigation against any + entity (including a cross-claim or counterclaim in a lawsuit) alleging + that this implementation of Go or any code incorporated within this + implementation of Go constitutes direct or contributory patent + infringement, or inducement of patent infringement, then any patent + rights granted to you under this License for this implementation of Go + shall terminate as of the date such litigation is filed. +notices: [] diff --git a/.licenses/arduino-create-agent/go/github.com/ProtonMail/go-crypto/openpgp/packet.dep.yml b/.licenses/arduino-create-agent/go/github.com/ProtonMail/go-crypto/openpgp/packet.dep.yml new file mode 100644 index 000000000..c470a9e2b --- /dev/null +++ b/.licenses/arduino-create-agent/go/github.com/ProtonMail/go-crypto/openpgp/packet.dep.yml @@ -0,0 +1,63 @@ +--- +name: github.com/ProtonMail/go-crypto/openpgp/packet +version: v1.1.0-alpha.5-proton +type: go +summary: Package packet implements parsing and serialization of OpenPGP packets, as + specified in RFC 4880. +homepage: https://pkg.go.dev/github.com/ProtonMail/go-crypto/openpgp/packet +license: bsd-3-clause +licenses: +- sources: go-crypto@v1.1.0-alpha.5-proton/LICENSE + text: | + Copyright (c) 2009 The Go Authors. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following disclaimer + in the documentation and/or other materials provided with the + distribution. + * Neither the name of Google Inc. nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +- sources: go-crypto@v1.1.0-alpha.5-proton/PATENTS + text: | + Additional IP Rights Grant (Patents) + + "This implementation" means the copyrightable works distributed by + Google as part of the Go project. + + Google hereby grants to You a perpetual, worldwide, non-exclusive, + no-charge, royalty-free, irrevocable (except as stated in this section) + patent license to make, have made, use, offer to sell, sell, import, + transfer and otherwise run, modify and propagate the contents of this + implementation of Go, where such license applies only to those patent + claims, both currently owned or controlled by Google and acquired in + the future, licensable by Google that are necessarily infringed by this + implementation of Go. This grant does not include claims that would be + infringed only as a consequence of further modification of this + implementation. If you or your agent or exclusive licensee institute or + order or agree to the institution of patent litigation against any + entity (including a cross-claim or counterclaim in a lawsuit) alleging + that this implementation of Go or any code incorporated within this + implementation of Go constitutes direct or contributory patent + infringement, or inducement of patent infringement, then any patent + rights granted to you under this License for this implementation of Go + shall terminate as of the date such litigation is filed. +notices: [] diff --git a/.licenses/arduino-create-agent/go/github.com/ProtonMail/go-crypto/openpgp/s2k.dep.yml b/.licenses/arduino-create-agent/go/github.com/ProtonMail/go-crypto/openpgp/s2k.dep.yml new file mode 100644 index 000000000..a1a554e68 --- /dev/null +++ b/.licenses/arduino-create-agent/go/github.com/ProtonMail/go-crypto/openpgp/s2k.dep.yml @@ -0,0 +1,64 @@ +--- +name: github.com/ProtonMail/go-crypto/openpgp/s2k +version: v1.1.0-alpha.5-proton +type: go +summary: Package s2k implements the various OpenPGP string-to-key transforms as specified + in RFC 4800 section 3.7.1, and Argon2 specified in draft-ietf-openpgp-crypto-refresh-08 + section 3.7.1.4. +homepage: https://pkg.go.dev/github.com/ProtonMail/go-crypto/openpgp/s2k +license: bsd-3-clause +licenses: +- sources: go-crypto@v1.1.0-alpha.5-proton/LICENSE + text: | + Copyright (c) 2009 The Go Authors. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following disclaimer + in the documentation and/or other materials provided with the + distribution. + * Neither the name of Google Inc. nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +- sources: go-crypto@v1.1.0-alpha.5-proton/PATENTS + text: | + Additional IP Rights Grant (Patents) + + "This implementation" means the copyrightable works distributed by + Google as part of the Go project. + + Google hereby grants to You a perpetual, worldwide, non-exclusive, + no-charge, royalty-free, irrevocable (except as stated in this section) + patent license to make, have made, use, offer to sell, sell, import, + transfer and otherwise run, modify and propagate the contents of this + implementation of Go, where such license applies only to those patent + claims, both currently owned or controlled by Google and acquired in + the future, licensable by Google that are necessarily infringed by this + implementation of Go. This grant does not include claims that would be + infringed only as a consequence of further modification of this + implementation. If you or your agent or exclusive licensee institute or + order or agree to the institution of patent litigation against any + entity (including a cross-claim or counterclaim in a lawsuit) alleging + that this implementation of Go or any code incorporated within this + implementation of Go constitutes direct or contributory patent + infringement, or inducement of patent infringement, then any patent + rights granted to you under this License for this implementation of Go + shall terminate as of the date such litigation is filed. +notices: [] diff --git a/.licenses/arduino-create-agent/go/github.com/ProtonMail/go-crypto/openpgp/symmetric.dep.yml b/.licenses/arduino-create-agent/go/github.com/ProtonMail/go-crypto/openpgp/symmetric.dep.yml new file mode 100644 index 000000000..581db5cbd --- /dev/null +++ b/.licenses/arduino-create-agent/go/github.com/ProtonMail/go-crypto/openpgp/symmetric.dep.yml @@ -0,0 +1,62 @@ +--- +name: github.com/ProtonMail/go-crypto/openpgp/symmetric +version: v1.1.0-alpha.5-proton +type: go +summary: +homepage: https://pkg.go.dev/github.com/ProtonMail/go-crypto/openpgp/symmetric +license: other +licenses: +- sources: go-crypto@v1.1.0-alpha.5-proton/LICENSE + text: | + Copyright (c) 2009 The Go Authors. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following disclaimer + in the documentation and/or other materials provided with the + distribution. + * Neither the name of Google Inc. nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +- sources: go-crypto@v1.1.0-alpha.5-proton/PATENTS + text: | + Additional IP Rights Grant (Patents) + + "This implementation" means the copyrightable works distributed by + Google as part of the Go project. + + Google hereby grants to You a perpetual, worldwide, non-exclusive, + no-charge, royalty-free, irrevocable (except as stated in this section) + patent license to make, have made, use, offer to sell, sell, import, + transfer and otherwise run, modify and propagate the contents of this + implementation of Go, where such license applies only to those patent + claims, both currently owned or controlled by Google and acquired in + the future, licensable by Google that are necessarily infringed by this + implementation of Go. This grant does not include claims that would be + infringed only as a consequence of further modification of this + implementation. If you or your agent or exclusive licensee institute or + order or agree to the institution of patent litigation against any + entity (including a cross-claim or counterclaim in a lawsuit) alleging + that this implementation of Go or any code incorporated within this + implementation of Go constitutes direct or contributory patent + infringement, or inducement of patent infringement, then any patent + rights granted to you under this License for this implementation of Go + shall terminate as of the date such litigation is filed. +notices: [] diff --git a/.licenses/arduino-create-agent/go/github.com/ProtonMail/go-crypto/openpgp/x25519.dep.yml b/.licenses/arduino-create-agent/go/github.com/ProtonMail/go-crypto/openpgp/x25519.dep.yml new file mode 100644 index 000000000..16798ee8e --- /dev/null +++ b/.licenses/arduino-create-agent/go/github.com/ProtonMail/go-crypto/openpgp/x25519.dep.yml @@ -0,0 +1,62 @@ +--- +name: github.com/ProtonMail/go-crypto/openpgp/x25519 +version: v1.1.0-alpha.5-proton +type: go +summary: +homepage: https://pkg.go.dev/github.com/ProtonMail/go-crypto/openpgp/x25519 +license: other +licenses: +- sources: go-crypto@v1.1.0-alpha.5-proton/LICENSE + text: | + Copyright (c) 2009 The Go Authors. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following disclaimer + in the documentation and/or other materials provided with the + distribution. + * Neither the name of Google Inc. nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +- sources: go-crypto@v1.1.0-alpha.5-proton/PATENTS + text: | + Additional IP Rights Grant (Patents) + + "This implementation" means the copyrightable works distributed by + Google as part of the Go project. + + Google hereby grants to You a perpetual, worldwide, non-exclusive, + no-charge, royalty-free, irrevocable (except as stated in this section) + patent license to make, have made, use, offer to sell, sell, import, + transfer and otherwise run, modify and propagate the contents of this + implementation of Go, where such license applies only to those patent + claims, both currently owned or controlled by Google and acquired in + the future, licensable by Google that are necessarily infringed by this + implementation of Go. This grant does not include claims that would be + infringed only as a consequence of further modification of this + implementation. If you or your agent or exclusive licensee institute or + order or agree to the institution of patent litigation against any + entity (including a cross-claim or counterclaim in a lawsuit) alleging + that this implementation of Go or any code incorporated within this + implementation of Go constitutes direct or contributory patent + infringement, or inducement of patent infringement, then any patent + rights granted to you under this License for this implementation of Go + shall terminate as of the date such litigation is filed. +notices: [] diff --git a/.licenses/arduino-create-agent/go/github.com/ProtonMail/go-crypto/openpgp/x448.dep.yml b/.licenses/arduino-create-agent/go/github.com/ProtonMail/go-crypto/openpgp/x448.dep.yml new file mode 100644 index 000000000..27acdb02c --- /dev/null +++ b/.licenses/arduino-create-agent/go/github.com/ProtonMail/go-crypto/openpgp/x448.dep.yml @@ -0,0 +1,62 @@ +--- +name: github.com/ProtonMail/go-crypto/openpgp/x448 +version: v1.1.0-alpha.5-proton +type: go +summary: +homepage: https://pkg.go.dev/github.com/ProtonMail/go-crypto/openpgp/x448 +license: other +licenses: +- sources: go-crypto@v1.1.0-alpha.5-proton/LICENSE + text: | + Copyright (c) 2009 The Go Authors. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following disclaimer + in the documentation and/or other materials provided with the + distribution. + * Neither the name of Google Inc. nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +- sources: go-crypto@v1.1.0-alpha.5-proton/PATENTS + text: | + Additional IP Rights Grant (Patents) + + "This implementation" means the copyrightable works distributed by + Google as part of the Go project. + + Google hereby grants to You a perpetual, worldwide, non-exclusive, + no-charge, royalty-free, irrevocable (except as stated in this section) + patent license to make, have made, use, offer to sell, sell, import, + transfer and otherwise run, modify and propagate the contents of this + implementation of Go, where such license applies only to those patent + claims, both currently owned or controlled by Google and acquired in + the future, licensable by Google that are necessarily infringed by this + implementation of Go. This grant does not include claims that would be + infringed only as a consequence of further modification of this + implementation. If you or your agent or exclusive licensee institute or + order or agree to the institution of patent litigation against any + entity (including a cross-claim or counterclaim in a lawsuit) alleging + that this implementation of Go or any code incorporated within this + implementation of Go constitutes direct or contributory patent + infringement, or inducement of patent infringement, then any patent + rights granted to you under this License for this implementation of Go + shall terminate as of the date such litigation is filed. +notices: [] diff --git a/.licenses/arduino-create-agent/go/github.com/arduino/go-paths-helper.dep.yml b/.licenses/arduino-create-agent/go/github.com/arduino/go-paths-helper.dep.yml new file mode 100644 index 000000000..21d102e90 --- /dev/null +++ b/.licenses/arduino-create-agent/go/github.com/arduino/go-paths-helper.dep.yml @@ -0,0 +1,350 @@ +--- +name: github.com/arduino/go-paths-helper +version: v1.12.1 +type: go +summary: +homepage: https://pkg.go.dev/github.com/arduino/go-paths-helper +license: gpl-2.0-or-later +licenses: +- sources: LICENSE + text: |2 + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your + freedom to share and change it. By contrast, the GNU General Public + License is intended to guarantee your freedom to share and change free + software--to make sure the software is free for all its users. This + General Public License applies to most of the Free Software + Foundation's software and to any other program whose authors commit to + using it. (Some other Free Software Foundation software is covered by + the GNU Lesser General Public License instead.) You can apply it to + your programs, too. + + When we speak of free software, we are referring to freedom, not + price. Our General Public Licenses are designed to make sure that you + have the freedom to distribute copies of free software (and charge for + this service if you wish), that you receive source code or can get it + if you want it, that you can change the software or use pieces of it + in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid + anyone to deny you these rights or to ask you to surrender the rights. + These restrictions translate to certain responsibilities for you if you + distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether + gratis or for a fee, you must give the recipients all the rights that + you have. You must make sure that they, too, receive or can get the + source code. And you must show them these terms so they know their + rights. + + We protect your rights with two steps: (1) copyright the software, and + (2) offer you this license which gives you legal permission to copy, + distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain + that everyone understands that there is no warranty for this free + software. If the software is modified by someone else and passed on, we + want its recipients to know that what they have is not the original, so + that any problems introduced by others will not reflect on the original + authors' reputations. + + Finally, any free program is threatened constantly by software + patents. We wish to avoid the danger that redistributors of a free + program will individually obtain patent licenses, in effect making the + program proprietary. To prevent this, we have made it clear that any + patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and + modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains + a notice placed by the copyright holder saying it may be distributed + under the terms of this General Public License. The "Program", below, + refers to any such program or work, and a "work based on the Program" + means either the Program or any derivative work under copyright law: + that is to say, a work containing the Program or a portion of it, + either verbatim or with modifications and/or translated into another + language. (Hereinafter, translation is included without limitation in + the term "modification".) Each licensee is addressed as "you". + + Activities other than copying, distribution and modification are not + covered by this License; they are outside its scope. The act of + running the Program is not restricted, and the output from the Program + is covered only if its contents constitute a work based on the + Program (independent of having been made by running the Program). + Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's + source code as you receive it, in any medium, provided that you + conspicuously and appropriately publish on each copy an appropriate + copyright notice and disclaimer of warranty; keep intact all the + notices that refer to this License and to the absence of any warranty; + and give any other recipients of the Program a copy of this License + along with the Program. + + You may charge a fee for the physical act of transferring a copy, and + you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion + of it, thus forming a work based on the Program, and copy and + distribute such modifications or work under the terms of Section 1 + above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + + These requirements apply to the modified work as a whole. If + identifiable sections of that work are not derived from the Program, + and can be reasonably considered independent and separate works in + themselves, then this License, and its terms, do not apply to those + sections when you distribute them as separate works. But when you + distribute the same sections as part of a whole which is a work based + on the Program, the distribution of the whole must be on the terms of + this License, whose permissions for other licensees extend to the + entire whole, and thus to each and every part regardless of who wrote it. + + Thus, it is not the intent of this section to claim rights or contest + your rights to work written entirely by you; rather, the intent is to + exercise the right to control the distribution of derivative or + collective works based on the Program. + + In addition, mere aggregation of another work not based on the Program + with the Program (or with a work based on the Program) on a volume of + a storage or distribution medium does not bring the other work under + the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, + under Section 2) in object code or executable form under the terms of + Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + + The source code for a work means the preferred form of the work for + making modifications to it. For an executable work, complete source + code means all the source code for all modules it contains, plus any + associated interface definition files, plus the scripts used to + control compilation and installation of the executable. However, as a + special exception, the source code distributed need not include + anything that is normally distributed (in either source or binary + form) with the major components (compiler, kernel, and so on) of the + operating system on which the executable runs, unless that component + itself accompanies the executable. + + If distribution of executable or object code is made by offering + access to copy from a designated place, then offering equivalent + access to copy the source code from the same place counts as + distribution of the source code, even though third parties are not + compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program + except as expressly provided under this License. Any attempt + otherwise to copy, modify, sublicense or distribute the Program is + void, and will automatically terminate your rights under this License. + However, parties who have received copies, or rights, from you under + this License will not have their licenses terminated so long as such + parties remain in full compliance. + + 5. You are not required to accept this License, since you have not + signed it. However, nothing else grants you permission to modify or + distribute the Program or its derivative works. These actions are + prohibited by law if you do not accept this License. Therefore, by + modifying or distributing the Program (or any work based on the + Program), you indicate your acceptance of this License to do so, and + all its terms and conditions for copying, distributing or modifying + the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the + Program), the recipient automatically receives a license from the + original licensor to copy, distribute or modify the Program subject to + these terms and conditions. You may not impose any further + restrictions on the recipients' exercise of the rights granted herein. + You are not responsible for enforcing compliance by third parties to + this License. + + 7. If, as a consequence of a court judgment or allegation of patent + infringement or for any other reason (not limited to patent issues), + conditions are imposed on you (whether by court order, agreement or + otherwise) that contradict the conditions of this License, they do not + excuse you from the conditions of this License. If you cannot + distribute so as to satisfy simultaneously your obligations under this + License and any other pertinent obligations, then as a consequence you + may not distribute the Program at all. For example, if a patent + license would not permit royalty-free redistribution of the Program by + all those who receive copies directly or indirectly through you, then + the only way you could satisfy both it and this License would be to + refrain entirely from distribution of the Program. + + If any portion of this section is held invalid or unenforceable under + any particular circumstance, the balance of the section is intended to + apply and the section as a whole is intended to apply in other + circumstances. + + It is not the purpose of this section to induce you to infringe any + patents or other property right claims or to contest validity of any + such claims; this section has the sole purpose of protecting the + integrity of the free software distribution system, which is + implemented by public license practices. Many people have made + generous contributions to the wide range of software distributed + through that system in reliance on consistent application of that + system; it is up to the author/donor to decide if he or she is willing + to distribute software through any other system and a licensee cannot + impose that choice. + + This section is intended to make thoroughly clear what is believed to + be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in + certain countries either by patents or by copyrighted interfaces, the + original copyright holder who places the Program under this License + may add an explicit geographical distribution limitation excluding + those countries, so that distribution is permitted only in or among + countries not thus excluded. In such case, this License incorporates + the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions + of the General Public License from time to time. Such new versions will + be similar in spirit to the present version, but may differ in detail to + address new problems or concerns. + + Each version is given a distinguishing version number. If the Program + specifies a version number of this License which applies to it and "any + later version", you have the option of following the terms and conditions + either of that version or of any later version published by the Free + Software Foundation. If the Program does not specify a version number of + this License, you may choose any version ever published by the Free Software + Foundation. + + 10. If you wish to incorporate parts of the Program into other free + programs whose distribution conditions are different, write to the author + to ask for permission. For software which is copyrighted by the Free + Software Foundation, write to the Free Software Foundation; we sometimes + make exceptions for this. Our decision will be guided by the two goals + of preserving the free status of all derivatives of our free software and + of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY + FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN + OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES + PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED + OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS + TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE + PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, + REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING + WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR + REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, + INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING + OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED + TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY + YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER + PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE + POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest + possible use to the public, the best way to achieve this is to make it + free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest + to attach them to the start of each source file to most effectively + convey the exclusion of warranty; and each file should have at least + the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + + Also add information on how to contact you by electronic and paper mail. + + If the program is interactive, make it output a short notice like this + when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + + The hypothetical commands `show w' and `show c' should show the appropriate + parts of the General Public License. Of course, the commands you use may + be called something other than `show w' and `show c'; they could even be + mouse-clicks or menu items--whatever suits your program. + + You should also get your employer (if you work as a programmer) or your + school, if any, to sign a "copyright disclaimer" for the program, if + necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + + This General Public License does not permit incorporating your program into + proprietary programs. If your program is a subroutine library, you may + consider it more useful to permit linking proprietary applications with the + library. If this is what you want to do, use the GNU Lesser General + Public License instead of this License. +notices: [] diff --git a/.licenses/arduino-create-agent/go/github.com/arduino/go-properties-orderedmap.dep.yml b/.licenses/arduino-create-agent/go/github.com/arduino/go-properties-orderedmap.dep.yml new file mode 100644 index 000000000..d7e78f9e6 --- /dev/null +++ b/.licenses/arduino-create-agent/go/github.com/arduino/go-properties-orderedmap.dep.yml @@ -0,0 +1,350 @@ +--- +name: github.com/arduino/go-properties-orderedmap +version: v1.8.0 +type: go +summary: Package properties is a library for handling maps of hierarchical properties. +homepage: https://pkg.go.dev/github.com/arduino/go-properties-orderedmap +license: gpl-2.0 +licenses: +- sources: LICENSE + text: |2 + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your + freedom to share and change it. By contrast, the GNU General Public + License is intended to guarantee your freedom to share and change free + software--to make sure the software is free for all its users. This + General Public License applies to most of the Free Software + Foundation's software and to any other program whose authors commit to + using it. (Some other Free Software Foundation software is covered by + the GNU Lesser General Public License instead.) You can apply it to + your programs, too. + + When we speak of free software, we are referring to freedom, not + price. Our General Public Licenses are designed to make sure that you + have the freedom to distribute copies of free software (and charge for + this service if you wish), that you receive source code or can get it + if you want it, that you can change the software or use pieces of it + in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid + anyone to deny you these rights or to ask you to surrender the rights. + These restrictions translate to certain responsibilities for you if you + distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether + gratis or for a fee, you must give the recipients all the rights that + you have. You must make sure that they, too, receive or can get the + source code. And you must show them these terms so they know their + rights. + + We protect your rights with two steps: (1) copyright the software, and + (2) offer you this license which gives you legal permission to copy, + distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain + that everyone understands that there is no warranty for this free + software. If the software is modified by someone else and passed on, we + want its recipients to know that what they have is not the original, so + that any problems introduced by others will not reflect on the original + authors' reputations. + + Finally, any free program is threatened constantly by software + patents. We wish to avoid the danger that redistributors of a free + program will individually obtain patent licenses, in effect making the + program proprietary. To prevent this, we have made it clear that any + patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and + modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains + a notice placed by the copyright holder saying it may be distributed + under the terms of this General Public License. The "Program", below, + refers to any such program or work, and a "work based on the Program" + means either the Program or any derivative work under copyright law: + that is to say, a work containing the Program or a portion of it, + either verbatim or with modifications and/or translated into another + language. (Hereinafter, translation is included without limitation in + the term "modification".) Each licensee is addressed as "you". + + Activities other than copying, distribution and modification are not + covered by this License; they are outside its scope. The act of + running the Program is not restricted, and the output from the Program + is covered only if its contents constitute a work based on the + Program (independent of having been made by running the Program). + Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's + source code as you receive it, in any medium, provided that you + conspicuously and appropriately publish on each copy an appropriate + copyright notice and disclaimer of warranty; keep intact all the + notices that refer to this License and to the absence of any warranty; + and give any other recipients of the Program a copy of this License + along with the Program. + + You may charge a fee for the physical act of transferring a copy, and + you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion + of it, thus forming a work based on the Program, and copy and + distribute such modifications or work under the terms of Section 1 + above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + + These requirements apply to the modified work as a whole. If + identifiable sections of that work are not derived from the Program, + and can be reasonably considered independent and separate works in + themselves, then this License, and its terms, do not apply to those + sections when you distribute them as separate works. But when you + distribute the same sections as part of a whole which is a work based + on the Program, the distribution of the whole must be on the terms of + this License, whose permissions for other licensees extend to the + entire whole, and thus to each and every part regardless of who wrote it. + + Thus, it is not the intent of this section to claim rights or contest + your rights to work written entirely by you; rather, the intent is to + exercise the right to control the distribution of derivative or + collective works based on the Program. + + In addition, mere aggregation of another work not based on the Program + with the Program (or with a work based on the Program) on a volume of + a storage or distribution medium does not bring the other work under + the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, + under Section 2) in object code or executable form under the terms of + Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + + The source code for a work means the preferred form of the work for + making modifications to it. For an executable work, complete source + code means all the source code for all modules it contains, plus any + associated interface definition files, plus the scripts used to + control compilation and installation of the executable. However, as a + special exception, the source code distributed need not include + anything that is normally distributed (in either source or binary + form) with the major components (compiler, kernel, and so on) of the + operating system on which the executable runs, unless that component + itself accompanies the executable. + + If distribution of executable or object code is made by offering + access to copy from a designated place, then offering equivalent + access to copy the source code from the same place counts as + distribution of the source code, even though third parties are not + compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program + except as expressly provided under this License. Any attempt + otherwise to copy, modify, sublicense or distribute the Program is + void, and will automatically terminate your rights under this License. + However, parties who have received copies, or rights, from you under + this License will not have their licenses terminated so long as such + parties remain in full compliance. + + 5. You are not required to accept this License, since you have not + signed it. However, nothing else grants you permission to modify or + distribute the Program or its derivative works. These actions are + prohibited by law if you do not accept this License. Therefore, by + modifying or distributing the Program (or any work based on the + Program), you indicate your acceptance of this License to do so, and + all its terms and conditions for copying, distributing or modifying + the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the + Program), the recipient automatically receives a license from the + original licensor to copy, distribute or modify the Program subject to + these terms and conditions. You may not impose any further + restrictions on the recipients' exercise of the rights granted herein. + You are not responsible for enforcing compliance by third parties to + this License. + + 7. If, as a consequence of a court judgment or allegation of patent + infringement or for any other reason (not limited to patent issues), + conditions are imposed on you (whether by court order, agreement or + otherwise) that contradict the conditions of this License, they do not + excuse you from the conditions of this License. If you cannot + distribute so as to satisfy simultaneously your obligations under this + License and any other pertinent obligations, then as a consequence you + may not distribute the Program at all. For example, if a patent + license would not permit royalty-free redistribution of the Program by + all those who receive copies directly or indirectly through you, then + the only way you could satisfy both it and this License would be to + refrain entirely from distribution of the Program. + + If any portion of this section is held invalid or unenforceable under + any particular circumstance, the balance of the section is intended to + apply and the section as a whole is intended to apply in other + circumstances. + + It is not the purpose of this section to induce you to infringe any + patents or other property right claims or to contest validity of any + such claims; this section has the sole purpose of protecting the + integrity of the free software distribution system, which is + implemented by public license practices. Many people have made + generous contributions to the wide range of software distributed + through that system in reliance on consistent application of that + system; it is up to the author/donor to decide if he or she is willing + to distribute software through any other system and a licensee cannot + impose that choice. + + This section is intended to make thoroughly clear what is believed to + be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in + certain countries either by patents or by copyrighted interfaces, the + original copyright holder who places the Program under this License + may add an explicit geographical distribution limitation excluding + those countries, so that distribution is permitted only in or among + countries not thus excluded. In such case, this License incorporates + the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions + of the General Public License from time to time. Such new versions will + be similar in spirit to the present version, but may differ in detail to + address new problems or concerns. + + Each version is given a distinguishing version number. If the Program + specifies a version number of this License which applies to it and "any + later version", you have the option of following the terms and conditions + either of that version or of any later version published by the Free + Software Foundation. If the Program does not specify a version number of + this License, you may choose any version ever published by the Free Software + Foundation. + + 10. If you wish to incorporate parts of the Program into other free + programs whose distribution conditions are different, write to the author + to ask for permission. For software which is copyrighted by the Free + Software Foundation, write to the Free Software Foundation; we sometimes + make exceptions for this. Our decision will be guided by the two goals + of preserving the free status of all derivatives of our free software and + of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY + FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN + OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES + PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED + OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS + TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE + PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, + REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING + WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR + REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, + INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING + OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED + TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY + YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER + PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE + POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest + possible use to the public, the best way to achieve this is to make it + free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest + to attach them to the start of each source file to most effectively + convey the exclusion of warranty; and each file should have at least + the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + + Also add information on how to contact you by electronic and paper mail. + + If the program is interactive, make it output a short notice like this + when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + + The hypothetical commands `show w' and `show c' should show the appropriate + parts of the General Public License. Of course, the commands you use may + be called something other than `show w' and `show c'; they could even be + mouse-clicks or menu items--whatever suits your program. + + You should also get your employer (if you work as a programmer) or your + school, if any, to sign a "copyright disclaimer" for the program, if + necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + + This General Public License does not permit incorporating your program into + proprietary programs. If your program is a subroutine library, you may + consider it more useful to permit linking proprietary applications with the + library. If this is what you want to do, use the GNU Lesser General + Public License instead of this License. +notices: [] diff --git a/.licenses/arduino-create-agent/go/github.com/arduino/go-serial-utils.dep.yml b/.licenses/arduino-create-agent/go/github.com/arduino/go-serial-utils.dep.yml new file mode 100644 index 000000000..fb7fa6ea5 --- /dev/null +++ b/.licenses/arduino-create-agent/go/github.com/arduino/go-serial-utils.dep.yml @@ -0,0 +1,458 @@ +--- +name: github.com/arduino/go-serial-utils +version: v0.1.2 +type: go +summary: +homepage: https://pkg.go.dev/github.com/arduino/go-serial-utils +license: gpl-3.0 +licenses: +- sources: LICENSE.txt + text: "This file includes licensing information for \n\nCopyright (c) 2024 ARDUINO + SA (www.arduino.cc)\n\nThe software is released under the GNU General Public License, + which covers the main body\nof the arduino-cli code. The terms of this license + can be found at:\nhttps://www.gnu.org/licenses/gpl-3.0.en.html\n\nYou can be released + from the requirements of the above licenses by purchasing\na commercial license. + Buying such a license is mandatory if you want to modify or\notherwise use the + software for commercial activities involving the Arduino\nsoftware without disclosing + the source code of your own applications. To purchase\na commercial license, send + an email to license@arduino.cc\n\n GNU GENERAL PUBLIC LICENSE\n + \ Version 3, 29 June 2007\n\n Copyright (C) 2007 Free Software + Foundation, Inc. \n Everyone is permitted to copy and distribute + verbatim copies\n of this license document, but changing it is not allowed.\n\n + \ Preamble\n\n The GNU General Public License is a + free, copyleft license for\nsoftware and other kinds of works.\n\n The licenses + for most software and other practical works are designed\nto take away your freedom + to share and change the works. By contrast,\nthe GNU General Public License is + intended to guarantee your freedom to\nshare and change all versions of a program--to + make sure it remains free\nsoftware for all its users. We, the Free Software + Foundation, use the\nGNU General Public License for most of our software; it applies + also to\nany other work released this way by its authors. You can apply it to\nyour + programs, too.\n\n When we speak of free software, we are referring to freedom, + not\nprice. Our General Public Licenses are designed to make sure that you\nhave + the freedom to distribute copies of free software (and charge for\nthem if you + wish), that you receive source code or can get it if you\nwant it, that you can + change the software or use pieces of it in new\nfree programs, and that you know + you can do these things.\n\n To protect your rights, we need to prevent others + from denying you\nthese rights or asking you to surrender the rights. Therefore, + you have\ncertain responsibilities if you distribute copies of the software, or + if\nyou modify it: responsibilities to respect the freedom of others.\n\n For + example, if you distribute copies of such a program, whether\ngratis or for a + fee, you must pass on to the recipients the same\nfreedoms that you received. + \ You must make sure that they, too, receive\nor can get the source code. And + you must show them these terms so they\nknow their rights.\n\n Developers that + use the GNU GPL protect your rights with two steps:\n(1) assert copyright on the + software, and (2) offer you this License\ngiving you legal permission to copy, + distribute and/or modify it.\n\n For the developers' and authors' protection, + the GPL clearly explains\nthat there is no warranty for this free software. For + both users' and\nauthors' sake, the GPL requires that modified versions be marked + as\nchanged, so that their problems will not be attributed erroneously to\nauthors + of previous versions.\n\n Some devices are designed to deny users access to install + or run\nmodified versions of the software inside them, although the manufacturer\ncan + do so. This is fundamentally incompatible with the aim of\nprotecting users' + freedom to change the software. The systematic\npattern of such abuse occurs + in the area of products for individuals to\nuse, which is precisely where it is + most unacceptable. Therefore, we\nhave designed this version of the GPL to prohibit + the practice for those\nproducts. If such problems arise substantially in other + domains, we\nstand ready to extend this provision to those domains in future versions\nof + the GPL, as needed to protect the freedom of users.\n\n Finally, every program + is threatened constantly by software patents.\nStates should not allow patents + to restrict development and use of\nsoftware on general-purpose computers, but + in those that do, we wish to\navoid the special danger that patents applied to + a free program could\nmake it effectively proprietary. To prevent this, the GPL + assures that\npatents cannot be used to render the program non-free.\n\n The + precise terms and conditions for copying, distribution and\nmodification follow.\n\n + \ TERMS AND CONDITIONS\n\n 0. Definitions.\n\n \"This License\" + refers to version 3 of the GNU General Public License.\n\n \"Copyright\" also + means copyright-like laws that apply to other kinds of\nworks, such as semiconductor + masks.\n\n \"The Program\" refers to any copyrightable work licensed under this\nLicense. + \ Each licensee is addressed as \"you\". \"Licensees\" and\n\"recipients\" may + be individuals or organizations.\n\n To \"modify\" a work means to copy from + or adapt all or part of the work\nin a fashion requiring copyright permission, + other than the making of an\nexact copy. The resulting work is called a \"modified + version\" of the\nearlier work or a work \"based on\" the earlier work.\n\n A + \"covered work\" means either the unmodified Program or a work based\non the Program.\n\n + \ To \"propagate\" a work means to do anything with it that, without\npermission, + would make you directly or secondarily liable for\ninfringement under applicable + copyright law, except executing it on a\ncomputer or modifying a private copy. + \ Propagation includes copying,\ndistribution (with or without modification), + making available to the\npublic, and in some countries other activities as well.\n\n + \ To \"convey\" a work means any kind of propagation that enables other\nparties + to make or receive copies. Mere interaction with a user through\na computer network, + with no transfer of a copy, is not conveying.\n\n An interactive user interface + displays \"Appropriate Legal Notices\"\nto the extent that it includes a convenient + and prominently visible\nfeature that (1) displays an appropriate copyright notice, + and (2)\ntells the user that there is no warranty for the work (except to the\nextent + that warranties are provided), that licensees may convey the\nwork under this + License, and how to view a copy of this License. If\nthe interface presents a + list of user commands or options, such as a\nmenu, a prominent item in the list + meets this criterion.\n\n 1. Source Code.\n\n The \"source code\" for a work + means the preferred form of the work\nfor making modifications to it. \"Object + code\" means any non-source\nform of a work.\n\n A \"Standard Interface\" means + an interface that either is an official\nstandard defined by a recognized standards + body, or, in the case of\ninterfaces specified for a particular programming language, + one that\nis widely used among developers working in that language.\n\n The \"System + Libraries\" of an executable work include anything, other\nthan the work as a + whole, that (a) is included in the normal form of\npackaging a Major Component, + but which is not part of that Major\nComponent, and (b) serves only to enable + use of the work with that\nMajor Component, or to implement a Standard Interface + for which an\nimplementation is available to the public in source code form. A\n\"Major + Component\", in this context, means a major essential component\n(kernel, window + system, and so on) of the specific operating system\n(if any) on which the executable + work runs, or a compiler used to\nproduce the work, or an object code interpreter + used to run it.\n\n The \"Corresponding Source\" for a work in object code form + means all\nthe source code needed to generate, install, and (for an executable\nwork) + run the object code and to modify the work, including scripts to\ncontrol those + activities. However, it does not include the work's\nSystem Libraries, or general-purpose + tools or generally available free\nprograms which are used unmodified in performing + those activities but\nwhich are not part of the work. For example, Corresponding + Source\nincludes interface definition files associated with source files for\nthe + work, and the source code for shared libraries and dynamically\nlinked subprograms + that the work is specifically designed to require,\nsuch as by intimate data communication + or control flow between those\nsubprograms and other parts of the work.\n\n The + Corresponding Source need not include anything that users\ncan regenerate automatically + from other parts of the Corresponding\nSource.\n\n The Corresponding Source for + a work in source code form is that\nsame work.\n\n 2. Basic Permissions.\n\n + \ All rights granted under this License are granted for the term of\ncopyright + on the Program, and are irrevocable provided the stated\nconditions are met. This + License explicitly affirms your unlimited\npermission to run the unmodified Program. + \ The output from running a\ncovered work is covered by this License only if the + output, given its\ncontent, constitutes a covered work. This License acknowledges + your\nrights of fair use or other equivalent, as provided by copyright law.\n\n + \ You may make, run and propagate covered works that you do not\nconvey, without + conditions so long as your license otherwise remains\nin force. You may convey + covered works to others for the sole purpose\nof having them make modifications + exclusively for you, or provide you\nwith facilities for running those works, + provided that you comply with\nthe terms of this License in conveying all material + for which you do\nnot control copyright. Those thus making or running the covered + works\nfor you must do so exclusively on your behalf, under your direction\nand + control, on terms that prohibit them from making any copies of\nyour copyrighted + material outside their relationship with you.\n\n Conveying under any other circumstances + is permitted solely under\nthe conditions stated below. Sublicensing is not allowed; + section 10\nmakes it unnecessary.\n\n 3. Protecting Users' Legal Rights From + Anti-Circumvention Law.\n\n No covered work shall be deemed part of an effective + technological\nmeasure under any applicable law fulfilling obligations under article\n11 + of the WIPO copyright treaty adopted on 20 December 1996, or\nsimilar laws prohibiting + or restricting circumvention of such\nmeasures.\n\n When you convey a covered + work, you waive any legal power to forbid\ncircumvention of technological measures + to the extent such circumvention\nis effected by exercising rights under this + License with respect to\nthe covered work, and you disclaim any intention to limit + operation or\nmodification of the work as a means of enforcing, against the work's\nusers, + your or third parties' legal rights to forbid circumvention of\ntechnological + measures.\n\n 4. Conveying Verbatim Copies.\n\n You may convey verbatim copies + of the Program's source code as you\nreceive it, in any medium, provided that + you conspicuously and\nappropriately publish on each copy an appropriate copyright + notice;\nkeep intact all notices stating that this License and any\nnon-permissive + terms added in accord with section 7 apply to the code;\nkeep intact all notices + of the absence of any warranty; and give all\nrecipients a copy of this License + along with the Program.\n\n You may charge any price or no price for each copy + that you convey,\nand you may offer support or warranty protection for a fee.\n\n + \ 5. Conveying Modified Source Versions.\n\n You may convey a work based on the + Program, or the modifications to\nproduce it from the Program, in the form of + source code under the\nterms of section 4, provided that you also meet all of + these conditions:\n\n a) The work must carry prominent notices stating that + you modified\n it, and giving a relevant date.\n\n b) The work must carry + prominent notices stating that it is\n released under this License and any + conditions added under section\n 7. This requirement modifies the requirement + in section 4 to\n \"keep intact all notices\".\n\n c) You must license the + entire work, as a whole, under this\n License to anyone who comes into possession + of a copy. This\n License will therefore apply, along with any applicable + section 7\n additional terms, to the whole of the work, and all its parts,\n + \ regardless of how they are packaged. This License gives no\n permission + to license the work in any other way, but it does not\n invalidate such permission + if you have separately received it.\n\n d) If the work has interactive user + interfaces, each must display\n Appropriate Legal Notices; however, if the + Program has interactive\n interfaces that do not display Appropriate Legal + Notices, your\n work need not make them do so.\n\n A compilation of a covered + work with other separate and independent\nworks, which are not by their nature + extensions of the covered work,\nand which are not combined with it such as to + form a larger program,\nin or on a volume of a storage or distribution medium, + is called an\n\"aggregate\" if the compilation and its resulting copyright are + not\nused to limit the access or legal rights of the compilation's users\nbeyond + what the individual works permit. Inclusion of a covered work\nin an aggregate + does not cause this License to apply to the other\nparts of the aggregate.\n\n + \ 6. Conveying Non-Source Forms.\n\n You may convey a covered work in object + code form under the terms\nof sections 4 and 5, provided that you also convey + the\nmachine-readable Corresponding Source under the terms of this License,\nin + one of these ways:\n\n a) Convey the object code in, or embodied in, a physical + product\n (including a physical distribution medium), accompanied by the\n + \ Corresponding Source fixed on a durable physical medium\n customarily used + for software interchange.\n\n b) Convey the object code in, or embodied in, + a physical product\n (including a physical distribution medium), accompanied + by a\n written offer, valid for at least three years and valid for as\n long + as you offer spare parts or customer support for that product\n model, to give + anyone who possesses the object code either (1) a\n copy of the Corresponding + Source for all the software in the\n product that is covered by this License, + on a durable physical\n medium customarily used for software interchange, for + a price no\n more than your reasonable cost of physically performing this\n + \ conveying of source, or (2) access to copy the\n Corresponding Source from + a network server at no charge.\n\n c) Convey individual copies of the object + code with a copy of the\n written offer to provide the Corresponding Source. + \ This\n alternative is allowed only occasionally and noncommercially, and\n + \ only if you received the object code with such an offer, in accord\n with + subsection 6b.\n\n d) Convey the object code by offering access from a designated\n + \ place (gratis or for a charge), and offer equivalent access to the\n Corresponding + Source in the same way through the same place at no\n further charge. You + need not require recipients to copy the\n Corresponding Source along with the + object code. If the place to\n copy the object code is a network server, the + Corresponding Source\n may be on a different server (operated by you or a third + party)\n that supports equivalent copying facilities, provided you maintain\n + \ clear directions next to the object code saying where to find the\n Corresponding + Source. Regardless of what server hosts the\n Corresponding Source, you remain + obligated to ensure that it is\n available for as long as needed to satisfy + these requirements.\n\n e) Convey the object code using peer-to-peer transmission, + provided\n you inform other peers where the object code and Corresponding\n + \ Source of the work are being offered to the general public at no\n charge + under subsection 6d.\n\n A separable portion of the object code, whose source + code is excluded\nfrom the Corresponding Source as a System Library, need not + be\nincluded in conveying the object code work.\n\n A \"User Product\" is either + (1) a \"consumer product\", which means any\ntangible personal property which + is normally used for personal, family,\nor household purposes, or (2) anything + designed or sold for incorporation\ninto a dwelling. In determining whether a + product is a consumer product,\ndoubtful cases shall be resolved in favor of coverage. + \ For a particular\nproduct received by a particular user, \"normally used\" refers + to a\ntypical or common use of that class of product, regardless of the status\nof + the particular user or of the way in which the particular user\nactually uses, + or expects or is expected to use, the product. A product\nis a consumer product + regardless of whether the product has substantial\ncommercial, industrial or non-consumer + uses, unless such uses represent\nthe only significant mode of use of the product.\n\n + \ \"Installation Information\" for a User Product means any methods,\nprocedures, + authorization keys, or other information required to install\nand execute modified + versions of a covered work in that User Product from\na modified version of its + Corresponding Source. The information must\nsuffice to ensure that the continued + functioning of the modified object\ncode is in no case prevented or interfered + with solely because\nmodification has been made.\n\n If you convey an object + code work under this section in, or with, or\nspecifically for use in, a User + Product, and the conveying occurs as\npart of a transaction in which the right + of possession and use of the\nUser Product is transferred to the recipient in + perpetuity or for a\nfixed term (regardless of how the transaction is characterized), + the\nCorresponding Source conveyed under this section must be accompanied\nby + the Installation Information. But this requirement does not apply\nif neither + you nor any third party retains the ability to install\nmodified object code on + the User Product (for example, the work has\nbeen installed in ROM).\n\n The + requirement to provide Installation Information does not include a\nrequirement + to continue to provide support service, warranty, or updates\nfor a work that + has been modified or installed by the recipient, or for\nthe User Product in which + it has been modified or installed. Access to a\nnetwork may be denied when the + modification itself materially and\nadversely affects the operation of the network + or violates the rules and\nprotocols for communication across the network.\n\n + \ Corresponding Source conveyed, and Installation Information provided,\nin accord + with this section must be in a format that is publicly\ndocumented (and with an + implementation available to the public in\nsource code form), and must require + no special password or key for\nunpacking, reading or copying.\n\n 7. Additional + Terms.\n\n \"Additional permissions\" are terms that supplement the terms of + this\nLicense by making exceptions from one or more of its conditions.\nAdditional + permissions that are applicable to the entire Program shall\nbe treated as though + they were included in this License, to the extent\nthat they are valid under applicable + law. If additional permissions\napply only to part of the Program, that part + may be used separately\nunder those permissions, but the entire Program remains + governed by\nthis License without regard to the additional permissions.\n\n When + you convey a copy of a covered work, you may at your option\nremove any additional + permissions from that copy, or from any part of\nit. (Additional permissions + may be written to require their own\nremoval in certain cases when you modify + the work.) You may place\nadditional permissions on material, added by you to + a covered work,\nfor which you have or can give appropriate copyright permission.\n\n + \ Notwithstanding any other provision of this License, for material you\nadd to + a covered work, you may (if authorized by the copyright holders of\nthat material) + supplement the terms of this License with terms:\n\n a) Disclaiming warranty + or limiting liability differently from the\n terms of sections 15 and 16 of + this License; or\n\n b) Requiring preservation of specified reasonable legal + notices or\n author attributions in that material or in the Appropriate Legal\n + \ Notices displayed by works containing it; or\n\n c) Prohibiting misrepresentation + of the origin of that material, or\n requiring that modified versions of such + material be marked in\n reasonable ways as different from the original version; + or\n\n d) Limiting the use for publicity purposes of names of licensors or\n + \ authors of the material; or\n\n e) Declining to grant rights under trademark + law for use of some\n trade names, trademarks, or service marks; or\n\n f) + Requiring indemnification of licensors and authors of that\n material by anyone + who conveys the material (or modified versions of\n it) with contractual assumptions + of liability to the recipient, for\n any liability that these contractual assumptions + directly impose on\n those licensors and authors.\n\n All other non-permissive + additional terms are considered \"further\nrestrictions\" within the meaning of + section 10. If the Program as you\nreceived it, or any part of it, contains a + notice stating that it is\ngoverned by this License along with a term that is + a further\nrestriction, you may remove that term. If a license document contains\na + further restriction but permits relicensing or conveying under this\nLicense, + you may add to a covered work material governed by the terms\nof that license + document, provided that the further restriction does\nnot survive such relicensing + or conveying.\n\n If you add terms to a covered work in accord with this section, + you\nmust place, in the relevant source files, a statement of the\nadditional + terms that apply to those files, or a notice indicating\nwhere to find the applicable + terms.\n\n Additional terms, permissive or non-permissive, may be stated in the\nform + of a separately written license, or stated as exceptions;\nthe above requirements + apply either way.\n\n 8. Termination.\n\n You may not propagate or modify a + covered work except as expressly\nprovided under this License. Any attempt otherwise + to propagate or\nmodify it is void, and will automatically terminate your rights + under\nthis License (including any patent licenses granted under the third\nparagraph + of section 11).\n\n However, if you cease all violation of this License, then + your\nlicense from a particular copyright holder is reinstated (a)\nprovisionally, + unless and until the copyright holder explicitly and\nfinally terminates your + license, and (b) permanently, if the copyright\nholder fails to notify you of + the violation by some reasonable means\nprior to 60 days after the cessation.\n\n + \ Moreover, your license from a particular copyright holder is\nreinstated permanently + if the copyright holder notifies you of the\nviolation by some reasonable means, + this is the first time you have\nreceived notice of violation of this License + (for any work) from that\ncopyright holder, and you cure the violation prior to + 30 days after\nyour receipt of the notice.\n\n Termination of your rights under + this section does not terminate the\nlicenses of parties who have received copies + or rights from you under\nthis License. If your rights have been terminated and + not permanently\nreinstated, you do not qualify to receive new licenses for the + same\nmaterial under section 10.\n\n 9. Acceptance Not Required for Having Copies.\n\n + \ You are not required to accept this License in order to receive or\nrun a copy + of the Program. Ancillary propagation of a covered work\noccurring solely as + a consequence of using peer-to-peer transmission\nto receive a copy likewise does + not require acceptance. However,\nnothing other than this License grants you + permission to propagate or\nmodify any covered work. These actions infringe copyright + if you do\nnot accept this License. Therefore, by modifying or propagating a\ncovered + work, you indicate your acceptance of this License to do so.\n\n 10. Automatic + Licensing of Downstream Recipients.\n\n Each time you convey a covered work, + the recipient automatically\nreceives a license from the original licensors, to + run, modify and\npropagate that work, subject to this License. You are not responsible\nfor + enforcing compliance by third parties with this License.\n\n An \"entity transaction\" + is a transaction transferring control of an\norganization, or substantially all + assets of one, or subdividing an\norganization, or merging organizations. If + propagation of a covered\nwork results from an entity transaction, each party + to that\ntransaction who receives a copy of the work also receives whatever\nlicenses + to the work the party's predecessor in interest had or could\ngive under the previous + paragraph, plus a right to possession of the\nCorresponding Source of the work + from the predecessor in interest, if\nthe predecessor has it or can get it with + reasonable efforts.\n\n You may not impose any further restrictions on the exercise + of the\nrights granted or affirmed under this License. For example, you may\nnot + impose a license fee, royalty, or other charge for exercise of\nrights granted + under this License, and you may not initiate litigation\n(including a cross-claim + or counterclaim in a lawsuit) alleging that\nany patent claim is infringed by + making, using, selling, offering for\nsale, or importing the Program or any portion + of it.\n\n 11. Patents.\n\n A \"contributor\" is a copyright holder who authorizes + use under this\nLicense of the Program or a work on which the Program is based. + \ The\nwork thus licensed is called the contributor's \"contributor version\".\n\n + \ A contributor's \"essential patent claims\" are all patent claims\nowned or + controlled by the contributor, whether already acquired or\nhereafter acquired, + that would be infringed by some manner, permitted\nby this License, of making, + using, or selling its contributor version,\nbut do not include claims that would + be infringed only as a\nconsequence of further modification of the contributor + version. For\npurposes of this definition, \"control\" includes the right to + grant\npatent sublicenses in a manner consistent with the requirements of\nthis + License.\n\n Each contributor grants you a non-exclusive, worldwide, royalty-free\npatent + license under the contributor's essential patent claims, to\nmake, use, sell, + offer for sale, import and otherwise run, modify and\npropagate the contents of + its contributor version.\n\n In the following three paragraphs, a \"patent license\" + is any express\nagreement or commitment, however denominated, not to enforce a + patent\n(such as an express permission to practice a patent or covenant not to\nsue + for patent infringement). To \"grant\" such a patent license to a\nparty means + to make such an agreement or commitment not to enforce a\npatent against the party.\n\n + \ If you convey a covered work, knowingly relying on a patent license,\nand the + Corresponding Source of the work is not available for anyone\nto copy, free of + charge and under the terms of this License, through a\npublicly available network + server or other readily accessible means,\nthen you must either (1) cause the + Corresponding Source to be so\navailable, or (2) arrange to deprive yourself of + the benefit of the\npatent license for this particular work, or (3) arrange, in + a manner\nconsistent with the requirements of this License, to extend the patent\nlicense + to downstream recipients. \"Knowingly relying\" means you have\nactual knowledge + that, but for the patent license, your conveying the\ncovered work in a country, + or your recipient's use of the covered work\nin a country, would infringe one + or more identifiable patents in that\ncountry that you have reason to believe + are valid.\n\n If, pursuant to or in connection with a single transaction or\narrangement, + you convey, or propagate by procuring conveyance of, a\ncovered work, and grant + a patent license to some of the parties\nreceiving the covered work authorizing + them to use, propagate, modify\nor convey a specific copy of the covered work, + then the patent license\nyou grant is automatically extended to all recipients + of the covered\nwork and works based on it.\n\n A patent license is \"discriminatory\" + if it does not include within\nthe scope of its coverage, prohibits the exercise + of, or is\nconditioned on the non-exercise of one or more of the rights that are\nspecifically + granted under this License. You may not convey a covered\nwork if you are a party + to an arrangement with a third party that is\nin the business of distributing + software, under which you make payment\nto the third party based on the extent + of your activity of conveying\nthe work, and under which the third party grants, + to any of the\nparties who would receive the covered work from you, a discriminatory\npatent + license (a) in connection with copies of the covered work\nconveyed by you (or + copies made from those copies), or (b) primarily\nfor and in connection with specific + products or compilations that\ncontain the covered work, unless you entered into + that arrangement,\nor that patent license was granted, prior to 28 March 2007.\n\n + \ Nothing in this License shall be construed as excluding or limiting\nany implied + license or other defenses to infringement that may\notherwise be available to + you under applicable patent law.\n\n 12. No Surrender of Others' Freedom.\n\n + \ If conditions are imposed on you (whether by court order, agreement or\notherwise) + that contradict the conditions of this License, they do not\nexcuse you from the + conditions of this License. If you cannot convey a\ncovered work so as to satisfy + simultaneously your obligations under this\nLicense and any other pertinent obligations, + then as a consequence you may\nnot convey it at all. For example, if you agree + to terms that obligate you\nto collect a royalty for further conveying from those + to whom you convey\nthe Program, the only way you could satisfy both those terms + and this\nLicense would be to refrain entirely from conveying the Program.\n\n + \ 13. Use with the GNU Affero General Public License.\n\n Notwithstanding any + other provision of this License, you have\npermission to link or combine any covered + work with a work licensed\nunder version 3 of the GNU Affero General Public License + into a single\ncombined work, and to convey the resulting work. The terms of + this\nLicense will continue to apply to the part which is the covered work,\nbut + the special requirements of the GNU Affero General Public License,\nsection 13, + concerning interaction through a network will apply to the\ncombination as such.\n\n + \ 14. Revised Versions of this License.\n\n The Free Software Foundation may + publish revised and/or new versions of\nthe GNU General Public License from time + to time. Such new versions will\nbe similar in spirit to the present version, + but may differ in detail to\naddress new problems or concerns.\n\n Each version + is given a distinguishing version number. If the\nProgram specifies that a certain + numbered version of the GNU General\nPublic License \"or any later version\" applies + to it, you have the\noption of following the terms and conditions either of that + numbered\nversion or of any later version published by the Free Software\nFoundation. + \ If the Program does not specify a version number of the\nGNU General Public + License, you may choose any version ever published\nby the Free Software Foundation.\n\n + \ If the Program specifies that a proxy can decide which future\nversions of the + GNU General Public License can be used, that proxy's\npublic statement of acceptance + of a version permanently authorizes you\nto choose that version for the Program.\n\n + \ Later license versions may give you additional or different\npermissions. However, + no additional obligations are imposed on any\nauthor or copyright holder as a + result of your choosing to follow a\nlater version.\n\n 15. Disclaimer of Warranty.\n\n + \ THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY\nAPPLICABLE + LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT\nHOLDERS AND/OR OTHER + PARTIES PROVIDE THE PROGRAM \"AS IS\" WITHOUT WARRANTY\nOF ANY KIND, EITHER EXPRESSED + OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,\nTHE IMPLIED WARRANTIES OF MERCHANTABILITY + AND FITNESS FOR A PARTICULAR\nPURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND + PERFORMANCE OF THE PROGRAM\nIS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, + YOU ASSUME THE COST OF\nALL NECESSARY SERVICING, REPAIR OR CORRECTION.\n\n 16. + Limitation of Liability.\n\n IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR + AGREED TO IN WRITING\nWILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES + AND/OR CONVEYS\nTHE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, + INCLUDING ANY\nGENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT + OF THE\nUSE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS + OF\nDATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD\nPARTIES + OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),\nEVEN IF SUCH + HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF\nSUCH DAMAGES.\n\n + \ 17. Interpretation of Sections 15 and 16.\n\n If the disclaimer of warranty + and limitation of liability provided\nabove cannot be given local legal effect + according to their terms,\nreviewing courts shall apply local law that most closely + approximates\nan absolute waiver of all civil liability in connection with the\nProgram, + unless a warranty or assumption of liability accompanies a\ncopy of the Program + in return for a fee.\n\n END OF TERMS AND CONDITIONS\n\n How + to Apply These Terms to Your New Programs\n\n If you develop a new program, and + you want it to be of the greatest\npossible use to the public, the best way to + achieve this is to make it\nfree software which everyone can redistribute and + change under these terms.\n\n To do so, attach the following notices to the program. + \ It is safest\nto attach them to the start of each source file to most effectively\nstate + the exclusion of warranty; and each file should have at least\nthe \"copyright\" + line and a pointer to where the full notice is found.\n\n \n Copyright (C) + \ \n\n This program is free software: you can redistribute + it and/or modify\n it under the terms of the GNU General Public License as + published by\n the Free Software Foundation, either version 3 of the License, + or\n (at your option) any later version.\n\n This program is distributed + in the hope that it will be useful,\n but WITHOUT ANY WARRANTY; without even + the implied warranty of\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + \ See the\n GNU General Public License for more details.\n\n You should + have received a copy of the GNU General Public License\n along with this program. + \ If not, see .\n\nAlso add information on how + to contact you by electronic and paper mail.\n\n If the program does terminal + interaction, make it output a short\nnotice like this when it starts in an interactive + mode:\n\n Copyright (C) \n This program + comes with ABSOLUTELY NO WARRANTY; for details type `show w'.\n This is free + software, and you are welcome to redistribute it\n under certain conditions; + type `show c' for details.\n\nThe hypothetical commands `show w' and `show c' + should show the appropriate\nparts of the General Public License. Of course, + your program's commands\nmight be different; for a GUI interface, you would use + an \"about box\".\n\n You should also get your employer (if you work as a programmer) + or school,\nif any, to sign a \"copyright disclaimer\" for the program, if necessary.\nFor + more information on this, and how to apply and follow the GNU GPL, see\n.\n\n + \ The GNU General Public License does not permit incorporating your program\ninto + proprietary programs. If your program is a subroutine library, you\nmay consider + it more useful to permit linking proprietary applications with\nthe library. If + this is what you want to do, use the GNU Lesser General\nPublic License instead + of this License. But first, please read\n.\n" +notices: [] diff --git a/.licenses/arduino-create-agent/go/github.com/arduino/pluggable-discovery-protocol-handler/v2.dep.yml b/.licenses/arduino-create-agent/go/github.com/arduino/pluggable-discovery-protocol-handler/v2.dep.yml new file mode 100644 index 000000000..0825582ba --- /dev/null +++ b/.licenses/arduino-create-agent/go/github.com/arduino/pluggable-discovery-protocol-handler/v2.dep.yml @@ -0,0 +1,709 @@ +--- +name: github.com/arduino/pluggable-discovery-protocol-handler/v2 +version: v2.2.1 +type: go +summary: Package discovery is a library for handling the Arduino Pluggable-Discovery + protocol (https://github.com/arduino/tooling-rfcs/blob/main/RFCs/0002-pluggable-discovery.md#pluggable-discovery-api-via-stdinstdout) +homepage: https://pkg.go.dev/github.com/arduino/pluggable-discovery-protocol-handler/v2 +license: other +licenses: +- sources: LICENSE.txt + text: | + This file includes licensing information for serial-discovery + + Copyright (c) 2018 ARDUINO SA (www.arduino.cc) + + The software is released under the GNU General Public License, which covers the main body + of the serial-discovery code. The terms of this license can be found at: + https://www.gnu.org/licenses/gpl-3.0.en.html + + You can be released from the requirements of the above licenses by purchasing + a commercial license. Buying such a license is mandatory if you want to modify or + otherwise use the software for commercial activities involving the Arduino + software without disclosing the source code of your own applications. To purchase + a commercial license, send an email to license@arduino.cc + + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for + software and other kinds of works. + + The licenses for most software and other practical works are designed + to take away your freedom to share and change the works. By contrast, + the GNU General Public License is intended to guarantee your freedom to + share and change all versions of a program--to make sure it remains free + software for all its users. We, the Free Software Foundation, use the + GNU General Public License for most of our software; it applies also to + any other work released this way by its authors. You can apply it to + your programs, too. + + When we speak of free software, we are referring to freedom, not + price. Our General Public Licenses are designed to make sure that you + have the freedom to distribute copies of free software (and charge for + them if you wish), that you receive source code or can get it if you + want it, that you can change the software or use pieces of it in new + free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you + these rights or asking you to surrender the rights. Therefore, you have + certain responsibilities if you distribute copies of the software, or if + you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether + gratis or for a fee, you must pass on to the recipients the same + freedoms that you received. You must make sure that they, too, receive + or can get the source code. And you must show them these terms so they + know their rights. + + Developers that use the GNU GPL protect your rights with two steps: + (1) assert copyright on the software, and (2) offer you this License + giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains + that there is no warranty for this free software. For both users' and + authors' sake, the GPL requires that modified versions be marked as + changed, so that their problems will not be attributed erroneously to + authors of previous versions. + + Some devices are designed to deny users access to install or run + modified versions of the software inside them, although the manufacturer + can do so. This is fundamentally incompatible with the aim of + protecting users' freedom to change the software. The systematic + pattern of such abuse occurs in the area of products for individuals to + use, which is precisely where it is most unacceptable. Therefore, we + have designed this version of the GPL to prohibit the practice for those + products. If such problems arise substantially in other domains, we + stand ready to extend this provision to those domains in future versions + of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. + States should not allow patents to restrict development and use of + software on general-purpose computers, but in those that do, we wish to + avoid the special danger that patents applied to a free program could + make it effectively proprietary. To prevent this, the GPL assures that + patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and + modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of + works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this + License. Each licensee is addressed as "you". "Licensees" and + "recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work + in a fashion requiring copyright permission, other than the making of an + exact copy. The resulting work is called a "modified version" of the + earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based + on the Program. + + To "propagate" a work means to do anything with it that, without + permission, would make you directly or secondarily liable for + infringement under applicable copyright law, except executing it on a + computer or modifying a private copy. Propagation includes copying, + distribution (with or without modification), making available to the + public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other + parties to make or receive copies. Mere interaction with a user through + a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" + to the extent that it includes a convenient and prominently visible + feature that (1) displays an appropriate copyright notice, and (2) + tells the user that there is no warranty for the work (except to the + extent that warranties are provided), that licensees may convey the + work under this License, and how to view a copy of this License. If + the interface presents a list of user commands or options, such as a + menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work + for making modifications to it. "Object code" means any non-source + form of a work. + + A "Standard Interface" means an interface that either is an official + standard defined by a recognized standards body, or, in the case of + interfaces specified for a particular programming language, one that + is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other + than the work as a whole, that (a) is included in the normal form of + packaging a Major Component, but which is not part of that Major + Component, and (b) serves only to enable use of the work with that + Major Component, or to implement a Standard Interface for which an + implementation is available to the public in source code form. A + "Major Component", in this context, means a major essential component + (kernel, window system, and so on) of the specific operating system + (if any) on which the executable work runs, or a compiler used to + produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all + the source code needed to generate, install, and (for an executable + work) run the object code and to modify the work, including scripts to + control those activities. However, it does not include the work's + System Libraries, or general-purpose tools or generally available free + programs which are used unmodified in performing those activities but + which are not part of the work. For example, Corresponding Source + includes interface definition files associated with source files for + the work, and the source code for shared libraries and dynamically + linked subprograms that the work is specifically designed to require, + such as by intimate data communication or control flow between those + subprograms and other parts of the work. + + The Corresponding Source need not include anything that users + can regenerate automatically from other parts of the Corresponding + Source. + + The Corresponding Source for a work in source code form is that + same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of + copyright on the Program, and are irrevocable provided the stated + conditions are met. This License explicitly affirms your unlimited + permission to run the unmodified Program. The output from running a + covered work is covered by this License only if the output, given its + content, constitutes a covered work. This License acknowledges your + rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not + convey, without conditions so long as your license otherwise remains + in force. You may convey covered works to others for the sole purpose + of having them make modifications exclusively for you, or provide you + with facilities for running those works, provided that you comply with + the terms of this License in conveying all material for which you do + not control copyright. Those thus making or running the covered works + for you must do so exclusively on your behalf, under your direction + and control, on terms that prohibit them from making any copies of + your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under + the conditions stated below. Sublicensing is not allowed; section 10 + makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological + measure under any applicable law fulfilling obligations under article + 11 of the WIPO copyright treaty adopted on 20 December 1996, or + similar laws prohibiting or restricting circumvention of such + measures. + + When you convey a covered work, you waive any legal power to forbid + circumvention of technological measures to the extent such circumvention + is effected by exercising rights under this License with respect to + the covered work, and you disclaim any intention to limit operation or + modification of the work as a means of enforcing, against the work's + users, your or third parties' legal rights to forbid circumvention of + technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you + receive it, in any medium, provided that you conspicuously and + appropriately publish on each copy an appropriate copyright notice; + keep intact all notices stating that this License and any + non-permissive terms added in accord with section 7 apply to the code; + keep intact all notices of the absence of any warranty; and give all + recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, + and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to + produce it from the Program, in the form of source code under the + terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent + works, which are not by their nature extensions of the covered work, + and which are not combined with it such as to form a larger program, + in or on a volume of a storage or distribution medium, is called an + "aggregate" if the compilation and its resulting copyright are not + used to limit the access or legal rights of the compilation's users + beyond what the individual works permit. Inclusion of a covered work + in an aggregate does not cause this License to apply to the other + parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms + of sections 4 and 5, provided that you also convey the + machine-readable Corresponding Source under the terms of this License, + in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded + from the Corresponding Source as a System Library, need not be + included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any + tangible personal property which is normally used for personal, family, + or household purposes, or (2) anything designed or sold for incorporation + into a dwelling. In determining whether a product is a consumer product, + doubtful cases shall be resolved in favor of coverage. For a particular + product received by a particular user, "normally used" refers to a + typical or common use of that class of product, regardless of the status + of the particular user or of the way in which the particular user + actually uses, or expects or is expected to use, the product. A product + is a consumer product regardless of whether the product has substantial + commercial, industrial or non-consumer uses, unless such uses represent + the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, + procedures, authorization keys, or other information required to install + and execute modified versions of a covered work in that User Product from + a modified version of its Corresponding Source. The information must + suffice to ensure that the continued functioning of the modified object + code is in no case prevented or interfered with solely because + modification has been made. + + If you convey an object code work under this section in, or with, or + specifically for use in, a User Product, and the conveying occurs as + part of a transaction in which the right of possession and use of the + User Product is transferred to the recipient in perpetuity or for a + fixed term (regardless of how the transaction is characterized), the + Corresponding Source conveyed under this section must be accompanied + by the Installation Information. But this requirement does not apply + if neither you nor any third party retains the ability to install + modified object code on the User Product (for example, the work has + been installed in ROM). + + The requirement to provide Installation Information does not include a + requirement to continue to provide support service, warranty, or updates + for a work that has been modified or installed by the recipient, or for + the User Product in which it has been modified or installed. Access to a + network may be denied when the modification itself materially and + adversely affects the operation of the network or violates the rules and + protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, + in accord with this section must be in a format that is publicly + documented (and with an implementation available to the public in + source code form), and must require no special password or key for + unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this + License by making exceptions from one or more of its conditions. + Additional permissions that are applicable to the entire Program shall + be treated as though they were included in this License, to the extent + that they are valid under applicable law. If additional permissions + apply only to part of the Program, that part may be used separately + under those permissions, but the entire Program remains governed by + this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option + remove any additional permissions from that copy, or from any part of + it. (Additional permissions may be written to require their own + removal in certain cases when you modify the work.) You may place + additional permissions on material, added by you to a covered work, + for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you + add to a covered work, you may (if authorized by the copyright holders of + that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further + restrictions" within the meaning of section 10. If the Program as you + received it, or any part of it, contains a notice stating that it is + governed by this License along with a term that is a further + restriction, you may remove that term. If a license document contains + a further restriction but permits relicensing or conveying under this + License, you may add to a covered work material governed by the terms + of that license document, provided that the further restriction does + not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you + must place, in the relevant source files, a statement of the + additional terms that apply to those files, or a notice indicating + where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the + form of a separately written license, or stated as exceptions; + the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly + provided under this License. Any attempt otherwise to propagate or + modify it is void, and will automatically terminate your rights under + this License (including any patent licenses granted under the third + paragraph of section 11). + + However, if you cease all violation of this License, then your + license from a particular copyright holder is reinstated (a) + provisionally, unless and until the copyright holder explicitly and + finally terminates your license, and (b) permanently, if the copyright + holder fails to notify you of the violation by some reasonable means + prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is + reinstated permanently if the copyright holder notifies you of the + violation by some reasonable means, this is the first time you have + received notice of violation of this License (for any work) from that + copyright holder, and you cure the violation prior to 30 days after + your receipt of the notice. + + Termination of your rights under this section does not terminate the + licenses of parties who have received copies or rights from you under + this License. If your rights have been terminated and not permanently + reinstated, you do not qualify to receive new licenses for the same + material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or + run a copy of the Program. Ancillary propagation of a covered work + occurring solely as a consequence of using peer-to-peer transmission + to receive a copy likewise does not require acceptance. However, + nothing other than this License grants you permission to propagate or + modify any covered work. These actions infringe copyright if you do + not accept this License. Therefore, by modifying or propagating a + covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically + receives a license from the original licensors, to run, modify and + propagate that work, subject to this License. You are not responsible + for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an + organization, or substantially all assets of one, or subdividing an + organization, or merging organizations. If propagation of a covered + work results from an entity transaction, each party to that + transaction who receives a copy of the work also receives whatever + licenses to the work the party's predecessor in interest had or could + give under the previous paragraph, plus a right to possession of the + Corresponding Source of the work from the predecessor in interest, if + the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the + rights granted or affirmed under this License. For example, you may + not impose a license fee, royalty, or other charge for exercise of + rights granted under this License, and you may not initiate litigation + (including a cross-claim or counterclaim in a lawsuit) alleging that + any patent claim is infringed by making, using, selling, offering for + sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this + License of the Program or a work on which the Program is based. The + work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims + owned or controlled by the contributor, whether already acquired or + hereafter acquired, that would be infringed by some manner, permitted + by this License, of making, using, or selling its contributor version, + but do not include claims that would be infringed only as a + consequence of further modification of the contributor version. For + purposes of this definition, "control" includes the right to grant + patent sublicenses in a manner consistent with the requirements of + this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free + patent license under the contributor's essential patent claims, to + make, use, sell, offer for sale, import and otherwise run, modify and + propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express + agreement or commitment, however denominated, not to enforce a patent + (such as an express permission to practice a patent or covenant not to + sue for patent infringement). To "grant" such a patent license to a + party means to make such an agreement or commitment not to enforce a + patent against the party. + + If you convey a covered work, knowingly relying on a patent license, + and the Corresponding Source of the work is not available for anyone + to copy, free of charge and under the terms of this License, through a + publicly available network server or other readily accessible means, + then you must either (1) cause the Corresponding Source to be so + available, or (2) arrange to deprive yourself of the benefit of the + patent license for this particular work, or (3) arrange, in a manner + consistent with the requirements of this License, to extend the patent + license to downstream recipients. "Knowingly relying" means you have + actual knowledge that, but for the patent license, your conveying the + covered work in a country, or your recipient's use of the covered work + in a country, would infringe one or more identifiable patents in that + country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or + arrangement, you convey, or propagate by procuring conveyance of, a + covered work, and grant a patent license to some of the parties + receiving the covered work authorizing them to use, propagate, modify + or convey a specific copy of the covered work, then the patent license + you grant is automatically extended to all recipients of the covered + work and works based on it. + + A patent license is "discriminatory" if it does not include within + the scope of its coverage, prohibits the exercise of, or is + conditioned on the non-exercise of one or more of the rights that are + specifically granted under this License. You may not convey a covered + work if you are a party to an arrangement with a third party that is + in the business of distributing software, under which you make payment + to the third party based on the extent of your activity of conveying + the work, and under which the third party grants, to any of the + parties who would receive the covered work from you, a discriminatory + patent license (a) in connection with copies of the covered work + conveyed by you (or copies made from those copies), or (b) primarily + for and in connection with specific products or compilations that + contain the covered work, unless you entered into that arrangement, + or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting + any implied license or other defenses to infringement that may + otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or + otherwise) that contradict the conditions of this License, they do not + excuse you from the conditions of this License. If you cannot convey a + covered work so as to satisfy simultaneously your obligations under this + License and any other pertinent obligations, then as a consequence you may + not convey it at all. For example, if you agree to terms that obligate you + to collect a royalty for further conveying from those to whom you convey + the Program, the only way you could satisfy both those terms and this + License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have + permission to link or combine any covered work with a work licensed + under version 3 of the GNU Affero General Public License into a single + combined work, and to convey the resulting work. The terms of this + License will continue to apply to the part which is the covered work, + but the special requirements of the GNU Affero General Public License, + section 13, concerning interaction through a network will apply to the + combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of + the GNU General Public License from time to time. Such new versions will + be similar in spirit to the present version, but may differ in detail to + address new problems or concerns. + + Each version is given a distinguishing version number. If the + Program specifies that a certain numbered version of the GNU General + Public License "or any later version" applies to it, you have the + option of following the terms and conditions either of that numbered + version or of any later version published by the Free Software + Foundation. If the Program does not specify a version number of the + GNU General Public License, you may choose any version ever published + by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future + versions of the GNU General Public License can be used, that proxy's + public statement of acceptance of a version permanently authorizes you + to choose that version for the Program. + + Later license versions may give you additional or different + permissions. However, no additional obligations are imposed on any + author or copyright holder as a result of your choosing to follow a + later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY + APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT + HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY + OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, + THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM + IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF + ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING + WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS + THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY + GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE + USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF + DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD + PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), + EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF + SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided + above cannot be given local legal effect according to their terms, + reviewing courts shall apply local law that most closely approximates + an absolute waiver of all civil liability in connection with the + Program, unless a warranty or assumption of liability accompanies a + copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest + possible use to the public, the best way to achieve this is to make it + free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest + to attach them to the start of each source file to most effectively + state the exclusion of warranty; and each file should have at least + the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + + Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short + notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + + The hypothetical commands `show w' and `show c' should show the appropriate + parts of the General Public License. Of course, your program's commands + might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, + if any, to sign a "copyright disclaimer" for the program, if necessary. + For more information on this, and how to apply and follow the GNU GPL, see + . + + The GNU General Public License does not permit incorporating your program + into proprietary programs. If your program is a subroutine library, you + may consider it more useful to permit linking proprietary applications with + the library. If this is what you want to do, use the GNU Lesser General + Public License instead of this License. But first, please read + . +- sources: README.md + text: |- + Copyright (c) 2021 ARDUINO SA (www.arduino.cc) + + The software is released under the GNU General Public License, which covers the main body + of the serial-discovery code. The terms of this license can be found at: + https://www.gnu.org/licenses/gpl-3.0.en.html + + See [LICENSE.txt](https://github.com/arduino/pluggable-discovery-protocol-handler/blob/master/LICENSE.txt) for details. +notices: [] diff --git a/.licenses/arduino-create-agent/go/github.com/blang/semver.dep.yml b/.licenses/arduino-create-agent/go/github.com/blang/semver.dep.yml new file mode 100644 index 000000000..39cce428f --- /dev/null +++ b/.licenses/arduino-create-agent/go/github.com/blang/semver.dep.yml @@ -0,0 +1,36 @@ +--- +name: github.com/blang/semver +version: v3.5.1+incompatible +type: go +summary: +homepage: https://pkg.go.dev/github.com/blang/semver +license: mit +licenses: +- sources: LICENSE + text: |+ + The MIT License + + Copyright (c) 2014 Benedikt Lang + + 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. + +- sources: README.md + text: See [LICENSE](LICENSE) file. +notices: [] +... diff --git a/.licenses/arduino-create-agent/go/github.com/cloudflare/circl/dh/x25519.dep.yml b/.licenses/arduino-create-agent/go/github.com/cloudflare/circl/dh/x25519.dep.yml new file mode 100644 index 000000000..9a3efa5ab --- /dev/null +++ b/.licenses/arduino-create-agent/go/github.com/cloudflare/circl/dh/x25519.dep.yml @@ -0,0 +1,70 @@ +--- +name: github.com/cloudflare/circl/dh/x25519 +version: v1.3.7 +type: go +summary: Package x25519 provides Diffie-Hellman functions as specified in RFC-7748. +homepage: https://pkg.go.dev/github.com/cloudflare/circl/dh/x25519 +license: other +licenses: +- sources: circl@v1.3.7/LICENSE + text: | + Copyright (c) 2019 Cloudflare. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following disclaimer + in the documentation and/or other materials provided with the + distribution. + * Neither the name of Cloudflare nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + ======================================================================== + + Copyright (c) 2009 The Go Authors. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following disclaimer + in the documentation and/or other materials provided with the + distribution. + * Neither the name of Google Inc. nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +- sources: circl@v1.3.7/README.md + text: The project is licensed under the [BSD-3-Clause License](./LICENSE). +notices: [] diff --git a/.licenses/arduino-create-agent/go/github.com/cloudflare/circl/dh/x448.dep.yml b/.licenses/arduino-create-agent/go/github.com/cloudflare/circl/dh/x448.dep.yml new file mode 100644 index 000000000..89ebbe189 --- /dev/null +++ b/.licenses/arduino-create-agent/go/github.com/cloudflare/circl/dh/x448.dep.yml @@ -0,0 +1,70 @@ +--- +name: github.com/cloudflare/circl/dh/x448 +version: v1.3.7 +type: go +summary: Package x448 provides Diffie-Hellman functions as specified in RFC-7748. +homepage: https://pkg.go.dev/github.com/cloudflare/circl/dh/x448 +license: other +licenses: +- sources: circl@v1.3.7/LICENSE + text: | + Copyright (c) 2019 Cloudflare. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following disclaimer + in the documentation and/or other materials provided with the + distribution. + * Neither the name of Cloudflare nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + ======================================================================== + + Copyright (c) 2009 The Go Authors. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following disclaimer + in the documentation and/or other materials provided with the + distribution. + * Neither the name of Google Inc. nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +- sources: circl@v1.3.7/README.md + text: The project is licensed under the [BSD-3-Clause License](./LICENSE). +notices: [] diff --git a/.licenses/arduino-create-agent/go/github.com/cloudflare/circl/ecc/goldilocks.dep.yml b/.licenses/arduino-create-agent/go/github.com/cloudflare/circl/ecc/goldilocks.dep.yml new file mode 100644 index 000000000..e9daa0487 --- /dev/null +++ b/.licenses/arduino-create-agent/go/github.com/cloudflare/circl/ecc/goldilocks.dep.yml @@ -0,0 +1,71 @@ +--- +name: github.com/cloudflare/circl/ecc/goldilocks +version: v1.3.7 +type: go +summary: Package goldilocks provides elliptic curve operations over the goldilocks + curve. +homepage: https://pkg.go.dev/github.com/cloudflare/circl/ecc/goldilocks +license: other +licenses: +- sources: circl@v1.3.7/LICENSE + text: | + Copyright (c) 2019 Cloudflare. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following disclaimer + in the documentation and/or other materials provided with the + distribution. + * Neither the name of Cloudflare nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + ======================================================================== + + Copyright (c) 2009 The Go Authors. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following disclaimer + in the documentation and/or other materials provided with the + distribution. + * Neither the name of Google Inc. nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +- sources: circl@v1.3.7/README.md + text: The project is licensed under the [BSD-3-Clause License](./LICENSE). +notices: [] diff --git a/.licenses/arduino-create-agent/go/github.com/cloudflare/circl/internal/conv.dep.yml b/.licenses/arduino-create-agent/go/github.com/cloudflare/circl/internal/conv.dep.yml new file mode 100644 index 000000000..02404fe46 --- /dev/null +++ b/.licenses/arduino-create-agent/go/github.com/cloudflare/circl/internal/conv.dep.yml @@ -0,0 +1,70 @@ +--- +name: github.com/cloudflare/circl/internal/conv +version: v1.3.7 +type: go +summary: +homepage: https://pkg.go.dev/github.com/cloudflare/circl/internal/conv +license: other +licenses: +- sources: circl@v1.3.7/LICENSE + text: | + Copyright (c) 2019 Cloudflare. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following disclaimer + in the documentation and/or other materials provided with the + distribution. + * Neither the name of Cloudflare nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + ======================================================================== + + Copyright (c) 2009 The Go Authors. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following disclaimer + in the documentation and/or other materials provided with the + distribution. + * Neither the name of Google Inc. nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +- sources: circl@v1.3.7/README.md + text: The project is licensed under the [BSD-3-Clause License](./LICENSE). +notices: [] diff --git a/.licenses/arduino-create-agent/go/github.com/cloudflare/circl/internal/sha3.dep.yml b/.licenses/arduino-create-agent/go/github.com/cloudflare/circl/internal/sha3.dep.yml new file mode 100644 index 000000000..49fa79d68 --- /dev/null +++ b/.licenses/arduino-create-agent/go/github.com/cloudflare/circl/internal/sha3.dep.yml @@ -0,0 +1,71 @@ +--- +name: github.com/cloudflare/circl/internal/sha3 +version: v1.3.7 +type: go +summary: Package sha3 implements the SHA-3 fixed-output-length hash functions and + the SHAKE variable-output-length hash functions defined by FIPS-202. +homepage: https://pkg.go.dev/github.com/cloudflare/circl/internal/sha3 +license: other +licenses: +- sources: circl@v1.3.7/LICENSE + text: | + Copyright (c) 2019 Cloudflare. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following disclaimer + in the documentation and/or other materials provided with the + distribution. + * Neither the name of Cloudflare nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + ======================================================================== + + Copyright (c) 2009 The Go Authors. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following disclaimer + in the documentation and/or other materials provided with the + distribution. + * Neither the name of Google Inc. nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +- sources: circl@v1.3.7/README.md + text: The project is licensed under the [BSD-3-Clause License](./LICENSE). +notices: [] diff --git a/.licenses/arduino-create-agent/go/github.com/cloudflare/circl/math.dep.yml b/.licenses/arduino-create-agent/go/github.com/cloudflare/circl/math.dep.yml new file mode 100644 index 000000000..efdc59bc4 --- /dev/null +++ b/.licenses/arduino-create-agent/go/github.com/cloudflare/circl/math.dep.yml @@ -0,0 +1,70 @@ +--- +name: github.com/cloudflare/circl/math +version: v1.3.7 +type: go +summary: Package math provides some utility functions for big integers. +homepage: https://pkg.go.dev/github.com/cloudflare/circl/math +license: other +licenses: +- sources: circl@v1.3.7/LICENSE + text: | + Copyright (c) 2019 Cloudflare. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following disclaimer + in the documentation and/or other materials provided with the + distribution. + * Neither the name of Cloudflare nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + ======================================================================== + + Copyright (c) 2009 The Go Authors. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following disclaimer + in the documentation and/or other materials provided with the + distribution. + * Neither the name of Google Inc. nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +- sources: circl@v1.3.7/README.md + text: The project is licensed under the [BSD-3-Clause License](./LICENSE). +notices: [] diff --git a/.licenses/arduino-create-agent/go/github.com/cloudflare/circl/math/fp25519.dep.yml b/.licenses/arduino-create-agent/go/github.com/cloudflare/circl/math/fp25519.dep.yml new file mode 100644 index 000000000..20c3b2393 --- /dev/null +++ b/.licenses/arduino-create-agent/go/github.com/cloudflare/circl/math/fp25519.dep.yml @@ -0,0 +1,70 @@ +--- +name: github.com/cloudflare/circl/math/fp25519 +version: v1.3.7 +type: go +summary: Package fp25519 provides prime field arithmetic over GF(2^255-19). +homepage: https://pkg.go.dev/github.com/cloudflare/circl/math/fp25519 +license: other +licenses: +- sources: circl@v1.3.7/LICENSE + text: | + Copyright (c) 2019 Cloudflare. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following disclaimer + in the documentation and/or other materials provided with the + distribution. + * Neither the name of Cloudflare nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + ======================================================================== + + Copyright (c) 2009 The Go Authors. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following disclaimer + in the documentation and/or other materials provided with the + distribution. + * Neither the name of Google Inc. nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +- sources: circl@v1.3.7/README.md + text: The project is licensed under the [BSD-3-Clause License](./LICENSE). +notices: [] diff --git a/.licenses/arduino-create-agent/go/github.com/cloudflare/circl/math/fp448.dep.yml b/.licenses/arduino-create-agent/go/github.com/cloudflare/circl/math/fp448.dep.yml new file mode 100644 index 000000000..b65891c91 --- /dev/null +++ b/.licenses/arduino-create-agent/go/github.com/cloudflare/circl/math/fp448.dep.yml @@ -0,0 +1,70 @@ +--- +name: github.com/cloudflare/circl/math/fp448 +version: v1.3.7 +type: go +summary: Package fp448 provides prime field arithmetic over GF(2^448-2^224-1). +homepage: https://pkg.go.dev/github.com/cloudflare/circl/math/fp448 +license: other +licenses: +- sources: circl@v1.3.7/LICENSE + text: | + Copyright (c) 2019 Cloudflare. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following disclaimer + in the documentation and/or other materials provided with the + distribution. + * Neither the name of Cloudflare nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + ======================================================================== + + Copyright (c) 2009 The Go Authors. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following disclaimer + in the documentation and/or other materials provided with the + distribution. + * Neither the name of Google Inc. nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +- sources: circl@v1.3.7/README.md + text: The project is licensed under the [BSD-3-Clause License](./LICENSE). +notices: [] diff --git a/.licenses/arduino-create-agent/go/github.com/cloudflare/circl/math/mlsbset.dep.yml b/.licenses/arduino-create-agent/go/github.com/cloudflare/circl/math/mlsbset.dep.yml new file mode 100644 index 000000000..c837e724c --- /dev/null +++ b/.licenses/arduino-create-agent/go/github.com/cloudflare/circl/math/mlsbset.dep.yml @@ -0,0 +1,70 @@ +--- +name: github.com/cloudflare/circl/math/mlsbset +version: v1.3.7 +type: go +summary: Package mlsbset provides a constant-time exponentiation method with precomputation. +homepage: https://pkg.go.dev/github.com/cloudflare/circl/math/mlsbset +license: other +licenses: +- sources: circl@v1.3.7/LICENSE + text: | + Copyright (c) 2019 Cloudflare. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following disclaimer + in the documentation and/or other materials provided with the + distribution. + * Neither the name of Cloudflare nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + ======================================================================== + + Copyright (c) 2009 The Go Authors. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following disclaimer + in the documentation and/or other materials provided with the + distribution. + * Neither the name of Google Inc. nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +- sources: circl@v1.3.7/README.md + text: The project is licensed under the [BSD-3-Clause License](./LICENSE). +notices: [] diff --git a/.licenses/arduino-create-agent/go/github.com/cloudflare/circl/sign.dep.yml b/.licenses/arduino-create-agent/go/github.com/cloudflare/circl/sign.dep.yml new file mode 100644 index 000000000..5d3285605 --- /dev/null +++ b/.licenses/arduino-create-agent/go/github.com/cloudflare/circl/sign.dep.yml @@ -0,0 +1,70 @@ +--- +name: github.com/cloudflare/circl/sign +version: v1.3.7 +type: go +summary: Package sign provides unified interfaces for signature schemes. +homepage: https://pkg.go.dev/github.com/cloudflare/circl/sign +license: other +licenses: +- sources: circl@v1.3.7/LICENSE + text: | + Copyright (c) 2019 Cloudflare. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following disclaimer + in the documentation and/or other materials provided with the + distribution. + * Neither the name of Cloudflare nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + ======================================================================== + + Copyright (c) 2009 The Go Authors. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following disclaimer + in the documentation and/or other materials provided with the + distribution. + * Neither the name of Google Inc. nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +- sources: circl@v1.3.7/README.md + text: The project is licensed under the [BSD-3-Clause License](./LICENSE). +notices: [] diff --git a/.licenses/arduino-create-agent/go/github.com/cloudflare/circl/sign/ed25519.dep.yml b/.licenses/arduino-create-agent/go/github.com/cloudflare/circl/sign/ed25519.dep.yml new file mode 100644 index 000000000..8586196a4 --- /dev/null +++ b/.licenses/arduino-create-agent/go/github.com/cloudflare/circl/sign/ed25519.dep.yml @@ -0,0 +1,70 @@ +--- +name: github.com/cloudflare/circl/sign/ed25519 +version: v1.3.7 +type: go +summary: Package ed25519 implements Ed25519 signature scheme as described in RFC-8032. +homepage: https://pkg.go.dev/github.com/cloudflare/circl/sign/ed25519 +license: other +licenses: +- sources: circl@v1.3.7/LICENSE + text: | + Copyright (c) 2019 Cloudflare. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following disclaimer + in the documentation and/or other materials provided with the + distribution. + * Neither the name of Cloudflare nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + ======================================================================== + + Copyright (c) 2009 The Go Authors. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following disclaimer + in the documentation and/or other materials provided with the + distribution. + * Neither the name of Google Inc. nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +- sources: circl@v1.3.7/README.md + text: The project is licensed under the [BSD-3-Clause License](./LICENSE). +notices: [] diff --git a/.licenses/arduino-create-agent/go/github.com/cloudflare/circl/sign/ed448.dep.yml b/.licenses/arduino-create-agent/go/github.com/cloudflare/circl/sign/ed448.dep.yml new file mode 100644 index 000000000..96cace11d --- /dev/null +++ b/.licenses/arduino-create-agent/go/github.com/cloudflare/circl/sign/ed448.dep.yml @@ -0,0 +1,70 @@ +--- +name: github.com/cloudflare/circl/sign/ed448 +version: v1.3.7 +type: go +summary: Package ed448 implements Ed448 signature scheme as described in RFC-8032. +homepage: https://pkg.go.dev/github.com/cloudflare/circl/sign/ed448 +license: other +licenses: +- sources: circl@v1.3.7/LICENSE + text: | + Copyright (c) 2019 Cloudflare. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following disclaimer + in the documentation and/or other materials provided with the + distribution. + * Neither the name of Cloudflare nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + ======================================================================== + + Copyright (c) 2009 The Go Authors. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following disclaimer + in the documentation and/or other materials provided with the + distribution. + * Neither the name of Google Inc. nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +- sources: circl@v1.3.7/README.md + text: The project is licensed under the [BSD-3-Clause License](./LICENSE). +notices: [] diff --git a/.licenses/arduino-create-agent/go/github.com/codeclysm/extract/v4.dep.yml b/.licenses/arduino-create-agent/go/github.com/codeclysm/extract/v4.dep.yml new file mode 100644 index 000000000..9defe5f88 --- /dev/null +++ b/.licenses/arduino-create-agent/go/github.com/codeclysm/extract/v4.dep.yml @@ -0,0 +1,33 @@ +--- +name: github.com/codeclysm/extract/v4 +version: v4.0.0 +type: go +summary: Package extract allows to extract archives in zip, tar.gz or tar.bz2 formats + easily. +homepage: https://pkg.go.dev/github.com/codeclysm/extract/v4 +license: mit +licenses: +- sources: LICENSE + text: | + The MIT License (MIT) + + Copyright (c) 2016 codeclysm + + 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. +notices: [] diff --git a/.licenses/arduino-create-agent/go/github.com/creack/goselect.dep.yml b/.licenses/arduino-create-agent/go/github.com/creack/goselect.dep.yml new file mode 100644 index 000000000..0785cd02c --- /dev/null +++ b/.licenses/arduino-create-agent/go/github.com/creack/goselect.dep.yml @@ -0,0 +1,36 @@ +--- +name: github.com/creack/goselect +version: v0.1.2 +type: go +summary: +homepage: https://pkg.go.dev/github.com/creack/goselect +license: mit +licenses: +- sources: LICENSE + text: |+ + The MIT License (MIT) + + Copyright (c) 2014 Guillaume J. Charmes + + 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. + +- sources: README.md + text: Released under the [MIT license](LICENSE). +notices: [] +... diff --git a/.licenses/arduino-create-agent/go/github.com/gabriel-vasile/mimetype.dep.yml b/.licenses/arduino-create-agent/go/github.com/gabriel-vasile/mimetype.dep.yml new file mode 100644 index 000000000..898030905 --- /dev/null +++ b/.licenses/arduino-create-agent/go/github.com/gabriel-vasile/mimetype.dep.yml @@ -0,0 +1,33 @@ +--- +name: github.com/gabriel-vasile/mimetype +version: v1.4.3 +type: go +summary: Package mimetype uses magic number signatures to detect the MIME type of + a file. +homepage: https://pkg.go.dev/github.com/gabriel-vasile/mimetype +license: mit +licenses: +- sources: LICENSE + text: | + MIT License + + Copyright (c) 2018-2020 Gabriel Vasile + + 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. +notices: [] diff --git a/.licenses/arduino-create-agent/go/github.com/gabriel-vasile/mimetype/internal/charset.dep.yml b/.licenses/arduino-create-agent/go/github.com/gabriel-vasile/mimetype/internal/charset.dep.yml new file mode 100644 index 000000000..ae2d894c1 --- /dev/null +++ b/.licenses/arduino-create-agent/go/github.com/gabriel-vasile/mimetype/internal/charset.dep.yml @@ -0,0 +1,32 @@ +--- +name: github.com/gabriel-vasile/mimetype/internal/charset +version: v1.4.3 +type: go +summary: +homepage: https://pkg.go.dev/github.com/gabriel-vasile/mimetype/internal/charset +license: mit +licenses: +- sources: mimetype@v1.4.3/LICENSE + text: | + MIT License + + Copyright (c) 2018-2020 Gabriel Vasile + + 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. +notices: [] diff --git a/.licenses/arduino-create-agent/go/github.com/gabriel-vasile/mimetype/internal/json.dep.yml b/.licenses/arduino-create-agent/go/github.com/gabriel-vasile/mimetype/internal/json.dep.yml new file mode 100644 index 000000000..f6a55e8ba --- /dev/null +++ b/.licenses/arduino-create-agent/go/github.com/gabriel-vasile/mimetype/internal/json.dep.yml @@ -0,0 +1,32 @@ +--- +name: github.com/gabriel-vasile/mimetype/internal/json +version: v1.4.3 +type: go +summary: Package json provides a JSON value parser state machine. +homepage: https://pkg.go.dev/github.com/gabriel-vasile/mimetype/internal/json +license: mit +licenses: +- sources: mimetype@v1.4.3/LICENSE + text: | + MIT License + + Copyright (c) 2018-2020 Gabriel Vasile + + 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. +notices: [] diff --git a/.licenses/arduino-create-agent/go/github.com/gabriel-vasile/mimetype/internal/magic.dep.yml b/.licenses/arduino-create-agent/go/github.com/gabriel-vasile/mimetype/internal/magic.dep.yml new file mode 100644 index 000000000..cacd38ad9 --- /dev/null +++ b/.licenses/arduino-create-agent/go/github.com/gabriel-vasile/mimetype/internal/magic.dep.yml @@ -0,0 +1,32 @@ +--- +name: github.com/gabriel-vasile/mimetype/internal/magic +version: v1.4.3 +type: go +summary: Package magic holds the matching functions used to find MIME types. +homepage: https://pkg.go.dev/github.com/gabriel-vasile/mimetype/internal/magic +license: mit +licenses: +- sources: mimetype@v1.4.3/LICENSE + text: | + MIT License + + Copyright (c) 2018-2020 Gabriel Vasile + + 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. +notices: [] diff --git a/.licenses/arduino-create-agent/go/github.com/gin-contrib/cors.dep.yml b/.licenses/arduino-create-agent/go/github.com/gin-contrib/cors.dep.yml new file mode 100644 index 000000000..a24f26880 --- /dev/null +++ b/.licenses/arduino-create-agent/go/github.com/gin-contrib/cors.dep.yml @@ -0,0 +1,32 @@ +--- +name: github.com/gin-contrib/cors +version: v1.7.2 +type: go +summary: +homepage: https://pkg.go.dev/github.com/gin-contrib/cors +license: mit +licenses: +- sources: LICENSE + text: | + MIT License + + Copyright (c) 2016 Gin-Gonic + + 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. +notices: [] diff --git a/.licenses/arduino-create-agent/go/github.com/gin-contrib/sse.dep.yml b/.licenses/arduino-create-agent/go/github.com/gin-contrib/sse.dep.yml new file mode 100644 index 000000000..c888d59ab --- /dev/null +++ b/.licenses/arduino-create-agent/go/github.com/gin-contrib/sse.dep.yml @@ -0,0 +1,32 @@ +--- +name: github.com/gin-contrib/sse +version: v0.1.0 +type: go +summary: +homepage: https://pkg.go.dev/github.com/gin-contrib/sse +license: mit +licenses: +- sources: LICENSE + text: | + The MIT License (MIT) + + Copyright (c) 2014 Manuel Martínez-Almeida + + 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. +notices: [] diff --git a/.licenses/arduino-create-agent/go/github.com/gin-gonic/gin.dep.yml b/.licenses/arduino-create-agent/go/github.com/gin-gonic/gin.dep.yml new file mode 100644 index 000000000..7d4960e69 --- /dev/null +++ b/.licenses/arduino-create-agent/go/github.com/gin-gonic/gin.dep.yml @@ -0,0 +1,440 @@ +--- +name: github.com/gin-gonic/gin +version: v1.10.0 +type: go +summary: Package gin implements a HTTP web framework called gin. +homepage: https://pkg.go.dev/github.com/gin-gonic/gin +license: mit +licenses: +- sources: LICENSE + text: | + The MIT License (MIT) + + Copyright (c) 2014 Manuel Martínez-Almeida + + 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. +notices: +- sources: AUTHORS.md + text: |- + List of all the awesome people working to make Gin the best Web Framework in Go. + + ## gin 1.x series authors + + **Gin Core Team:** Bo-Yi Wu (@appleboy), thinkerou (@thinkerou), Javier Provecho (@javierprovecho) + + ## gin 0.x series authors + + **Maintainers:** Manu Martinez-Almeida (@manucorporat), Javier Provecho (@javierprovecho) + + ------ + + People and companies, who have contributed, in alphabetical order. + + - 178inaba <178inaba@users.noreply.github.com> + - A. F + - ABHISHEK SONI + - Abhishek Chanda + - Abner Chen + - AcoNCodes + - Adam Dratwinski + - Adam Mckaig + - Adam Zielinski + - Adonis + - Alan Wang + - Albin Gilles + - Aleksandr Didenko + - Alessandro (Ale) Segala <43508+ItalyPaleAle@users.noreply.github.com> + - Alex + - Alexander + - Alexander Lokhman + - Alexander Melentyev <55826637+alexander-melentyev@users.noreply.github.com> + - Alexander Nyquist + - Allen Ren + - AllinGo + - Ammar Bandukwala + - An Xiao (Luffy) + - Andre Dublin <81dublin@gmail.com> + - Andrew Szeto + - Andrey Abramov + - Andrey Nering + - Andrey Smirnov + - Andrii Bubis + - André Bazaglia + - Andy Pan + - Antoine GIRARD + - Anup Kumar Panwar <1anuppanwar@gmail.com> + - Aravinth Sundaram + - Artem + - Ashwani + - Aurelien Regat-Barrel + - Austin Heap + - Barnabus + - Bo-Yi Wu + - Boris Borshevsky + - Boyi Wu + - BradyBromley <51128276+BradyBromley@users.noreply.github.com> + - Brendan Fosberry + - Brian Wigginton + - Carlos Eduardo + - Chad Russell + - Charles + - Christian Muehlhaeuser + - Christian Persson + - Christopher Harrington + - Damon Zhao + - Dan Markham + - Dang Nguyen + - Daniel Krom + - Daniel M. Lambea + - Danieliu + - David Irvine + - David Zhang + - Davor Kapsa + - DeathKing + - Dennis Cho <47404603+forest747@users.noreply.github.com> + - Dmitry Dorogin + - Dmitry Kutakov + - Dmitry Sedykh + - Don2Quixote <35610661+Don2Quixote@users.noreply.github.com> + - Donn Pebe + - Dustin Decker + - Eason Lin + - Edward Betts + - Egor Seredin <4819888+agmt@users.noreply.github.com> + - Emmanuel Goh + - Equim + - Eren A. Akyol + - Eric_Lee + - Erik Bender + - Ethan Kan + - Evgeny Persienko + - Faisal Alam + - Fareed Dudhia + - Filip Figiel + - Florian Polster + - Frank Bille + - Franz Bettag + - Ganlv + - Gaozhen Ying + - George Gabolaev + - George Kirilenko + - Georges Varouchas + - Gordon Tyler + - Harindu Perera + - Helios <674876158@qq.com> + - Henry Kwan + - Henry Yee + - Himanshu Mishra + - Hiroyuki Tanaka + - Ibraheem Ahmed + - Ignacio Galindo + - Igor H. Vieira + - Ildar1111 <54001462+Ildar1111@users.noreply.github.com> + - Iskander (Alex) Sharipov + - Ismail Gjevori + - Ivan Chen + - JINNOUCHI Yasushi + - James Pettyjohn + - Jamie Stackhouse + - Jason Lee + - Javier Provecho + - Javier Provecho + - Javier Provecho + - Javier Provecho Fernandez + - Javier Provecho Fernandez + - Jean-Christophe Lebreton + - Jeff + - Jeremy Loy + - Jim Filippou + - Jimmy Pettersson + - John Bampton + - Johnny Dallas + - Johnny Dallas + - Jonathan (JC) Chen + - Josep Jesus Bigorra Algaba <42377845+averageflow@users.noreply.github.com> + - Josh Horowitz + - Joshua Loper + - Julien Schmidt + - Jun Kimura + - Justin Beckwith + - Justin Israel + - Justin Mayhew + - Jérôme Laforge + - Kacper Bąk <56700396+53jk1@users.noreply.github.com> + - Kamron Batman + - Kane Rogers + - Kaushik Neelichetty + - Keiji Yoshida + - Kel Cecil + - Kevin Mulvey + - Kevin Zhu + - Kirill Motkov + - Klemen Sever + - Kristoffer A. Iversen + - Krzysztof Szafrański + - Kumar McMillan + - Kyle Mcgill + - Lanco <35420416+lancoLiu@users.noreply.github.com> + - Levi Olson + - Lin Kao-Yuan + - Linus Unnebäck + - Lucas Clemente + - Ludwig Valda Vasquez + - Luis GG + - MW Lim + - Maksimov Sergey + - Manjusaka + - Manu MA + - Manu MA + - Manu Mtz-Almeida + - Manu Mtz.-Almeida + - Manuel Alonso + - Mara Kim + - Mario Kostelac + - Martin Karlsch + - Matt Newberry + - Matt Williams + - Matthieu MOREL + - Max Hilbrunner + - Maxime Soulé + - MetalBreaker + - Michael Puncel + - MichaelDeSteven <51652084+MichaelDeSteven@users.noreply.github.com> + - Mike <38686456+icy4ever@users.noreply.github.com> + - Mike Stipicevic + - Miki Tebeka + - Miles + - Mirza Ceric + - Mykyta Semenistyi + - Naoki Takano + - Ngalim Siregar + - Ni Hao + - Nick Gerakines + - Nikifor Seryakov + - Notealot <714804968@qq.com> + - Olivier Mengué + - Olivier Robardet + - Pablo Moncada + - Pablo Moncada + - Panmax <967168@qq.com> + - Peperoncino <2wua4nlyi@gmail.com> + - Philipp Meinen + - Pierre Massat + - Qt + - Quentin ROYER + - README Bot <35302948+codetriage-readme-bot@users.noreply.github.com> + - Rafal Zajac + - Rahul Datta Roy + - Rajiv Kilaparti + - Raphael Gavache + - Ray Rodriguez + - Regner Blok-Andersen + - Remco + - Rex Lee(李俊) + - Richard Lee + - Riverside + - Robert Wilkinson + - Rogier Lommers + - Rohan Pai + - Romain Beuque + - Roman Belyakovsky + - Roman Zaynetdinov <627197+zaynetro@users.noreply.github.com> + - Roman Zaynetdinov + - Ronald Petty + - Ross Wolf <31489089+rw-access@users.noreply.github.com> + - Roy Lou + - Rubi <14269809+codenoid@users.noreply.github.com> + - Ryan <46182144+ryanker@users.noreply.github.com> + - Ryan J. Yoder + - SRK.Lyu + - Sai + - Samuel Abreu + - Santhosh Kumar + - Sasha Melentyev + - Sasha Myasoedov + - Segev Finer + - Sergey Egorov + - Sergey Fedchenko + - Sergey Gonimar + - Sergey Ponomarev + - Serica <943914044@qq.com> + - Shamus Taylor + - Shilin Wang + - Shuo + - Skuli Oskarsson + - Snawoot + - Sridhar Ratnakumar + - Steeve Chailloux + - Sudhir Mishra + - Suhas Karanth + - TaeJun Park + - Tatsuya Hoshino + - Tevic + - Tevin Jeffrey + - The Gitter Badger + - Thibault Jamet + - Thomas Boerger + - Thomas Schaffer + - Tommy Chu + - Tudor Roman + - Uwe Dauernheim + - Valentine Oragbakosi + - Vas N + - Vasilyuk Vasiliy + - Victor Castell + - Vince Yuan + - Vyacheslav Dubinin + - Waynerv + - Weilin Shi <934587911@qq.com> + - Xudong Cai + - Yasuhiro Matsumoto + - Yehezkiel Syamsuhadi + - Yoshiki Nakagawa + - Yoshiyuki Kinjo + - Yue Yang + - ZYunH + - Zach Newburgh + - Zasda Yusuf Mikail + - ZhangYunHao + - ZhiFeng Hu + - Zhu Xi + - a2tt + - ahuigo <1781999+ahuigo@users.noreply.github.com> + - ali + - aljun + - andrea + - andriikushch + - anoty + - awkj + - axiaoxin <254606826@qq.com> + - bbiao + - bestgopher <84328409@qq.com> + - betahu + - bigwheel + - bn4t <17193640+bn4t@users.noreply.github.com> + - bullgare + - chainhelen + - chenyang929 + - chriswhelix + - collinmsn <4130944@qq.com> + - cssivision + - danielalves + - delphinus + - dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> + - dickeyxxx + - edebernis + - error10 + - esplo + - eudore <30709860+eudore@users.noreply.github.com> + - ffhelicopter <32922889+ffhelicopter@users.noreply.github.com> + - filikos <11477309+filikos@users.noreply.github.com> + - forging2012 + - goqihoo + - grapeVine + - guonaihong + - heige + - heige + - hellojukay + - henrylee2cn + - htobenothing + - iamhesir <78344375+iamhesir@users.noreply.github.com> + - ijaa + - ishanray + - ishanray + - itcloudy <272685110@qq.com> + - jarodsong6 + - jasonrhansen + - jincheng9 + - joeADSP <75027008+joeADSP@users.noreply.github.com> + - junfengye + - kaiiak + - kebo + - keke <19yamashita15@gmail.com> + - kishor kunal raj <68464660+kishorkunal-raj@users.noreply.github.com> + - kyledinh + - lantw44 + - likakuli <1154584512@qq.com> + - linfangrong + - linzi <873804682@qq.com> + - llgoer + - long-road <13412081338@163.com> + - mbesancon + - mehdy + - metal A-wing + - micanzhang + - minarc + - mllu + - mopemoepe + - msoedov + - mstmdev + - novaeye + - olebedev + - phithon + - pjgg + - qm012 <67568757+qm012@users.noreply.github.com> + - raymonder jin + - rns + - root@andrea:~# + - sekky0905 <20237968+sekky0905@users.noreply.github.com> + - senhtry + - shadrus + - silasb + - solos + - songjiayang + - sope + - srt180 <30768686+srt180@users.noreply.github.com> + - stackerzzq + - sunshineplan + - syssam + - techjanitor + - techjanitor + - thinkerou + - thinkgo <49174849+thinkgos@users.noreply.github.com> + - tsirolnik + - tyltr <31768692+tylitianrui@users.noreply.github.com> + - vinhha96 + - voidman + - vz + - wei + - weibaohui + - whirosan + - willnewrelic + - wssccc + - wuhuizuo + - xyb + - y-yagi + - yiranzai + - youzeliang + - yugu + - yuyabe + - zebozhuang + - zero11-0203 <93071220+zero11-0203@users.noreply.github.com> + - zesani <7sin@outlook.co.th> + - zhanweidu + - zhing + - ziheng + - zzjin + - 森 優太 <59682979+uta-mori@users.noreply.github.com> + - 杰哥 <858806258@qq.com> + - 涛叔 + - 市民233 + - 尹宝强 + - 梦溪笔谈 + - 飞雪无情 + - 寻寻觅觅的Gopher diff --git a/.licenses/arduino-create-agent/go/github.com/gin-gonic/gin/binding.dep.yml b/.licenses/arduino-create-agent/go/github.com/gin-gonic/gin/binding.dep.yml new file mode 100644 index 000000000..a99238ac3 --- /dev/null +++ b/.licenses/arduino-create-agent/go/github.com/gin-gonic/gin/binding.dep.yml @@ -0,0 +1,32 @@ +--- +name: github.com/gin-gonic/gin/binding +version: v1.10.0 +type: go +summary: +homepage: https://pkg.go.dev/github.com/gin-gonic/gin/binding +license: mit +licenses: +- sources: gin@v1.10.0/LICENSE + text: | + The MIT License (MIT) + + Copyright (c) 2014 Manuel Martínez-Almeida + + 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. +notices: [] diff --git a/.licenses/arduino-create-agent/go/github.com/gin-gonic/gin/internal/bytesconv.dep.yml b/.licenses/arduino-create-agent/go/github.com/gin-gonic/gin/internal/bytesconv.dep.yml new file mode 100644 index 000000000..97e8d6cb9 --- /dev/null +++ b/.licenses/arduino-create-agent/go/github.com/gin-gonic/gin/internal/bytesconv.dep.yml @@ -0,0 +1,32 @@ +--- +name: github.com/gin-gonic/gin/internal/bytesconv +version: v1.10.0 +type: go +summary: +homepage: https://pkg.go.dev/github.com/gin-gonic/gin/internal/bytesconv +license: mit +licenses: +- sources: gin@v1.10.0/LICENSE + text: | + The MIT License (MIT) + + Copyright (c) 2014 Manuel Martínez-Almeida + + 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. +notices: [] diff --git a/.licenses/arduino-create-agent/go/github.com/gin-gonic/gin/internal/json.dep.yml b/.licenses/arduino-create-agent/go/github.com/gin-gonic/gin/internal/json.dep.yml new file mode 100644 index 000000000..2551fb8d9 --- /dev/null +++ b/.licenses/arduino-create-agent/go/github.com/gin-gonic/gin/internal/json.dep.yml @@ -0,0 +1,32 @@ +--- +name: github.com/gin-gonic/gin/internal/json +version: v1.10.0 +type: go +summary: +homepage: https://pkg.go.dev/github.com/gin-gonic/gin/internal/json +license: mit +licenses: +- sources: gin@v1.10.0/LICENSE + text: | + The MIT License (MIT) + + Copyright (c) 2014 Manuel Martínez-Almeida + + 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. +notices: [] diff --git a/.licenses/arduino-create-agent/go/github.com/gin-gonic/gin/render.dep.yml b/.licenses/arduino-create-agent/go/github.com/gin-gonic/gin/render.dep.yml new file mode 100644 index 000000000..deb06fb36 --- /dev/null +++ b/.licenses/arduino-create-agent/go/github.com/gin-gonic/gin/render.dep.yml @@ -0,0 +1,32 @@ +--- +name: github.com/gin-gonic/gin/render +version: v1.10.0 +type: go +summary: +homepage: https://pkg.go.dev/github.com/gin-gonic/gin/render +license: mit +licenses: +- sources: gin@v1.10.0/LICENSE + text: | + The MIT License (MIT) + + Copyright (c) 2014 Manuel Martínez-Almeida + + 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. +notices: [] diff --git a/.licenses/arduino-create-agent/go/github.com/go-chi/chi/v5.dep.yml b/.licenses/arduino-create-agent/go/github.com/go-chi/chi/v5.dep.yml new file mode 100644 index 000000000..ed956774e --- /dev/null +++ b/.licenses/arduino-create-agent/go/github.com/go-chi/chi/v5.dep.yml @@ -0,0 +1,42 @@ +--- +name: github.com/go-chi/chi/v5 +version: v5.0.12 +type: go +summary: Package chi is a small, idiomatic and composable router for building HTTP + services. +homepage: https://pkg.go.dev/github.com/go-chi/chi/v5 +license: mit +licenses: +- sources: LICENSE + text: | + Copyright (c) 2015-present Peter Kieltyka (https://github.com/pkieltyka), Google Inc. + + MIT License + + 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. +- sources: README.md + text: |- + Copyright (c) 2015-present [Peter Kieltyka](https://github.com/pkieltyka) + + Licensed under [MIT License](./LICENSE) + + [GoDoc]: https://pkg.go.dev/github.com/go-chi/chi/v5 + [GoDoc Widget]: https://godoc.org/github.com/go-chi/chi?status.svg + [Travis]: https://travis-ci.org/go-chi/chi + [Travis Widget]: https://travis-ci.org/go-chi/chi.svg?branch=master +notices: [] diff --git a/.licenses/arduino-create-agent/go/github.com/go-ini/ini.dep.yml b/.licenses/arduino-create-agent/go/github.com/go-ini/ini.dep.yml new file mode 100644 index 000000000..446908dd7 --- /dev/null +++ b/.licenses/arduino-create-agent/go/github.com/go-ini/ini.dep.yml @@ -0,0 +1,205 @@ +--- +name: github.com/go-ini/ini +version: v1.62.0 +type: go +summary: Package ini provides INI file read and write functionality in Go. +homepage: https://pkg.go.dev/github.com/go-ini/ini +license: apache-2.0 +licenses: +- sources: LICENSE + text: | + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, and + distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by the copyright + owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all other entities + that control, are controlled by, or are under common control with that entity. + For the purposes of this definition, "control" means (i) the power, direct or + indirect, to cause the direction or management of such entity, whether by + contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity exercising + permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, including + but not limited to software source code, documentation source, and configuration + files. + + "Object" form shall mean any form resulting from mechanical transformation or + translation of a Source form, including but not limited to compiled object code, + generated documentation, and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or Object form, made + available under the License, as indicated by a copyright notice that is included + in or attached to the work (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object form, that + is based on (or derived from) the Work and for which the editorial revisions, + annotations, elaborations, or other modifications represent, as a whole, an + original work of authorship. For the purposes of this License, Derivative Works + shall not include works that remain separable from, or merely link (or bind by + name) to the interfaces of, the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including the original version + of the Work and any modifications or additions to that Work or Derivative Works + thereof, that is intentionally submitted to Licensor for inclusion in the Work + by the copyright owner or by an individual or Legal Entity authorized to submit + on behalf of the copyright owner. For the purposes of this definition, + "submitted" means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, and + issue tracking systems that are managed by, or on behalf of, the Licensor for + the purpose of discussing and improving the Work, but excluding communication + that is conspicuously marked or otherwise designated in writing by the copyright + owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity on behalf + of whom a Contribution has been received by Licensor and subsequently + incorporated within the Work. + + 2. Grant of Copyright License. + + Subject to the terms and conditions of this License, each Contributor hereby + grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, + irrevocable copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the Work and such + Derivative Works in Source or Object form. + + 3. Grant of Patent License. + + Subject to the terms and conditions of this License, each Contributor hereby + grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, + irrevocable (except as stated in this section) patent license to make, have + made, use, offer to sell, sell, import, and otherwise transfer the Work, where + such license applies only to those patent claims licensable by such Contributor + that are necessarily infringed by their Contribution(s) alone or by combination + of their Contribution(s) with the Work to which such Contribution(s) was + submitted. If You institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work or a + Contribution incorporated within the Work constitutes direct or contributory + patent infringement, then any patent licenses granted to You under this License + for that Work shall terminate as of the date such litigation is filed. + + 4. Redistribution. + + You may reproduce and distribute copies of the Work or Derivative Works thereof + in any medium, with or without modifications, and in Source or Object form, + provided that You meet the following conditions: + + You must give any other recipients of the Work or Derivative Works a copy of + this License; and + You must cause any modified files to carry prominent notices stating that You + changed the files; and + You must retain, in the Source form of any Derivative Works that You distribute, + all copyright, patent, trademark, and attribution notices from the Source form + of the Work, excluding those notices that do not pertain to any part of the + Derivative Works; and + If the Work includes a "NOTICE" text file as part of its distribution, then any + Derivative Works that You distribute must include a readable copy of the + attribution notices contained within such NOTICE file, excluding those notices + that do not pertain to any part of the Derivative Works, in at least one of the + following places: within a NOTICE text file distributed as part of the + Derivative Works; within the Source form or documentation, if provided along + with the Derivative Works; or, within a display generated by the Derivative + Works, if and wherever such third-party notices normally appear. The contents of + the NOTICE file are for informational purposes only and do not modify the + License. You may add Your own attribution notices within Derivative Works that + You distribute, alongside or as an addendum to the NOTICE text from the Work, + provided that such additional attribution notices cannot be construed as + modifying the License. + You may add Your own copyright statement to Your modifications and may provide + additional or different license terms and conditions for use, reproduction, or + distribution of Your modifications, or for any such Derivative Works as a whole, + provided Your use, reproduction, and distribution of the Work otherwise complies + with the conditions stated in this License. + + 5. Submission of Contributions. + + Unless You explicitly state otherwise, any Contribution intentionally submitted + for inclusion in the Work by You to the Licensor shall be under the terms and + conditions of this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify the terms of + any separate license agreement you may have executed with Licensor regarding + such Contributions. + + 6. Trademarks. + + This License does not grant permission to use the trade names, trademarks, + service marks, or product names of the Licensor, except as required for + reasonable and customary use in describing the origin of the Work and + reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. + + Unless required by applicable law or agreed to in writing, Licensor provides the + Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, + including, without limitation, any warranties or conditions of TITLE, + NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are + solely responsible for determining the appropriateness of using or + redistributing the Work and assume any risks associated with Your exercise of + permissions under this License. + + 8. Limitation of Liability. + + In no event and under no legal theory, whether in tort (including negligence), + contract, or otherwise, unless required by applicable law (such as deliberate + and grossly negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, incidental, + or consequential damages of any character arising as a result of this License or + out of the use or inability to use the Work (including but not limited to + damages for loss of goodwill, work stoppage, computer failure or malfunction, or + any and all other commercial damages or losses), even if such Contributor has + been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. + + While redistributing the Work or Derivative Works thereof, You may choose to + offer, and charge a fee for, acceptance of support, warranty, indemnity, or + other liability obligations and/or rights consistent with this License. However, + in accepting such obligations, You may act only on Your own behalf and on Your + sole responsibility, not on behalf of any other Contributor, and only if You + agree to indemnify, defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason of your + accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work + + To apply the Apache License to your work, attach the following boilerplate + notice, with the fields enclosed by brackets "[]" replaced with your own + identifying information. (Don't include the brackets!) The text should be + enclosed in the appropriate comment syntax for the file format. We also + recommend that a file or class name and description of purpose be included on + the same "printed page" as the copyright notice for easier identification within + third-party archives. + + Copyright 2014 Unknwon + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +- sources: README.md + text: This project is under Apache v2 License. See the [LICENSE](LICENSE) file for + the full license text. +notices: [] diff --git a/.licenses/arduino-create-agent/go/github.com/go-playground/locales.dep.yml b/.licenses/arduino-create-agent/go/github.com/go-playground/locales.dep.yml new file mode 100644 index 000000000..ee78f87a8 --- /dev/null +++ b/.licenses/arduino-create-agent/go/github.com/go-playground/locales.dep.yml @@ -0,0 +1,34 @@ +--- +name: github.com/go-playground/locales +version: v0.14.1 +type: go +summary: +homepage: https://pkg.go.dev/github.com/go-playground/locales +license: mit +licenses: +- sources: LICENSE + text: |- + The MIT License (MIT) + + Copyright (c) 2016 Go Playground + + 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. +- sources: README.md + text: Distributed under MIT License, please see license file in code for more details. +notices: [] diff --git a/.licenses/arduino-create-agent/go/github.com/go-playground/locales/currency.dep.yml b/.licenses/arduino-create-agent/go/github.com/go-playground/locales/currency.dep.yml new file mode 100644 index 000000000..7e33d3e3f --- /dev/null +++ b/.licenses/arduino-create-agent/go/github.com/go-playground/locales/currency.dep.yml @@ -0,0 +1,34 @@ +--- +name: github.com/go-playground/locales/currency +version: v0.14.1 +type: go +summary: +homepage: https://pkg.go.dev/github.com/go-playground/locales/currency +license: mit +licenses: +- sources: locales@v0.14.1/LICENSE + text: |- + The MIT License (MIT) + + Copyright (c) 2016 Go Playground + + 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. +- sources: locales@v0.14.1/README.md + text: Distributed under MIT License, please see license file in code for more details. +notices: [] diff --git a/.licenses/arduino-create-agent/go/github.com/go-playground/universal-translator.dep.yml b/.licenses/arduino-create-agent/go/github.com/go-playground/universal-translator.dep.yml new file mode 100644 index 000000000..3efb0fc2b --- /dev/null +++ b/.licenses/arduino-create-agent/go/github.com/go-playground/universal-translator.dep.yml @@ -0,0 +1,34 @@ +--- +name: github.com/go-playground/universal-translator +version: v0.18.1 +type: go +summary: +homepage: https://pkg.go.dev/github.com/go-playground/universal-translator +license: mit +licenses: +- sources: LICENSE + text: | + The MIT License (MIT) + + Copyright (c) 2016 Go Playground + + 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. +- sources: README.md + text: Distributed under MIT License, please see license file in code for more details. +notices: [] diff --git a/.licenses/arduino-create-agent/go/github.com/go-playground/validator/v10.dep.yml b/.licenses/arduino-create-agent/go/github.com/go-playground/validator/v10.dep.yml new file mode 100644 index 000000000..59a2acb5e --- /dev/null +++ b/.licenses/arduino-create-agent/go/github.com/go-playground/validator/v10.dep.yml @@ -0,0 +1,38 @@ +--- +name: github.com/go-playground/validator/v10 +version: v10.20.0 +type: go +summary: Package validator implements value validations for structs and individual + fields based on tags. +homepage: https://pkg.go.dev/github.com/go-playground/validator/v10 +license: mit +licenses: +- sources: LICENSE + text: |+ + The MIT License (MIT) + + Copyright (c) 2015 Dean Karn + + 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. + +- sources: README.md + text: Distributed under MIT License, please see license file within the code for + more details. +notices: [] +... diff --git a/.licenses/arduino-create-agent/go/github.com/godbus/dbus/v5.dep.yml b/.licenses/arduino-create-agent/go/github.com/godbus/dbus/v5.dep.yml new file mode 100644 index 000000000..a8ef10a04 --- /dev/null +++ b/.licenses/arduino-create-agent/go/github.com/godbus/dbus/v5.dep.yml @@ -0,0 +1,42 @@ +--- +name: github.com/godbus/dbus/v5 +version: v5.0.4 +type: go +summary: Package dbus implements bindings to the D-Bus message bus system. +homepage: https://pkg.go.dev/github.com/godbus/dbus/v5 +license: bsd-2-clause +licenses: +- sources: LICENSE + text: | + Copyright (c) 2013, Georg Reinke (), Google + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +- sources: README.markdown + text: |- + go.dbus is available under the Simplified BSD License; see LICENSE for the full + text. + + Nearly all of the credit for this library goes to github.com/guelfey/go.dbus. +notices: [] diff --git a/.licenses/arduino-create-agent/go/github.com/godbus/dbus/v5/introspect.dep.yml b/.licenses/arduino-create-agent/go/github.com/godbus/dbus/v5/introspect.dep.yml new file mode 100644 index 000000000..fa1753274 --- /dev/null +++ b/.licenses/arduino-create-agent/go/github.com/godbus/dbus/v5/introspect.dep.yml @@ -0,0 +1,43 @@ +--- +name: github.com/godbus/dbus/v5/introspect +version: v5.0.4 +type: go +summary: Package introspect provides some utilities for dealing with the DBus introspection + format. +homepage: https://pkg.go.dev/github.com/godbus/dbus/v5/introspect +license: bsd-2-clause +licenses: +- sources: v5@v5.0.4/LICENSE + text: | + Copyright (c) 2013, Georg Reinke (), Google + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +- sources: v5@v5.0.4/README.markdown + text: |- + go.dbus is available under the Simplified BSD License; see LICENSE for the full + text. + + Nearly all of the credit for this library goes to github.com/guelfey/go.dbus. +notices: [] diff --git a/.licenses/arduino-create-agent/go/github.com/godbus/dbus/v5/prop.dep.yml b/.licenses/arduino-create-agent/go/github.com/godbus/dbus/v5/prop.dep.yml new file mode 100644 index 000000000..99695edeb --- /dev/null +++ b/.licenses/arduino-create-agent/go/github.com/godbus/dbus/v5/prop.dep.yml @@ -0,0 +1,43 @@ +--- +name: github.com/godbus/dbus/v5/prop +version: v5.0.4 +type: go +summary: Package prop provides the Properties struct which can be used to implement + org.freedesktop.DBus.Properties. +homepage: https://pkg.go.dev/github.com/godbus/dbus/v5/prop +license: bsd-2-clause +licenses: +- sources: v5@v5.0.4/LICENSE + text: | + Copyright (c) 2013, Georg Reinke (), Google + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +- sources: v5@v5.0.4/README.markdown + text: |- + go.dbus is available under the Simplified BSD License; see LICENSE for the full + text. + + Nearly all of the credit for this library goes to github.com/guelfey/go.dbus. +notices: [] diff --git a/.licenses/arduino-create-agent/go/github.com/google/uuid.dep.yml b/.licenses/arduino-create-agent/go/github.com/google/uuid.dep.yml new file mode 100644 index 000000000..e01f5c108 --- /dev/null +++ b/.licenses/arduino-create-agent/go/github.com/google/uuid.dep.yml @@ -0,0 +1,38 @@ +--- +name: github.com/google/uuid +version: v1.6.0 +type: go +summary: Package uuid generates and inspects UUIDs. +homepage: https://pkg.go.dev/github.com/google/uuid +license: bsd-3-clause +licenses: +- sources: LICENSE + text: | + Copyright (c) 2009,2014 Google Inc. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following disclaimer + in the documentation and/or other materials provided with the + distribution. + * Neither the name of Google Inc. nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +notices: [] diff --git a/.licenses/arduino-create-agent/go/github.com/googollee/go-engine.io.dep.yml b/.licenses/arduino-create-agent/go/github.com/googollee/go-engine.io.dep.yml new file mode 100644 index 000000000..3d65daba3 --- /dev/null +++ b/.licenses/arduino-create-agent/go/github.com/googollee/go-engine.io.dep.yml @@ -0,0 +1,36 @@ +--- +name: github.com/googollee/go-engine.io +version: v0.0.0-20180829091931-e2f255711dcb +type: go +summary: +homepage: https://pkg.go.dev/github.com/googollee/go-engine.io +license: bsd-3-clause +licenses: +- sources: LICENSE + text: |- + Copyright (c) 2014-2014 Googol Lee + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. The name of the author may not be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +- sources: README.md + text: The 3-clause BSD License - see LICENSE for more details +notices: [] diff --git a/.licenses/arduino-create-agent/go/github.com/googollee/go-engine.io/message.dep.yml b/.licenses/arduino-create-agent/go/github.com/googollee/go-engine.io/message.dep.yml new file mode 100644 index 000000000..55490cf08 --- /dev/null +++ b/.licenses/arduino-create-agent/go/github.com/googollee/go-engine.io/message.dep.yml @@ -0,0 +1,36 @@ +--- +name: github.com/googollee/go-engine.io/message +version: v0.0.0-20180829091931-e2f255711dcb +type: go +summary: +homepage: https://pkg.go.dev/github.com/googollee/go-engine.io/message +license: bsd-3-clause +licenses: +- sources: go-engine.io@v0.0.0-20180829091931-e2f255711dcb/LICENSE + text: |- + Copyright (c) 2014-2014 Googol Lee + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. The name of the author may not be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +- sources: go-engine.io@v0.0.0-20180829091931-e2f255711dcb/README.md + text: The 3-clause BSD License - see LICENSE for more details +notices: [] diff --git a/.licenses/arduino-create-agent/go/github.com/googollee/go-engine.io/parser.dep.yml b/.licenses/arduino-create-agent/go/github.com/googollee/go-engine.io/parser.dep.yml new file mode 100644 index 000000000..718fadade --- /dev/null +++ b/.licenses/arduino-create-agent/go/github.com/googollee/go-engine.io/parser.dep.yml @@ -0,0 +1,36 @@ +--- +name: github.com/googollee/go-engine.io/parser +version: v0.0.0-20180829091931-e2f255711dcb +type: go +summary: +homepage: https://pkg.go.dev/github.com/googollee/go-engine.io/parser +license: bsd-3-clause +licenses: +- sources: go-engine.io@v0.0.0-20180829091931-e2f255711dcb/LICENSE + text: |- + Copyright (c) 2014-2014 Googol Lee + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. The name of the author may not be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +- sources: go-engine.io@v0.0.0-20180829091931-e2f255711dcb/README.md + text: The 3-clause BSD License - see LICENSE for more details +notices: [] diff --git a/.licenses/arduino-create-agent/go/github.com/googollee/go-engine.io/polling.dep.yml b/.licenses/arduino-create-agent/go/github.com/googollee/go-engine.io/polling.dep.yml new file mode 100644 index 000000000..5692db014 --- /dev/null +++ b/.licenses/arduino-create-agent/go/github.com/googollee/go-engine.io/polling.dep.yml @@ -0,0 +1,36 @@ +--- +name: github.com/googollee/go-engine.io/polling +version: v0.0.0-20180829091931-e2f255711dcb +type: go +summary: +homepage: https://pkg.go.dev/github.com/googollee/go-engine.io/polling +license: bsd-3-clause +licenses: +- sources: go-engine.io@v0.0.0-20180829091931-e2f255711dcb/LICENSE + text: |- + Copyright (c) 2014-2014 Googol Lee + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. The name of the author may not be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +- sources: go-engine.io@v0.0.0-20180829091931-e2f255711dcb/README.md + text: The 3-clause BSD License - see LICENSE for more details +notices: [] diff --git a/.licenses/arduino-create-agent/go/github.com/googollee/go-engine.io/transport.dep.yml b/.licenses/arduino-create-agent/go/github.com/googollee/go-engine.io/transport.dep.yml new file mode 100644 index 000000000..430ab5ad5 --- /dev/null +++ b/.licenses/arduino-create-agent/go/github.com/googollee/go-engine.io/transport.dep.yml @@ -0,0 +1,36 @@ +--- +name: github.com/googollee/go-engine.io/transport +version: v0.0.0-20180829091931-e2f255711dcb +type: go +summary: +homepage: https://pkg.go.dev/github.com/googollee/go-engine.io/transport +license: bsd-3-clause +licenses: +- sources: go-engine.io@v0.0.0-20180829091931-e2f255711dcb/LICENSE + text: |- + Copyright (c) 2014-2014 Googol Lee + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. The name of the author may not be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +- sources: go-engine.io@v0.0.0-20180829091931-e2f255711dcb/README.md + text: The 3-clause BSD License - see LICENSE for more details +notices: [] diff --git a/.licenses/arduino-create-agent/go/github.com/googollee/go-engine.io/websocket.dep.yml b/.licenses/arduino-create-agent/go/github.com/googollee/go-engine.io/websocket.dep.yml new file mode 100644 index 000000000..3718a69b2 --- /dev/null +++ b/.licenses/arduino-create-agent/go/github.com/googollee/go-engine.io/websocket.dep.yml @@ -0,0 +1,36 @@ +--- +name: github.com/googollee/go-engine.io/websocket +version: v0.0.0-20180829091931-e2f255711dcb +type: go +summary: +homepage: https://pkg.go.dev/github.com/googollee/go-engine.io/websocket +license: bsd-3-clause +licenses: +- sources: go-engine.io@v0.0.0-20180829091931-e2f255711dcb/LICENSE + text: |- + Copyright (c) 2014-2014 Googol Lee + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. The name of the author may not be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +- sources: go-engine.io@v0.0.0-20180829091931-e2f255711dcb/README.md + text: The 3-clause BSD License - see LICENSE for more details +notices: [] diff --git a/.licenses/arduino-create-agent/go/github.com/googollee/go-socket.io.dep.yml b/.licenses/arduino-create-agent/go/github.com/googollee/go-socket.io.dep.yml new file mode 100644 index 000000000..fb650bfe3 --- /dev/null +++ b/.licenses/arduino-create-agent/go/github.com/googollee/go-socket.io.dep.yml @@ -0,0 +1,36 @@ +--- +name: github.com/googollee/go-socket.io +version: v0.0.0-20181101151912-c8aeb1ed9b49 +type: go +summary: go-socket.io is a server implementation of socket.io in golang. +homepage: https://pkg.go.dev/github.com/googollee/go-socket.io +license: bsd-3-clause +licenses: +- sources: LICENSE + text: |- + Copyright (c) 2014-2014 Googol Lee + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. The name of the author may not be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +- sources: README.md + text: The 3-clause BSD License - see LICENSE for more details +notices: [] diff --git a/.licenses/arduino-create-agent/go/github.com/gorilla/websocket.dep.yml b/.licenses/arduino-create-agent/go/github.com/gorilla/websocket.dep.yml new file mode 100644 index 000000000..0d0f4b6bb --- /dev/null +++ b/.licenses/arduino-create-agent/go/github.com/gorilla/websocket.dep.yml @@ -0,0 +1,29 @@ +--- +name: github.com/gorilla/websocket +version: v1.5.1 +type: go +summary: Package websocket implements the WebSocket protocol defined in RFC 6455. +homepage: https://pkg.go.dev/github.com/gorilla/websocket +license: bsd-3-clause +licenses: +- sources: LICENSE + text: "Copyright (c) 2023 The Gorilla Authors. All rights reserved.\n\nRedistribution + and use in source and binary forms, with or without\nmodification, are permitted + provided that the following conditions are\nmet:\n\n\t * Redistributions of source + code must retain the above copyright\nnotice, this list of conditions and the + following disclaimer.\n\t * Redistributions in binary form must reproduce the + above\ncopyright notice, this list of conditions and the following disclaimer\nin + the documentation and/or other materials provided with the\ndistribution.\n\t + * Neither the name of Google Inc. nor the names of its\ncontributors may be used + to endorse or promote products derived from\nthis software without specific prior + written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT + NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA + PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS + BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING + NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, + EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n" +notices: [] diff --git a/.licenses/arduino-create-agent/go/github.com/h2non/filetype.dep.yml b/.licenses/arduino-create-agent/go/github.com/h2non/filetype.dep.yml new file mode 100644 index 000000000..ce88ad732 --- /dev/null +++ b/.licenses/arduino-create-agent/go/github.com/h2non/filetype.dep.yml @@ -0,0 +1,37 @@ +--- +name: github.com/h2non/filetype +version: v1.1.3 +type: go +summary: +homepage: https://pkg.go.dev/github.com/h2non/filetype +license: mit +licenses: +- sources: LICENSE + text: | + The MIT License + + Copyright (c) Tomas Aparicio + + 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. +- sources: README.md + text: MIT - Tomas Aparicio +notices: [] diff --git a/.licenses/arduino-create-agent/go/github.com/h2non/filetype/matchers.dep.yml b/.licenses/arduino-create-agent/go/github.com/h2non/filetype/matchers.dep.yml new file mode 100644 index 000000000..e441102a1 --- /dev/null +++ b/.licenses/arduino-create-agent/go/github.com/h2non/filetype/matchers.dep.yml @@ -0,0 +1,37 @@ +--- +name: github.com/h2non/filetype/matchers +version: v1.1.3 +type: go +summary: +homepage: https://pkg.go.dev/github.com/h2non/filetype/matchers +license: mit +licenses: +- sources: filetype@v1.1.3/LICENSE + text: | + The MIT License + + Copyright (c) Tomas Aparicio + + 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. +- sources: filetype@v1.1.3/README.md + text: MIT - Tomas Aparicio +notices: [] diff --git a/.licenses/arduino-create-agent/go/github.com/h2non/filetype/matchers/isobmff.dep.yml b/.licenses/arduino-create-agent/go/github.com/h2non/filetype/matchers/isobmff.dep.yml new file mode 100644 index 000000000..d18a56f5a --- /dev/null +++ b/.licenses/arduino-create-agent/go/github.com/h2non/filetype/matchers/isobmff.dep.yml @@ -0,0 +1,37 @@ +--- +name: github.com/h2non/filetype/matchers/isobmff +version: v1.1.3 +type: go +summary: +homepage: https://pkg.go.dev/github.com/h2non/filetype/matchers/isobmff +license: mit +licenses: +- sources: filetype@v1.1.3/LICENSE + text: | + The MIT License + + Copyright (c) Tomas Aparicio + + 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. +- sources: filetype@v1.1.3/README.md + text: MIT - Tomas Aparicio +notices: [] diff --git a/.licenses/arduino-create-agent/go/github.com/h2non/filetype/types.dep.yml b/.licenses/arduino-create-agent/go/github.com/h2non/filetype/types.dep.yml new file mode 100644 index 000000000..6a3e9ff8c --- /dev/null +++ b/.licenses/arduino-create-agent/go/github.com/h2non/filetype/types.dep.yml @@ -0,0 +1,37 @@ +--- +name: github.com/h2non/filetype/types +version: v1.1.3 +type: go +summary: +homepage: https://pkg.go.dev/github.com/h2non/filetype/types +license: mit +licenses: +- sources: filetype@v1.1.3/LICENSE + text: | + The MIT License + + Copyright (c) Tomas Aparicio + + 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. +- sources: filetype@v1.1.3/README.md + text: MIT - Tomas Aparicio +notices: [] diff --git a/.licenses/arduino-create-agent/go/github.com/juju/errors.dep.yml b/.licenses/arduino-create-agent/go/github.com/juju/errors.dep.yml new file mode 100644 index 000000000..670e3a0bc --- /dev/null +++ b/.licenses/arduino-create-agent/go/github.com/juju/errors.dep.yml @@ -0,0 +1,203 @@ +--- +name: github.com/juju/errors +version: v1.0.0 +type: go +summary: Package errors provides an easy way to annotate errors without losing the + original error context. +homepage: https://pkg.go.dev/github.com/juju/errors +license: lgpl-3.0-only +licenses: +- sources: LICENSE + text: | + All files in this repository are licensed as follows. If you contribute + to this repository, it is assumed that you license your contribution + under the same license unless you state otherwise. + + All files Copyright (C) 2015 Canonical Ltd. unless otherwise specified in the file. + + This software is licensed under the LGPLv3, included below. + + As a special exception to the GNU Lesser General Public License version 3 + ("LGPL3"), the copyright holders of this Library give you permission to + convey to a third party a Combined Work that links statically or dynamically + to this Library without providing any Minimal Corresponding Source or + Minimal Application Code as set out in 4d or providing the installation + information set out in section 4e, provided that you comply with the other + provisions of LGPL3 and provided that you meet, for the Application the + terms and conditions of the license(s) which apply to the Application. + + Except as stated in this special exception, the provisions of LGPL3 will + continue to comply in full to this Library. If you modify this Library, you + may apply this exception to your version of this Library, but you are not + obliged to do so. If you do not wish to do so, delete this exception + statement from your version. This exception does not (and cannot) modify any + license terms which apply to the Application, with which you must still + comply. + + + GNU LESSER GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + + This version of the GNU Lesser General Public License incorporates + the terms and conditions of version 3 of the GNU General Public + License, supplemented by the additional permissions listed below. + + 0. Additional Definitions. + + As used herein, "this License" refers to version 3 of the GNU Lesser + General Public License, and the "GNU GPL" refers to version 3 of the GNU + General Public License. + + "The Library" refers to a covered work governed by this License, + other than an Application or a Combined Work as defined below. + + An "Application" is any work that makes use of an interface provided + by the Library, but which is not otherwise based on the Library. + Defining a subclass of a class defined by the Library is deemed a mode + of using an interface provided by the Library. + + A "Combined Work" is a work produced by combining or linking an + Application with the Library. The particular version of the Library + with which the Combined Work was made is also called the "Linked + Version". + + The "Minimal Corresponding Source" for a Combined Work means the + Corresponding Source for the Combined Work, excluding any source code + for portions of the Combined Work that, considered in isolation, are + based on the Application, and not on the Linked Version. + + The "Corresponding Application Code" for a Combined Work means the + object code and/or source code for the Application, including any data + and utility programs needed for reproducing the Combined Work from the + Application, but excluding the System Libraries of the Combined Work. + + 1. Exception to Section 3 of the GNU GPL. + + You may convey a covered work under sections 3 and 4 of this License + without being bound by section 3 of the GNU GPL. + + 2. Conveying Modified Versions. + + If you modify a copy of the Library, and, in your modifications, a + facility refers to a function or data to be supplied by an Application + that uses the facility (other than as an argument passed when the + facility is invoked), then you may convey a copy of the modified + version: + + a) under this License, provided that you make a good faith effort to + ensure that, in the event an Application does not supply the + function or data, the facility still operates, and performs + whatever part of its purpose remains meaningful, or + + b) under the GNU GPL, with none of the additional permissions of + this License applicable to that copy. + + 3. Object Code Incorporating Material from Library Header Files. + + The object code form of an Application may incorporate material from + a header file that is part of the Library. You may convey such object + code under terms of your choice, provided that, if the incorporated + material is not limited to numerical parameters, data structure + layouts and accessors, or small macros, inline functions and templates + (ten or fewer lines in length), you do both of the following: + + a) Give prominent notice with each copy of the object code that the + Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the object code with a copy of the GNU GPL and this license + document. + + 4. Combined Works. + + You may convey a Combined Work under terms of your choice that, + taken together, effectively do not restrict modification of the + portions of the Library contained in the Combined Work and reverse + engineering for debugging such modifications, if you also do each of + the following: + + a) Give prominent notice with each copy of the Combined Work that + the Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the Combined Work with a copy of the GNU GPL and this license + document. + + c) For a Combined Work that displays copyright notices during + execution, include the copyright notice for the Library among + these notices, as well as a reference directing the user to the + copies of the GNU GPL and this license document. + + d) Do one of the following: + + 0) Convey the Minimal Corresponding Source under the terms of this + License, and the Corresponding Application Code in a form + suitable for, and under terms that permit, the user to + recombine or relink the Application with a modified version of + the Linked Version to produce a modified Combined Work, in the + manner specified by section 6 of the GNU GPL for conveying + Corresponding Source. + + 1) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (a) uses at run time + a copy of the Library already present on the user's computer + system, and (b) will operate properly with a modified version + of the Library that is interface-compatible with the Linked + Version. + + e) Provide Installation Information, but only if you would otherwise + be required to provide such information under section 6 of the + GNU GPL, and only to the extent that such information is + necessary to install and execute a modified version of the + Combined Work produced by recombining or relinking the + Application with a modified version of the Linked Version. (If + you use option 4d0, the Installation Information must accompany + the Minimal Corresponding Source and Corresponding Application + Code. If you use option 4d1, you must provide the Installation + Information in the manner specified by section 6 of the GNU GPL + for conveying Corresponding Source.) + + 5. Combined Libraries. + + You may place library facilities that are a work based on the + Library side by side in a single library together with other library + facilities that are not Applications and are not covered by this + License, and convey such a combined library under terms of your + choice, if you do both of the following: + + a) Accompany the combined library with a copy of the same work based + on the Library, uncombined with any other library facilities, + conveyed under the terms of this License. + + b) Give prominent notice with the combined library that part of it + is a work based on the Library, and explaining where to find the + accompanying uncombined form of the same work. + + 6. Revised Versions of the GNU Lesser General Public License. + + The Free Software Foundation may publish revised and/or new versions + of the GNU Lesser General Public License from time to time. Such new + versions will be similar in spirit to the present version, but may + differ in detail to address new problems or concerns. + + Each version is given a distinguishing version number. If the + Library as you received it specifies that a certain numbered version + of the GNU Lesser General Public License "or any later version" + applies to it, you have the option of following the terms and + conditions either of that published version or of any later version + published by the Free Software Foundation. If the Library as you + received it does not specify a version number of the GNU Lesser + General Public License, you may choose any version of the GNU Lesser + General Public License ever published by the Free Software Foundation. + + If the Library as you received it specifies that a proxy can decide + whether future versions of the GNU Lesser General Public License shall + apply, that proxy's public statement of acceptance of any version is + permanent authorization for you to choose that version for the + Library. +notices: [] diff --git a/.licenses/arduino-create-agent/go/github.com/kardianos/osext.dep.yml b/.licenses/arduino-create-agent/go/github.com/kardianos/osext.dep.yml new file mode 100644 index 000000000..d7afd8fad --- /dev/null +++ b/.licenses/arduino-create-agent/go/github.com/kardianos/osext.dep.yml @@ -0,0 +1,38 @@ +--- +name: github.com/kardianos/osext +version: v0.0.0-20190222173326-2bc1f35cddc0 +type: go +summary: Extensions to the standard "os" package. +homepage: https://pkg.go.dev/github.com/kardianos/osext +license: bsd-3-clause +licenses: +- sources: LICENSE + text: | + Copyright (c) 2012 The Go Authors. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following disclaimer + in the documentation and/or other materials provided with the + distribution. + * Neither the name of Google Inc. nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +notices: [] diff --git a/.licenses/arduino-create-agent/go/github.com/klauspost/compress.dep.yml b/.licenses/arduino-create-agent/go/github.com/klauspost/compress.dep.yml new file mode 100644 index 000000000..6015c205c --- /dev/null +++ b/.licenses/arduino-create-agent/go/github.com/klauspost/compress.dep.yml @@ -0,0 +1,318 @@ +--- +name: github.com/klauspost/compress +version: v1.17.0 +type: go +summary: +homepage: https://pkg.go.dev/github.com/klauspost/compress +license: bsd-3-clause +licenses: +- sources: LICENSE + text: | + Copyright (c) 2012 The Go Authors. All rights reserved. + Copyright (c) 2019 Klaus Post. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following disclaimer + in the documentation and/or other materials provided with the + distribution. + * Neither the name of Google Inc. nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + ------------------ + + Files: gzhttp/* + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2016-2017 The New York Times Company + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + ------------------ + + Files: s2/cmd/internal/readahead/* + + The MIT License (MIT) + + Copyright (c) 2015 Klaus Post + + 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. + + --------------------- + Files: snappy/* + Files: internal/snapref/* + + Copyright (c) 2011 The Snappy-Go Authors. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following disclaimer + in the documentation and/or other materials provided with the + distribution. + * Neither the name of Google Inc. nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + ----------------- + + Files: s2/cmd/internal/filepathx/* + + Copyright 2016 The filepathx Authors + + 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. +- sources: README.md + text: This code is licensed under the same conditions as the original Go code. See + LICENSE file. +notices: [] diff --git a/.licenses/arduino-create-agent/go/github.com/klauspost/compress/fse.dep.yml b/.licenses/arduino-create-agent/go/github.com/klauspost/compress/fse.dep.yml new file mode 100644 index 000000000..8d885e97e --- /dev/null +++ b/.licenses/arduino-create-agent/go/github.com/klauspost/compress/fse.dep.yml @@ -0,0 +1,315 @@ +--- +name: github.com/klauspost/compress/fse +version: v1.17.0 +type: go +summary: Package fse provides Finite State Entropy encoding and decoding. +homepage: https://pkg.go.dev/github.com/klauspost/compress/fse +license: bsd-3-clause +licenses: +- sources: compress@v1.17.0/LICENSE + text: | + Copyright (c) 2012 The Go Authors. All rights reserved. + Copyright (c) 2019 Klaus Post. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following disclaimer + in the documentation and/or other materials provided with the + distribution. + * Neither the name of Google Inc. nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + ------------------ + + Files: gzhttp/* + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2016-2017 The New York Times Company + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + ------------------ + + Files: s2/cmd/internal/readahead/* + + The MIT License (MIT) + + Copyright (c) 2015 Klaus Post + + 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. + + --------------------- + Files: snappy/* + Files: internal/snapref/* + + Copyright (c) 2011 The Snappy-Go Authors. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following disclaimer + in the documentation and/or other materials provided with the + distribution. + * Neither the name of Google Inc. nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + ----------------- + + Files: s2/cmd/internal/filepathx/* + + Copyright 2016 The filepathx Authors + + 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. +notices: [] diff --git a/.licenses/arduino-create-agent/go/github.com/klauspost/compress/huff0.dep.yml b/.licenses/arduino-create-agent/go/github.com/klauspost/compress/huff0.dep.yml new file mode 100644 index 000000000..30901b047 --- /dev/null +++ b/.licenses/arduino-create-agent/go/github.com/klauspost/compress/huff0.dep.yml @@ -0,0 +1,316 @@ +--- +name: github.com/klauspost/compress/huff0 +version: v1.17.0 +type: go +summary: This file contains the specialisation of Decoder.Decompress4X and Decoder.Decompress1X + that use an asm implementation of thir main loops. +homepage: https://pkg.go.dev/github.com/klauspost/compress/huff0 +license: bsd-3-clause +licenses: +- sources: compress@v1.17.0/LICENSE + text: | + Copyright (c) 2012 The Go Authors. All rights reserved. + Copyright (c) 2019 Klaus Post. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following disclaimer + in the documentation and/or other materials provided with the + distribution. + * Neither the name of Google Inc. nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + ------------------ + + Files: gzhttp/* + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2016-2017 The New York Times Company + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + ------------------ + + Files: s2/cmd/internal/readahead/* + + The MIT License (MIT) + + Copyright (c) 2015 Klaus Post + + 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. + + --------------------- + Files: snappy/* + Files: internal/snapref/* + + Copyright (c) 2011 The Snappy-Go Authors. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following disclaimer + in the documentation and/or other materials provided with the + distribution. + * Neither the name of Google Inc. nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + ----------------- + + Files: s2/cmd/internal/filepathx/* + + Copyright 2016 The filepathx Authors + + 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. +notices: [] diff --git a/.licenses/arduino-create-agent/go/github.com/klauspost/compress/internal/cpuinfo.dep.yml b/.licenses/arduino-create-agent/go/github.com/klauspost/compress/internal/cpuinfo.dep.yml new file mode 100644 index 000000000..9b6923997 --- /dev/null +++ b/.licenses/arduino-create-agent/go/github.com/klauspost/compress/internal/cpuinfo.dep.yml @@ -0,0 +1,318 @@ +--- +name: github.com/klauspost/compress/internal/cpuinfo +version: v1.17.0 +type: go +summary: Package cpuinfo gives runtime info about the current CPU. +homepage: https://pkg.go.dev/github.com/klauspost/compress/internal/cpuinfo +license: bsd-3-clause +licenses: +- sources: compress@v1.17.0/LICENSE + text: | + Copyright (c) 2012 The Go Authors. All rights reserved. + Copyright (c) 2019 Klaus Post. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following disclaimer + in the documentation and/or other materials provided with the + distribution. + * Neither the name of Google Inc. nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + ------------------ + + Files: gzhttp/* + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2016-2017 The New York Times Company + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + ------------------ + + Files: s2/cmd/internal/readahead/* + + The MIT License (MIT) + + Copyright (c) 2015 Klaus Post + + 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. + + --------------------- + Files: snappy/* + Files: internal/snapref/* + + Copyright (c) 2011 The Snappy-Go Authors. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following disclaimer + in the documentation and/or other materials provided with the + distribution. + * Neither the name of Google Inc. nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + ----------------- + + Files: s2/cmd/internal/filepathx/* + + Copyright 2016 The filepathx Authors + + 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. +- sources: compress@v1.17.0/README.md + text: This code is licensed under the same conditions as the original Go code. See + LICENSE file. +notices: [] diff --git a/.licenses/arduino-create-agent/go/github.com/klauspost/compress/internal/snapref.dep.yml b/.licenses/arduino-create-agent/go/github.com/klauspost/compress/internal/snapref.dep.yml new file mode 100644 index 000000000..76d6e0025 --- /dev/null +++ b/.licenses/arduino-create-agent/go/github.com/klauspost/compress/internal/snapref.dep.yml @@ -0,0 +1,347 @@ +--- +name: github.com/klauspost/compress/internal/snapref +version: v1.17.0 +type: go +summary: Package snapref implements the Snappy compression format. +homepage: https://pkg.go.dev/github.com/klauspost/compress/internal/snapref +license: bsd-3-clause +licenses: +- sources: LICENSE + text: | + Copyright (c) 2011 The Snappy-Go Authors. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following disclaimer + in the documentation and/or other materials provided with the + distribution. + * Neither the name of Google Inc. nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +- sources: compress@v1.17.0/LICENSE + text: | + Copyright (c) 2012 The Go Authors. All rights reserved. + Copyright (c) 2019 Klaus Post. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following disclaimer + in the documentation and/or other materials provided with the + distribution. + * Neither the name of Google Inc. nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + ------------------ + + Files: gzhttp/* + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2016-2017 The New York Times Company + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + ------------------ + + Files: s2/cmd/internal/readahead/* + + The MIT License (MIT) + + Copyright (c) 2015 Klaus Post + + 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. + + --------------------- + Files: snappy/* + Files: internal/snapref/* + + Copyright (c) 2011 The Snappy-Go Authors. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following disclaimer + in the documentation and/or other materials provided with the + distribution. + * Neither the name of Google Inc. nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + ----------------- + + Files: s2/cmd/internal/filepathx/* + + Copyright 2016 The filepathx Authors + + 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. +- sources: compress@v1.17.0/README.md + text: This code is licensed under the same conditions as the original Go code. See + LICENSE file. +notices: [] diff --git a/.licenses/arduino-create-agent/go/github.com/klauspost/compress/zstd.dep.yml b/.licenses/arduino-create-agent/go/github.com/klauspost/compress/zstd.dep.yml new file mode 100644 index 000000000..e7dc8db67 --- /dev/null +++ b/.licenses/arduino-create-agent/go/github.com/klauspost/compress/zstd.dep.yml @@ -0,0 +1,315 @@ +--- +name: github.com/klauspost/compress/zstd +version: v1.17.0 +type: go +summary: Package zstd provides decompression of zstandard files. +homepage: https://pkg.go.dev/github.com/klauspost/compress/zstd +license: bsd-3-clause +licenses: +- sources: compress@v1.17.0/LICENSE + text: | + Copyright (c) 2012 The Go Authors. All rights reserved. + Copyright (c) 2019 Klaus Post. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following disclaimer + in the documentation and/or other materials provided with the + distribution. + * Neither the name of Google Inc. nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + ------------------ + + Files: gzhttp/* + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2016-2017 The New York Times Company + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + ------------------ + + Files: s2/cmd/internal/readahead/* + + The MIT License (MIT) + + Copyright (c) 2015 Klaus Post + + 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. + + --------------------- + Files: snappy/* + Files: internal/snapref/* + + Copyright (c) 2011 The Snappy-Go Authors. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following disclaimer + in the documentation and/or other materials provided with the + distribution. + * Neither the name of Google Inc. nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + ----------------- + + Files: s2/cmd/internal/filepathx/* + + Copyright 2016 The filepathx Authors + + 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. +notices: [] diff --git a/.licenses/arduino-create-agent/go/github.com/klauspost/compress/zstd/internal/xxhash.dep.yml b/.licenses/arduino-create-agent/go/github.com/klauspost/compress/zstd/internal/xxhash.dep.yml new file mode 100644 index 000000000..6fc4c211b --- /dev/null +++ b/.licenses/arduino-create-agent/go/github.com/klauspost/compress/zstd/internal/xxhash.dep.yml @@ -0,0 +1,339 @@ +--- +name: github.com/klauspost/compress/zstd/internal/xxhash +version: v1.17.0 +type: go +summary: +homepage: https://pkg.go.dev/github.com/klauspost/compress/zstd/internal/xxhash +license: bsd-3-clause +licenses: +- sources: compress@v1.17.0/LICENSE + text: | + Copyright (c) 2012 The Go Authors. All rights reserved. + Copyright (c) 2019 Klaus Post. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following disclaimer + in the documentation and/or other materials provided with the + distribution. + * Neither the name of Google Inc. nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + ------------------ + + Files: gzhttp/* + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2016-2017 The New York Times Company + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + ------------------ + + Files: s2/cmd/internal/readahead/* + + The MIT License (MIT) + + Copyright (c) 2015 Klaus Post + + 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. + + --------------------- + Files: snappy/* + Files: internal/snapref/* + + Copyright (c) 2011 The Snappy-Go Authors. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following disclaimer + in the documentation and/or other materials provided with the + distribution. + * Neither the name of Google Inc. nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + ----------------- + + Files: s2/cmd/internal/filepathx/* + + Copyright 2016 The filepathx Authors + + 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. +- sources: LICENSE.txt + text: | + Copyright (c) 2016 Caleb Spare + + MIT License + + 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. +notices: [] diff --git a/.licenses/arduino-create-agent/go/github.com/kr/binarydist.dep.yml b/.licenses/arduino-create-agent/go/github.com/kr/binarydist.dep.yml new file mode 100644 index 000000000..9487d6f08 --- /dev/null +++ b/.licenses/arduino-create-agent/go/github.com/kr/binarydist.dep.yml @@ -0,0 +1,33 @@ +--- +name: github.com/kr/binarydist +version: v0.1.0 +type: go +summary: Package binarydist implements binary diff and patch as described on http://www.daemonology.net/bsdiff/. +homepage: https://pkg.go.dev/github.com/kr/binarydist +license: mit +licenses: +- sources: License + text: | + Copyright 2012 Keith Rarick + + 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. +notices: [] diff --git a/.licenses/arduino-create-agent/go/github.com/leodido/go-urn.dep.yml b/.licenses/arduino-create-agent/go/github.com/leodido/go-urn.dep.yml new file mode 100644 index 000000000..5c146cf19 --- /dev/null +++ b/.licenses/arduino-create-agent/go/github.com/leodido/go-urn.dep.yml @@ -0,0 +1,32 @@ +--- +name: github.com/leodido/go-urn +version: v1.4.0 +type: go +summary: +homepage: https://pkg.go.dev/github.com/leodido/go-urn +license: mit +licenses: +- sources: LICENSE + text: | + MIT License + + Copyright (c) 2018 Leonardo Di Donato + + 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. +notices: [] diff --git a/.licenses/arduino-create-agent/go/github.com/leodido/go-urn/scim/schema.dep.yml b/.licenses/arduino-create-agent/go/github.com/leodido/go-urn/scim/schema.dep.yml new file mode 100644 index 000000000..db9fe5292 --- /dev/null +++ b/.licenses/arduino-create-agent/go/github.com/leodido/go-urn/scim/schema.dep.yml @@ -0,0 +1,32 @@ +--- +name: github.com/leodido/go-urn/scim/schema +version: v1.4.0 +type: go +summary: +homepage: https://pkg.go.dev/github.com/leodido/go-urn/scim/schema +license: mit +licenses: +- sources: go-urn@v1.4.0/LICENSE + text: | + MIT License + + Copyright (c) 2018 Leonardo Di Donato + + 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. +notices: [] diff --git a/.licenses/arduino-create-agent/go/github.com/mattn/go-isatty.dep.yml b/.licenses/arduino-create-agent/go/github.com/mattn/go-isatty.dep.yml new file mode 100644 index 000000000..fcf391275 --- /dev/null +++ b/.licenses/arduino-create-agent/go/github.com/mattn/go-isatty.dep.yml @@ -0,0 +1,22 @@ +--- +name: github.com/mattn/go-isatty +version: v0.0.20 +type: go +summary: Package isatty implements interface to isatty +homepage: https://pkg.go.dev/github.com/mattn/go-isatty +license: mit +licenses: +- sources: LICENSE + text: | + Copyright (c) Yasuhiro MATSUMOTO + + MIT License (Expat) + + 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. +- sources: README.md + text: MIT +notices: [] diff --git a/.licenses/arduino-create-agent/go/github.com/mattn/go-shellwords.dep.yml b/.licenses/arduino-create-agent/go/github.com/mattn/go-shellwords.dep.yml new file mode 100644 index 000000000..742e6604f --- /dev/null +++ b/.licenses/arduino-create-agent/go/github.com/mattn/go-shellwords.dep.yml @@ -0,0 +1,34 @@ +--- +name: github.com/mattn/go-shellwords +version: v1.0.12 +type: go +summary: +homepage: https://pkg.go.dev/github.com/mattn/go-shellwords +license: mit +licenses: +- sources: LICENSE + text: | + The MIT License (MIT) + + Copyright (c) 2017 Yasuhiro Matsumoto + + 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. +- sources: README.md + text: 'under the MIT License: http://mattn.mit-license.org/2017' +notices: [] diff --git a/.licenses/arduino-create-agent/go/github.com/pelletier/go-toml/v2.dep.yml b/.licenses/arduino-create-agent/go/github.com/pelletier/go-toml/v2.dep.yml new file mode 100644 index 000000000..44cb14185 --- /dev/null +++ b/.licenses/arduino-create-agent/go/github.com/pelletier/go-toml/v2.dep.yml @@ -0,0 +1,35 @@ +--- +name: github.com/pelletier/go-toml/v2 +version: v2.2.2 +type: go +summary: Package toml is a library to read and write TOML documents. +homepage: https://pkg.go.dev/github.com/pelletier/go-toml/v2 +license: other +licenses: +- sources: LICENSE + text: | + The MIT License (MIT) + + go-toml v2 + Copyright (c) 2021 - 2023 Thomas Pelletier + + 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. +- sources: README.md + text: The MIT License (MIT). Read [LICENSE](LICENSE). +notices: [] diff --git a/.licenses/arduino-create-agent/go/github.com/pelletier/go-toml/v2/internal/characters.dep.yml b/.licenses/arduino-create-agent/go/github.com/pelletier/go-toml/v2/internal/characters.dep.yml new file mode 100644 index 000000000..59a3269ba --- /dev/null +++ b/.licenses/arduino-create-agent/go/github.com/pelletier/go-toml/v2/internal/characters.dep.yml @@ -0,0 +1,35 @@ +--- +name: github.com/pelletier/go-toml/v2/internal/characters +version: v2.2.2 +type: go +summary: +homepage: https://pkg.go.dev/github.com/pelletier/go-toml/v2/internal/characters +license: other +licenses: +- sources: v2@v2.2.2/LICENSE + text: | + The MIT License (MIT) + + go-toml v2 + Copyright (c) 2021 - 2023 Thomas Pelletier + + 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. +- sources: v2@v2.2.2/README.md + text: The MIT License (MIT). Read [LICENSE](LICENSE). +notices: [] diff --git a/.licenses/arduino-create-agent/go/github.com/pelletier/go-toml/v2/internal/danger.dep.yml b/.licenses/arduino-create-agent/go/github.com/pelletier/go-toml/v2/internal/danger.dep.yml new file mode 100644 index 000000000..36075df83 --- /dev/null +++ b/.licenses/arduino-create-agent/go/github.com/pelletier/go-toml/v2/internal/danger.dep.yml @@ -0,0 +1,35 @@ +--- +name: github.com/pelletier/go-toml/v2/internal/danger +version: v2.2.2 +type: go +summary: +homepage: https://pkg.go.dev/github.com/pelletier/go-toml/v2/internal/danger +license: other +licenses: +- sources: v2@v2.2.2/LICENSE + text: | + The MIT License (MIT) + + go-toml v2 + Copyright (c) 2021 - 2023 Thomas Pelletier + + 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. +- sources: v2@v2.2.2/README.md + text: The MIT License (MIT). Read [LICENSE](LICENSE). +notices: [] diff --git a/.licenses/arduino-create-agent/go/github.com/pelletier/go-toml/v2/internal/tracker.dep.yml b/.licenses/arduino-create-agent/go/github.com/pelletier/go-toml/v2/internal/tracker.dep.yml new file mode 100644 index 000000000..954011183 --- /dev/null +++ b/.licenses/arduino-create-agent/go/github.com/pelletier/go-toml/v2/internal/tracker.dep.yml @@ -0,0 +1,35 @@ +--- +name: github.com/pelletier/go-toml/v2/internal/tracker +version: v2.2.2 +type: go +summary: +homepage: https://pkg.go.dev/github.com/pelletier/go-toml/v2/internal/tracker +license: other +licenses: +- sources: v2@v2.2.2/LICENSE + text: | + The MIT License (MIT) + + go-toml v2 + Copyright (c) 2021 - 2023 Thomas Pelletier + + 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. +- sources: v2@v2.2.2/README.md + text: The MIT License (MIT). Read [LICENSE](LICENSE). +notices: [] diff --git a/.licenses/arduino-create-agent/go/github.com/pelletier/go-toml/v2/unstable.dep.yml b/.licenses/arduino-create-agent/go/github.com/pelletier/go-toml/v2/unstable.dep.yml new file mode 100644 index 000000000..4fc5a61cb --- /dev/null +++ b/.licenses/arduino-create-agent/go/github.com/pelletier/go-toml/v2/unstable.dep.yml @@ -0,0 +1,36 @@ +--- +name: github.com/pelletier/go-toml/v2/unstable +version: v2.2.2 +type: go +summary: Package unstable provides APIs that do not meet the backward compatibility + guarantees yet. +homepage: https://pkg.go.dev/github.com/pelletier/go-toml/v2/unstable +license: other +licenses: +- sources: v2@v2.2.2/LICENSE + text: | + The MIT License (MIT) + + go-toml v2 + Copyright (c) 2021 - 2023 Thomas Pelletier + + 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. +- sources: v2@v2.2.2/README.md + text: The MIT License (MIT). Read [LICENSE](LICENSE). +notices: [] diff --git a/.licenses/arduino-create-agent/go/github.com/pkg/errors.dep.yml b/.licenses/arduino-create-agent/go/github.com/pkg/errors.dep.yml new file mode 100644 index 000000000..a9b72bc4b --- /dev/null +++ b/.licenses/arduino-create-agent/go/github.com/pkg/errors.dep.yml @@ -0,0 +1,36 @@ +--- +name: github.com/pkg/errors +version: v0.9.1 +type: go +summary: Package errors provides simple error handling primitives. +homepage: https://pkg.go.dev/github.com/pkg/errors +license: bsd-2-clause +licenses: +- sources: LICENSE + text: | + Copyright (c) 2015, Dave Cheney + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +- sources: README.md + text: BSD-2-Clause +notices: [] diff --git a/.licenses/arduino-create-agent/go/github.com/sirupsen/logrus.dep.yml b/.licenses/arduino-create-agent/go/github.com/sirupsen/logrus.dep.yml new file mode 100644 index 000000000..07801f93d --- /dev/null +++ b/.licenses/arduino-create-agent/go/github.com/sirupsen/logrus.dep.yml @@ -0,0 +1,33 @@ +--- +name: github.com/sirupsen/logrus +version: v1.9.3 +type: go +summary: Package logrus is a structured logger for Go, completely API compatible with + the standard library logger. +homepage: https://pkg.go.dev/github.com/sirupsen/logrus +license: mit +licenses: +- sources: LICENSE + text: | + The MIT License (MIT) + + Copyright (c) 2014 Simon Eskildsen + + 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. +notices: [] diff --git a/.licenses/arduino-create-agent/go/github.com/skratchdot/open-golang/open.dep.yml b/.licenses/arduino-create-agent/go/github.com/skratchdot/open-golang/open.dep.yml new file mode 100644 index 000000000..2cd61387d --- /dev/null +++ b/.licenses/arduino-create-agent/go/github.com/skratchdot/open-golang/open.dep.yml @@ -0,0 +1,36 @@ +--- +name: github.com/skratchdot/open-golang/open +version: v0.0.0-20200116055534-eef842397966 +type: go +summary: Open a file, directory, or URI using the OS's default application for that + object type. +homepage: https://pkg.go.dev/github.com/skratchdot/open-golang/open +license: mit +licenses: +- sources: open-golang@v0.0.0-20200116055534-eef842397966/LICENSE + text: | + Copyright (c) 2013 skratchdot + + 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. +- sources: open-golang@v0.0.0-20200116055534-eef842397966/README.md + text: "Copyright (c) 2013 skratchdot \nLicensed under the MIT license." +notices: [] diff --git a/.licenses/arduino-create-agent/go/github.com/ugorji/go/codec.dep.yml b/.licenses/arduino-create-agent/go/github.com/ugorji/go/codec.dep.yml new file mode 100644 index 000000000..eb52f1cb0 --- /dev/null +++ b/.licenses/arduino-create-agent/go/github.com/ugorji/go/codec.dep.yml @@ -0,0 +1,34 @@ +--- +name: github.com/ugorji/go/codec +version: v1.1.6 +type: go +summary: Package codec provides a High Performance, Feature-Rich Idiomatic Go 1.4+ + codec/encoding library for binc, msgpack, cbor, json. +homepage: https://pkg.go.dev/github.com/ugorji/go/codec +license: mit +licenses: +- sources: go@v1.1.6/LICENSE + text: | + The MIT License (MIT) + + Copyright (c) 2012-2015 Ugorji Nwoke. + All rights reserved. + + 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. +notices: [] diff --git a/.licenses/arduino-create-agent/go/github.com/ulikunitz/xz.dep.yml b/.licenses/arduino-create-agent/go/github.com/ulikunitz/xz.dep.yml new file mode 100644 index 000000000..b02e158ff --- /dev/null +++ b/.licenses/arduino-create-agent/go/github.com/ulikunitz/xz.dep.yml @@ -0,0 +1,37 @@ +--- +name: github.com/ulikunitz/xz +version: v0.5.12 +type: go +summary: Package xz supports the compression and decompression of xz files. +homepage: https://pkg.go.dev/github.com/ulikunitz/xz +license: bsd-3-clause +licenses: +- sources: LICENSE + text: | + Copyright (c) 2014-2022 Ulrich Kunitz + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + * My name, Ulrich Kunitz, may not be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +notices: [] diff --git a/.licenses/arduino-create-agent/go/github.com/ulikunitz/xz/internal/hash.dep.yml b/.licenses/arduino-create-agent/go/github.com/ulikunitz/xz/internal/hash.dep.yml new file mode 100644 index 000000000..c9a34e7af --- /dev/null +++ b/.licenses/arduino-create-agent/go/github.com/ulikunitz/xz/internal/hash.dep.yml @@ -0,0 +1,37 @@ +--- +name: github.com/ulikunitz/xz/internal/hash +version: v0.5.12 +type: go +summary: Package hash provides rolling hashes. +homepage: https://pkg.go.dev/github.com/ulikunitz/xz/internal/hash +license: bsd-3-clause +licenses: +- sources: xz@v0.5.12/LICENSE + text: | + Copyright (c) 2014-2022 Ulrich Kunitz + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + * My name, Ulrich Kunitz, may not be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +notices: [] diff --git a/.licenses/arduino-create-agent/go/github.com/ulikunitz/xz/internal/xlog.dep.yml b/.licenses/arduino-create-agent/go/github.com/ulikunitz/xz/internal/xlog.dep.yml new file mode 100644 index 000000000..a5ec30088 --- /dev/null +++ b/.licenses/arduino-create-agent/go/github.com/ulikunitz/xz/internal/xlog.dep.yml @@ -0,0 +1,38 @@ +--- +name: github.com/ulikunitz/xz/internal/xlog +version: v0.5.12 +type: go +summary: Package xlog provides a simple logging package that allows to disable certain + message categories. +homepage: https://pkg.go.dev/github.com/ulikunitz/xz/internal/xlog +license: bsd-3-clause +licenses: +- sources: xz@v0.5.12/LICENSE + text: | + Copyright (c) 2014-2022 Ulrich Kunitz + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + * My name, Ulrich Kunitz, may not be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +notices: [] diff --git a/.licenses/arduino-create-agent/go/github.com/ulikunitz/xz/lzma.dep.yml b/.licenses/arduino-create-agent/go/github.com/ulikunitz/xz/lzma.dep.yml new file mode 100644 index 000000000..66a937e5e --- /dev/null +++ b/.licenses/arduino-create-agent/go/github.com/ulikunitz/xz/lzma.dep.yml @@ -0,0 +1,37 @@ +--- +name: github.com/ulikunitz/xz/lzma +version: v0.5.12 +type: go +summary: Package lzma supports the decoding and encoding of LZMA streams. +homepage: https://pkg.go.dev/github.com/ulikunitz/xz/lzma +license: bsd-3-clause +licenses: +- sources: xz@v0.5.12/LICENSE + text: | + Copyright (c) 2014-2022 Ulrich Kunitz + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + * My name, Ulrich Kunitz, may not be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +notices: [] diff --git a/.licenses/arduino-create-agent/go/github.com/xrash/smetrics.dep.yml b/.licenses/arduino-create-agent/go/github.com/xrash/smetrics.dep.yml new file mode 100644 index 000000000..cbd322a2e --- /dev/null +++ b/.licenses/arduino-create-agent/go/github.com/xrash/smetrics.dep.yml @@ -0,0 +1,32 @@ +--- +name: github.com/xrash/smetrics +version: v0.0.0-20170218160415-a3153f7040e9 +type: go +summary: +homepage: https://pkg.go.dev/github.com/xrash/smetrics +license: mit +licenses: +- sources: LICENSE + text: | + Copyright (C) 2016 Felipe da Cunha Gonçalves + All Rights Reserved. + + MIT LICENSE + + 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. +notices: [] diff --git a/.licenses/arduino-create-agent/go/go.bug.st/serial.dep.yml b/.licenses/arduino-create-agent/go/go.bug.st/serial.dep.yml new file mode 100644 index 000000000..73d434109 --- /dev/null +++ b/.licenses/arduino-create-agent/go/go.bug.st/serial.dep.yml @@ -0,0 +1,50 @@ +--- +name: go.bug.st/serial +version: v1.6.4 +type: go +summary: Package serial is a cross-platform serial library for the go language. +homepage: https://pkg.go.dev/go.bug.st/serial +license: bsd-3-clause +licenses: +- sources: LICENSE + text: |2+ + + Copyright (c) 2014-2024, Cristian Maglie. + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + + 3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + +- sources: README.md + text: |- + This software is released under the [BSD 3-clause license]. + + [contributors]: https://github.com/bugst/go-serial/graphs/contributors + [BSD 3-clause license]: https://github.com/bugst/go-serial/blob/master/LICENSE +notices: [] diff --git a/.licenses/arduino-create-agent/go/go.bug.st/serial/enumerator.dep.yml b/.licenses/arduino-create-agent/go/go.bug.st/serial/enumerator.dep.yml new file mode 100644 index 000000000..d7b0b63e1 --- /dev/null +++ b/.licenses/arduino-create-agent/go/go.bug.st/serial/enumerator.dep.yml @@ -0,0 +1,51 @@ +--- +name: go.bug.st/serial/enumerator +version: v1.6.4 +type: go +summary: Package enumerator is a golang cross-platform library for USB serial port + discovery. +homepage: https://pkg.go.dev/go.bug.st/serial/enumerator +license: bsd-3-clause +licenses: +- sources: serial@v1.6.4/LICENSE + text: |2+ + + Copyright (c) 2014-2024, Cristian Maglie. + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + + 3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + +- sources: serial@v1.6.4/README.md + text: |- + This software is released under the [BSD 3-clause license]. + + [contributors]: https://github.com/bugst/go-serial/graphs/contributors + [BSD 3-clause license]: https://github.com/bugst/go-serial/blob/master/LICENSE +notices: [] diff --git a/.licenses/arduino-create-agent/go/go.bug.st/serial/unixutils.dep.yml b/.licenses/arduino-create-agent/go/go.bug.st/serial/unixutils.dep.yml new file mode 100644 index 000000000..ac5bb6bb1 --- /dev/null +++ b/.licenses/arduino-create-agent/go/go.bug.st/serial/unixutils.dep.yml @@ -0,0 +1,50 @@ +--- +name: go.bug.st/serial/unixutils +version: v1.6.4 +type: go +summary: +homepage: https://pkg.go.dev/go.bug.st/serial/unixutils +license: bsd-3-clause +licenses: +- sources: serial@v1.6.4/LICENSE + text: |2+ + + Copyright (c) 2014-2024, Cristian Maglie. + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + + 3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + +- sources: serial@v1.6.4/README.md + text: |- + This software is released under the [BSD 3-clause license]. + + [contributors]: https://github.com/bugst/go-serial/graphs/contributors + [BSD 3-clause license]: https://github.com/bugst/go-serial/blob/master/LICENSE +notices: [] diff --git a/.licenses/arduino-create-agent/go/goa.design/goa/v3/http.dep.yml b/.licenses/arduino-create-agent/go/goa.design/goa/v3/http.dep.yml new file mode 100644 index 000000000..5b8731876 --- /dev/null +++ b/.licenses/arduino-create-agent/go/goa.design/goa/v3/http.dep.yml @@ -0,0 +1,33 @@ +--- +name: goa.design/goa/v3/http +version: v3.16.1 +type: go +summary: Package http contains HTTP specific constructs that complement the code generated + by Goa. +homepage: https://pkg.go.dev/goa.design/goa/v3/http +license: mit +licenses: +- sources: v3@v3.16.1/LICENSE + text: | + The MIT License (MIT) + + Copyright (c) 2015 Raphael Simon and goa Contributors + + 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. +notices: [] diff --git a/.licenses/arduino-create-agent/go/goa.design/goa/v3/http/middleware.dep.yml b/.licenses/arduino-create-agent/go/goa.design/goa/v3/http/middleware.dep.yml new file mode 100644 index 000000000..193108077 --- /dev/null +++ b/.licenses/arduino-create-agent/go/goa.design/goa/v3/http/middleware.dep.yml @@ -0,0 +1,34 @@ +--- +name: goa.design/goa/v3/http/middleware +version: v3.16.1 +type: go +summary: Package middleware contains HTTP middlewares that wrap a HTTP handler to + provide ancilliary functionality such as capturing HTTP details into the request + context or printing debug information on incoming requests. +homepage: https://pkg.go.dev/goa.design/goa/v3/http/middleware +license: mit +licenses: +- sources: v3@v3.16.1/LICENSE + text: | + The MIT License (MIT) + + Copyright (c) 2015 Raphael Simon and goa Contributors + + 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. +notices: [] diff --git a/.licenses/arduino-create-agent/go/goa.design/goa/v3/middleware.dep.yml b/.licenses/arduino-create-agent/go/goa.design/goa/v3/middleware.dep.yml new file mode 100644 index 000000000..f84516f4f --- /dev/null +++ b/.licenses/arduino-create-agent/go/goa.design/goa/v3/middleware.dep.yml @@ -0,0 +1,32 @@ +--- +name: goa.design/goa/v3/middleware +version: v3.16.1 +type: go +summary: Package middleware contains transport independent middlewares. +homepage: https://pkg.go.dev/goa.design/goa/v3/middleware +license: mit +licenses: +- sources: v3@v3.16.1/LICENSE + text: | + The MIT License (MIT) + + Copyright (c) 2015 Raphael Simon and goa Contributors + + 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. +notices: [] diff --git a/.licenses/arduino-create-agent/go/goa.design/goa/v3/pkg.dep.yml b/.licenses/arduino-create-agent/go/goa.design/goa/v3/pkg.dep.yml new file mode 100644 index 000000000..fc7a78b9d --- /dev/null +++ b/.licenses/arduino-create-agent/go/goa.design/goa/v3/pkg.dep.yml @@ -0,0 +1,34 @@ +--- +name: goa.design/goa/v3/pkg +version: v3.16.1 +type: go +summary: Package goa implements a Go framework for writing microservices that promotes + best practice by providing a single source of truth from which server code, client + code, and documentation is derived. +homepage: https://pkg.go.dev/goa.design/goa/v3/pkg +license: mit +licenses: +- sources: v3@v3.16.1/LICENSE + text: | + The MIT License (MIT) + + Copyright (c) 2015 Raphael Simon and goa Contributors + + 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. +notices: [] diff --git a/.licenses/arduino-create-agent/go/golang.org/x/crypto/argon2.dep.yml b/.licenses/arduino-create-agent/go/golang.org/x/crypto/argon2.dep.yml new file mode 100644 index 000000000..cc73f399f --- /dev/null +++ b/.licenses/arduino-create-agent/go/golang.org/x/crypto/argon2.dep.yml @@ -0,0 +1,62 @@ +--- +name: golang.org/x/crypto/argon2 +version: v0.23.0 +type: go +summary: Package argon2 implements the key derivation function Argon2. +homepage: https://pkg.go.dev/golang.org/x/crypto/argon2 +license: bsd-3-clause +licenses: +- sources: crypto@v0.23.0/LICENSE + text: | + Copyright (c) 2009 The Go Authors. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following disclaimer + in the documentation and/or other materials provided with the + distribution. + * Neither the name of Google Inc. nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +- sources: crypto@v0.23.0/PATENTS + text: | + Additional IP Rights Grant (Patents) + + "This implementation" means the copyrightable works distributed by + Google as part of the Go project. + + Google hereby grants to You a perpetual, worldwide, non-exclusive, + no-charge, royalty-free, irrevocable (except as stated in this section) + patent license to make, have made, use, offer to sell, sell, import, + transfer and otherwise run, modify and propagate the contents of this + implementation of Go, where such license applies only to those patent + claims, both currently owned or controlled by Google and acquired in + the future, licensable by Google that are necessarily infringed by this + implementation of Go. This grant does not include claims that would be + infringed only as a consequence of further modification of this + implementation. If you or your agent or exclusive licensee institute or + order or agree to the institution of patent litigation against any + entity (including a cross-claim or counterclaim in a lawsuit) alleging + that this implementation of Go or any code incorporated within this + implementation of Go constitutes direct or contributory patent + infringement, or inducement of patent infringement, then any patent + rights granted to you under this License for this implementation of Go + shall terminate as of the date such litigation is filed. +notices: [] diff --git a/.licenses/arduino-create-agent/go/golang.org/x/crypto/blake2b.dep.yml b/.licenses/arduino-create-agent/go/golang.org/x/crypto/blake2b.dep.yml new file mode 100644 index 000000000..ef8816c59 --- /dev/null +++ b/.licenses/arduino-create-agent/go/golang.org/x/crypto/blake2b.dep.yml @@ -0,0 +1,63 @@ +--- +name: golang.org/x/crypto/blake2b +version: v0.23.0 +type: go +summary: Package blake2b implements the BLAKE2b hash algorithm defined by RFC 7693 + and the extendable output function (XOF) BLAKE2Xb. +homepage: https://pkg.go.dev/golang.org/x/crypto/blake2b +license: bsd-3-clause +licenses: +- sources: crypto@v0.23.0/LICENSE + text: | + Copyright (c) 2009 The Go Authors. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following disclaimer + in the documentation and/or other materials provided with the + distribution. + * Neither the name of Google Inc. nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +- sources: crypto@v0.23.0/PATENTS + text: | + Additional IP Rights Grant (Patents) + + "This implementation" means the copyrightable works distributed by + Google as part of the Go project. + + Google hereby grants to You a perpetual, worldwide, non-exclusive, + no-charge, royalty-free, irrevocable (except as stated in this section) + patent license to make, have made, use, offer to sell, sell, import, + transfer and otherwise run, modify and propagate the contents of this + implementation of Go, where such license applies only to those patent + claims, both currently owned or controlled by Google and acquired in + the future, licensable by Google that are necessarily infringed by this + implementation of Go. This grant does not include claims that would be + infringed only as a consequence of further modification of this + implementation. If you or your agent or exclusive licensee institute or + order or agree to the institution of patent litigation against any + entity (including a cross-claim or counterclaim in a lawsuit) alleging + that this implementation of Go or any code incorporated within this + implementation of Go constitutes direct or contributory patent + infringement, or inducement of patent infringement, then any patent + rights granted to you under this License for this implementation of Go + shall terminate as of the date such litigation is filed. +notices: [] diff --git a/.licenses/arduino-create-agent/go/golang.org/x/crypto/cast5.dep.yml b/.licenses/arduino-create-agent/go/golang.org/x/crypto/cast5.dep.yml new file mode 100644 index 000000000..369aae2e1 --- /dev/null +++ b/.licenses/arduino-create-agent/go/golang.org/x/crypto/cast5.dep.yml @@ -0,0 +1,62 @@ +--- +name: golang.org/x/crypto/cast5 +version: v0.23.0 +type: go +summary: Package cast5 implements CAST5, as defined in RFC 2144. +homepage: https://pkg.go.dev/golang.org/x/crypto/cast5 +license: bsd-3-clause +licenses: +- sources: crypto@v0.23.0/LICENSE + text: | + Copyright (c) 2009 The Go Authors. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following disclaimer + in the documentation and/or other materials provided with the + distribution. + * Neither the name of Google Inc. nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +- sources: crypto@v0.23.0/PATENTS + text: | + Additional IP Rights Grant (Patents) + + "This implementation" means the copyrightable works distributed by + Google as part of the Go project. + + Google hereby grants to You a perpetual, worldwide, non-exclusive, + no-charge, royalty-free, irrevocable (except as stated in this section) + patent license to make, have made, use, offer to sell, sell, import, + transfer and otherwise run, modify and propagate the contents of this + implementation of Go, where such license applies only to those patent + claims, both currently owned or controlled by Google and acquired in + the future, licensable by Google that are necessarily infringed by this + implementation of Go. This grant does not include claims that would be + infringed only as a consequence of further modification of this + implementation. If you or your agent or exclusive licensee institute or + order or agree to the institution of patent litigation against any + entity (including a cross-claim or counterclaim in a lawsuit) alleging + that this implementation of Go or any code incorporated within this + implementation of Go constitutes direct or contributory patent + infringement, or inducement of patent infringement, then any patent + rights granted to you under this License for this implementation of Go + shall terminate as of the date such litigation is filed. +notices: [] diff --git a/.licenses/arduino-create-agent/go/golang.org/x/net/html.dep.yml b/.licenses/arduino-create-agent/go/golang.org/x/net/html.dep.yml new file mode 100644 index 000000000..be34abd7f --- /dev/null +++ b/.licenses/arduino-create-agent/go/golang.org/x/net/html.dep.yml @@ -0,0 +1,62 @@ +--- +name: golang.org/x/net/html +version: v0.25.0 +type: go +summary: Package html implements an HTML5-compliant tokenizer and parser. +homepage: https://pkg.go.dev/golang.org/x/net/html +license: other +licenses: +- sources: net@v0.25.0/LICENSE + text: | + Copyright (c) 2009 The Go Authors. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following disclaimer + in the documentation and/or other materials provided with the + distribution. + * Neither the name of Google Inc. nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +- sources: net@v0.25.0/PATENTS + text: | + Additional IP Rights Grant (Patents) + + "This implementation" means the copyrightable works distributed by + Google as part of the Go project. + + Google hereby grants to You a perpetual, worldwide, non-exclusive, + no-charge, royalty-free, irrevocable (except as stated in this section) + patent license to make, have made, use, offer to sell, sell, import, + transfer and otherwise run, modify and propagate the contents of this + implementation of Go, where such license applies only to those patent + claims, both currently owned or controlled by Google and acquired in + the future, licensable by Google that are necessarily infringed by this + implementation of Go. This grant does not include claims that would be + infringed only as a consequence of further modification of this + implementation. If you or your agent or exclusive licensee institute or + order or agree to the institution of patent litigation against any + entity (including a cross-claim or counterclaim in a lawsuit) alleging + that this implementation of Go or any code incorporated within this + implementation of Go constitutes direct or contributory patent + infringement, or inducement of patent infringement, then any patent + rights granted to you under this License for this implementation of Go + shall terminate as of the date such litigation is filed. +notices: [] diff --git a/.licenses/arduino-create-agent/go/golang.org/x/net/html/atom.dep.yml b/.licenses/arduino-create-agent/go/golang.org/x/net/html/atom.dep.yml new file mode 100644 index 000000000..49ddaa0f3 --- /dev/null +++ b/.licenses/arduino-create-agent/go/golang.org/x/net/html/atom.dep.yml @@ -0,0 +1,64 @@ +--- +name: golang.org/x/net/html/atom +version: v0.25.0 +type: go +summary: 'Package atom provides integer codes (also known as atoms) for a fixed set + of frequently occurring HTML strings: tag names and attribute keys such as "p" and + "id".' +homepage: https://pkg.go.dev/golang.org/x/net/html/atom +license: other +licenses: +- sources: net@v0.25.0/LICENSE + text: | + Copyright (c) 2009 The Go Authors. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following disclaimer + in the documentation and/or other materials provided with the + distribution. + * Neither the name of Google Inc. nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +- sources: net@v0.25.0/PATENTS + text: | + Additional IP Rights Grant (Patents) + + "This implementation" means the copyrightable works distributed by + Google as part of the Go project. + + Google hereby grants to You a perpetual, worldwide, non-exclusive, + no-charge, royalty-free, irrevocable (except as stated in this section) + patent license to make, have made, use, offer to sell, sell, import, + transfer and otherwise run, modify and propagate the contents of this + implementation of Go, where such license applies only to those patent + claims, both currently owned or controlled by Google and acquired in + the future, licensable by Google that are necessarily infringed by this + implementation of Go. This grant does not include claims that would be + infringed only as a consequence of further modification of this + implementation. If you or your agent or exclusive licensee institute or + order or agree to the institution of patent litigation against any + entity (including a cross-claim or counterclaim in a lawsuit) alleging + that this implementation of Go or any code incorporated within this + implementation of Go constitutes direct or contributory patent + infringement, or inducement of patent infringement, then any patent + rights granted to you under this License for this implementation of Go + shall terminate as of the date such litigation is filed. +notices: [] diff --git a/.licenses/arduino-create-agent/go/golang.org/x/net/http2.dep.yml b/.licenses/arduino-create-agent/go/golang.org/x/net/http2.dep.yml new file mode 100644 index 000000000..4e442b810 --- /dev/null +++ b/.licenses/arduino-create-agent/go/golang.org/x/net/http2.dep.yml @@ -0,0 +1,62 @@ +--- +name: golang.org/x/net/http2 +version: v0.25.0 +type: go +summary: Package http2 implements the HTTP/2 protocol. +homepage: https://pkg.go.dev/golang.org/x/net/http2 +license: bsd-3-clause +licenses: +- sources: net@v0.25.0/LICENSE + text: | + Copyright (c) 2009 The Go Authors. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following disclaimer + in the documentation and/or other materials provided with the + distribution. + * Neither the name of Google Inc. nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +- sources: net@v0.25.0/PATENTS + text: | + Additional IP Rights Grant (Patents) + + "This implementation" means the copyrightable works distributed by + Google as part of the Go project. + + Google hereby grants to You a perpetual, worldwide, non-exclusive, + no-charge, royalty-free, irrevocable (except as stated in this section) + patent license to make, have made, use, offer to sell, sell, import, + transfer and otherwise run, modify and propagate the contents of this + implementation of Go, where such license applies only to those patent + claims, both currently owned or controlled by Google and acquired in + the future, licensable by Google that are necessarily infringed by this + implementation of Go. This grant does not include claims that would be + infringed only as a consequence of further modification of this + implementation. If you or your agent or exclusive licensee institute or + order or agree to the institution of patent litigation against any + entity (including a cross-claim or counterclaim in a lawsuit) alleging + that this implementation of Go or any code incorporated within this + implementation of Go constitutes direct or contributory patent + infringement, or inducement of patent infringement, then any patent + rights granted to you under this License for this implementation of Go + shall terminate as of the date such litigation is filed. +notices: [] diff --git a/.licenses/arduino-create-agent/go/golang.org/x/net/http2/h2c.dep.yml b/.licenses/arduino-create-agent/go/golang.org/x/net/http2/h2c.dep.yml new file mode 100644 index 000000000..38586be25 --- /dev/null +++ b/.licenses/arduino-create-agent/go/golang.org/x/net/http2/h2c.dep.yml @@ -0,0 +1,62 @@ +--- +name: golang.org/x/net/http2/h2c +version: v0.25.0 +type: go +summary: Package h2c implements the unencrypted "h2c" form of HTTP/2. +homepage: https://pkg.go.dev/golang.org/x/net/http2/h2c +license: bsd-3-clause +licenses: +- sources: net@v0.25.0/LICENSE + text: | + Copyright (c) 2009 The Go Authors. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following disclaimer + in the documentation and/or other materials provided with the + distribution. + * Neither the name of Google Inc. nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +- sources: net@v0.25.0/PATENTS + text: | + Additional IP Rights Grant (Patents) + + "This implementation" means the copyrightable works distributed by + Google as part of the Go project. + + Google hereby grants to You a perpetual, worldwide, non-exclusive, + no-charge, royalty-free, irrevocable (except as stated in this section) + patent license to make, have made, use, offer to sell, sell, import, + transfer and otherwise run, modify and propagate the contents of this + implementation of Go, where such license applies only to those patent + claims, both currently owned or controlled by Google and acquired in + the future, licensable by Google that are necessarily infringed by this + implementation of Go. This grant does not include claims that would be + infringed only as a consequence of further modification of this + implementation. If you or your agent or exclusive licensee institute or + order or agree to the institution of patent litigation against any + entity (including a cross-claim or counterclaim in a lawsuit) alleging + that this implementation of Go or any code incorporated within this + implementation of Go constitutes direct or contributory patent + infringement, or inducement of patent infringement, then any patent + rights granted to you under this License for this implementation of Go + shall terminate as of the date such litigation is filed. +notices: [] diff --git a/.licenses/arduino-create-agent/go/golang.org/x/net/internal/socks.dep.yml b/.licenses/arduino-create-agent/go/golang.org/x/net/internal/socks.dep.yml new file mode 100644 index 000000000..5e49f37c5 --- /dev/null +++ b/.licenses/arduino-create-agent/go/golang.org/x/net/internal/socks.dep.yml @@ -0,0 +1,62 @@ +--- +name: golang.org/x/net/internal/socks +version: v0.25.0 +type: go +summary: Package socks provides a SOCKS version 5 client implementation. +homepage: https://pkg.go.dev/golang.org/x/net/internal/socks +license: other +licenses: +- sources: net@v0.25.0/LICENSE + text: | + Copyright (c) 2009 The Go Authors. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following disclaimer + in the documentation and/or other materials provided with the + distribution. + * Neither the name of Google Inc. nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +- sources: net@v0.25.0/PATENTS + text: | + Additional IP Rights Grant (Patents) + + "This implementation" means the copyrightable works distributed by + Google as part of the Go project. + + Google hereby grants to You a perpetual, worldwide, non-exclusive, + no-charge, royalty-free, irrevocable (except as stated in this section) + patent license to make, have made, use, offer to sell, sell, import, + transfer and otherwise run, modify and propagate the contents of this + implementation of Go, where such license applies only to those patent + claims, both currently owned or controlled by Google and acquired in + the future, licensable by Google that are necessarily infringed by this + implementation of Go. This grant does not include claims that would be + infringed only as a consequence of further modification of this + implementation. If you or your agent or exclusive licensee institute or + order or agree to the institution of patent litigation against any + entity (including a cross-claim or counterclaim in a lawsuit) alleging + that this implementation of Go or any code incorporated within this + implementation of Go constitutes direct or contributory patent + infringement, or inducement of patent infringement, then any patent + rights granted to you under this License for this implementation of Go + shall terminate as of the date such litigation is filed. +notices: [] diff --git a/.licenses/arduino-create-agent/go/golang.org/x/net/proxy.dep.yml b/.licenses/arduino-create-agent/go/golang.org/x/net/proxy.dep.yml new file mode 100644 index 000000000..a87c7e359 --- /dev/null +++ b/.licenses/arduino-create-agent/go/golang.org/x/net/proxy.dep.yml @@ -0,0 +1,63 @@ +--- +name: golang.org/x/net/proxy +version: v0.25.0 +type: go +summary: Package proxy provides support for a variety of protocols to proxy network + data. +homepage: https://pkg.go.dev/golang.org/x/net/proxy +license: other +licenses: +- sources: net@v0.25.0/LICENSE + text: | + Copyright (c) 2009 The Go Authors. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following disclaimer + in the documentation and/or other materials provided with the + distribution. + * Neither the name of Google Inc. nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +- sources: net@v0.25.0/PATENTS + text: | + Additional IP Rights Grant (Patents) + + "This implementation" means the copyrightable works distributed by + Google as part of the Go project. + + Google hereby grants to You a perpetual, worldwide, non-exclusive, + no-charge, royalty-free, irrevocable (except as stated in this section) + patent license to make, have made, use, offer to sell, sell, import, + transfer and otherwise run, modify and propagate the contents of this + implementation of Go, where such license applies only to those patent + claims, both currently owned or controlled by Google and acquired in + the future, licensable by Google that are necessarily infringed by this + implementation of Go. This grant does not include claims that would be + infringed only as a consequence of further modification of this + implementation. If you or your agent or exclusive licensee institute or + order or agree to the institution of patent litigation against any + entity (including a cross-claim or counterclaim in a lawsuit) alleging + that this implementation of Go or any code incorporated within this + implementation of Go constitutes direct or contributory patent + infringement, or inducement of patent infringement, then any patent + rights granted to you under this License for this implementation of Go + shall terminate as of the date such litigation is filed. +notices: [] diff --git a/.licenses/arduino-create-agent/go/golang.org/x/sys/unix.dep.yml b/.licenses/arduino-create-agent/go/golang.org/x/sys/unix.dep.yml new file mode 100644 index 000000000..5c4780a8d --- /dev/null +++ b/.licenses/arduino-create-agent/go/golang.org/x/sys/unix.dep.yml @@ -0,0 +1,62 @@ +--- +name: golang.org/x/sys/unix +version: v0.23.0 +type: go +summary: Package unix contains an interface to the low-level operating system primitives. +homepage: https://pkg.go.dev/golang.org/x/sys/unix +license: other +licenses: +- sources: sys@v0.23.0/LICENSE + text: | + Copyright 2009 The Go Authors. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following disclaimer + in the documentation and/or other materials provided with the + distribution. + * Neither the name of Google LLC nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +- sources: sys@v0.23.0/PATENTS + text: | + Additional IP Rights Grant (Patents) + + "This implementation" means the copyrightable works distributed by + Google as part of the Go project. + + Google hereby grants to You a perpetual, worldwide, non-exclusive, + no-charge, royalty-free, irrevocable (except as stated in this section) + patent license to make, have made, use, offer to sell, sell, import, + transfer and otherwise run, modify and propagate the contents of this + implementation of Go, where such license applies only to those patent + claims, both currently owned or controlled by Google and acquired in + the future, licensable by Google that are necessarily infringed by this + implementation of Go. This grant does not include claims that would be + infringed only as a consequence of further modification of this + implementation. If you or your agent or exclusive licensee institute or + order or agree to the institution of patent litigation against any + entity (including a cross-claim or counterclaim in a lawsuit) alleging + that this implementation of Go or any code incorporated within this + implementation of Go constitutes direct or contributory patent + infringement, or inducement of patent infringement, then any patent + rights granted to you under this License for this implementation of Go + shall terminate as of the date such litigation is filed. +notices: [] diff --git a/.licenses/arduino-create-agent/go/golang.org/x/text/internal/language.dep.yml b/.licenses/arduino-create-agent/go/golang.org/x/text/internal/language.dep.yml new file mode 100644 index 000000000..4a392d8cf --- /dev/null +++ b/.licenses/arduino-create-agent/go/golang.org/x/text/internal/language.dep.yml @@ -0,0 +1,62 @@ +--- +name: golang.org/x/text/internal/language +version: v0.15.0 +type: go +summary: +homepage: https://pkg.go.dev/golang.org/x/text/internal/language +license: bsd-3-clause +licenses: +- sources: text@v0.15.0/LICENSE + text: | + Copyright (c) 2009 The Go Authors. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following disclaimer + in the documentation and/or other materials provided with the + distribution. + * Neither the name of Google Inc. nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +- sources: text@v0.15.0/PATENTS + text: | + Additional IP Rights Grant (Patents) + + "This implementation" means the copyrightable works distributed by + Google as part of the Go project. + + Google hereby grants to You a perpetual, worldwide, non-exclusive, + no-charge, royalty-free, irrevocable (except as stated in this section) + patent license to make, have made, use, offer to sell, sell, import, + transfer and otherwise run, modify and propagate the contents of this + implementation of Go, where such license applies only to those patent + claims, both currently owned or controlled by Google and acquired in + the future, licensable by Google that are necessarily infringed by this + implementation of Go. This grant does not include claims that would be + infringed only as a consequence of further modification of this + implementation. If you or your agent or exclusive licensee institute or + order or agree to the institution of patent litigation against any + entity (including a cross-claim or counterclaim in a lawsuit) alleging + that this implementation of Go or any code incorporated within this + implementation of Go constitutes direct or contributory patent + infringement, or inducement of patent infringement, then any patent + rights granted to you under this License for this implementation of Go + shall terminate as of the date such litigation is filed. +notices: [] diff --git a/.licenses/arduino-create-agent/go/golang.org/x/text/internal/language/compact.dep.yml b/.licenses/arduino-create-agent/go/golang.org/x/text/internal/language/compact.dep.yml new file mode 100644 index 000000000..d6e0022d2 --- /dev/null +++ b/.licenses/arduino-create-agent/go/golang.org/x/text/internal/language/compact.dep.yml @@ -0,0 +1,62 @@ +--- +name: golang.org/x/text/internal/language/compact +version: v0.15.0 +type: go +summary: Package compact defines a compact representation of language tags. +homepage: https://pkg.go.dev/golang.org/x/text/internal/language/compact +license: bsd-3-clause +licenses: +- sources: text@v0.15.0/LICENSE + text: | + Copyright (c) 2009 The Go Authors. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following disclaimer + in the documentation and/or other materials provided with the + distribution. + * Neither the name of Google Inc. nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +- sources: text@v0.15.0/PATENTS + text: | + Additional IP Rights Grant (Patents) + + "This implementation" means the copyrightable works distributed by + Google as part of the Go project. + + Google hereby grants to You a perpetual, worldwide, non-exclusive, + no-charge, royalty-free, irrevocable (except as stated in this section) + patent license to make, have made, use, offer to sell, sell, import, + transfer and otherwise run, modify and propagate the contents of this + implementation of Go, where such license applies only to those patent + claims, both currently owned or controlled by Google and acquired in + the future, licensable by Google that are necessarily infringed by this + implementation of Go. This grant does not include claims that would be + infringed only as a consequence of further modification of this + implementation. If you or your agent or exclusive licensee institute or + order or agree to the institution of patent litigation against any + entity (including a cross-claim or counterclaim in a lawsuit) alleging + that this implementation of Go or any code incorporated within this + implementation of Go constitutes direct or contributory patent + infringement, or inducement of patent infringement, then any patent + rights granted to you under this License for this implementation of Go + shall terminate as of the date such litigation is filed. +notices: [] diff --git a/.licenses/arduino-create-agent/go/golang.org/x/text/internal/tag.dep.yml b/.licenses/arduino-create-agent/go/golang.org/x/text/internal/tag.dep.yml new file mode 100644 index 000000000..f5b00b4eb --- /dev/null +++ b/.licenses/arduino-create-agent/go/golang.org/x/text/internal/tag.dep.yml @@ -0,0 +1,62 @@ +--- +name: golang.org/x/text/internal/tag +version: v0.15.0 +type: go +summary: Package tag contains functionality handling tags and related data. +homepage: https://pkg.go.dev/golang.org/x/text/internal/tag +license: bsd-3-clause +licenses: +- sources: text@v0.15.0/LICENSE + text: | + Copyright (c) 2009 The Go Authors. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following disclaimer + in the documentation and/or other materials provided with the + distribution. + * Neither the name of Google Inc. nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +- sources: text@v0.15.0/PATENTS + text: | + Additional IP Rights Grant (Patents) + + "This implementation" means the copyrightable works distributed by + Google as part of the Go project. + + Google hereby grants to You a perpetual, worldwide, non-exclusive, + no-charge, royalty-free, irrevocable (except as stated in this section) + patent license to make, have made, use, offer to sell, sell, import, + transfer and otherwise run, modify and propagate the contents of this + implementation of Go, where such license applies only to those patent + claims, both currently owned or controlled by Google and acquired in + the future, licensable by Google that are necessarily infringed by this + implementation of Go. This grant does not include claims that would be + infringed only as a consequence of further modification of this + implementation. If you or your agent or exclusive licensee institute or + order or agree to the institution of patent litigation against any + entity (including a cross-claim or counterclaim in a lawsuit) alleging + that this implementation of Go or any code incorporated within this + implementation of Go constitutes direct or contributory patent + infringement, or inducement of patent infringement, then any patent + rights granted to you under this License for this implementation of Go + shall terminate as of the date such litigation is filed. +notices: [] diff --git a/.licenses/arduino-create-agent/go/golang.org/x/text/language.dep.yml b/.licenses/arduino-create-agent/go/golang.org/x/text/language.dep.yml new file mode 100644 index 000000000..ee9e1f0d0 --- /dev/null +++ b/.licenses/arduino-create-agent/go/golang.org/x/text/language.dep.yml @@ -0,0 +1,62 @@ +--- +name: golang.org/x/text/language +version: v0.15.0 +type: go +summary: Package language implements BCP 47 language tags and related functionality. +homepage: https://pkg.go.dev/golang.org/x/text/language +license: bsd-3-clause +licenses: +- sources: text@v0.15.0/LICENSE + text: | + Copyright (c) 2009 The Go Authors. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following disclaimer + in the documentation and/or other materials provided with the + distribution. + * Neither the name of Google Inc. nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +- sources: text@v0.15.0/PATENTS + text: | + Additional IP Rights Grant (Patents) + + "This implementation" means the copyrightable works distributed by + Google as part of the Go project. + + Google hereby grants to You a perpetual, worldwide, non-exclusive, + no-charge, royalty-free, irrevocable (except as stated in this section) + patent license to make, have made, use, offer to sell, sell, import, + transfer and otherwise run, modify and propagate the contents of this + implementation of Go, where such license applies only to those patent + claims, both currently owned or controlled by Google and acquired in + the future, licensable by Google that are necessarily infringed by this + implementation of Go. This grant does not include claims that would be + infringed only as a consequence of further modification of this + implementation. If you or your agent or exclusive licensee institute or + order or agree to the institution of patent litigation against any + entity (including a cross-claim or counterclaim in a lawsuit) alleging + that this implementation of Go or any code incorporated within this + implementation of Go constitutes direct or contributory patent + infringement, or inducement of patent infringement, then any patent + rights granted to you under this License for this implementation of Go + shall terminate as of the date such litigation is filed. +notices: [] diff --git a/.licenses/arduino-create-agent/go/google.golang.org/protobuf/encoding/protowire.dep.yml b/.licenses/arduino-create-agent/go/google.golang.org/protobuf/encoding/protowire.dep.yml new file mode 100644 index 000000000..d935d1df6 --- /dev/null +++ b/.licenses/arduino-create-agent/go/google.golang.org/protobuf/encoding/protowire.dep.yml @@ -0,0 +1,62 @@ +--- +name: google.golang.org/protobuf/encoding/protowire +version: v1.34.1 +type: go +summary: Package protowire parses and formats the raw wire encoding. +homepage: https://pkg.go.dev/google.golang.org/protobuf/encoding/protowire +license: bsd-3-clause +licenses: +- sources: protobuf@v1.34.1/LICENSE + text: | + Copyright (c) 2018 The Go Authors. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following disclaimer + in the documentation and/or other materials provided with the + distribution. + * Neither the name of Google Inc. nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +- sources: protobuf@v1.34.1/PATENTS + text: | + Additional IP Rights Grant (Patents) + + "This implementation" means the copyrightable works distributed by + Google as part of the Go project. + + Google hereby grants to You a perpetual, worldwide, non-exclusive, + no-charge, royalty-free, irrevocable (except as stated in this section) + patent license to make, have made, use, offer to sell, sell, import, + transfer and otherwise run, modify and propagate the contents of this + implementation of Go, where such license applies only to those patent + claims, both currently owned or controlled by Google and acquired in + the future, licensable by Google that are necessarily infringed by this + implementation of Go. This grant does not include claims that would be + infringed only as a consequence of further modification of this + implementation. If you or your agent or exclusive licensee institute or + order or agree to the institution of patent litigation against any + entity (including a cross-claim or counterclaim in a lawsuit) alleging + that this implementation of Go or any code incorporated within this + implementation of Go constitutes direct or contributory patent + infringement, or inducement of patent infringement, then any patent + rights granted to you under this License for this implementation of Go + shall terminate as of the date such litigation is filed. +notices: [] diff --git a/.licenses/arduino-create-agent/go/google.golang.org/protobuf/internal/detrand.dep.yml b/.licenses/arduino-create-agent/go/google.golang.org/protobuf/internal/detrand.dep.yml new file mode 100644 index 000000000..1b4a97a55 --- /dev/null +++ b/.licenses/arduino-create-agent/go/google.golang.org/protobuf/internal/detrand.dep.yml @@ -0,0 +1,62 @@ +--- +name: google.golang.org/protobuf/internal/detrand +version: v1.34.1 +type: go +summary: Package detrand provides deterministically random functionality. +homepage: https://pkg.go.dev/google.golang.org/protobuf/internal/detrand +license: bsd-3-clause +licenses: +- sources: protobuf@v1.34.1/LICENSE + text: | + Copyright (c) 2018 The Go Authors. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following disclaimer + in the documentation and/or other materials provided with the + distribution. + * Neither the name of Google Inc. nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +- sources: protobuf@v1.34.1/PATENTS + text: | + Additional IP Rights Grant (Patents) + + "This implementation" means the copyrightable works distributed by + Google as part of the Go project. + + Google hereby grants to You a perpetual, worldwide, non-exclusive, + no-charge, royalty-free, irrevocable (except as stated in this section) + patent license to make, have made, use, offer to sell, sell, import, + transfer and otherwise run, modify and propagate the contents of this + implementation of Go, where such license applies only to those patent + claims, both currently owned or controlled by Google and acquired in + the future, licensable by Google that are necessarily infringed by this + implementation of Go. This grant does not include claims that would be + infringed only as a consequence of further modification of this + implementation. If you or your agent or exclusive licensee institute or + order or agree to the institution of patent litigation against any + entity (including a cross-claim or counterclaim in a lawsuit) alleging + that this implementation of Go or any code incorporated within this + implementation of Go constitutes direct or contributory patent + infringement, or inducement of patent infringement, then any patent + rights granted to you under this License for this implementation of Go + shall terminate as of the date such litigation is filed. +notices: [] diff --git a/.licenses/arduino-create-agent/go/google.golang.org/protobuf/internal/encoding/messageset.dep.yml b/.licenses/arduino-create-agent/go/google.golang.org/protobuf/internal/encoding/messageset.dep.yml new file mode 100644 index 000000000..8cf22dded --- /dev/null +++ b/.licenses/arduino-create-agent/go/google.golang.org/protobuf/internal/encoding/messageset.dep.yml @@ -0,0 +1,62 @@ +--- +name: google.golang.org/protobuf/internal/encoding/messageset +version: v1.34.1 +type: go +summary: Package messageset encodes and decodes the obsolete MessageSet wire format. +homepage: https://pkg.go.dev/google.golang.org/protobuf/internal/encoding/messageset +license: bsd-3-clause +licenses: +- sources: protobuf@v1.34.1/LICENSE + text: | + Copyright (c) 2018 The Go Authors. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following disclaimer + in the documentation and/or other materials provided with the + distribution. + * Neither the name of Google Inc. nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +- sources: protobuf@v1.34.1/PATENTS + text: | + Additional IP Rights Grant (Patents) + + "This implementation" means the copyrightable works distributed by + Google as part of the Go project. + + Google hereby grants to You a perpetual, worldwide, non-exclusive, + no-charge, royalty-free, irrevocable (except as stated in this section) + patent license to make, have made, use, offer to sell, sell, import, + transfer and otherwise run, modify and propagate the contents of this + implementation of Go, where such license applies only to those patent + claims, both currently owned or controlled by Google and acquired in + the future, licensable by Google that are necessarily infringed by this + implementation of Go. This grant does not include claims that would be + infringed only as a consequence of further modification of this + implementation. If you or your agent or exclusive licensee institute or + order or agree to the institution of patent litigation against any + entity (including a cross-claim or counterclaim in a lawsuit) alleging + that this implementation of Go or any code incorporated within this + implementation of Go constitutes direct or contributory patent + infringement, or inducement of patent infringement, then any patent + rights granted to you under this License for this implementation of Go + shall terminate as of the date such litigation is filed. +notices: [] diff --git a/.licenses/arduino-create-agent/go/google.golang.org/protobuf/internal/errors.dep.yml b/.licenses/arduino-create-agent/go/google.golang.org/protobuf/internal/errors.dep.yml new file mode 100644 index 000000000..ee63cc3d2 --- /dev/null +++ b/.licenses/arduino-create-agent/go/google.golang.org/protobuf/internal/errors.dep.yml @@ -0,0 +1,62 @@ +--- +name: google.golang.org/protobuf/internal/errors +version: v1.34.1 +type: go +summary: Package errors implements functions to manipulate errors. +homepage: https://pkg.go.dev/google.golang.org/protobuf/internal/errors +license: bsd-3-clause +licenses: +- sources: protobuf@v1.34.1/LICENSE + text: | + Copyright (c) 2018 The Go Authors. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following disclaimer + in the documentation and/or other materials provided with the + distribution. + * Neither the name of Google Inc. nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +- sources: protobuf@v1.34.1/PATENTS + text: | + Additional IP Rights Grant (Patents) + + "This implementation" means the copyrightable works distributed by + Google as part of the Go project. + + Google hereby grants to You a perpetual, worldwide, non-exclusive, + no-charge, royalty-free, irrevocable (except as stated in this section) + patent license to make, have made, use, offer to sell, sell, import, + transfer and otherwise run, modify and propagate the contents of this + implementation of Go, where such license applies only to those patent + claims, both currently owned or controlled by Google and acquired in + the future, licensable by Google that are necessarily infringed by this + implementation of Go. This grant does not include claims that would be + infringed only as a consequence of further modification of this + implementation. If you or your agent or exclusive licensee institute or + order or agree to the institution of patent litigation against any + entity (including a cross-claim or counterclaim in a lawsuit) alleging + that this implementation of Go or any code incorporated within this + implementation of Go constitutes direct or contributory patent + infringement, or inducement of patent infringement, then any patent + rights granted to you under this License for this implementation of Go + shall terminate as of the date such litigation is filed. +notices: [] diff --git a/.licenses/arduino-create-agent/go/google.golang.org/protobuf/internal/flags.dep.yml b/.licenses/arduino-create-agent/go/google.golang.org/protobuf/internal/flags.dep.yml new file mode 100644 index 000000000..4ad5ad854 --- /dev/null +++ b/.licenses/arduino-create-agent/go/google.golang.org/protobuf/internal/flags.dep.yml @@ -0,0 +1,62 @@ +--- +name: google.golang.org/protobuf/internal/flags +version: v1.34.1 +type: go +summary: Package flags provides a set of flags controlled by build tags. +homepage: https://pkg.go.dev/google.golang.org/protobuf/internal/flags +license: bsd-3-clause +licenses: +- sources: protobuf@v1.34.1/LICENSE + text: | + Copyright (c) 2018 The Go Authors. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following disclaimer + in the documentation and/or other materials provided with the + distribution. + * Neither the name of Google Inc. nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +- sources: protobuf@v1.34.1/PATENTS + text: | + Additional IP Rights Grant (Patents) + + "This implementation" means the copyrightable works distributed by + Google as part of the Go project. + + Google hereby grants to You a perpetual, worldwide, non-exclusive, + no-charge, royalty-free, irrevocable (except as stated in this section) + patent license to make, have made, use, offer to sell, sell, import, + transfer and otherwise run, modify and propagate the contents of this + implementation of Go, where such license applies only to those patent + claims, both currently owned or controlled by Google and acquired in + the future, licensable by Google that are necessarily infringed by this + implementation of Go. This grant does not include claims that would be + infringed only as a consequence of further modification of this + implementation. If you or your agent or exclusive licensee institute or + order or agree to the institution of patent litigation against any + entity (including a cross-claim or counterclaim in a lawsuit) alleging + that this implementation of Go or any code incorporated within this + implementation of Go constitutes direct or contributory patent + infringement, or inducement of patent infringement, then any patent + rights granted to you under this License for this implementation of Go + shall terminate as of the date such litigation is filed. +notices: [] diff --git a/.licenses/arduino-create-agent/go/google.golang.org/protobuf/internal/genid.dep.yml b/.licenses/arduino-create-agent/go/google.golang.org/protobuf/internal/genid.dep.yml new file mode 100644 index 000000000..74669222b --- /dev/null +++ b/.licenses/arduino-create-agent/go/google.golang.org/protobuf/internal/genid.dep.yml @@ -0,0 +1,63 @@ +--- +name: google.golang.org/protobuf/internal/genid +version: v1.34.1 +type: go +summary: Package genid contains constants for declarations in descriptor.proto and + the well-known types. +homepage: https://pkg.go.dev/google.golang.org/protobuf/internal/genid +license: bsd-3-clause +licenses: +- sources: protobuf@v1.34.1/LICENSE + text: | + Copyright (c) 2018 The Go Authors. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following disclaimer + in the documentation and/or other materials provided with the + distribution. + * Neither the name of Google Inc. nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +- sources: protobuf@v1.34.1/PATENTS + text: | + Additional IP Rights Grant (Patents) + + "This implementation" means the copyrightable works distributed by + Google as part of the Go project. + + Google hereby grants to You a perpetual, worldwide, non-exclusive, + no-charge, royalty-free, irrevocable (except as stated in this section) + patent license to make, have made, use, offer to sell, sell, import, + transfer and otherwise run, modify and propagate the contents of this + implementation of Go, where such license applies only to those patent + claims, both currently owned or controlled by Google and acquired in + the future, licensable by Google that are necessarily infringed by this + implementation of Go. This grant does not include claims that would be + infringed only as a consequence of further modification of this + implementation. If you or your agent or exclusive licensee institute or + order or agree to the institution of patent litigation against any + entity (including a cross-claim or counterclaim in a lawsuit) alleging + that this implementation of Go or any code incorporated within this + implementation of Go constitutes direct or contributory patent + infringement, or inducement of patent infringement, then any patent + rights granted to you under this License for this implementation of Go + shall terminate as of the date such litigation is filed. +notices: [] diff --git a/.licenses/arduino-create-agent/go/google.golang.org/protobuf/internal/order.dep.yml b/.licenses/arduino-create-agent/go/google.golang.org/protobuf/internal/order.dep.yml new file mode 100644 index 000000000..43e239a6b --- /dev/null +++ b/.licenses/arduino-create-agent/go/google.golang.org/protobuf/internal/order.dep.yml @@ -0,0 +1,62 @@ +--- +name: google.golang.org/protobuf/internal/order +version: v1.34.1 +type: go +summary: Package order provides ordered access to messages and maps. +homepage: https://pkg.go.dev/google.golang.org/protobuf/internal/order +license: bsd-3-clause +licenses: +- sources: protobuf@v1.34.1/LICENSE + text: | + Copyright (c) 2018 The Go Authors. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following disclaimer + in the documentation and/or other materials provided with the + distribution. + * Neither the name of Google Inc. nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +- sources: protobuf@v1.34.1/PATENTS + text: | + Additional IP Rights Grant (Patents) + + "This implementation" means the copyrightable works distributed by + Google as part of the Go project. + + Google hereby grants to You a perpetual, worldwide, non-exclusive, + no-charge, royalty-free, irrevocable (except as stated in this section) + patent license to make, have made, use, offer to sell, sell, import, + transfer and otherwise run, modify and propagate the contents of this + implementation of Go, where such license applies only to those patent + claims, both currently owned or controlled by Google and acquired in + the future, licensable by Google that are necessarily infringed by this + implementation of Go. This grant does not include claims that would be + infringed only as a consequence of further modification of this + implementation. If you or your agent or exclusive licensee institute or + order or agree to the institution of patent litigation against any + entity (including a cross-claim or counterclaim in a lawsuit) alleging + that this implementation of Go or any code incorporated within this + implementation of Go constitutes direct or contributory patent + infringement, or inducement of patent infringement, then any patent + rights granted to you under this License for this implementation of Go + shall terminate as of the date such litigation is filed. +notices: [] diff --git a/.licenses/arduino-create-agent/go/google.golang.org/protobuf/internal/pragma.dep.yml b/.licenses/arduino-create-agent/go/google.golang.org/protobuf/internal/pragma.dep.yml new file mode 100644 index 000000000..b8f4d4e96 --- /dev/null +++ b/.licenses/arduino-create-agent/go/google.golang.org/protobuf/internal/pragma.dep.yml @@ -0,0 +1,63 @@ +--- +name: google.golang.org/protobuf/internal/pragma +version: v1.34.1 +type: go +summary: Package pragma provides types that can be embedded into a struct to statically + enforce or prevent certain language properties. +homepage: https://pkg.go.dev/google.golang.org/protobuf/internal/pragma +license: bsd-3-clause +licenses: +- sources: protobuf@v1.34.1/LICENSE + text: | + Copyright (c) 2018 The Go Authors. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following disclaimer + in the documentation and/or other materials provided with the + distribution. + * Neither the name of Google Inc. nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +- sources: protobuf@v1.34.1/PATENTS + text: | + Additional IP Rights Grant (Patents) + + "This implementation" means the copyrightable works distributed by + Google as part of the Go project. + + Google hereby grants to You a perpetual, worldwide, non-exclusive, + no-charge, royalty-free, irrevocable (except as stated in this section) + patent license to make, have made, use, offer to sell, sell, import, + transfer and otherwise run, modify and propagate the contents of this + implementation of Go, where such license applies only to those patent + claims, both currently owned or controlled by Google and acquired in + the future, licensable by Google that are necessarily infringed by this + implementation of Go. This grant does not include claims that would be + infringed only as a consequence of further modification of this + implementation. If you or your agent or exclusive licensee institute or + order or agree to the institution of patent litigation against any + entity (including a cross-claim or counterclaim in a lawsuit) alleging + that this implementation of Go or any code incorporated within this + implementation of Go constitutes direct or contributory patent + infringement, or inducement of patent infringement, then any patent + rights granted to you under this License for this implementation of Go + shall terminate as of the date such litigation is filed. +notices: [] diff --git a/.licenses/arduino-create-agent/go/google.golang.org/protobuf/internal/strs.dep.yml b/.licenses/arduino-create-agent/go/google.golang.org/protobuf/internal/strs.dep.yml new file mode 100644 index 000000000..a2137bf66 --- /dev/null +++ b/.licenses/arduino-create-agent/go/google.golang.org/protobuf/internal/strs.dep.yml @@ -0,0 +1,62 @@ +--- +name: google.golang.org/protobuf/internal/strs +version: v1.34.1 +type: go +summary: Package strs provides string manipulation functionality specific to protobuf. +homepage: https://pkg.go.dev/google.golang.org/protobuf/internal/strs +license: bsd-3-clause +licenses: +- sources: protobuf@v1.34.1/LICENSE + text: | + Copyright (c) 2018 The Go Authors. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following disclaimer + in the documentation and/or other materials provided with the + distribution. + * Neither the name of Google Inc. nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +- sources: protobuf@v1.34.1/PATENTS + text: | + Additional IP Rights Grant (Patents) + + "This implementation" means the copyrightable works distributed by + Google as part of the Go project. + + Google hereby grants to You a perpetual, worldwide, non-exclusive, + no-charge, royalty-free, irrevocable (except as stated in this section) + patent license to make, have made, use, offer to sell, sell, import, + transfer and otherwise run, modify and propagate the contents of this + implementation of Go, where such license applies only to those patent + claims, both currently owned or controlled by Google and acquired in + the future, licensable by Google that are necessarily infringed by this + implementation of Go. This grant does not include claims that would be + infringed only as a consequence of further modification of this + implementation. If you or your agent or exclusive licensee institute or + order or agree to the institution of patent litigation against any + entity (including a cross-claim or counterclaim in a lawsuit) alleging + that this implementation of Go or any code incorporated within this + implementation of Go constitutes direct or contributory patent + infringement, or inducement of patent infringement, then any patent + rights granted to you under this License for this implementation of Go + shall terminate as of the date such litigation is filed. +notices: [] diff --git a/.licenses/arduino-create-agent/go/google.golang.org/protobuf/proto.dep.yml b/.licenses/arduino-create-agent/go/google.golang.org/protobuf/proto.dep.yml new file mode 100644 index 000000000..bcbae244e --- /dev/null +++ b/.licenses/arduino-create-agent/go/google.golang.org/protobuf/proto.dep.yml @@ -0,0 +1,62 @@ +--- +name: google.golang.org/protobuf/proto +version: v1.34.1 +type: go +summary: Package proto provides functions operating on protocol buffer messages. +homepage: https://pkg.go.dev/google.golang.org/protobuf/proto +license: bsd-3-clause +licenses: +- sources: protobuf@v1.34.1/LICENSE + text: | + Copyright (c) 2018 The Go Authors. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following disclaimer + in the documentation and/or other materials provided with the + distribution. + * Neither the name of Google Inc. nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +- sources: protobuf@v1.34.1/PATENTS + text: | + Additional IP Rights Grant (Patents) + + "This implementation" means the copyrightable works distributed by + Google as part of the Go project. + + Google hereby grants to You a perpetual, worldwide, non-exclusive, + no-charge, royalty-free, irrevocable (except as stated in this section) + patent license to make, have made, use, offer to sell, sell, import, + transfer and otherwise run, modify and propagate the contents of this + implementation of Go, where such license applies only to those patent + claims, both currently owned or controlled by Google and acquired in + the future, licensable by Google that are necessarily infringed by this + implementation of Go. This grant does not include claims that would be + infringed only as a consequence of further modification of this + implementation. If you or your agent or exclusive licensee institute or + order or agree to the institution of patent litigation against any + entity (including a cross-claim or counterclaim in a lawsuit) alleging + that this implementation of Go or any code incorporated within this + implementation of Go constitutes direct or contributory patent + infringement, or inducement of patent infringement, then any patent + rights granted to you under this License for this implementation of Go + shall terminate as of the date such litigation is filed. +notices: [] diff --git a/.licenses/arduino-create-agent/go/google.golang.org/protobuf/reflect/protoreflect.dep.yml b/.licenses/arduino-create-agent/go/google.golang.org/protobuf/reflect/protoreflect.dep.yml new file mode 100644 index 000000000..d38294499 --- /dev/null +++ b/.licenses/arduino-create-agent/go/google.golang.org/protobuf/reflect/protoreflect.dep.yml @@ -0,0 +1,62 @@ +--- +name: google.golang.org/protobuf/reflect/protoreflect +version: v1.34.1 +type: go +summary: Package protoreflect provides interfaces to dynamically manipulate messages. +homepage: https://pkg.go.dev/google.golang.org/protobuf/reflect/protoreflect +license: bsd-3-clause +licenses: +- sources: protobuf@v1.34.1/LICENSE + text: | + Copyright (c) 2018 The Go Authors. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following disclaimer + in the documentation and/or other materials provided with the + distribution. + * Neither the name of Google Inc. nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +- sources: protobuf@v1.34.1/PATENTS + text: | + Additional IP Rights Grant (Patents) + + "This implementation" means the copyrightable works distributed by + Google as part of the Go project. + + Google hereby grants to You a perpetual, worldwide, non-exclusive, + no-charge, royalty-free, irrevocable (except as stated in this section) + patent license to make, have made, use, offer to sell, sell, import, + transfer and otherwise run, modify and propagate the contents of this + implementation of Go, where such license applies only to those patent + claims, both currently owned or controlled by Google and acquired in + the future, licensable by Google that are necessarily infringed by this + implementation of Go. This grant does not include claims that would be + infringed only as a consequence of further modification of this + implementation. If you or your agent or exclusive licensee institute or + order or agree to the institution of patent litigation against any + entity (including a cross-claim or counterclaim in a lawsuit) alleging + that this implementation of Go or any code incorporated within this + implementation of Go constitutes direct or contributory patent + infringement, or inducement of patent infringement, then any patent + rights granted to you under this License for this implementation of Go + shall terminate as of the date such litigation is filed. +notices: [] diff --git a/.licenses/arduino-create-agent/go/google.golang.org/protobuf/reflect/protoregistry.dep.yml b/.licenses/arduino-create-agent/go/google.golang.org/protobuf/reflect/protoregistry.dep.yml new file mode 100644 index 000000000..737474192 --- /dev/null +++ b/.licenses/arduino-create-agent/go/google.golang.org/protobuf/reflect/protoregistry.dep.yml @@ -0,0 +1,63 @@ +--- +name: google.golang.org/protobuf/reflect/protoregistry +version: v1.34.1 +type: go +summary: Package protoregistry provides data structures to register and lookup protobuf + descriptor types. +homepage: https://pkg.go.dev/google.golang.org/protobuf/reflect/protoregistry +license: bsd-3-clause +licenses: +- sources: protobuf@v1.34.1/LICENSE + text: | + Copyright (c) 2018 The Go Authors. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following disclaimer + in the documentation and/or other materials provided with the + distribution. + * Neither the name of Google Inc. nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +- sources: protobuf@v1.34.1/PATENTS + text: | + Additional IP Rights Grant (Patents) + + "This implementation" means the copyrightable works distributed by + Google as part of the Go project. + + Google hereby grants to You a perpetual, worldwide, non-exclusive, + no-charge, royalty-free, irrevocable (except as stated in this section) + patent license to make, have made, use, offer to sell, sell, import, + transfer and otherwise run, modify and propagate the contents of this + implementation of Go, where such license applies only to those patent + claims, both currently owned or controlled by Google and acquired in + the future, licensable by Google that are necessarily infringed by this + implementation of Go. This grant does not include claims that would be + infringed only as a consequence of further modification of this + implementation. If you or your agent or exclusive licensee institute or + order or agree to the institution of patent litigation against any + entity (including a cross-claim or counterclaim in a lawsuit) alleging + that this implementation of Go or any code incorporated within this + implementation of Go constitutes direct or contributory patent + infringement, or inducement of patent infringement, then any patent + rights granted to you under this License for this implementation of Go + shall terminate as of the date such litigation is filed. +notices: [] diff --git a/.licenses/arduino-create-agent/go/google.golang.org/protobuf/runtime/protoiface.dep.yml b/.licenses/arduino-create-agent/go/google.golang.org/protobuf/runtime/protoiface.dep.yml new file mode 100644 index 000000000..559ff53fc --- /dev/null +++ b/.licenses/arduino-create-agent/go/google.golang.org/protobuf/runtime/protoiface.dep.yml @@ -0,0 +1,62 @@ +--- +name: google.golang.org/protobuf/runtime/protoiface +version: v1.34.1 +type: go +summary: Package protoiface contains types referenced or implemented by messages. +homepage: https://pkg.go.dev/google.golang.org/protobuf/runtime/protoiface +license: bsd-3-clause +licenses: +- sources: protobuf@v1.34.1/LICENSE + text: | + Copyright (c) 2018 The Go Authors. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following disclaimer + in the documentation and/or other materials provided with the + distribution. + * Neither the name of Google Inc. nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +- sources: protobuf@v1.34.1/PATENTS + text: | + Additional IP Rights Grant (Patents) + + "This implementation" means the copyrightable works distributed by + Google as part of the Go project. + + Google hereby grants to You a perpetual, worldwide, non-exclusive, + no-charge, royalty-free, irrevocable (except as stated in this section) + patent license to make, have made, use, offer to sell, sell, import, + transfer and otherwise run, modify and propagate the contents of this + implementation of Go, where such license applies only to those patent + claims, both currently owned or controlled by Google and acquired in + the future, licensable by Google that are necessarily infringed by this + implementation of Go. This grant does not include claims that would be + infringed only as a consequence of further modification of this + implementation. If you or your agent or exclusive licensee institute or + order or agree to the institution of patent litigation against any + entity (including a cross-claim or counterclaim in a lawsuit) alleging + that this implementation of Go or any code incorporated within this + implementation of Go constitutes direct or contributory patent + infringement, or inducement of patent infringement, then any patent + rights granted to you under this License for this implementation of Go + shall terminate as of the date such litigation is filed. +notices: [] diff --git a/.licenses/arduino-create-agent/go/gopkg.in/inconshreveable/go-update.v0.dep.yml b/.licenses/arduino-create-agent/go/gopkg.in/inconshreveable/go-update.v0.dep.yml new file mode 100644 index 000000000..9aaf42dd7 --- /dev/null +++ b/.licenses/arduino-create-agent/go/gopkg.in/inconshreveable/go-update.v0.dep.yml @@ -0,0 +1,27 @@ +--- +name: gopkg.in/inconshreveable/go-update.v0 +version: v0.0.0-20150814200126-d8b0b1d421aa +type: go +summary: go-update allows a program to update itself by replacing its executable file + with a new version. +homepage: https://pkg.go.dev/gopkg.in/inconshreveable/go-update.v0 +license: apache-2.0 +licenses: +- sources: LICENSE + text: | + Copyright 2014 Alan Shreve + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +- sources: README.md + text: Apache +notices: [] diff --git a/.licenses/arduino-create-agent/go/gopkg.in/inconshreveable/go-update.v0/download.dep.yml b/.licenses/arduino-create-agent/go/gopkg.in/inconshreveable/go-update.v0/download.dep.yml new file mode 100644 index 000000000..12e0b1dcf --- /dev/null +++ b/.licenses/arduino-create-agent/go/gopkg.in/inconshreveable/go-update.v0/download.dep.yml @@ -0,0 +1,26 @@ +--- +name: gopkg.in/inconshreveable/go-update.v0/download +version: v0.0.0-20150814200126-d8b0b1d421aa +type: go +summary: +homepage: https://pkg.go.dev/gopkg.in/inconshreveable/go-update.v0/download +license: apache-2.0 +licenses: +- sources: go-update.v0@v0.0.0-20150814200126-d8b0b1d421aa/LICENSE + text: | + Copyright 2014 Alan Shreve + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +- sources: go-update.v0@v0.0.0-20150814200126-d8b0b1d421aa/README.md + text: Apache +notices: [] diff --git a/.licenses/arduino-create-agent/go/gopkg.in/yaml.v3.dep.yml b/.licenses/arduino-create-agent/go/gopkg.in/yaml.v3.dep.yml new file mode 100644 index 000000000..cef0ee501 --- /dev/null +++ b/.licenses/arduino-create-agent/go/gopkg.in/yaml.v3.dep.yml @@ -0,0 +1,80 @@ +--- +name: gopkg.in/yaml.v3 +version: v3.0.1 +type: go +summary: Package yaml implements YAML support for the Go language. +homepage: https://pkg.go.dev/gopkg.in/yaml.v3 +license: mit +licenses: +- sources: LICENSE + text: |2 + + This project is covered by two different licenses: MIT and Apache. + + #### MIT License #### + + The following files were ported to Go from C files of libyaml, and thus + are still covered by their original MIT license, with the additional + copyright staring in 2011 when the project was ported over: + + apic.go emitterc.go parserc.go readerc.go scannerc.go + writerc.go yamlh.go yamlprivateh.go + + Copyright (c) 2006-2010 Kirill Simonov + Copyright (c) 2006-2011 Kirill Simonov + + 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. + + ### Apache License ### + + All the remaining project files are covered by the Apache license: + + Copyright (c) 2011-2019 Canonical Ltd + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +- sources: README.md + text: |- + The yaml package is licensed under the MIT and Apache License 2.0 licenses. + Please see the LICENSE file for details. +notices: +- sources: NOTICE + text: |- + Copyright 2011-2016 Canonical Ltd. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/LICENSE.md b/LICENSE.md deleted file mode 100644 index 23cb79033..000000000 --- a/LICENSE.md +++ /dev/null @@ -1,339 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 - - Copyright (C) 1989, 1991 Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -License is intended to guarantee your freedom to share and change free -software--to make sure the software is free for all its users. This -General Public License applies to most of the Free Software -Foundation's software and to any other program whose authors commit to -using it. (Some other Free Software Foundation software is covered by -the GNU Lesser General Public License instead.) You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -this service if you wish), that you receive source code or can get it -if you want it, that you can change the software or use pieces of it -in new free programs; and that you know you can do these things. - - To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if you -distribute copies of the software, or if you modify it. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must give the recipients all the rights that -you have. You must make sure that they, too, receive or can get the -source code. And you must show them these terms so they know their -rights. - - We protect your rights with two steps: (1) copyright the software, and -(2) offer you this license which gives you legal permission to copy, -distribute and/or modify the software. - - Also, for each author's protection and ours, we want to make certain -that everyone understands that there is no warranty for this free -software. If the software is modified by someone else and passed on, we -want its recipients to know that what they have is not the original, so -that any problems introduced by others will not reflect on the original -authors' reputations. - - Finally, any free program is threatened constantly by software -patents. We wish to avoid the danger that redistributors of a free -program will individually obtain patent licenses, in effect making the -program proprietary. To prevent this, we have made it clear that any -patent must be licensed for everyone's free use or not licensed at all. - - The precise terms and conditions for copying, distribution and -modification follow. - - GNU GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License applies to any program or other work which contains -a notice placed by the copyright holder saying it may be distributed -under the terms of this General Public License. The "Program", below, -refers to any such program or work, and a "work based on the Program" -means either the Program or any derivative work under copyright law: -that is to say, a work containing the Program or a portion of it, -either verbatim or with modifications and/or translated into another -language. (Hereinafter, translation is included without limitation in -the term "modification".) Each licensee is addressed as "you". - -Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running the Program is not restricted, and the output from the Program -is covered only if its contents constitute a work based on the -Program (independent of having been made by running the Program). -Whether that is true depends on what the Program does. - - 1. You may copy and distribute verbatim copies of the Program's -source code as you receive it, in any medium, provided that you -conspicuously and appropriately publish on each copy an appropriate -copyright notice and disclaimer of warranty; keep intact all the -notices that refer to this License and to the absence of any warranty; -and give any other recipients of the Program a copy of this License -along with the Program. - -You may charge a fee for the physical act of transferring a copy, and -you may at your option offer warranty protection in exchange for a fee. - - 2. You may modify your copy or copies of the Program or any portion -of it, thus forming a work based on the Program, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) You must cause the modified files to carry prominent notices - stating that you changed the files and the date of any change. - - b) You must cause any work that you distribute or publish, that in - whole or in part contains or is derived from the Program or any - part thereof, to be licensed as a whole at no charge to all third - parties under the terms of this License. - - c) If the modified program normally reads commands interactively - when run, you must cause it, when started running for such - interactive use in the most ordinary way, to print or display an - announcement including an appropriate copyright notice and a - notice that there is no warranty (or else, saying that you provide - a warranty) and that users may redistribute the program under - these conditions, and telling the user how to view a copy of this - License. (Exception: if the Program itself is interactive but - does not normally print such an announcement, your work based on - the Program is not required to print an announcement.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Program, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Program, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Program. - -In addition, mere aggregation of another work not based on the Program -with the Program (or with a work based on the Program) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may copy and distribute the Program (or a work based on it, -under Section 2) in object code or executable form under the terms of -Sections 1 and 2 above provided that you also do one of the following: - - a) Accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of Sections - 1 and 2 above on a medium customarily used for software interchange; or, - - b) Accompany it with a written offer, valid for at least three - years, to give any third party, for a charge no more than your - cost of physically performing source distribution, a complete - machine-readable copy of the corresponding source code, to be - distributed under the terms of Sections 1 and 2 above on a medium - customarily used for software interchange; or, - - c) Accompany it with the information you received as to the offer - to distribute corresponding source code. (This alternative is - allowed only for noncommercial distribution and only if you - received the program in object code or executable form with such - an offer, in accord with Subsection b above.) - -The source code for a work means the preferred form of the work for -making modifications to it. For an executable work, complete source -code means all the source code for all modules it contains, plus any -associated interface definition files, plus the scripts used to -control compilation and installation of the executable. However, as a -special exception, the source code distributed need not include -anything that is normally distributed (in either source or binary -form) with the major components (compiler, kernel, and so on) of the -operating system on which the executable runs, unless that component -itself accompanies the executable. - -If distribution of executable or object code is made by offering -access to copy from a designated place, then offering equivalent -access to copy the source code from the same place counts as -distribution of the source code, even though third parties are not -compelled to copy the source along with the object code. - - 4. You may not copy, modify, sublicense, or distribute the Program -except as expressly provided under this License. Any attempt -otherwise to copy, modify, sublicense or distribute the Program is -void, and will automatically terminate your rights under this License. -However, parties who have received copies, or rights, from you under -this License will not have their licenses terminated so long as such -parties remain in full compliance. - - 5. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Program or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Program (or any work based on the -Program), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Program or works based on it. - - 6. Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the -original licensor to copy, distribute or modify the Program subject to -these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties to -this License. - - 7. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Program at all. For example, if a patent -license would not permit royalty-free redistribution of the Program by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Program. - -If any portion of this section is held invalid or unenforceable under -any particular circumstance, the balance of the section is intended to -apply and the section as a whole is intended to apply in other -circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system, which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 8. If the distribution and/or use of the Program is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Program under this License -may add an explicit geographical distribution limitation excluding -those countries, so that distribution is permitted only in or among -countries not thus excluded. In such case, this License incorporates -the limitation as if written in the body of this License. - - 9. The Free Software Foundation may publish revised and/or new versions -of the General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - -Each version is given a distinguishing version number. If the Program -specifies a version number of this License which applies to it and "any -later version", you have the option of following the terms and conditions -either of that version or of any later version published by the Free -Software Foundation. If the Program does not specify a version number of -this License, you may choose any version ever published by the Free Software -Foundation. - - 10. If you wish to incorporate parts of the Program into other free -programs whose distribution conditions are different, write to the author -to ask for permission. For software which is copyrighted by the Free -Software Foundation, write to the Free Software Foundation; we sometimes -make exceptions for this. Our decision will be guided by the two goals -of preserving the free status of all derivatives of our free software and -of promoting the sharing and reuse of software generally. - - NO WARRANTY - - 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY -FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN -OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES -PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED -OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS -TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE -PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, -REPAIR OR CORRECTION. - - 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR -REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, -INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING -OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED -TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY -YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER -PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE -POSSIBILITY OF SUCH DAMAGES. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - {description} - Copyright (C) {year} {fullname} - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - -Also add information on how to contact you by electronic and paper mail. - -If the program is interactive, make it output a short notice like this -when it starts in an interactive mode: - - Gnomovision version 69, Copyright (C) year name of author - Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, the commands you use may -be called something other than `show w' and `show c'; they could even be -mouse-clicks or menu items--whatever suits your program. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the program, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the program - `Gnomovision' (which makes passes at compilers) written by James Hacker. - - {signature of Ty Coon}, 1 April 1989 - Ty Coon, President of Vice - -This General Public License does not permit incorporating your program into -proprietary programs. If your program is a subroutine library, you may -consider it more useful to permit linking proprietary applications with the -library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. diff --git a/LICENSE.txt b/LICENSE.txt new file mode 100644 index 000000000..0ad25db4b --- /dev/null +++ b/LICENSE.txt @@ -0,0 +1,661 @@ + GNU AFFERO GENERAL PUBLIC LICENSE + Version 3, 19 November 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU Affero General Public License is a free, copyleft license for +software and other kinds of works, specifically designed to ensure +cooperation with the community in the case of network server software. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +our General Public Licenses are intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + Developers that use our General Public Licenses protect your rights +with two steps: (1) assert copyright on the software, and (2) offer +you this License which gives you legal permission to copy, distribute +and/or modify the software. + + A secondary benefit of defending all users' freedom is that +improvements made in alternate versions of the program, if they +receive widespread use, become available for other developers to +incorporate. Many developers of free software are heartened and +encouraged by the resulting cooperation. However, in the case of +software used on network servers, this result may fail to come about. +The GNU General Public License permits making a modified version and +letting the public access it on a server without ever releasing its +source code to the public. + + The GNU Affero General Public License is designed specifically to +ensure that, in such cases, the modified source code becomes available +to the community. It requires the operator of a network server to +provide the source code of the modified version running there to the +users of that server. Therefore, public use of a modified version, on +a publicly accessible server, gives the public access to the source +code of the modified version. + + An older license, called the Affero General Public License and +published by Affero, was designed to accomplish similar goals. This is +a different license, not a version of the Affero GPL, but Affero has +released a new version of the Affero GPL which permits relicensing under +this license. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU Affero General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Remote Network Interaction; Use with the GNU General Public License. + + Notwithstanding any other provision of this License, if you modify the +Program, your modified version must prominently offer all users +interacting with it remotely through a computer network (if your version +supports such interaction) an opportunity to receive the Corresponding +Source of your version by providing access to the Corresponding Source +from a network server at no charge, through some standard or customary +means of facilitating copying of software. This Corresponding Source +shall include the Corresponding Source for any work covered by version 3 +of the GNU General Public License that is incorporated pursuant to the +following paragraph. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the work with which it is combined will remain governed by version +3 of the GNU General Public License. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU Affero General Public License from time to time. Such new versions +will be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU Affero General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU Affero General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU Affero General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If your software can interact with users remotely through a computer +network, you should also make sure that it provides a way for users to +get its source. For example, if your program is a web application, its +interface could display a "Source" link that leads users to an archive +of the code. There are many ways you could offer source, and different +solutions will be better for different programs; see section 13 for the +specific requirements. + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU AGPL, see +. diff --git a/README.md b/README.md index e6b456c22..db5e92c65 100644 --- a/README.md +++ b/README.md @@ -1,44 +1,56 @@ -[![License: GPL v2](https://img.shields.io/badge/License-GPL%20v2-blue.svg)](https://www.gnu.org/licenses/old-licenses/gpl-2.0.en.html) +# arduino-cloud-agent -arduino-create-agent -==================== +[![License: AGPL v3.0](https://img.shields.io/badge/License-AGPL%20v3.0-blue)](https://www.gnu.org/licenses/agpl-3.0.html) +[![Test Go status](https://github.com/arduino/arduino-create-agent/actions/workflows/test-go-task.yml/badge.svg)](https://github.com/arduino/arduino-create-agent/actions/workflows/test-go-task.yml) +[![Codecov](https://codecov.io/gh/arduino/arduino-create-agent/branch/main/graph/badge.svg)](https://codecov.io/gh/arduino/arduino-create-agent) +[![Test Integration status](https://github.com/arduino/arduino-create-agent/actions/workflows/test-go-integration-task.yml/badge.svg)](https://github.com/arduino/arduino-create-agent/actions/workflows/test-go-integration-task.yml) +[![Check License status](https://github.com/arduino/arduino-create-agent/actions/workflows/check-license.yml/badge.svg)](https://github.com/arduino/arduino-create-agent/actions/workflows/check-license.yml) +[![Check Go Dependencies status](https://github.com/arduino/arduino-create-agent/actions/workflows/check-go-dependencies-task.yml/badge.svg)](https://github.com/arduino/arduino-create-agent/actions/workflows/check-go-dependencies-task.yml) +[![Check Go status](https://github.com/arduino/arduino-create-agent/actions/workflows/check-go-task.yml/badge.svg)](https://github.com/arduino/arduino-create-agent/actions/workflows/check-go-task.yml) -The Arduino Create Agent is a single binary that will sit on the traybar and work in the background. It allows you to use the [Arduino Create applications](https://create.arduino.cc) to seamlessly upload code to any USB connected Arduino board (or Yún in LAN) directly from the browser. +The Arduino Cloud Agent is a single binary that will sit on the traybar and work in the background. It allows you to use the [Arduino Cloud](https://app.arduino.cc/) to seamlessly upload code to any USB connected Arduino board (or Yún in LAN) directly from the browser. ## Architecture -``` + +```text +-------------------------------+ | | | Browser | | | Web socket +----------------------+ flashes +---------------+ | +---------------------------+ |<-------------->| +------------>| | -| | | | | Arduino Create Agent | | Arduino Board | -| | Arduino Create Web Editor | +--------------->| |<------------+ | +| | | | | Arduino Cloud Agent | | Arduino Board | +| | Arduino Cloud | +--------------->| |<------------+ | | | | | REST API +----------------------+ serial +---------------+ | +---------------------------+ | +-------------------------------+ ``` ## Installation -Get the [latest version](https://github.com/arduino/arduino-create-agent/releases) of the Agent for all supported platforms or complete the [Getting Started](https://create.arduino.cc/getting-started/plugin/welcome). -## Apple M1 support -At the moment the new Apple Silicon Macs released in November 2020, like the new [MacBook Pro 13"](https://www.apple.com/macbook-pro-13/), [MacBook Air](https://www.apple.com/macbook-air/) and [Mac mini](https://www.apple.com/mac-mini/) models with the [Apple M1](https://www.apple.com/mac/m1/) chip are currently NOT supported by the Create Agent. +Get the [latest version](https://github.com/arduino/arduino-create-agent/releases) of the Agent for all supported platforms or complete the [Getting Started](https://cloud.arduino.cc/download-agent/). + +## Apple silicon support + +The Arduino Agent is supported both on Intel and Apple silicon computers. This includes devices with the M1, M2 and M3 processors. +The Arduino Agent is built both for Intel architectures and Apple silicon devices, but distributed as a single universal executable for macOS. ## Documentation + The documentation has been moved to the [wiki](https://github.com/arduino/arduino-create-agent/wiki) page. There you can find: + - [Advanced usage](https://github.com/arduino/arduino-create-agent/wiki/Advanced-usage): explaining how to use multiple configurations and how to use the agent with a proxy. - [Agent Beta Program](https://github.com/arduino/arduino-create-agent/wiki/Agent-Beta-Program) -- [Developement](https://github.com/arduino/arduino-create-agent/wiki/Developement): containing useful info to help in development +- [Development](https://github.com/arduino/arduino-create-agent/wiki/Development): containing useful info to help in development - [Disable Autostart](https://github.com/arduino/arduino-create-agent/wiki/Disable-Autostart) - [How to compile on Raspberry Pi](https://github.com/arduino/arduino-create-agent/wiki/How-to-compile-on-Raspberry-Pi) - [How to use crashreport functionality](https://github.com/arduino/arduino-create-agent/wiki/How-to-use-crashreport-functionality) - [How to use the agent](https://github.com/arduino/arduino-create-agent/wiki/How-to-use-the-agent) ## Contributing + ### Submitting an issue -When submitting a new issue please search for duplicates before creating a new one. Help us by providing useful context and information. Please attach the output of the commands running at the debug console or attach [crash reports](https://github.com/arduino/arduino-create-agent/wiki/How-to-use-crashreport-functionality) if useful. +When submitting a new issue please search for duplicates before creating a new one. Help us by providing useful context and information. Please attach the output of the commands running at the debug console or attach [crash reports](https://github.com/arduino/arduino-create-agent/wiki/How-to-use-crashreport-functionality) if useful. #### Security @@ -49,6 +61,7 @@ Thank you! e-mail contact: security@arduino.cc ### Submitting a pull request + We are glad you want to contribute with code: that's the best way to help this software. Your contribution is adding or modifying existing behaviour, please always refer to an existing issue or open a new one before contributing. We are trying to use [Test Driven Development](https://en.wikipedia.org/wiki/Test-driven_development) in the near future: please add one or more tests that prove that your contribution is good and is working as expected, it will help us a lot. @@ -60,12 +73,14 @@ Also, for your contribution to be accepted, every one of your commits must be "S By signing off your commits, you agree to the following agreement, also known as [Developer Certificate of Origin](http://developercertificate.org/): it assures everyone that the code you're submitting is yours or that you have rights to submit it. ## Authors and acknowledgment -arduino-create-agent is a fork of @[johnlauer](https://github.com/johnlauer)'s [serial-port-json-server](https://github.com/johnlauer/serial-port-json-server) (which we really want to thank for his kindness and great work) + +arduino-cloud-agent is a fork of @[johnlauer](https://github.com/johnlauer)'s [serial-port-json-server](https://github.com/johnlauer/serial-port-json-server) (which we really want to thank for his kindness and great work) The history has been rewritten to keep the repo small (thus removing all binaries committed in the past) ## License -``` + +```text Developer Certificate of Origin Version 1.1 @@ -76,7 +91,6 @@ San Francisco, CA 94110 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. - Developer's Certificate of Origin 1.1 By making a contribution to this project, I certify that: diff --git a/Taskfile.yml b/Taskfile.yml index 48c6fb534..681c8274d 100644 --- a/Taskfile.yml +++ b/Taskfile.yml @@ -1,70 +1,188 @@ -version: '3' +version: "3" tasks: - build: + install: + desc: Install dependencies for local development + cmds: + - go install github.com/githubnemo/CompileDaemon@v1.4.0 + + run: + desc: Run the project locally with auto-reload and data race detector + cmds: + - CompileDaemon -build="go build -race" -command="./arduino-create-agent" -graceful-kill=true + + # Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/assets/check-dependencies-task/Taskfile.yml + general:cache-dep-licenses: + desc: Cache dependency license metadata + cmds: + - | + if ! which licensed &>/dev/null; then + if [[ {{OS}} == "windows" ]]; then + echo "Licensed does not have Windows support." + echo "Please use Linux/macOS or download the dependencies cache from the GitHub Actions workflow artifact." + else + echo "licensed not found or not in PATH. Please install: https://github.com/github/licensed#as-an-executable" + fi + exit 1 + fi + - licensed cache + + # Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/assets/check-dependencies-task/Taskfile.yml + general:check-dep-licenses: + desc: Check for unapproved dependency licenses + deps: + - task: general:cache-dep-licenses + cmds: + - licensed status + + # Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/assets/go-task/Taskfile.yml + go:build: desc: Build the project, to use a specific version use `task build TAG_VERSION=x.x.x` + dir: "{{.DEFAULT_GO_MODULE_PATH}}" cmds: - - go build -v -i {{default "" .ADDITIONAL_FLAGS}} -o {{default "arduino-create-agent" .APP_NAME}} -ldflags '-X main.version={{default .TAG_TEST .TAG_VERSION}} -X main.git_revision={{.COMMIT}} {{default "" .WIN_FLAGS}}' - vars: - COMMIT: - sh: git log -n 1 --format=%h + - go build -v {{.ADDITIONAL_FLAGS}} -o {{.PROJECT_NAME}} {{.LDFLAGS}} {{.WIN_FLAGS}}' - build-cli: - desc: Build the project without tray support + go:build-cli: + desc: Build the project without tray icon support cmds: - - task: build + - task: go:build vars: - APP_NAME: arduino-create-agent_cli + PROJECT_NAME: arduino-cloud-agent_cli ADDITIONAL_FLAGS: -tags cli - build-win: + go:build-win: desc: Build the project for win, to build 32bit `export GOARCH=386` and for 64 bit `export GOARCH=amd64` before `task build-win` cmds: - rsrc -arch {{.GOARCH}} -manifest manifest.xml # GOARCH shoud be either amd64 or 386 - - task: build + - task: go:build vars: - APP_NAME: arduino-create-agent.exe + PROJECT_NAME: arduino-cloud-agent.exe WIN_FLAGS: -H=windowsgui - rm *.syso # rm file to avoid compilation problems on other platforms + vars: + GOARCH: + sh: go env GOARCH - test-unit: - desc: Run unit tests only + go:build-win-cli: + desc: Build the project for win without tray icon support cmds: - - go test -short -run '{{ default ".*" .TEST_REGEX }}' {{ default "-v" .GOFLAGS }} -coverprofile=coverage_unit.txt {{ default .DEFAULT_TARGETS .TARGETS }} {{.TEST_LDFLAGS}} + - task: go:build + vars: + PROJECT_NAME: arduino-cloud-agent_cli.exe + ADDITIONAL_FLAGS: -tags cli - test-e2e: - desc: Run end 2 end tests + # Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/assets/test-go-task/Taskfile.yml + go:test: + desc: Run unit tests + dir: "{{default .DEFAULT_GO_MODULE_PATH .GO_MODULE_PATH}}" + cmds: + - | + go test \ + -v \ + -short \ + -run '{{default ".*" .GO_TEST_REGEX}}' \ + {{default "-timeout 10m -coverpkg=./... -covermode=atomic" .GO_TEST_FLAGS}} \ + -coverprofile=coverage_unit.txt \ + {{default .DEFAULT_GO_PACKAGES .GO_PACKAGES}} + + # Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/assets/test-go-integration-task/Taskfile.yml + go:test-integration: + desc: Run integration tests + deps: + # - task: go:build # we build it in the CI and not in the task because _cli version is required and build procedure is different on win + - task: poetry:install-deps + cmds: + - poetry run pytest tests + + # Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/assets/poetry-task/Taskfile.yml + poetry:install-deps: + desc: Install dependencies managed by Poetry cmds: - poetry install --no-root - - poetry run pytest test + + # Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/assets/poetry-task/Taskfile.yml + poetry:update-deps: + desc: Update all dependencies managed by Poetry to their newest versions + cmds: + - poetry update + + # Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/assets/check-go-task/Taskfile.yml + go:fix: + desc: Modernize usages of outdated APIs + dir: "{{default .DEFAULT_GO_MODULE_PATH .GO_MODULE_PATH}}" + cmds: + - go fix {{default .DEFAULT_GO_PACKAGES .GO_PACKAGES}} + + # Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/assets/check-go-task/Taskfile.yml + go:format: + desc: Format Go code + dir: "{{default .DEFAULT_GO_MODULE_PATH .GO_MODULE_PATH}}" + cmds: + - go fmt {{default .DEFAULT_GO_PACKAGES .GO_PACKAGES}} + + # Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/assets/check-go-task/Taskfile.yml + go:lint: + desc: Lint Go code + dir: "{{default .DEFAULT_GO_MODULE_PATH .GO_MODULE_PATH}}" + cmds: + - | + if ! which golint &>/dev/null; then + echo "golint not installed or not in PATH. Please install: https://github.com/golang/lint#installation" + exit 1 + fi + - | + golint \ + {{default "-min_confidence 0.8 -set_exit_status" .GO_LINT_FLAGS}} \ + {{default .DEFAULT_GO_PACKAGES .GO_PACKAGES}} + + # Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/assets/check-go-task/Taskfile.yml + go:vet: + desc: Check for errors in Go code + dir: "{{default .DEFAULT_GO_MODULE_PATH .GO_MODULE_PATH}}" + cmds: + - go vet {{default .DEFAULT_GO_PACKAGES .GO_PACKAGES}} check: desc: Check fmt and lint cmds: - - go version - - go fmt {{ default .DEFAULT_TARGETS .TARGETS }} - - test -z $(go fmt {{ default .DEFAULT_TARGETS .TARGETS }}) - - echo 'test ok' - - go vet {{ default .DEFAULT_TARGETS .TARGETS }} - - echo 'vet ok' - # FIXME: too many suggestions are failing the check, I'll fix these one in - # another PR. - # - "'{{.GOLINTBIN}}' {{.GOLINTFLAGS}} {{ default .DEFAULT_TARGETS .TARGETS }}" - # - task: i18n:check - # - task: python:check - # - task: docs:check - # - task: config:check - + - task: go:vet + - task: go:lint + + autoupdate:demo: + desc: Demo the local auto-update workflow for the Agent (for linux and mac user) + prompt: Before continuing, please make sure you’ve opened the "Open Configuration" option from the Agent menu and set the updateUrl=http://127.0.0.1:3000/ + cmds: + - task: go:build + - go install github.com/sanbornm/go-selfupdate/...@latest + # NOTE: the path 'CreateAgent/Stable' is important to keep as is + # because agent searches the update files into "CreateAgent/Stable/{platform}.json" and "https://downloads.arduino.cc/CreateAgent/Stable/{version}/{platform}.gz" + - go-selfupdate -o public/CreateAgent/Stable ./arduino-cloud-agent {{.VERSION}} + - docker rm -f agent-static-server + - docker run --rm -d -v "$PWD/public:/usr/share/nginx/html:ro" -p 3000:80 --name agent-static-server nginx:alpine + - sleep 5 # wait the server is up before starting the update + - curl -X POST http://127.0.0.1:8991/update + vars: + # Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/assets/release-go-task/Taskfile.yml + PROJECT_NAME: arduino-cloud-agent + # build vars + COMMIT: + sh: echo "$(git log --no-show-signature -n 1 --format=%h)" + TIMESTAMP_SHORT: + sh: echo "{{now | date "20060102"}}" + TAG: + sh: echo "$(git tag --points-at=HEAD 2> /dev/null | head -n1)" TAG_TEST: "0.0.0-dev" - GOARCH: - sh: go env GOARCH - # all modules of this project except for "gen/..." module - DEFAULT_TARGETS: - sh: echo `go list ./... | grep -v 'arduino-create-agent/gen/' | tr '\n' ' '` - GOFLAGS: "-timeout 10m -v -coverpkg=./... -covermode=atomic" - # check-lint vars - GOLINTBIN: - sh: go list -f {{"{{"}}".Target{{"}}"}}" golang.org/x/lint/golint - GOLINTFLAGS: "-min_confidence 0.8 -set_exit_status" + VERSION: "{{if .NIGHTLY}}nightly-{{.TIMESTAMP_SHORT}}{{else if .TAG}}{{.TAG}}{{else}}{{.TAG_TEST}}{{end}}" + CONFIGURATION_PACKAGE: main + LDFLAGS: >- + -ldflags + ' + -X {{.CONFIGURATION_PACKAGE}}.version={{.VERSION}} + -X {{.CONFIGURATION_PACKAGE}}.commit={{.COMMIT}} + # Path of the project's primary Go module: + DEFAULT_GO_MODULE_PATH: ./ + DEFAULT_GO_PACKAGES: + sh: | + echo $(cd {{default .DEFAULT_GO_MODULE_PATH .GO_MODULE_PATH}} && go list ./... | grep -v 'arduino-create-agent/gen/' | grep -v 'arduino-create-agent/design' | tr '\n' ' ' || echo '"ERROR: Unable to discover Go packages"') diff --git a/bufferflow.go b/bufferflow.go index 42ee9e9b4..a9fef8e51 100644 --- a/bufferflow.go +++ b/bufferflow.go @@ -1,49 +1,23 @@ -package main - -import ( -//"log" -//"time" -) - -var availableBufferAlgorithms = []string{"default", "timed", "timedraw"} +// Copyright 2022 Arduino SA +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published +// by the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . -type BufferMsg struct { - Cmd string - Port string - TriggeringResponse string - //Desc string - //Desc string -} +package main +// Bufferflow interface type Bufferflow interface { Init() - BlockUntilReady(cmd string, id string) (bool, bool) // implement this method - //JustQueue(cmd string, id string) bool // implement this method - OnIncomingData(data string) // implement this method - ClearOutSemaphore() // implement this method - BreakApartCommands(cmd string) []string // implement this method - Pause() // implement this method - Unpause() // implement this method - SeeIfSpecificCommandsShouldSkipBuffer(cmd string) bool // implement this method - SeeIfSpecificCommandsShouldPauseBuffer(cmd string) bool // implement this method - SeeIfSpecificCommandsShouldUnpauseBuffer(cmd string) bool // implement this method - SeeIfSpecificCommandsShouldWipeBuffer(cmd string) bool // implement this method - SeeIfSpecificCommandsReturnNoResponse(cmd string) bool // implement this method - ReleaseLock() // implement this method - IsBufferGloballySendingBackIncomingData() bool // implement this method - Close() // implement this method -} - -/*data packets returned to client*/ -type DataCmdComplete struct { - Cmd string - Id string - P string - BufSize int `json:"-"` - D string `json:"-"` -} - -type DataPerLine struct { - P string - D string + OnIncomingData(data string) // implement this method + Close() // implement this method } diff --git a/bufferflow_default.go b/bufferflow_default.go index 7f37ac3d2..959737d54 100644 --- a/bufferflow_default.go +++ b/bufferflow_default.go @@ -1,71 +1,72 @@ +// Copyright 2022 Arduino SA +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published +// by the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + package main import ( + "encoding/json" + log "github.com/sirupsen/logrus" ) +// BufferflowDefault is the default bufferflow, whick means no buffering type BufferflowDefault struct { - Name string - Port string + port string + output chan<- []byte + input chan string + done chan bool } -var () +// NewBufferflowDefault create a new default bufferflow +func NewBufferflowDefault(port string, output chan<- []byte) *BufferflowDefault { + return &BufferflowDefault{ + port: port, + output: output, + input: make(chan string), + done: make(chan bool), + } +} +// Init will initialize the bufferflow func (b *BufferflowDefault) Init() { log.Println("Initting default buffer flow (which means no buffering)") + go b.consumeInput() } -func (b *BufferflowDefault) BlockUntilReady(cmd string, id string) (bool, bool) { - //log.Printf("BlockUntilReady() start\n") - return true, false +func (b *BufferflowDefault) consumeInput() { +Loop: + for { + select { + case data := <-b.input: + m := SpPortMessage{b.port, data} + message, _ := json.Marshal(m) + b.output <- message + case <-b.done: + break Loop //this is required, a simple break statement would only exit the innermost switch statement + } + } + close(b.input) // close the input channel at the end of the computation } +// OnIncomingData will forward the data func (b *BufferflowDefault) OnIncomingData(data string) { - //log.Printf("OnIncomingData() start. data:%v\n", data) -} - -// Clean out b.sem so it can truly block -func (b *BufferflowDefault) ClearOutSemaphore() { -} - -func (b *BufferflowDefault) BreakApartCommands(cmd string) []string { - return []string{cmd} -} - -func (b *BufferflowDefault) Pause() { - return -} - -func (b *BufferflowDefault) Unpause() { - return -} - -func (b *BufferflowDefault) SeeIfSpecificCommandsShouldSkipBuffer(cmd string) bool { - return false -} - -func (b *BufferflowDefault) SeeIfSpecificCommandsShouldPauseBuffer(cmd string) bool { - return false -} - -func (b *BufferflowDefault) SeeIfSpecificCommandsShouldUnpauseBuffer(cmd string) bool { - return false -} - -func (b *BufferflowDefault) SeeIfSpecificCommandsShouldWipeBuffer(cmd string) bool { - return false -} - -func (b *BufferflowDefault) SeeIfSpecificCommandsReturnNoResponse(cmd string) bool { - return false -} - -func (b *BufferflowDefault) ReleaseLock() { -} - -func (b *BufferflowDefault) IsBufferGloballySendingBackIncomingData() bool { - return false + b.input <- data } +// Close will close the bufferflow func (b *BufferflowDefault) Close() { + b.done <- true + close(b.done) } diff --git a/bufferflow_timed.go b/bufferflow_timed.go index d0be90227..36aaf08bf 100644 --- a/bufferflow_timed.go +++ b/bufferflow_timed.go @@ -1,3 +1,18 @@ +// Copyright 2022 Arduino SA +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published +// by the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + package main import ( @@ -7,107 +22,65 @@ import ( log "github.com/sirupsen/logrus" ) +// BufferflowTimed sends data once every 16ms type BufferflowTimed struct { - Name string - Port string - Output chan []byte - Input chan string - done chan bool - ticker *time.Ticker + port string + output chan<- []byte + input chan string + done chan bool + ticker *time.Ticker + sPort string + bufferedOutput string } -var ( - bufferedOutput string - sPort string -) +// NewBufferflowTimed will create a new timed bufferflow +func NewBufferflowTimed(port string, output chan<- []byte) *BufferflowTimed { + return &BufferflowTimed{ + port: port, + output: output, + input: make(chan string), + done: make(chan bool), + ticker: time.NewTicker(16 * time.Millisecond), + sPort: "", + bufferedOutput: "", + } +} +// Init will initialize the bufferflow func (b *BufferflowTimed) Init() { log.Println("Initting timed buffer flow (output once every 16ms)") - bufferedOutput = "" - sPort = "" - - go func() { - b.ticker = time.NewTicker(16 * time.Millisecond) - b.done = make(chan bool) - Loop: - for { - select { - case data := <-b.Input: - bufferedOutput = bufferedOutput + data - sPort = b.Port - case <-b.ticker.C: - if bufferedOutput != "" { - m := SpPortMessage{sPort, bufferedOutput} - buf, _ := json.Marshal(m) - // data is now encoded in base64 format - // need a decoder on the other side - b.Output <- []byte(buf) - bufferedOutput = "" - sPort = "" - } - case <-b.done: - break Loop + go b.consumeInput() +} + +func (b *BufferflowTimed) consumeInput() { +Loop: + for { + select { + case data := <-b.input: // use the buffer and append data to it + b.bufferedOutput = b.bufferedOutput + data + b.sPort = b.port + case <-b.ticker.C: // after 16ms send the buffered output message + if b.bufferedOutput != "" { + m := SpPortMessage{b.sPort, b.bufferedOutput} + buf, _ := json.Marshal(m) + b.output <- buf + // reset the buffer and the port + b.bufferedOutput = "" + b.sPort = "" } + case <-b.done: + break Loop //this is required, a simple break statement would only exit the innermost switch statement } - - close(b.Input) - - }() - -} - -func (b *BufferflowTimed) BlockUntilReady(cmd string, id string) (bool, bool) { - //log.Printf("BlockUntilReady() start\n") - return true, false + } + close(b.input) } +// OnIncomingData will forward the data func (b *BufferflowTimed) OnIncomingData(data string) { - b.Input <- data -} - -// Clean out b.sem so it can truly block -func (b *BufferflowTimed) ClearOutSemaphore() { -} - -func (b *BufferflowTimed) BreakApartCommands(cmd string) []string { - return []string{cmd} -} - -func (b *BufferflowTimed) Pause() { - return -} - -func (b *BufferflowTimed) Unpause() { - return -} - -func (b *BufferflowTimed) SeeIfSpecificCommandsShouldSkipBuffer(cmd string) bool { - return false -} - -func (b *BufferflowTimed) SeeIfSpecificCommandsShouldPauseBuffer(cmd string) bool { - return false -} - -func (b *BufferflowTimed) SeeIfSpecificCommandsShouldUnpauseBuffer(cmd string) bool { - return false -} - -func (b *BufferflowTimed) SeeIfSpecificCommandsShouldWipeBuffer(cmd string) bool { - return false -} - -func (b *BufferflowTimed) SeeIfSpecificCommandsReturnNoResponse(cmd string) bool { - return false -} - -func (b *BufferflowTimed) ReleaseLock() { -} - -func (b *BufferflowTimed) IsBufferGloballySendingBackIncomingData() bool { - return true + b.input <- data } +// Close will close the bufferflow func (b *BufferflowTimed) Close() { b.ticker.Stop() b.done <- true diff --git a/bufferflow_timedraw.go b/bufferflow_timedraw.go index b20f27f48..08b34cab6 100644 --- a/bufferflow_timedraw.go +++ b/bufferflow_timedraw.go @@ -1,3 +1,18 @@ +// Copyright 2022 Arduino SA +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published +// by the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + package main import ( @@ -7,96 +22,68 @@ import ( log "github.com/sirupsen/logrus" ) +// BufferflowTimedRaw sends raw data once every 16ms type BufferflowTimedRaw struct { - Name string - Port string - Output chan []byte - Input chan string - ticker *time.Ticker + port string + output chan<- []byte + input chan string + done chan bool + ticker *time.Ticker + bufferedOutputRaw []byte + sPortRaw string } -var ( - bufferedOutputRaw []byte -) +// NewBufferflowTimedRaw will create a new raw bufferflow +func NewBufferflowTimedRaw(port string, output chan<- []byte) *BufferflowTimedRaw { + return &BufferflowTimedRaw{ + port: port, + output: output, + input: make(chan string), + done: make(chan bool), + ticker: time.NewTicker(16 * time.Millisecond), + bufferedOutputRaw: nil, + sPortRaw: "", + } +} +// Init will initialize the bufferflow func (b *BufferflowTimedRaw) Init() { - log.Println("Initting timed buffer flow (output once every 16ms)") - - go func() { - for data := range b.Input { - bufferedOutputRaw = append(bufferedOutputRaw, []byte(data)...) - } - }() - - go func() { - b.ticker = time.NewTicker(16 * time.Millisecond) - for _ = range b.ticker.C { - if len(bufferedOutputRaw) != 0 { - m := SpPortMessageRaw{b.Port, bufferedOutputRaw} + log.Println("Initting timed buffer raw flow (output once every 16ms)") + go b.consumeInput() +} + +func (b *BufferflowTimedRaw) consumeInput() { +Loop: + for { + select { + case data := <-b.input: // use the buffer and append data to it + b.bufferedOutputRaw = append(b.bufferedOutputRaw, []byte(data)...) + b.sPortRaw = b.port + case <-b.ticker.C: // after 16ms send the buffered output message + if b.bufferedOutputRaw != nil { + m := SpPortMessageRaw{b.sPortRaw, b.bufferedOutputRaw} buf, _ := json.Marshal(m) - // data is now encoded in base64 format - // need a decoder on the other side - b.Output <- []byte(buf) - bufferedOutputRaw = nil + // since bufferedOutputRaw is a []byte is base64-encoded by json.Marshal() function automatically + b.output <- buf + // reset the buffer and the port + b.bufferedOutputRaw = nil + b.sPortRaw = "" } + case <-b.done: + break Loop //this is required, a simple break statement would only exit the innermost switch statement } - }() - -} - -func (b *BufferflowTimedRaw) BlockUntilReady(cmd string, id string) (bool, bool) { - //log.Printf("BlockUntilReady() start\n") - return true, false + } + close(b.input) } +// OnIncomingData will forward the data func (b *BufferflowTimedRaw) OnIncomingData(data string) { - b.Input <- data -} - -// Clean out b.sem so it can truly block -func (b *BufferflowTimedRaw) ClearOutSemaphore() { -} - -func (b *BufferflowTimedRaw) BreakApartCommands(cmd string) []string { - return []string{cmd} -} - -func (b *BufferflowTimedRaw) Pause() { - return -} - -func (b *BufferflowTimedRaw) Unpause() { - return -} - -func (b *BufferflowTimedRaw) SeeIfSpecificCommandsShouldSkipBuffer(cmd string) bool { - return false -} - -func (b *BufferflowTimedRaw) SeeIfSpecificCommandsShouldPauseBuffer(cmd string) bool { - return false -} - -func (b *BufferflowTimedRaw) SeeIfSpecificCommandsShouldUnpauseBuffer(cmd string) bool { - return false -} - -func (b *BufferflowTimedRaw) SeeIfSpecificCommandsShouldWipeBuffer(cmd string) bool { - return false -} - -func (b *BufferflowTimedRaw) SeeIfSpecificCommandsReturnNoResponse(cmd string) bool { - return false -} - -func (b *BufferflowTimedRaw) ReleaseLock() { -} - -func (b *BufferflowTimedRaw) IsBufferGloballySendingBackIncomingData() bool { - return true + b.input <- data } +// Close will close the bufferflow func (b *BufferflowTimedRaw) Close() { b.ticker.Stop() - close(b.Input) + b.done <- true + close(b.done) } diff --git a/certificates.go b/certificates.go deleted file mode 100644 index 8c2628fb9..000000000 --- a/certificates.go +++ /dev/null @@ -1,342 +0,0 @@ -// Copyright 2009 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Generate a self-signed X.509 certificate for a TLS server. Outputs to -// 'cert.pem' and 'key.pem' and will overwrite existing files. - -package main - -import ( - "crypto/ecdsa" - "crypto/elliptic" - "crypto/rand" - "crypto/rsa" - "crypto/x509" - "crypto/x509/pkix" - "encoding/pem" - "fmt" - "io/ioutil" - "math/big" - "net" - "os" - "strings" - "text/template" - "time" - - "github.com/gin-gonic/gin" - log "github.com/sirupsen/logrus" -) - -var ( - host = "localhost" - validFrom = "" - validFor = 365 * 24 * time.Hour * 2 // 2 years - rsaBits = 2048 -) - -func publicKey(priv interface{}) interface{} { - switch k := priv.(type) { - case *rsa.PrivateKey: - return &k.PublicKey - case *ecdsa.PrivateKey: - return &k.PublicKey - default: - return nil - } -} - -func pemBlockForKey(priv interface{}) *pem.Block { - switch k := priv.(type) { - case *rsa.PrivateKey: - return &pem.Block{Type: "RSA PRIVATE KEY", Bytes: x509.MarshalPKCS1PrivateKey(k)} - case *ecdsa.PrivateKey: - b, err := x509.MarshalECPrivateKey(k) - if err != nil { - fmt.Fprintf(os.Stderr, "Unable to marshal ECDSA private key: %v", err) - os.Exit(2) - } - return &pem.Block{Type: "EC PRIVATE KEY", Bytes: b} - default: - return nil - } -} - -func generateKey(ecdsaCurve string) (interface{}, error) { - switch ecdsaCurve { - case "": - return rsa.GenerateKey(rand.Reader, rsaBits) - case "P224": - return ecdsa.GenerateKey(elliptic.P224(), rand.Reader) - case "P256": - return ecdsa.GenerateKey(elliptic.P256(), rand.Reader) - case "P384": - return ecdsa.GenerateKey(elliptic.P384(), rand.Reader) - case "P521": - return ecdsa.GenerateKey(elliptic.P521(), rand.Reader) - default: - return nil, fmt.Errorf("Unrecognized elliptic curve: %q", ecdsaCurve) - } -} - -func generateSingleCertificate(isCa bool) (*x509.Certificate, error) { - var notBefore time.Time - var err error - if len(validFrom) == 0 { - notBefore = time.Now() - } else { - notBefore, err = time.Parse("Jan 2 15:04:05 2006", validFrom) - if err != nil { - return nil, fmt.Errorf("Failed to parse creation date: %s\n", err.Error()) - } - } - - notAfter := notBefore.Add(validFor) - - serialNumberLimit := new(big.Int).Lsh(big.NewInt(1), 128) - serialNumber, err := rand.Int(rand.Reader, serialNumberLimit) - if err != nil { - return nil, fmt.Errorf("failed to generate serial number: %s\n", err.Error()) - } - - template := x509.Certificate{ - SerialNumber: serialNumber, - Subject: pkix.Name{ - Organization: []string{"Arduino LLC US"}, - Country: []string{"US"}, - CommonName: "127.0.0.1", - OrganizationalUnit: []string{"IT"}, - }, - NotBefore: notBefore, - NotAfter: notAfter, - - KeyUsage: x509.KeyUsageKeyEncipherment | x509.KeyUsageDigitalSignature, - ExtKeyUsage: []x509.ExtKeyUsage{x509.ExtKeyUsageClientAuth, x509.ExtKeyUsageServerAuth}, - BasicConstraintsValid: true, - } - - hosts := strings.Split(host, ",") - for _, h := range hosts { - if ip := net.ParseIP(h); ip != nil { - template.IPAddresses = append(template.IPAddresses, ip) - } else { - template.DNSNames = append(template.DNSNames, h) - } - } - - if isCa { - template.IsCA = true - template.KeyUsage |= x509.KeyUsageCertSign - template.Subject.CommonName = "Arduino" - } - - return &template, nil -} - -func generateCertificates() { - - os.Remove("ca.cert.pem") - os.Remove("ca.key.pem") - os.Remove("cert.pem") - os.Remove("key.pem") - - // Create the key for the certification authority - caKey, err := generateKey("P256") - if err != nil { - log.Error(err.Error()) - os.Exit(1) - } - - keyOut, err := os.OpenFile("ca.key.pem", os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0600) - if err != nil { - log.Error(err.Error()) - os.Exit(1) - } - pem.Encode(keyOut, pemBlockForKey(caKey)) - keyOut.Close() - log.Println("written ca.key.pem") - - // Create the certification authority - caTemplate, err := generateSingleCertificate(true) - - if err != nil { - log.Error(err.Error()) - os.Exit(1) - } - - derBytes, err := x509.CreateCertificate(rand.Reader, caTemplate, caTemplate, publicKey(caKey), caKey) - - certOut, err := os.Create("ca.cert.pem") - if err != nil { - log.Error(err.Error()) - os.Exit(1) - } - pem.Encode(certOut, &pem.Block{Type: "CERTIFICATE", Bytes: derBytes}) - certOut.Close() - log.Print("written ca.cert.pem") - - ioutil.WriteFile("ca.cert.cer", derBytes, 0644) - log.Print("written ca.cert.cer") - - // Create the key for the final certificate - key, err := generateKey("P256") - if err != nil { - log.Error(err.Error()) - os.Exit(1) - } - - keyOut, err = os.OpenFile("key.pem", os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0600) - if err != nil { - log.Error(err.Error()) - os.Exit(1) - } - pem.Encode(keyOut, pemBlockForKey(key)) - keyOut.Close() - log.Println("written key.pem") - - // Create the final certificate - template, err := generateSingleCertificate(false) - - if err != nil { - log.Error(err.Error()) - os.Exit(1) - } - - derBytes, err = x509.CreateCertificate(rand.Reader, template, caTemplate, publicKey(key), caKey) - - certOut, err = os.Create("cert.pem") - if err != nil { - log.Error(err.Error()) - os.Exit(1) - } - pem.Encode(certOut, &pem.Block{Type: "CERTIFICATE", Bytes: derBytes}) - certOut.Close() - log.Print("written cert.pem") - - ioutil.WriteFile("cert.cer", derBytes, 0644) - log.Print("written cert.cer") - -} - -func certHandler(c *gin.Context) { - if strings.Contains(c.Request.UserAgent(), "Firefox") { - c.Header("content-type", "application/x-x509-ca-cert") - c.File("ca.cert.cer") - return - } - noFirefoxTemplate.Execute(c.Writer, gin.H{ - "url": "http://" + c.Request.Host + c.Request.URL.String(), - }) -} - -func deleteCertHandler(c *gin.Context) { - DeleteCertificates() -} - -func DeleteCertificates() { - os.Remove("ca.cert.pem") - os.Remove("ca.cert.cer") - os.Remove("ca.key.pem") -} - -const noFirefoxTemplateHTML = ` - - - - - - -
-

Oops, this is not Firefox

-
- -
-

You need to open this link in Firefox to trust this certificate: {{.host}}{{.url}}

-
- - -` - -var noFirefoxTemplate = template.Must(template.New("home").Parse(noFirefoxTemplateHTML)) diff --git a/certificates/certificates.go b/certificates/certificates.go new file mode 100644 index 000000000..ae2843d22 --- /dev/null +++ b/certificates/certificates.go @@ -0,0 +1,291 @@ +// Copyright 2023 Arduino SA +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published +// by the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +// Generate a self-signed X.509 certificate for a TLS server. Outputs to +// 'cert.pem' and 'key.pem' and will overwrite existing files. + +package certificates + +import ( + "crypto/ecdsa" + "crypto/elliptic" + "crypto/rand" + "crypto/rsa" + "crypto/x509" + "crypto/x509/pkix" + "encoding/pem" + "fmt" + "math/big" + "net" + "os" + "time" + + "github.com/arduino/arduino-create-agent/utilities" + "github.com/arduino/go-paths-helper" + log "github.com/sirupsen/logrus" +) + +var ( + validFrom = "" + validFor = 365 * 24 * time.Hour * 2 // 2 years + rsaBits = 2048 +) + +func publicKey(priv interface{}) interface{} { + switch k := priv.(type) { + case *rsa.PrivateKey: + return &k.PublicKey + case *ecdsa.PrivateKey: + return &k.PublicKey + default: + return nil + } +} + +func pemBlockForKey(priv interface{}) *pem.Block { + switch k := priv.(type) { + case *rsa.PrivateKey: + return &pem.Block{Type: "RSA PRIVATE KEY", Bytes: x509.MarshalPKCS1PrivateKey(k)} + case *ecdsa.PrivateKey: + b, err := x509.MarshalECPrivateKey(k) + if err != nil { + fmt.Fprintf(os.Stderr, "Unable to marshal ECDSA private key: %v", err) + os.Exit(2) + } + return &pem.Block{Type: "EC PRIVATE KEY", Bytes: b} + default: + return nil + } +} + +func generateKey(ecdsaCurve string) (interface{}, error) { + switch ecdsaCurve { + case "": + return rsa.GenerateKey(rand.Reader, rsaBits) + case "P224": + return ecdsa.GenerateKey(elliptic.P224(), rand.Reader) + case "P256": + return ecdsa.GenerateKey(elliptic.P256(), rand.Reader) + case "P384": + return ecdsa.GenerateKey(elliptic.P384(), rand.Reader) + case "P521": + return ecdsa.GenerateKey(elliptic.P521(), rand.Reader) + default: + return nil, fmt.Errorf("unrecognized elliptic curve: %q", ecdsaCurve) + } +} + +func generateSingleCertificate(isCa bool) (*x509.Certificate, error) { + var notBefore time.Time + var err error + if len(validFrom) == 0 { + notBefore = time.Now() + } else { + notBefore, err = time.Parse("Jan 2 15:04:05 2006", validFrom) + if err != nil { + return nil, fmt.Errorf("failed to parse creation date: %s", err.Error()) + } + } + + notAfter := notBefore.Add(validFor) + + serialNumberLimit := new(big.Int).Lsh(big.NewInt(1), 128) + serialNumber, err := rand.Int(rand.Reader, serialNumberLimit) + if err != nil { + return nil, fmt.Errorf("failed to generate serial number: %s", err.Error()) + } + + template := x509.Certificate{ + SerialNumber: serialNumber, + Subject: pkix.Name{ + Organization: []string{"Arduino LLC US"}, + Country: []string{"US"}, + CommonName: "127.0.0.1", + OrganizationalUnit: []string{"IT"}, + }, + NotBefore: notBefore, + NotAfter: notAfter, + + KeyUsage: x509.KeyUsageKeyEncipherment | x509.KeyUsageDigitalSignature, + ExtKeyUsage: []x509.ExtKeyUsage{x509.ExtKeyUsageClientAuth, x509.ExtKeyUsageServerAuth}, + BasicConstraintsValid: true, + } + + template.IPAddresses = append(template.IPAddresses, net.ParseIP("127.0.0.1")) + template.DNSNames = append(template.DNSNames, "localhost") + + if isCa { + template.IsCA = true + template.KeyUsage |= x509.KeyUsageCertSign + template.Subject.CommonName = "Arduino" + } + + return &template, nil +} + +// MigrateCertificatesGeneratedWithOldAgentVersions checks if certificates generated +// with an old version of the Agent needs to be migrated to the current certificates +// directory, and performs the migration if needed. +func MigrateCertificatesGeneratedWithOldAgentVersions(certsDir *paths.Path) { + if certsDir.Join("ca.cert.pem").Exist() { + // The new certificates are already set-up, nothing to do + return + } + + fileList := []string{ + "ca.key.pem", + "ca.cert.pem", + "ca.cert.cer", + "key.pem", + "cert.pem", + "cert.cer", + } + oldCertsDirPath, _ := os.Executable() + oldCertsDir := paths.New(oldCertsDirPath) + for _, fileName := range fileList { + oldCert := oldCertsDir.Join(fileName) + if oldCert.Exist() { + oldCert.CopyTo(certsDir.Join(fileName)) + } + } +} + +// GenerateCertificates will generate the required certificates useful for a HTTPS connection on localhost +func GenerateCertificates(certsDir *paths.Path) { + + // Create the key for the certification authority + caKey, err := generateKey("P256") + if err != nil { + log.Error(err.Error()) + os.Exit(1) + } + + { + keyOutPath := certsDir.Join("ca.key.pem").String() + keyOut, err := os.OpenFile(keyOutPath, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0600) // Save key with user-only permission 0600 + if err != nil { + log.Error(err.Error()) + os.Exit(1) + } + pem.Encode(keyOut, pemBlockForKey(caKey)) + keyOut.Close() + log.Printf("written %s", keyOutPath) + } + + // Create the certification authority + caTemplate, err := generateSingleCertificate(true) + if err != nil { + log.Error(err.Error()) + os.Exit(1) + } + + derBytes, _ := x509.CreateCertificate(rand.Reader, caTemplate, caTemplate, publicKey(caKey), caKey) + + { + caCertOutPath := certsDir.Join("ca.cert.pem") + caCertOut, err := caCertOutPath.Create() + if err != nil { + log.Error(err.Error()) + os.Exit(1) + } + pem.Encode(caCertOut, &pem.Block{Type: "CERTIFICATE", Bytes: derBytes}) + caCertOut.Close() + log.Printf("written %s", caCertOutPath) + } + + { + caCertPath := certsDir.Join("ca.cert.cer") + caCertPath.WriteFile(derBytes) + log.Printf("written %s", caCertPath) + } + + // Create the key for the final certificate + key, err := generateKey("P256") + if err != nil { + log.Error(err.Error()) + os.Exit(1) + } + + { + keyOutPath := certsDir.Join("key.pem").String() + keyOut, err := os.OpenFile(keyOutPath, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0600) // Save key with user-only permission 0600 + if err != nil { + log.Error(err.Error()) + os.Exit(1) + } + pem.Encode(keyOut, pemBlockForKey(key)) + keyOut.Close() + log.Printf("written %s", keyOutPath) + } + + // Create the final certificate + template, err := generateSingleCertificate(false) + if err != nil { + log.Error(err.Error()) + os.Exit(1) + } + + derBytes, _ = x509.CreateCertificate(rand.Reader, template, caTemplate, publicKey(key), caKey) + + { + certOutPath := certsDir.Join("cert.pem").String() + certOut, err := os.Create(certOutPath) + if err != nil { + log.Error(err.Error()) + os.Exit(1) + } + pem.Encode(certOut, &pem.Block{Type: "CERTIFICATE", Bytes: derBytes}) + certOut.Close() + log.Printf("written %s", certOutPath) + } + + { + certPath := certsDir.Join("cert.cer") + certPath.WriteFile(derBytes) + log.Printf("written %s", certPath) + } +} + +// DeleteCertificates will delete the certificates +func DeleteCertificates(certDir *paths.Path) { + certDir.Join("ca.key.pem").Remove() + certDir.Join("ca.cert.pem").Remove() + certDir.Join("ca.cert.cer").Remove() + certDir.Join("key.pem").Remove() + certDir.Join("cert.pem").Remove() + certDir.Join("cert.cer").Remove() +} + +// IsExpired checks if a certificate is expired or about to expire (less than 1 month) +func IsExpired() (bool, error) { + bound := time.Now().AddDate(0, 1, 0) + date, err := GetExpirationDate() + if err != nil { + return false, err + } + return date.Before(bound), nil +} + +// GenerateAndInstallCertificates generates and installs the certificates +func GenerateAndInstallCertificates(certDir *paths.Path) { + GenerateCertificates(certDir) + err := InstallCertificate(certDir.Join("ca.cert.cer")) + // if something goes wrong during the cert install we remove them, so the user is able to retry + if err != nil { + log.Errorf("cannot install certificates something went wrong: %s", err) + DeleteCertificates(certDir) + } + utilities.UserPrompt("The HTTPS certificate has been installed correctly.", "{\"OK\"}", "OK", "OK", "Arduino Agent: HTTPS certificate installation") +} diff --git a/certificates/certificates_darwin.h b/certificates/certificates_darwin.h new file mode 100644 index 000000000..78ba0ae5f --- /dev/null +++ b/certificates/certificates_darwin.h @@ -0,0 +1,7 @@ +const char *getDefaultBrowserName(); + +const char *installCert(const char *path); +const char *uninstallCert(); +const bool certInKeychain(); + +const char *getExpirationDate(long *expirationDate); \ No newline at end of file diff --git a/certificates/certificates_darwin.m b/certificates/certificates_darwin.m new file mode 100644 index 000000000..0ac511833 --- /dev/null +++ b/certificates/certificates_darwin.m @@ -0,0 +1,137 @@ +#import +#import +#include "certificates_darwin.h" + +// Used to return error strings (as NSString) as a C-string to the Go code. +const char *toErrorString(NSString *errString) { + NSLog(@"%@", errString); + return [errString cStringUsingEncoding:[NSString defaultCStringEncoding]]; +} + +// Returns a string describing the name of the default browser set for the user, nil in case of error. +const char *getDefaultBrowserName() { + NSURL *defaultBrowserURL = [[NSWorkspace sharedWorkspace] URLForApplicationToOpenURL:[NSURL URLWithString:@"http://"]]; + if (defaultBrowserURL) { + NSBundle *defaultBrowserBundle = [NSBundle bundleWithURL:defaultBrowserURL]; + NSString *defaultBrowser = [defaultBrowserBundle objectForInfoDictionaryKey:@"CFBundleDisplayName"]; + + return [defaultBrowser cStringUsingEncoding:[NSString defaultCStringEncoding]]; + } + + return ""; +} + +// inspired by https://stackoverflow.com/questions/12798950/ios-install-ssl-certificate-programmatically +const char *installCert(const char *path) { + NSURL *url = [NSURL fileURLWithPath:@(path) isDirectory:NO]; + NSData *rootCertData = [NSData dataWithContentsOfURL:url]; + + OSStatus err = noErr; + SecCertificateRef rootCert = SecCertificateCreateWithData(kCFAllocatorDefault, (CFDataRef) rootCertData); + + CFTypeRef result; + + NSDictionary* dict = [NSDictionary dictionaryWithObjectsAndKeys: + (id)kSecClassCertificate, kSecClass, + rootCert, kSecValueRef, + nil]; + + err = SecItemAdd((CFDictionaryRef)dict, &result); + + if (err == noErr) { + NSLog(@"Install root certificate success"); + } else if (err == errSecDuplicateItem) { + NSString *errString = [@"duplicate root certificate entry. Error: " stringByAppendingFormat:@"%d", err]; + NSLog(@"%@", errString); + return [errString cStringUsingEncoding:[NSString defaultCStringEncoding]]; + } else { + NSString *errString = [@"install root certificate failure. Error: " stringByAppendingFormat:@"%d", err]; + NSLog(@"%@", errString); + return [errString cStringUsingEncoding:[NSString defaultCStringEncoding]]; + } + + NSDictionary *newTrustSettings = @{(id)kSecTrustSettingsResult: [NSNumber numberWithInt:kSecTrustSettingsResultTrustRoot]}; + err = SecTrustSettingsSetTrustSettings(rootCert, kSecTrustSettingsDomainUser, (__bridge CFTypeRef)(newTrustSettings)); + if (err != errSecSuccess) { + NSString *errString = [@"Could not change the trust setting for a certificate. Error: " stringByAppendingFormat:@"%d", err]; + NSLog(@"%@", errString); + return [errString cStringUsingEncoding:[NSString defaultCStringEncoding]]; + } + + return ""; +} + +const char *uninstallCert() { + // Each line is a key-value of the dictionary. Note: the the inverted order, value first then key. + NSDictionary* dict = [NSDictionary dictionaryWithObjectsAndKeys: + (id)kSecClassCertificate, kSecClass, + CFSTR("Arduino"), kSecAttrLabel, + kSecMatchLimitOne, kSecMatchLimit, + kCFBooleanTrue, kSecReturnAttributes, + nil]; + + OSStatus err = noErr; + // Use this function to check for errors + err = SecItemCopyMatching((CFDictionaryRef)dict, nil); + if (err == noErr) { + err = SecItemDelete((CFDictionaryRef)dict); + if (err != noErr) { + NSString *errString = [@"Could not delete the certificates. Error: " stringByAppendingFormat:@"%d", err]; + NSLog(@"%@", errString); + return [errString cStringUsingEncoding:[NSString defaultCStringEncoding]]; + } + } else if (err != errSecItemNotFound){ + NSString *errString = [@"Error: " stringByAppendingFormat:@"%d", err]; + NSLog(@"%@", errString); + return [errString cStringUsingEncoding:[NSString defaultCStringEncoding]]; + } + return ""; +} + +const bool certInKeychain() { + // Create a key-value dictionary used to query the Keychain and look for the "Arduino" root certificate. + NSDictionary *getquery = @{ + (id)kSecClass: (id)kSecClassCertificate, + (id)kSecAttrLabel: @"Arduino", + (id)kSecReturnRef: @YES, + }; + + OSStatus err = SecItemCopyMatching((CFDictionaryRef)getquery, nil); + return (err == noErr); // No error means the certificate was found, otherwise err will be "errSecItemNotFound". +} + +// Returns the expiration date "kSecOIDX509V1ValidityNotAfter" of the Arduino certificate. +// The value is returned as a CFAbsoluteTime: a long number of seconds from the date of 1 Jan 2001 00:00:00 GMT. +const char *getExpirationDate(long *expirationDate) { + // Create a key-value dictionary used to query the Keychain and look for the "Arduino" root certificate. + NSDictionary *getquery = @{ + (id)kSecClass: (id)kSecClassCertificate, + (id)kSecAttrLabel: @"Arduino", + (id)kSecReturnRef: @YES, + }; + + SecCertificateRef cert = NULL; + + // Search the keychain for certificates matching the query above. + OSStatus err = SecItemCopyMatching((CFDictionaryRef)getquery, (CFTypeRef *)&cert); + if (err != noErr) return toErrorString([@"Error getting the certificate: " stringByAppendingFormat:@"%d", err]); + + // Get data from the certificate, as a dictionary of properties. We just need the "invalidity not after" property. + CFDictionaryRef certDict = SecCertificateCopyValues(cert, + (__bridge CFArrayRef)@[(__bridge id)kSecOIDX509V1ValidityNotAfter], NULL); + if (certDict == NULL) return toErrorString(@"SecCertificateCopyValues failed"); + + + // Get the "validity not after" property as a dictionary, and get the "value" key (that is a number). + CFDictionaryRef validityNotAfterDict = CFDictionaryGetValue(certDict, kSecOIDX509V1ValidityNotAfter); + if (validityNotAfterDict == NULL) return toErrorString(@"CFDictionaryGetValue (validity) failed"); + + CFNumberRef number = (CFNumberRef)CFDictionaryGetValue(validityNotAfterDict, kSecPropertyKeyValue); + if (number == NULL) return toErrorString(@"CFDictionaryGetValue (keyValue) failed"); + + CFNumberGetValue(number, kCFNumberSInt64Type, expirationDate); + // NSLog(@"Certificate validity not after: %ld", *expirationDate); + + CFRelease(certDict); + return ""; // No error. +} \ No newline at end of file diff --git a/certificates/install_darwin.go b/certificates/install_darwin.go new file mode 100644 index 000000000..515c9f7d4 --- /dev/null +++ b/certificates/install_darwin.go @@ -0,0 +1,101 @@ +// Copyright 2023 Arduino SA +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published +// by the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +package certificates + +/* +// Explicitly tell the GCC compiler that the language is Objective-C. +#cgo CFLAGS: -x objective-c + +// Pass the list of macOS frameworks needed by this piece of Objective-C code. +#cgo LDFLAGS: -framework Foundation -framework Security -framework AppKit + +#import +#include "certificates_darwin.h" +*/ +import "C" +import ( + "errors" + "time" + "unsafe" + + log "github.com/sirupsen/logrus" + + "github.com/arduino/arduino-create-agent/utilities" + "github.com/arduino/go-paths-helper" +) + +// InstallCertificate will install the certificates in the system keychain on macos, +// if something goes wrong will show a dialog with the error and return an error +func InstallCertificate(cert *paths.Path) error { + log.Infof("Installing certificate: %s", cert) + ccert := C.CString(cert.String()) + defer C.free(unsafe.Pointer(ccert)) + p := C.installCert(ccert) + s := C.GoString(p) + if len(s) != 0 { + utilities.UserPrompt(s, "\"OK\"", "OK", "OK", "Arduino Agent: Error installing certificates") + UninstallCertificates() + return errors.New(s) + } + return nil +} + +// UninstallCertificates will uninstall the certificates from the system keychain on macos, +// if something goes wrong will show a dialog with the error and return an error +func UninstallCertificates() error { + log.Infof("Uninstalling certificates") + p := C.uninstallCert() + s := C.GoString(p) + if len(s) != 0 { + utilities.UserPrompt(s, "\"OK\"", "OK", "OK", "Arduino Agent: Error uninstalling certificates") + return errors.New(s) + } + return nil +} + +// GetExpirationDate returns the expiration date of a certificate stored in the keychain +func GetExpirationDate() (time.Time, error) { + log.Infof("Retrieving certificate's expiration date") + + expirationDateLong := C.long(0) + + err := C.getExpirationDate(&expirationDateLong) + errString := C.GoString(err) + if len(errString) > 0 { + utilities.UserPrompt(errString, "\"OK\"", "OK", "OK", "Arduino Agent: Error retrieving expiration date") + return time.Time{}, errors.New(errString) + } + + // The expirationDate is the number of seconds from the date of 1 Jan 2001 00:00:00 GMT. + // Add 31 years to convert it to Unix Epoch. + expirationDate := int64(expirationDateLong) + return time.Unix(expirationDate, 0).AddDate(31, 0, 0), nil +} + +// GetDefaultBrowserName returns the name of the default browser +func GetDefaultBrowserName() string { + log.Infof("Retrieving default browser name") + p := C.getDefaultBrowserName() + return C.GoString(p) +} + +// CertInKeychain checks if the certificate is stored inside the keychain +func CertInKeychain() bool { + log.Infof("Checking if the Arduino certificate is in the keychain") + + certInKeychain := C.certInKeychain() + return bool(certInKeychain) +} diff --git a/certificates/install_default.go b/certificates/install_default.go new file mode 100644 index 000000000..533574d69 --- /dev/null +++ b/certificates/install_default.go @@ -0,0 +1,57 @@ +// Copyright 2023 Arduino SA +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published +// by the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +//go:build !darwin + +package certificates + +import ( + "errors" + "time" + + log "github.com/sirupsen/logrus" + + "github.com/arduino/go-paths-helper" +) + +// InstallCertificate won't do anything on unsupported Operative Systems +func InstallCertificate(cert *paths.Path) error { + log.Warn("platform not supported for the certificate install") + return errors.New("platform not supported for the certificate install") +} + +// UninstallCertificates won't do anything on unsupported Operative Systems +func UninstallCertificates() error { + log.Warn("platform not supported for the certificates uninstall") + return errors.New("platform not supported for the certificates uninstall") +} + +// GetExpirationDate won't do anything on unsupported Operative Systems +func GetExpirationDate() (time.Time, error) { + log.Warn("platform not supported for retrieving certificates expiration date") + return time.Time{}, errors.New("platform not supported for retrieving certificates expiration date") +} + +// GetDefaultBrowserName won't do anything on unsupported Operative Systems +func GetDefaultBrowserName() string { + log.Warn("platform not supported for retrieving default browser name") + return "" +} + +// CertInKeychain won't do anything on unsupported Operative Systems +func CertInKeychain() bool { + log.Warn("platform not supported for verifying the certificate existence") + return false +} diff --git a/config/ArduinoCreateAgent.plist b/config/ArduinoCreateAgent.plist new file mode 100644 index 000000000..7e85cc3b5 --- /dev/null +++ b/config/ArduinoCreateAgent.plist @@ -0,0 +1,16 @@ + + + + + KeepAlive + + Label + cc.arduino.arduino-create-agent + Program + {{.Program}} + RunAtLoad + <{{.RunAtLoad}}/> + AbandonProcessGroup + + + \ No newline at end of file diff --git a/config/autostart.go b/config/autostart.go new file mode 100644 index 000000000..e45333d5b --- /dev/null +++ b/config/autostart.go @@ -0,0 +1,158 @@ +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published +// by the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +package config + +import ( + "bytes" + // we need this for the ArduinoCreateAgent.plist in this package + _ "embed" + "os" + "os/exec" + "text/template" + + "github.com/arduino/go-paths-helper" + log "github.com/sirupsen/logrus" +) + +//go:embed ArduinoCreateAgent.plist +var launchdAgentDefinition []byte + +// getLaunchdAgentPath will return the path of the launchd agent default path +func getLaunchdAgentPath() *paths.Path { + homeDir := GetDefaultHomeDir() + launchAgentsPath := homeDir.Join("Library", "LaunchAgents") + agentPlistPath := launchAgentsPath.Join("ArduinoCreateAgent.plist") + + if err := os.MkdirAll(launchAgentsPath.String(), 0755); err != nil { + log.Panicf("Could not create ~/Library/LaunchAgents directory: %s", err) + } + + return agentPlistPath +} + +// InstallPlistFile will handle the process of creating the plist file required for the autostart +// and loading it using launchd +func InstallPlistFile() { + launchdAgentPath := getLaunchdAgentPath() + if !launchdAgentPath.Exist() { + writeAndLoadPlistFile(launchdAgentPath) + log.Info("Quitting, another instance of the agent has been started by launchd") + os.Exit(0) + } else { + // we already have an existing launchd plist file, so we check if it's updated + launchAgentContent, _ := launchdAgentPath.ReadFile() + launchAgentContentNew, _ := getLaunchdAgentDefinition() + if bytes.Equal(launchAgentContent, launchAgentContentNew) { + log.Infof("the autostart file %s already exists: nothing to do", launchdAgentPath) + } else { + log.Infof("the autostart file %s needs to be updated", launchdAgentPath) + removePlistFile() + writeAndLoadPlistFile(launchdAgentPath) + } + + } +} + +// writeAndLoadPlistFile function will write the plist file, load it, and then exit, because launchd will start a new instance. +func writeAndLoadPlistFile(launchdAgentPath *paths.Path) { + err := writePlistFile(launchdAgentPath) + if err != nil { + log.Error(err) + } else { + err = loadLaunchdAgent() // this will load the agent: basically starting a new instance + if err != nil { + log.Error(err) + } + } +} + +// writePlistFile function will write the required plist file to launchdAgentPath +// it will return nil in case of success, +// it will error in any other case +func writePlistFile(launchdAgentPath *paths.Path) error { + definition, err := getLaunchdAgentDefinition() + if err != nil { + return err + } + // we need to create a new launchd plist file + return launchdAgentPath.WriteFile(definition) +} + +// getLaunchdAgentDefinition will return the definition of the new LaunchdAgent +func getLaunchdAgentDefinition() ([]byte, error) { + src, err := os.Executable() + + if err != nil { + return nil, err + } + data := struct { + Program string + RunAtLoad bool + }{ + Program: src, + RunAtLoad: true, // This will start the agent right after login (and also after `launchctl load ...`) + } + + t := template.Must(template.New("launchdConfig").Parse(string(launchdAgentDefinition))) + + buf := bytes.NewBuffer(nil) + err = t.Execute(buf, data) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} + +// loadLaunchdAgent will use launchctl to load the agent, will return an error if something goes wrong +func loadLaunchdAgent() error { + // https://www.launchd.info/ + oscmd := exec.Command("launchctl", "load", getLaunchdAgentPath().String()) + err := oscmd.Run() + return err +} + +// UninstallPlistFile will handle the process of unloading (unsing launchd) the file required for the autostart +// and removing the file +func UninstallPlistFile() { + err := unloadLaunchdAgent() + if err != nil { + log.Error(err) + } else { + err = removePlistFile() + if err != nil { + log.Error(err) + } + } +} + +// unloadLaunchdAgent will use launchctl to load the agent, will return an error if something goes wrong +func unloadLaunchdAgent() error { + // https://www.launchd.info/ + oscmd := exec.Command("launchctl", "unload", getLaunchdAgentPath().String()) + err := oscmd.Run() + return err +} + +// removePlistFile function will remove the plist file from $HOME/Library/LaunchAgents/ArduinoCreateAgent.plist and return an error +// it will not do anything if the file is not there +func removePlistFile() error { + launchdAgentPath := getLaunchdAgentPath() + if launchdAgentPath.Exist() { + log.Infof("removing: %s", launchdAgentPath) + return launchdAgentPath.Remove() + } + log.Infof("the autostart file %s do not exists: nothing to do", launchdAgentPath) + return nil +} diff --git a/config/config.go b/config/config.go new file mode 100644 index 000000000..69d29eeee --- /dev/null +++ b/config/config.go @@ -0,0 +1,144 @@ +// Copyright 2023 Arduino SA +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published +// by the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +package config + +import ( + // we need this for the config ini in this package + _ "embed" + "os" + + "github.com/arduino/go-paths-helper" + "github.com/go-ini/ini" + log "github.com/sirupsen/logrus" +) + +// GetCertificatesDir return the directory where SSL certificates are saved +func GetCertificatesDir() *paths.Path { + return GetDataDir() +} + +// CertsExist checks if the certs have already been generated +func CertsExist() bool { + certFile := GetCertificatesDir().Join("cert.pem") + return certFile.Exist() //if the certFile is not present we assume there are no certs +} + +// GetDataDir returns the full path to the default Arduino Create Agent data directory. +func GetDataDir() *paths.Path { + userDir, err := os.UserHomeDir() + if err != nil { + log.Panicf("Could not get user dir: %s", err) + } + dataDir := paths.New(userDir, ".arduino-create") + if err := dataDir.MkdirAll(); err != nil { + log.Panicf("Could not create data dir: %s", err) + } + return dataDir +} + +// GetLogsDir return the directory where logs are saved +func GetLogsDir() *paths.Path { + logsDir := GetDataDir().Join("logs") + if err := logsDir.MkdirAll(); err != nil { + log.Panicf("Can't create logs dir: %s", err) + } + return logsDir +} + +// LogsIsEmpty checks if the folder containing crash-reports is empty +func LogsIsEmpty() bool { + return GetLogsDir().NotExist() // if the logs directory is empty we assume there are no crashreports +} + +// GetDefaultConfigDir returns the full path to the default Arduino Create Agent configuration directory. +func GetDefaultConfigDir() *paths.Path { + // UserConfigDir returns the default root directory to use + // for user-specific configuration data. Users should create + // their own application-specific subdirectory within this + // one and use that. + // + // On Unix systems, it returns $XDG_CONFIG_HOME as specified by + // https://specifications.freedesktop.org/basedir-spec/basedir-spec-latest.html + // if non-empty, else $HOME/.config. + // + // On Darwin, it returns $HOME/Library/Application Support. + // On Windows, it returns %AppData%. + // On Plan 9, it returns $home/lib. + // + // If the location cannot be determined (for example, $HOME + // is not defined), then it will return an error. + configDir, err := os.UserConfigDir() + if err != nil { + log.Panicf("Can't get user home dir: %s", err) + } + + agentConfigDir := paths.New(configDir, "ArduinoCreateAgent") + if err := agentConfigDir.MkdirAll(); err != nil { + log.Panicf("Can't create config dir: %s", err) + } + return agentConfigDir +} + +// GetDefaultHomeDir returns the full path to the user's home directory. +func GetDefaultHomeDir() *paths.Path { + // UserHomeDir returns the current user's home directory. + + // On Unix, including macOS, it returns the $HOME environment variable. + // On Windows, it returns %USERPROFILE%. + // On Plan 9, it returns the $home environment variable. + + homeDir, err := os.UserHomeDir() + if err != nil { + log.Panicf("Can't get user home dir: %s", err) + } + + return paths.New(homeDir) +} + +//go:embed config.ini +var configContent []byte + +// GenerateConfig function will take a directory path as an input +// and will write the default config,ini file to that directory, +// it will panic if something goes wrong +func GenerateConfig(destDir *paths.Path) *paths.Path { + configPath := destDir.Join("config.ini") + + // generate the config.ini file directly in destDir + if err := configPath.WriteFile(configContent); err != nil { + // if we do not have a config there's nothing else we can do + panic("cannot generate config: " + err.Error()) + } + log.Infof("generated config in %s", configPath) + return configPath +} + +// SetInstallCertsIni sets installCerts value to true in the config +func SetInstallCertsIni(filename string, value string) error { + cfg, err := ini.LoadSources(ini.LoadOptions{IgnoreInlineComment: false, AllowPythonMultilineValues: true}, filename) + if err != nil { + return err + } + _, err = cfg.Section("").NewKey("installCerts", value) + if err != nil { + return err + } + err = cfg.SaveTo(filename) + if err != nil { + return err + } + return nil +} diff --git a/config.ini b/config/config.ini similarity index 84% rename from config.ini rename to config/config.ini index 960e5f3d3..f63377db5 100644 --- a/config.ini +++ b/config/config.ini @@ -6,4 +6,5 @@ appName = CreateAgent/Stable updateUrl = https://downloads.arduino.cc/ origins = https://local.arduino.cc:8000 #httpProxy = http://your.proxy:port # Proxy server for HTTP requests -crashreport = false # enable crashreport logging \ No newline at end of file +crashreport = false # enable crashreport logging +autostartMacOS = true # the Arduino Create Agent is able to start automatically after login on macOS (launchd agent) \ No newline at end of file diff --git a/conn.go b/conn.go index 87d11e841..8c71c54c4 100644 --- a/conn.go +++ b/conn.go @@ -1,19 +1,28 @@ +// Copyright 2022 Arduino SA +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published +// by the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + // Supports Windows, Linux, Mac, and Raspberry Pi package main import ( "bytes" - "crypto" "crypto/rsa" - "crypto/sha256" - "crypto/x509" - "encoding/hex" "encoding/json" - "encoding/pem" "errors" "fmt" - "io/ioutil" "net/http" "os" "path/filepath" @@ -30,8 +39,7 @@ type connection struct { ws socketio.Socket // Buffered channel of outbound messages. - send chan []byte - incoming chan []byte + send chan []byte } func (c *connection) writer() { @@ -52,7 +60,7 @@ func (s *WsServer) ServeHTTP(c *gin.Context) { s.Server.ServeHTTP(c.Writer, c.Request) } -type AdditionalFile struct { +type additionalFile struct { Hex []byte `json:"hex"` Filename string `json:"filename"` } @@ -67,115 +75,119 @@ type Upload struct { Extra upload.Extra `json:"extra"` Hex []byte `json:"hex"` Filename string `json:"filename"` - ExtraFiles []AdditionalFile `json:"extrafiles"` + ExtraFiles []additionalFile `json:"extrafiles"` } var uploadStatusStr = "ProgrammerStatus" -func uploadHandler(c *gin.Context) { - - data := new(Upload) - c.BindJSON(data) - - log.Printf("%+v %+v %+v %+v %+v %+v", data.Port, data.Board, data.Rewrite, data.Commandline, data.Extra, data.Filename) - - if data.Port == "" { - c.String(http.StatusBadRequest, "port is required") - return - } - - if data.Board == "" { - c.String(http.StatusBadRequest, "board is required") - log.Error("board is required") - return - } - - if data.Extra.Network == false { - if data.Signature == "" { - c.String(http.StatusBadRequest, "signature is required") +func uploadHandler(pubKey *rsa.PublicKey) func(*gin.Context) { + return func(c *gin.Context) { + data := new(Upload) + if err := c.BindJSON(data); err != nil { + c.String(http.StatusBadRequest, fmt.Sprintf("err with the payload. %v", err.Error())) return } - if data.Commandline == "" { - c.String(http.StatusBadRequest, "commandline is required for local board") + log.Printf("%+v %+v %+v %+v %+v %+v", data.Port, data.Board, data.Rewrite, data.Commandline, data.Extra, data.Filename) + + if data.Port == "" { + c.String(http.StatusBadRequest, "port is required") return } - err := verifyCommandLine(data.Commandline, data.Signature) - - if err != nil { - c.String(http.StatusBadRequest, "signature is invalid") + if data.Board == "" { + c.String(http.StatusBadRequest, "board is required") + log.Error("board is required") return } - } - buffer := bytes.NewBuffer(data.Hex) + if !data.Extra.Network { + if data.Signature == "" { + c.String(http.StatusBadRequest, "signature is required") + return + } - filePath, err := utilities.SaveFileonTempDir(data.Filename, buffer) - if err != nil { - c.String(http.StatusBadRequest, err.Error()) - return - } + if data.Commandline == "" { + c.String(http.StatusBadRequest, "commandline is required for local board") + return + } - var filePaths []string - filePaths = append(filePaths, filePath) + err := utilities.VerifyInput(data.Commandline, data.Signature, pubKey) - tmpdir, err := ioutil.TempDir("", "extrafiles") - if err != nil { - c.String(http.StatusBadRequest, err.Error()) - return - } + if err != nil { + log.WithField("err", err).Error("Error verifying the command") + c.String(http.StatusBadRequest, "signature is invalid") + return + } + } - for _, extraFile := range data.ExtraFiles { - path := filepath.Join(tmpdir, extraFile.Filename) - filePaths = append(filePaths, path) - log.Printf("Saving %s on %s", extraFile.Filename, path) + buffer := bytes.NewBuffer(data.Hex) - err = os.MkdirAll(filepath.Dir(path), 0744) + filePath, err := utilities.SaveFileonTempDir(data.Filename, buffer) if err != nil { c.String(http.StatusBadRequest, err.Error()) return } - err := ioutil.WriteFile(path, extraFile.Hex, 0644) + tmpdir, err := os.MkdirTemp("", "extrafiles") if err != nil { c.String(http.StatusBadRequest, err.Error()) return } - } - - if data.Rewrite != "" { - data.Board = data.Rewrite - } - - go func() { - // Resolve commandline - commandline, err := upload.PartiallyResolve(data.Board, filePath, tmpdir, data.Commandline, data.Extra, &Tools) - if err != nil { - send(map[string]string{uploadStatusStr: "Error", "Msg": err.Error()}) - return - } - - l := PLogger{Verbose: true} - // Upload - if data.Extra.Network { - send(map[string]string{uploadStatusStr: "Starting", "Cmd": "Network"}) - err = upload.Network(data.Port, data.Board, filePaths, commandline, data.Extra.Auth, l, data.Extra.SSH) - } else { - send(map[string]string{uploadStatusStr: "Starting", "Cmd": "Serial"}) - err = upload.Serial(data.Port, commandline, data.Extra, l) + for _, extraFile := range data.ExtraFiles { + path, err := utilities.SafeJoin(tmpdir, extraFile.Filename) + if err != nil { + c.String(http.StatusBadRequest, err.Error()) + return + } + log.Printf("Saving %s on %s", extraFile.Filename, path) + + err = os.MkdirAll(filepath.Dir(path), 0744) + if err != nil { + c.String(http.StatusBadRequest, err.Error()) + return + } + + err = os.WriteFile(path, extraFile.Hex, 0644) + if err != nil { + c.String(http.StatusBadRequest, err.Error()) + return + } } - // Handle result - if err != nil { - send(map[string]string{uploadStatusStr: "Error", "Msg": err.Error()}) - return + if data.Rewrite != "" { + data.Board = data.Rewrite } - send(map[string]string{uploadStatusStr: "Done", "Flash": "Ok"}) - }() - c.String(http.StatusAccepted, "") + go func() { + // Resolve commandline + commandline, err := upload.PartiallyResolve(data.Board, filePath, tmpdir, data.Commandline, data.Extra, Tools) + if err != nil { + send(map[string]string{uploadStatusStr: "Error", "Msg": err.Error()}) + return + } + + l := PLogger{Verbose: true} + + // Upload + if data.Extra.Network { + err = errors.New("network upload is not supported anymore, pease use OTA instead") + } else { + send(map[string]string{uploadStatusStr: "Starting", "Cmd": "Serial"}) + err = upload.Serial(data.Port, commandline, data.Extra, l) + } + + // Handle result + if err != nil { + send(map[string]string{uploadStatusStr: "Error", "Msg": err.Error()}) + return + } + send(map[string]string{uploadStatusStr: "Done", "Flash": "Ok"}) + }() + + c.String(http.StatusAccepted, "") + } } // PLogger sends the info from the upload to the websocket @@ -202,23 +214,6 @@ func send(args map[string]string) { h.broadcastSys <- mapB } -func verifyCommandLine(input string, signature string) error { - sign, _ := hex.DecodeString(signature) - block, _ := pem.Decode([]byte(*signatureKey)) - if block == nil { - return errors.New("invalid key") - } - key, err := x509.ParsePKIXPublicKey(block.Bytes) - if err != nil { - return err - } - rsaKey := key.(*rsa.PublicKey) - h := sha256.New() - h.Write([]byte(input)) - d := h.Sum(nil) - return rsa.VerifyPKCS1v15(rsaKey, crypto.SHA256, d, sign) -} - func wsHandler() *WsServer { server, err := socketio.NewServer(nil) if err != nil { diff --git a/design/design.go b/design/design.go index d65793916..b690a40e4 100644 --- a/design/design.go +++ b/design/design.go @@ -1,6 +1,21 @@ +// Copyright 2022 Arduino SA +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published +// by the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + package design -import . "goa.design/goa/dsl" +import . "goa.design/goa/v3/dsl" var _ = API("arduino-create-agent", func() { Title("Arduino Create Agent") @@ -9,5 +24,7 @@ var _ = API("arduino-create-agent", func() { such as detecting which boards are connected and upload sketches on them.`) HTTP(func() { Path("/v2") + Consumes("application/json") + Consumes("plain/text") }) }) diff --git a/design/docs.go b/design/docs.go deleted file mode 100644 index d86fd9065..000000000 --- a/design/docs.go +++ /dev/null @@ -1,10 +0,0 @@ -package design - -import . "goa.design/goa/dsl" - -var _ = Service("docs", func() { - HTTP(func() { - Path("/docs") - }) - Files("/pkgs", "docs/pkgs.html") -}) diff --git a/design/pkgs.go b/design/pkgs.go index 2e566fdbe..21c30d217 100644 --- a/design/pkgs.go +++ b/design/pkgs.go @@ -1,41 +1,21 @@ -package design - -import . "goa.design/goa/dsl" - -var _ = Service("indexes", func() { - Description("The indexes service manages the package_index files") - - Error("invalid_url", ErrorResult, "url invalid") - HTTP(func() { - Response("invalid_url", StatusBadRequest) - }) - - Method("list", func() { - Result(ArrayOf(String)) - HTTP(func() { - GET("/pkgs/indexes") - Response(StatusOK) - }) - }) +// Copyright 2022 Arduino SA +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published +// by the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . - Method("add", func() { - Payload(IndexPayload) - Result(Operation) - HTTP(func() { - POST("/pkgs/indexes/add") - Response(StatusOK) - }) - }) +package design - Method("remove", func() { - Payload(IndexPayload) - Result(Operation) - HTTP(func() { - POST("/pkgs/indexes/delete") - Response(StatusOK) - }) - }) -}) +import . "goa.design/goa/v3/dsl" var _ = Service("tools", func() { Description("The tools service manages the available and installed tools") @@ -48,6 +28,13 @@ var _ = Service("tools", func() { }) }) + Method("installedhead", func() { + HTTP(func() { + HEAD("/pkgs/tools/installed") + Response(StatusOK) + }) + }) + Method("installed", func() { Result(CollectionOf(Tool)) HTTP(func() { @@ -80,35 +67,35 @@ var _ = Service("tools", func() { }) }) -var IndexPayload = Type("arduino.index", func() { - TypeName("IndexPayload") - - Attribute("url", String, "The url of the index file", func() { - Example("https://downloads.arduino.cc/packages/package_index.json") - }) - Required("url") -}) - var ToolPayload = Type("arduino.tool", func() { Description(`A tool is an executable program that can upload sketches. If url is absent the tool will be searched among the package index installed`) TypeName("ToolPayload") Attribute("name", String, "The name of the tool", func() { - Example("avrdude") + Example("bossac") }) Attribute("version", String, "The version of the tool", func() { - Example("6.3.0-arduino9") + Example("1.7.0-arduino3") }) Attribute("packager", String, "The packager of the tool", func() { Example("arduino") }) Attribute("url", String, `The url where the package can be found. Optional. - If present checksum must also be present.`) + If present checksum must also be present.`, func() { + Example("http://downloads.arduino.cc/tools/bossac-1.7.0-arduino3-linux64.tar.gz") + }) Attribute("checksum", String, `A checksum of the archive. Mandatory when url is present. - This ensures that the package is downloaded correcly.`) + This ensures that the package is downloaded correcly.`, func() { + Example("SHA-256:1ae54999c1f97234a5c603eb99ad39313b11746a4ca517269a9285afa05f9100") + }) + + Attribute("signature", String, `The signature used to sign the url. Mandatory when url is present. + This ensure the security of the file downloaded`, func() { + Example("382898a97b5a86edd74208f10107d2fecbf7059ffe9cc856e045266fb4db4e98802728a0859cfdcda1c0b9075ec01e42dbea1f430b813530d5a6ae1766dfbba64c3e689b59758062dc2ab2e32b2a3491dc2b9a80b9cda4ae514fbe0ec5af210111b6896976053ab76bac55bcecfcececa68adfa3299e3cde6b7f117b3552a7d80ca419374bb497e3c3f12b640cf5b20875416b45e662fc6150b99b178f8e41d6982b4c0a255925ea39773683f9aa9201dc5768b6fc857c87ff602b6a93452a541b8ec10ca07f166e61a9e9d91f0a6090bd2038ed4427af6251039fb9fe8eb62ec30d7b0f3df38bc9de7204dec478fb86f8eb3f71543710790ee169dce039d3e0") + }) Required("name", "version", "packager") }) diff --git a/discovery.go b/discovery.go deleted file mode 100644 index e83d7a46d..000000000 --- a/discovery.go +++ /dev/null @@ -1,158 +0,0 @@ -// -// discovery.go -// -// Created by Martino Facchin -// Copyright (c) 2015 Arduino LLC -// -// 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. -// - -package main - -import ( - "net" - "strings" - "time" - - "github.com/oleksandr/bonjour" - log "github.com/sirupsen/logrus" -) - -const timeoutConst = 2 - -// SavedNetworkPorts contains the ports which we know are already connected -var SavedNetworkPorts []OsSerialPort - -// GetNetworkList returns a list of Network Ports -// The research of network ports is articulated in two phases. First we add new ports coming from -// the bonjour module, then we prune the boards who don't respond to a ping -func GetNetworkList() ([]OsSerialPort, error) { - newPorts, err := getPorts() - if err != nil { - return nil, err - } - - SavedNetworkPorts = Filter(SavedNetworkPorts, func(port OsSerialPort) bool { - any := true - for _, p := range newPorts { - if p.Name == port.Name { - any = false - return any - } - } - return any - }) - - SavedNetworkPorts, err = pruneUnreachablePorts(SavedNetworkPorts) - if err != nil { - return nil, err - } - - SavedNetworkPorts = append(SavedNetworkPorts, newPorts...) - - return SavedNetworkPorts, nil -} - -func checkAvailability(ip string) bool { - timeout := time.Duration(1500 * time.Millisecond) - // Check if the port 80 is open - conn, err := net.DialTimeout("tcp", ip+":80", timeout) - if err != nil { - log.Println(err) - // Check if the port 22 is open - conn, err = net.DialTimeout("tcp", ip+":22", timeout) - if err != nil { - log.Println(err) - return false - } - conn.Close() - return true - } - conn.Close() - return true -} - -func pruneUnreachablePorts(ports []OsSerialPort) ([]OsSerialPort, error) { - times := 2 - - ports = Filter(ports, func(port OsSerialPort) bool { - any := false - for i := 0; i < times; i++ { - if checkAvailability(port.Name) { - any = true - } - } - return any - }) - - return ports, nil -} - -func getPorts() ([]OsSerialPort, error) { - resolver, err := bonjour.NewResolver(nil) - if err != nil { - log.Println("Failed to initialize resolver:", err.Error()) - return nil, err - } - - results := make(chan *bonjour.ServiceEntry) - - timeout := make(chan bool, 1) - go func(exitCh chan<- bool) { - time.Sleep(timeoutConst * time.Second) - exitCh <- true - close(results) - }(resolver.Exit) - - arrPorts := []OsSerialPort{} - go func(results chan *bonjour.ServiceEntry, exitCh chan<- bool) { - for e := range results { - log.Printf("%+v", e) - if e.AddrIPv4 != nil { - arrPorts = append(arrPorts, OsSerialPort{Name: e.AddrIPv4.String(), IdProduct: e.Instance, IdVendor: strings.Join(e.Text[:], " "), NetworkPort: true}) - } - } - timeout <- true - }(results, resolver.Exit) - - err = resolver.Browse("_arduino._tcp", "", results) - if err != nil { - log.Println("Failed to browse:", err.Error()) - return nil, err - } - // wait for some kind of timeout and return arrPorts - select { - case <-timeout: - return arrPorts, nil - } -} - -// Filter returns a new slice containing all OsSerialPort in the slice that satisfy the predicate f. -func Filter(vs []OsSerialPort, f func(OsSerialPort) bool) []OsSerialPort { - var vsf []OsSerialPort - for _, v := range vs { - if f(v) { - vsf = append(vsf, v) - } - } - return vsf -} diff --git a/docs/pkgs.html b/docs/pkgs.html deleted file mode 100644 index c505805f5..000000000 --- a/docs/pkgs.html +++ /dev/null @@ -1,123 +0,0 @@ - - - - - Interactive docs for pkgs api - - - -

pkgs api manage the indexes and tools installed on the system.

- -

Indexes

-

An index file contains the info about a core and its tools. You can see an example at https://downloads.arduino.cc/packages/package_index.json

- -

index files are saved (with an urlencoded filename) in the folder ~/.arduino-create/indexes

- -

List Indexes

-

You can list the indexes installed in the system with this simple GET

-
-
- - -

Add Indexes

-

You can add a new index with a POST request

-
-
- - -

You can now check if the new package_index was downloaded by repeating List Indexes.

- -

Remove Indexes

-

You can add a new index with a POST request

-
-
- - -

You can now check if the new package_index was removed by repeating List Indexes.

- - -

Tools

-

A tool is an executable that can be used to program a board.

- -

tools are saved in the folder ~/.arduino-create with a structure like {packager}/{name}/{version}

- -

List Available Tools

-

You can list the available tools that could be installed from an index with this simple GET. (Remember to add - indexes)

-
-
- - -

List Installed Tools

-

You can list the tools installed in the system with this simple GET

-
-
- - - -

Install a tool from an index file

-

You can install one of the available tools with a PUT request

-
-
- - - -

Remove an installed tool

-

You can remove one of the installed tools with a DELETE request

-
-
- - - - - - - \ No newline at end of file diff --git a/gen/docs/client.go b/gen/docs/client.go deleted file mode 100644 index 480f8dc7a..000000000 --- a/gen/docs/client.go +++ /dev/null @@ -1,21 +0,0 @@ -// Code generated by goa v2.0.0-wip, DO NOT EDIT. -// -// docs client -// -// Command: -// $ goa gen github.com/arduino/arduino-create-agent/design - -package docs - -import ( - goa "goa.design/goa" -) - -// Client is the "docs" service client. -type Client struct { -} - -// NewClient initializes a "docs" service client given the endpoints. -func NewClient(goa.Endpoint) *Client { - return &Client{} -} diff --git a/gen/docs/endpoints.go b/gen/docs/endpoints.go deleted file mode 100644 index c03e4ab49..000000000 --- a/gen/docs/endpoints.go +++ /dev/null @@ -1,25 +0,0 @@ -// Code generated by goa v2.0.0-wip, DO NOT EDIT. -// -// docs endpoints -// -// Command: -// $ goa gen github.com/arduino/arduino-create-agent/design - -package docs - -import ( - goa "goa.design/goa" -) - -// Endpoints wraps the "docs" service endpoints. -type Endpoints struct { -} - -// NewEndpoints wraps the methods of the "docs" service with endpoints. -func NewEndpoints(s Service) *Endpoints { - return &Endpoints{} -} - -// Use applies the given middleware to all the "docs" service endpoints. -func (e *Endpoints) Use(m func(goa.Endpoint) goa.Endpoint) { -} diff --git a/gen/docs/service.go b/gen/docs/service.go deleted file mode 100644 index 3b1e0a265..000000000 --- a/gen/docs/service.go +++ /dev/null @@ -1,22 +0,0 @@ -// Code generated by goa v2.0.0-wip, DO NOT EDIT. -// -// docs service -// -// Command: -// $ goa gen github.com/arduino/arduino-create-agent/design - -package docs - -// Service is the docs service interface. -type Service interface { -} - -// ServiceName is the name of the service as defined in the design. This is the -// same value that is set in the endpoint request contexts under the ServiceKey -// key. -const ServiceName = "docs" - -// MethodNames lists the service method names as defined in the design. These -// are the same values that are set in the endpoint request contexts under the -// MethodKey key. -var MethodNames = [0]string{} diff --git a/gen/http/cli/arduino_create_agent/cli.go b/gen/http/cli/arduino_create_agent/cli.go index 76e9a56e2..a4d856292 100644 --- a/gen/http/cli/arduino_create_agent/cli.go +++ b/gen/http/cli/arduino_create_agent/cli.go @@ -1,4 +1,4 @@ -// Code generated by goa v2.0.0-wip, DO NOT EDIT. +// Code generated by goa v3.16.1, DO NOT EDIT. // // arduino-create-agent HTTP client CLI support package // @@ -13,26 +13,22 @@ import ( "net/http" "os" - indexesc "github.com/arduino/arduino-create-agent/gen/http/indexes/client" toolsc "github.com/arduino/arduino-create-agent/gen/http/tools/client" - goa "goa.design/goa" - goahttp "goa.design/goa/http" + goahttp "goa.design/goa/v3/http" + goa "goa.design/goa/v3/pkg" ) // UsageCommands returns the set of commands and sub-commands using the format // -// command (subcommand1|subcommand2|...) -// +// command (subcommand1|subcommand2|...) func UsageCommands() string { - return `indexes (list|add|remove) -tools (available|installed|install|remove) + return `tools (available|installedhead|installed|install|remove) ` } // UsageExamples produces an example of a valid invocation of the CLI tool. func UsageExamples() string { - return os.Args[0] + ` indexes list` + "\n" + - os.Args[0] + ` tools available` + "\n" + + return os.Args[0] + ` tools available` + "\n" + "" } @@ -44,22 +40,14 @@ func ParseEndpoint( enc func(*http.Request) goahttp.Encoder, dec func(*http.Response) goahttp.Decoder, restore bool, -) (goa.Endpoint, interface{}, error) { +) (goa.Endpoint, any, error) { var ( - indexesFlags = flag.NewFlagSet("indexes", flag.ContinueOnError) - - indexesListFlags = flag.NewFlagSet("list", flag.ExitOnError) - - indexesAddFlags = flag.NewFlagSet("add", flag.ExitOnError) - indexesAddBodyFlag = indexesAddFlags.String("body", "REQUIRED", "") - - indexesRemoveFlags = flag.NewFlagSet("remove", flag.ExitOnError) - indexesRemoveBodyFlag = indexesRemoveFlags.String("body", "REQUIRED", "") - toolsFlags = flag.NewFlagSet("tools", flag.ContinueOnError) toolsAvailableFlags = flag.NewFlagSet("available", flag.ExitOnError) + toolsInstalledheadFlags = flag.NewFlagSet("installedhead", flag.ExitOnError) + toolsInstalledFlags = flag.NewFlagSet("installed", flag.ExitOnError) toolsInstallFlags = flag.NewFlagSet("install", flag.ExitOnError) @@ -71,13 +59,9 @@ func ParseEndpoint( toolsRemoveNameFlag = toolsRemoveFlags.String("name", "REQUIRED", "The name of the tool") toolsRemoveVersionFlag = toolsRemoveFlags.String("version", "REQUIRED", "The version of the tool") ) - indexesFlags.Usage = indexesUsage - indexesListFlags.Usage = indexesListUsage - indexesAddFlags.Usage = indexesAddUsage - indexesRemoveFlags.Usage = indexesRemoveUsage - toolsFlags.Usage = toolsUsage toolsAvailableFlags.Usage = toolsAvailableUsage + toolsInstalledheadFlags.Usage = toolsInstalledheadUsage toolsInstalledFlags.Usage = toolsInstalledUsage toolsInstallFlags.Usage = toolsInstallUsage toolsRemoveFlags.Usage = toolsRemoveUsage @@ -97,8 +81,6 @@ func ParseEndpoint( { svcn = flag.Arg(0) switch svcn { - case "indexes": - svcf = indexesFlags case "tools": svcf = toolsFlags default: @@ -116,24 +98,14 @@ func ParseEndpoint( { epn = svcf.Arg(0) switch svcn { - case "indexes": - switch epn { - case "list": - epf = indexesListFlags - - case "add": - epf = indexesAddFlags - - case "remove": - epf = indexesRemoveFlags - - } - case "tools": switch epn { case "available": epf = toolsAvailableFlags + case "installedhead": + epf = toolsInstalledheadFlags + case "installed": epf = toolsInstalledFlags @@ -159,31 +131,21 @@ func ParseEndpoint( } var ( - data interface{} + data any endpoint goa.Endpoint err error ) { switch svcn { - case "indexes": - c := indexesc.NewClient(scheme, host, doer, enc, dec, restore) - switch epn { - case "list": - endpoint = c.List() - data = nil - case "add": - endpoint = c.Add() - data, err = indexesc.BuildAddPayload(*indexesAddBodyFlag) - case "remove": - endpoint = c.Remove() - data, err = indexesc.BuildRemovePayload(*indexesRemoveBodyFlag) - } case "tools": c := toolsc.NewClient(scheme, host, doer, enc, dec, restore) switch epn { case "available": endpoint = c.Available() data = nil + case "installedhead": + endpoint = c.Installedhead() + data = nil case "installed": endpoint = c.Installed() data = nil @@ -203,112 +165,73 @@ func ParseEndpoint( return endpoint, data, nil } -// indexesUsage displays the usage of the indexes command and its subcommands. -func indexesUsage() { - fmt.Fprintf(os.Stderr, `The indexes service manages the package_index files -Usage: - %s [globalflags] indexes COMMAND [flags] - -COMMAND: - list: List implements list. - add: Add implements add. - remove: Remove implements remove. - -Additional help: - %s indexes COMMAND --help -`, os.Args[0], os.Args[0]) -} -func indexesListUsage() { - fmt.Fprintf(os.Stderr, `%s [flags] indexes list - -List implements list. - -Example: - `+os.Args[0]+` indexes list -`, os.Args[0]) -} - -func indexesAddUsage() { - fmt.Fprintf(os.Stderr, `%s [flags] indexes add -body JSON - -Add implements add. - -body JSON: - -Example: - `+os.Args[0]+` indexes add --body '{ - "url": "http://downloads.arduino.cc/packages/package_index.json" - }' -`, os.Args[0]) -} - -func indexesRemoveUsage() { - fmt.Fprintf(os.Stderr, `%s [flags] indexes remove -body JSON - -Remove implements remove. - -body JSON: - -Example: - `+os.Args[0]+` indexes remove --body '{ - "url": "http://downloads.arduino.cc/packages/package_index.json" - }' -`, os.Args[0]) -} - // toolsUsage displays the usage of the tools command and its subcommands. func toolsUsage() { fmt.Fprintf(os.Stderr, `The tools service manages the available and installed tools Usage: - %s [globalflags] tools COMMAND [flags] + %[1]s [globalflags] tools COMMAND [flags] COMMAND: available: Available implements available. + installedhead: Installedhead implements installedhead. installed: Installed implements installed. install: Install implements install. remove: Remove implements remove. Additional help: - %s tools COMMAND --help -`, os.Args[0], os.Args[0]) + %[1]s tools COMMAND --help +`, os.Args[0]) } func toolsAvailableUsage() { - fmt.Fprintf(os.Stderr, `%s [flags] tools available + fmt.Fprintf(os.Stderr, `%[1]s [flags] tools available Available implements available. Example: - `+os.Args[0]+` tools available + %[1]s tools available +`, os.Args[0]) +} + +func toolsInstalledheadUsage() { + fmt.Fprintf(os.Stderr, `%[1]s [flags] tools installedhead + +Installedhead implements installedhead. + +Example: + %[1]s tools installedhead `, os.Args[0]) } func toolsInstalledUsage() { - fmt.Fprintf(os.Stderr, `%s [flags] tools installed + fmt.Fprintf(os.Stderr, `%[1]s [flags] tools installed Installed implements installed. Example: - `+os.Args[0]+` tools installed + %[1]s tools installed `, os.Args[0]) } func toolsInstallUsage() { - fmt.Fprintf(os.Stderr, `%s [flags] tools install -body JSON + fmt.Fprintf(os.Stderr, `%[1]s [flags] tools install -body JSON Install implements install. -body JSON: Example: - `+os.Args[0]+` tools install --body '{ - "checksum": "Quam voluptas voluptates expedita rem ipsum.", - "name": "avrdude", + %[1]s tools install --body '{ + "checksum": "SHA-256:1ae54999c1f97234a5c603eb99ad39313b11746a4ca517269a9285afa05f9100", + "name": "bossac", "packager": "arduino", - "url": "Iusto libero explicabo beatae dolor adipisci nulla.", - "version": "6.3.0-arduino9" + "signature": "382898a97b5a86edd74208f10107d2fecbf7059ffe9cc856e045266fb4db4e98802728a0859cfdcda1c0b9075ec01e42dbea1f430b813530d5a6ae1766dfbba64c3e689b59758062dc2ab2e32b2a3491dc2b9a80b9cda4ae514fbe0ec5af210111b6896976053ab76bac55bcecfcececa68adfa3299e3cde6b7f117b3552a7d80ca419374bb497e3c3f12b640cf5b20875416b45e662fc6150b99b178f8e41d6982b4c0a255925ea39773683f9aa9201dc5768b6fc857c87ff602b6a93452a541b8ec10ca07f166e61a9e9d91f0a6090bd2038ed4427af6251039fb9fe8eb62ec30d7b0f3df38bc9de7204dec478fb86f8eb3f71543710790ee169dce039d3e0", + "url": "http://downloads.arduino.cc/tools/bossac-1.7.0-arduino3-linux64.tar.gz", + "version": "1.7.0-arduino3" }' `, os.Args[0]) } func toolsRemoveUsage() { - fmt.Fprintf(os.Stderr, `%s [flags] tools remove -body JSON -packager STRING -name STRING -version STRING + fmt.Fprintf(os.Stderr, `%[1]s [flags] tools remove -body JSON -packager STRING -name STRING -version STRING Remove implements remove. -body JSON: @@ -317,8 +240,10 @@ Remove implements remove. -version STRING: The version of the tool Example: - `+os.Args[0]+` tools remove --body '{ - "url": "http://downloads.arduino.cc/packages/package_index.json" - }' --packager "arduino" --name "avrdude" --version "6.3.0-arduino9" + %[1]s tools remove --body '{ + "checksum": "SHA-256:1ae54999c1f97234a5c603eb99ad39313b11746a4ca517269a9285afa05f9100", + "signature": "382898a97b5a86edd74208f10107d2fecbf7059ffe9cc856e045266fb4db4e98802728a0859cfdcda1c0b9075ec01e42dbea1f430b813530d5a6ae1766dfbba64c3e689b59758062dc2ab2e32b2a3491dc2b9a80b9cda4ae514fbe0ec5af210111b6896976053ab76bac55bcecfcececa68adfa3299e3cde6b7f117b3552a7d80ca419374bb497e3c3f12b640cf5b20875416b45e662fc6150b99b178f8e41d6982b4c0a255925ea39773683f9aa9201dc5768b6fc857c87ff602b6a93452a541b8ec10ca07f166e61a9e9d91f0a6090bd2038ed4427af6251039fb9fe8eb62ec30d7b0f3df38bc9de7204dec478fb86f8eb3f71543710790ee169dce039d3e0", + "url": "http://downloads.arduino.cc/tools/bossac-1.7.0-arduino3-linux64.tar.gz" + }' --packager "arduino" --name "bossac" --version "1.7.0-arduino3" `, os.Args[0]) } diff --git a/gen/http/docs/client/client.go b/gen/http/docs/client/client.go deleted file mode 100644 index b7f6ee012..000000000 --- a/gen/http/docs/client/client.go +++ /dev/null @@ -1,44 +0,0 @@ -// Code generated by goa v2.0.0-wip, DO NOT EDIT. -// -// docs client HTTP transport -// -// Command: -// $ goa gen github.com/arduino/arduino-create-agent/design - -package client - -import ( - "net/http" - - goahttp "goa.design/goa/http" -) - -// Client lists the docs service endpoint HTTP clients. -type Client struct { - // RestoreResponseBody controls whether the response bodies are reset after - // decoding so they can be read again. - RestoreResponseBody bool - - scheme string - host string - encoder func(*http.Request) goahttp.Encoder - decoder func(*http.Response) goahttp.Decoder -} - -// NewClient instantiates HTTP clients for all the docs service servers. -func NewClient( - scheme string, - host string, - doer goahttp.Doer, - enc func(*http.Request) goahttp.Encoder, - dec func(*http.Response) goahttp.Decoder, - restoreBody bool, -) *Client { - return &Client{ - RestoreResponseBody: restoreBody, - scheme: scheme, - host: host, - decoder: dec, - encoder: enc, - } -} diff --git a/gen/http/docs/client/encode_decode.go b/gen/http/docs/client/encode_decode.go deleted file mode 100644 index e6b7b4af3..000000000 --- a/gen/http/docs/client/encode_decode.go +++ /dev/null @@ -1,8 +0,0 @@ -// Code generated by goa v2.0.0-wip, DO NOT EDIT. -// -// docs HTTP client encoders and decoders -// -// Command: -// $ goa gen github.com/arduino/arduino-create-agent/design - -package client diff --git a/gen/http/docs/client/paths.go b/gen/http/docs/client/paths.go deleted file mode 100644 index f0c4e10eb..000000000 --- a/gen/http/docs/client/paths.go +++ /dev/null @@ -1,8 +0,0 @@ -// Code generated by goa v2.0.0-wip, DO NOT EDIT. -// -// HTTP request path constructors for the docs service. -// -// Command: -// $ goa gen github.com/arduino/arduino-create-agent/design - -package client diff --git a/gen/http/docs/client/types.go b/gen/http/docs/client/types.go deleted file mode 100644 index d2e2410ee..000000000 --- a/gen/http/docs/client/types.go +++ /dev/null @@ -1,8 +0,0 @@ -// Code generated by goa v2.0.0-wip, DO NOT EDIT. -// -// docs HTTP client types -// -// Command: -// $ goa gen github.com/arduino/arduino-create-agent/design - -package client diff --git a/gen/http/docs/server/encode_decode.go b/gen/http/docs/server/encode_decode.go deleted file mode 100644 index df1840332..000000000 --- a/gen/http/docs/server/encode_decode.go +++ /dev/null @@ -1,8 +0,0 @@ -// Code generated by goa v2.0.0-wip, DO NOT EDIT. -// -// docs HTTP server encoders and decoders -// -// Command: -// $ goa gen github.com/arduino/arduino-create-agent/design - -package server diff --git a/gen/http/docs/server/paths.go b/gen/http/docs/server/paths.go deleted file mode 100644 index 72ae3fc84..000000000 --- a/gen/http/docs/server/paths.go +++ /dev/null @@ -1,8 +0,0 @@ -// Code generated by goa v2.0.0-wip, DO NOT EDIT. -// -// HTTP request path constructors for the docs service. -// -// Command: -// $ goa gen github.com/arduino/arduino-create-agent/design - -package server diff --git a/gen/http/docs/server/server.go b/gen/http/docs/server/server.go deleted file mode 100644 index 627b1fb60..000000000 --- a/gen/http/docs/server/server.go +++ /dev/null @@ -1,73 +0,0 @@ -// Code generated by goa v2.0.0-wip, DO NOT EDIT. -// -// docs HTTP server -// -// Command: -// $ goa gen github.com/arduino/arduino-create-agent/design - -package server - -import ( - "context" - "net/http" - - docs "github.com/arduino/arduino-create-agent/gen/docs" - goahttp "goa.design/goa/http" -) - -// Server lists the docs service endpoint HTTP handlers. -type Server struct { - Mounts []*MountPoint -} - -// ErrorNamer is an interface implemented by generated error structs that -// exposes the name of the error as defined in the design. -type ErrorNamer interface { - ErrorName() string -} - -// MountPoint holds information about the mounted endpoints. -type MountPoint struct { - // Method is the name of the service method served by the mounted HTTP handler. - Method string - // Verb is the HTTP method used to match requests to the mounted handler. - Verb string - // Pattern is the HTTP request path pattern used to match requests to the - // mounted handler. - Pattern string -} - -// New instantiates HTTP handlers for all the docs service endpoints. -func New( - e *docs.Endpoints, - mux goahttp.Muxer, - dec func(*http.Request) goahttp.Decoder, - enc func(context.Context, http.ResponseWriter) goahttp.Encoder, - eh func(context.Context, http.ResponseWriter, error), -) *Server { - return &Server{ - Mounts: []*MountPoint{ - {"docs/pkgs.html", "GET", "/v2/docs/pkgs"}, - }, - } -} - -// Service returns the name of the service served. -func (s *Server) Service() string { return "docs" } - -// Use wraps the server handlers with the given middleware. -func (s *Server) Use(m func(http.Handler) http.Handler) { -} - -// Mount configures the mux to serve the docs endpoints. -func Mount(mux goahttp.Muxer) { - MountDocsPkgsHTML(mux, http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - http.ServeFile(w, r, "docs/pkgs.html") - })) -} - -// MountDocsPkgsHTML configures the mux to serve GET request made to -// "/v2/docs/pkgs". -func MountDocsPkgsHTML(mux goahttp.Muxer, h http.Handler) { - mux.Handle("GET", "/v2/docs/pkgs", h.ServeHTTP) -} diff --git a/gen/http/docs/server/types.go b/gen/http/docs/server/types.go deleted file mode 100644 index 123e3bc30..000000000 --- a/gen/http/docs/server/types.go +++ /dev/null @@ -1,8 +0,0 @@ -// Code generated by goa v2.0.0-wip, DO NOT EDIT. -// -// docs HTTP server types -// -// Command: -// $ goa gen github.com/arduino/arduino-create-agent/design - -package server diff --git a/gen/http/indexes/client/cli.go b/gen/http/indexes/client/cli.go deleted file mode 100644 index f6a2ff094..000000000 --- a/gen/http/indexes/client/cli.go +++ /dev/null @@ -1,55 +0,0 @@ -// Code generated by goa v2.0.0-wip, DO NOT EDIT. -// -// indexes HTTP client CLI support package -// -// Command: -// $ goa gen github.com/arduino/arduino-create-agent/design - -package client - -import ( - "encoding/json" - "fmt" - - indexes "github.com/arduino/arduino-create-agent/gen/indexes" -) - -// BuildAddPayload builds the payload for the indexes add endpoint from CLI -// flags. -func BuildAddPayload(indexesAddBody string) (*indexes.IndexPayload, error) { - var err error - var body AddRequestBody - { - err = json.Unmarshal([]byte(indexesAddBody), &body) - if err != nil { - return nil, fmt.Errorf("invalid JSON for body, example of valid JSON:\n%s", "'{\n \"url\": \"http://downloads.arduino.cc/packages/package_index.json\"\n }'") - } - } - if err != nil { - return nil, err - } - v := &indexes.IndexPayload{ - URL: body.URL, - } - return v, nil -} - -// BuildRemovePayload builds the payload for the indexes remove endpoint from -// CLI flags. -func BuildRemovePayload(indexesRemoveBody string) (*indexes.IndexPayload, error) { - var err error - var body RemoveRequestBody - { - err = json.Unmarshal([]byte(indexesRemoveBody), &body) - if err != nil { - return nil, fmt.Errorf("invalid JSON for body, example of valid JSON:\n%s", "'{\n \"url\": \"http://downloads.arduino.cc/packages/package_index.json\"\n }'") - } - } - if err != nil { - return nil, err - } - v := &indexes.IndexPayload{ - URL: body.URL, - } - return v, nil -} diff --git a/gen/http/indexes/client/client.go b/gen/http/indexes/client/client.go deleted file mode 100644 index 418f060c2..000000000 --- a/gen/http/indexes/client/client.go +++ /dev/null @@ -1,128 +0,0 @@ -// Code generated by goa v2.0.0-wip, DO NOT EDIT. -// -// indexes client HTTP transport -// -// Command: -// $ goa gen github.com/arduino/arduino-create-agent/design - -package client - -import ( - "context" - "net/http" - - goa "goa.design/goa" - goahttp "goa.design/goa/http" -) - -// Client lists the indexes service endpoint HTTP clients. -type Client struct { - // List Doer is the HTTP client used to make requests to the list endpoint. - ListDoer goahttp.Doer - - // Add Doer is the HTTP client used to make requests to the add endpoint. - AddDoer goahttp.Doer - - // Remove Doer is the HTTP client used to make requests to the remove endpoint. - RemoveDoer goahttp.Doer - - // RestoreResponseBody controls whether the response bodies are reset after - // decoding so they can be read again. - RestoreResponseBody bool - - scheme string - host string - encoder func(*http.Request) goahttp.Encoder - decoder func(*http.Response) goahttp.Decoder -} - -// NewClient instantiates HTTP clients for all the indexes service servers. -func NewClient( - scheme string, - host string, - doer goahttp.Doer, - enc func(*http.Request) goahttp.Encoder, - dec func(*http.Response) goahttp.Decoder, - restoreBody bool, -) *Client { - return &Client{ - ListDoer: doer, - AddDoer: doer, - RemoveDoer: doer, - RestoreResponseBody: restoreBody, - scheme: scheme, - host: host, - decoder: dec, - encoder: enc, - } -} - -// List returns an endpoint that makes HTTP requests to the indexes service -// list server. -func (c *Client) List() goa.Endpoint { - var ( - decodeResponse = DecodeListResponse(c.decoder, c.RestoreResponseBody) - ) - return func(ctx context.Context, v interface{}) (interface{}, error) { - req, err := c.BuildListRequest(ctx, v) - if err != nil { - return nil, err - } - resp, err := c.ListDoer.Do(req) - - if err != nil { - return nil, goahttp.ErrRequestError("indexes", "list", err) - } - return decodeResponse(resp) - } -} - -// Add returns an endpoint that makes HTTP requests to the indexes service add -// server. -func (c *Client) Add() goa.Endpoint { - var ( - encodeRequest = EncodeAddRequest(c.encoder) - decodeResponse = DecodeAddResponse(c.decoder, c.RestoreResponseBody) - ) - return func(ctx context.Context, v interface{}) (interface{}, error) { - req, err := c.BuildAddRequest(ctx, v) - if err != nil { - return nil, err - } - err = encodeRequest(req, v) - if err != nil { - return nil, err - } - resp, err := c.AddDoer.Do(req) - - if err != nil { - return nil, goahttp.ErrRequestError("indexes", "add", err) - } - return decodeResponse(resp) - } -} - -// Remove returns an endpoint that makes HTTP requests to the indexes service -// remove server. -func (c *Client) Remove() goa.Endpoint { - var ( - encodeRequest = EncodeRemoveRequest(c.encoder) - decodeResponse = DecodeRemoveResponse(c.decoder, c.RestoreResponseBody) - ) - return func(ctx context.Context, v interface{}) (interface{}, error) { - req, err := c.BuildRemoveRequest(ctx, v) - if err != nil { - return nil, err - } - err = encodeRequest(req, v) - if err != nil { - return nil, err - } - resp, err := c.RemoveDoer.Do(req) - - if err != nil { - return nil, goahttp.ErrRequestError("indexes", "remove", err) - } - return decodeResponse(resp) - } -} diff --git a/gen/http/indexes/client/encode_decode.go b/gen/http/indexes/client/encode_decode.go deleted file mode 100644 index 3bca6b10c..000000000 --- a/gen/http/indexes/client/encode_decode.go +++ /dev/null @@ -1,267 +0,0 @@ -// Code generated by goa v2.0.0-wip, DO NOT EDIT. -// -// indexes HTTP client encoders and decoders -// -// Command: -// $ goa gen github.com/arduino/arduino-create-agent/design - -package client - -import ( - "bytes" - "context" - "io/ioutil" - "net/http" - "net/url" - - indexes "github.com/arduino/arduino-create-agent/gen/indexes" - indexesviews "github.com/arduino/arduino-create-agent/gen/indexes/views" - goahttp "goa.design/goa/http" -) - -// BuildListRequest instantiates a HTTP request object with method and path set -// to call the "indexes" service "list" endpoint -func (c *Client) BuildListRequest(ctx context.Context, v interface{}) (*http.Request, error) { - u := &url.URL{Scheme: c.scheme, Host: c.host, Path: ListIndexesPath()} - req, err := http.NewRequest("GET", u.String(), nil) - if err != nil { - return nil, goahttp.ErrInvalidURL("indexes", "list", u.String(), err) - } - if ctx != nil { - req = req.WithContext(ctx) - } - - return req, nil -} - -// DecodeListResponse returns a decoder for responses returned by the indexes -// list endpoint. restoreBody controls whether the response body should be -// restored after having been read. -// DecodeListResponse may return the following errors: -// - "invalid_url" (type *goa.ServiceError): http.StatusBadRequest -// - error: internal error -func DecodeListResponse(decoder func(*http.Response) goahttp.Decoder, restoreBody bool) func(*http.Response) (interface{}, error) { - return func(resp *http.Response) (interface{}, error) { - if restoreBody { - b, err := ioutil.ReadAll(resp.Body) - if err != nil { - return nil, err - } - resp.Body = ioutil.NopCloser(bytes.NewBuffer(b)) - defer func() { - resp.Body = ioutil.NopCloser(bytes.NewBuffer(b)) - }() - } else { - defer resp.Body.Close() - } - switch resp.StatusCode { - case http.StatusOK: - var ( - body []string - err error - ) - err = decoder(resp).Decode(&body) - if err != nil { - return nil, goahttp.ErrDecodingError("indexes", "list", err) - } - return body, nil - case http.StatusBadRequest: - var ( - body ListInvalidURLResponseBody - err error - ) - err = decoder(resp).Decode(&body) - if err != nil { - return nil, goahttp.ErrDecodingError("indexes", "list", err) - } - err = ValidateListInvalidURLResponseBody(&body) - if err != nil { - return nil, goahttp.ErrValidationError("indexes", "list", err) - } - return nil, NewListInvalidURL(&body) - default: - body, _ := ioutil.ReadAll(resp.Body) - return nil, goahttp.ErrInvalidResponse("indexes", "list", resp.StatusCode, string(body)) - } - } -} - -// BuildAddRequest instantiates a HTTP request object with method and path set -// to call the "indexes" service "add" endpoint -func (c *Client) BuildAddRequest(ctx context.Context, v interface{}) (*http.Request, error) { - u := &url.URL{Scheme: c.scheme, Host: c.host, Path: AddIndexesPath()} - req, err := http.NewRequest("POST", u.String(), nil) - if err != nil { - return nil, goahttp.ErrInvalidURL("indexes", "add", u.String(), err) - } - if ctx != nil { - req = req.WithContext(ctx) - } - - return req, nil -} - -// EncodeAddRequest returns an encoder for requests sent to the indexes add -// server. -func EncodeAddRequest(encoder func(*http.Request) goahttp.Encoder) func(*http.Request, interface{}) error { - return func(req *http.Request, v interface{}) error { - p, ok := v.(*indexes.IndexPayload) - if !ok { - return goahttp.ErrInvalidType("indexes", "add", "*indexes.IndexPayload", v) - } - body := NewAddRequestBody(p) - if err := encoder(req).Encode(&body); err != nil { - return goahttp.ErrEncodingError("indexes", "add", err) - } - return nil - } -} - -// DecodeAddResponse returns a decoder for responses returned by the indexes -// add endpoint. restoreBody controls whether the response body should be -// restored after having been read. -// DecodeAddResponse may return the following errors: -// - "invalid_url" (type *goa.ServiceError): http.StatusBadRequest -// - error: internal error -func DecodeAddResponse(decoder func(*http.Response) goahttp.Decoder, restoreBody bool) func(*http.Response) (interface{}, error) { - return func(resp *http.Response) (interface{}, error) { - if restoreBody { - b, err := ioutil.ReadAll(resp.Body) - if err != nil { - return nil, err - } - resp.Body = ioutil.NopCloser(bytes.NewBuffer(b)) - defer func() { - resp.Body = ioutil.NopCloser(bytes.NewBuffer(b)) - }() - } else { - defer resp.Body.Close() - } - switch resp.StatusCode { - case http.StatusOK: - var ( - body AddResponseBody - err error - ) - err = decoder(resp).Decode(&body) - if err != nil { - return nil, goahttp.ErrDecodingError("indexes", "add", err) - } - p := NewAddOperationOK(&body) - view := "default" - vres := &indexesviews.Operation{p, view} - if err = indexesviews.ValidateOperation(vres); err != nil { - return nil, goahttp.ErrValidationError("indexes", "add", err) - } - res := indexes.NewOperation(vres) - return res, nil - case http.StatusBadRequest: - var ( - body AddInvalidURLResponseBody - err error - ) - err = decoder(resp).Decode(&body) - if err != nil { - return nil, goahttp.ErrDecodingError("indexes", "add", err) - } - err = ValidateAddInvalidURLResponseBody(&body) - if err != nil { - return nil, goahttp.ErrValidationError("indexes", "add", err) - } - return nil, NewAddInvalidURL(&body) - default: - body, _ := ioutil.ReadAll(resp.Body) - return nil, goahttp.ErrInvalidResponse("indexes", "add", resp.StatusCode, string(body)) - } - } -} - -// BuildRemoveRequest instantiates a HTTP request object with method and path -// set to call the "indexes" service "remove" endpoint -func (c *Client) BuildRemoveRequest(ctx context.Context, v interface{}) (*http.Request, error) { - u := &url.URL{Scheme: c.scheme, Host: c.host, Path: RemoveIndexesPath()} - req, err := http.NewRequest("POST", u.String(), nil) - if err != nil { - return nil, goahttp.ErrInvalidURL("indexes", "remove", u.String(), err) - } - if ctx != nil { - req = req.WithContext(ctx) - } - - return req, nil -} - -// EncodeRemoveRequest returns an encoder for requests sent to the indexes -// remove server. -func EncodeRemoveRequest(encoder func(*http.Request) goahttp.Encoder) func(*http.Request, interface{}) error { - return func(req *http.Request, v interface{}) error { - p, ok := v.(*indexes.IndexPayload) - if !ok { - return goahttp.ErrInvalidType("indexes", "remove", "*indexes.IndexPayload", v) - } - body := NewRemoveRequestBody(p) - if err := encoder(req).Encode(&body); err != nil { - return goahttp.ErrEncodingError("indexes", "remove", err) - } - return nil - } -} - -// DecodeRemoveResponse returns a decoder for responses returned by the indexes -// remove endpoint. restoreBody controls whether the response body should be -// restored after having been read. -// DecodeRemoveResponse may return the following errors: -// - "invalid_url" (type *goa.ServiceError): http.StatusBadRequest -// - error: internal error -func DecodeRemoveResponse(decoder func(*http.Response) goahttp.Decoder, restoreBody bool) func(*http.Response) (interface{}, error) { - return func(resp *http.Response) (interface{}, error) { - if restoreBody { - b, err := ioutil.ReadAll(resp.Body) - if err != nil { - return nil, err - } - resp.Body = ioutil.NopCloser(bytes.NewBuffer(b)) - defer func() { - resp.Body = ioutil.NopCloser(bytes.NewBuffer(b)) - }() - } else { - defer resp.Body.Close() - } - switch resp.StatusCode { - case http.StatusOK: - var ( - body RemoveResponseBody - err error - ) - err = decoder(resp).Decode(&body) - if err != nil { - return nil, goahttp.ErrDecodingError("indexes", "remove", err) - } - p := NewRemoveOperationOK(&body) - view := "default" - vres := &indexesviews.Operation{p, view} - if err = indexesviews.ValidateOperation(vres); err != nil { - return nil, goahttp.ErrValidationError("indexes", "remove", err) - } - res := indexes.NewOperation(vres) - return res, nil - case http.StatusBadRequest: - var ( - body RemoveInvalidURLResponseBody - err error - ) - err = decoder(resp).Decode(&body) - if err != nil { - return nil, goahttp.ErrDecodingError("indexes", "remove", err) - } - err = ValidateRemoveInvalidURLResponseBody(&body) - if err != nil { - return nil, goahttp.ErrValidationError("indexes", "remove", err) - } - return nil, NewRemoveInvalidURL(&body) - default: - body, _ := ioutil.ReadAll(resp.Body) - return nil, goahttp.ErrInvalidResponse("indexes", "remove", resp.StatusCode, string(body)) - } - } -} diff --git a/gen/http/indexes/client/paths.go b/gen/http/indexes/client/paths.go deleted file mode 100644 index 24fb5b1cb..000000000 --- a/gen/http/indexes/client/paths.go +++ /dev/null @@ -1,23 +0,0 @@ -// Code generated by goa v2.0.0-wip, DO NOT EDIT. -// -// HTTP request path constructors for the indexes service. -// -// Command: -// $ goa gen github.com/arduino/arduino-create-agent/design - -package client - -// ListIndexesPath returns the URL path to the indexes service list HTTP endpoint. -func ListIndexesPath() string { - return "/v2/pkgs/indexes" -} - -// AddIndexesPath returns the URL path to the indexes service add HTTP endpoint. -func AddIndexesPath() string { - return "/v2/pkgs/indexes/add" -} - -// RemoveIndexesPath returns the URL path to the indexes service remove HTTP endpoint. -func RemoveIndexesPath() string { - return "/v2/pkgs/indexes/delete" -} diff --git a/gen/http/indexes/client/types.go b/gen/http/indexes/client/types.go deleted file mode 100644 index 4d9d04b06..000000000 --- a/gen/http/indexes/client/types.go +++ /dev/null @@ -1,244 +0,0 @@ -// Code generated by goa v2.0.0-wip, DO NOT EDIT. -// -// indexes HTTP client types -// -// Command: -// $ goa gen github.com/arduino/arduino-create-agent/design - -package client - -import ( - indexes "github.com/arduino/arduino-create-agent/gen/indexes" - indexesviews "github.com/arduino/arduino-create-agent/gen/indexes/views" - goa "goa.design/goa" -) - -// AddRequestBody is the type of the "indexes" service "add" endpoint HTTP -// request body. -type AddRequestBody struct { - // The url of the index file - URL string `form:"url" json:"url" xml:"url"` -} - -// RemoveRequestBody is the type of the "indexes" service "remove" endpoint -// HTTP request body. -type RemoveRequestBody struct { - // The url of the index file - URL string `form:"url" json:"url" xml:"url"` -} - -// AddResponseBody is the type of the "indexes" service "add" endpoint HTTP -// response body. -type AddResponseBody struct { - // The status of the operation - Status *string `form:"status,omitempty" json:"status,omitempty" xml:"status,omitempty"` -} - -// RemoveResponseBody is the type of the "indexes" service "remove" endpoint -// HTTP response body. -type RemoveResponseBody struct { - // The status of the operation - Status *string `form:"status,omitempty" json:"status,omitempty" xml:"status,omitempty"` -} - -// ListInvalidURLResponseBody is the type of the "indexes" service "list" -// endpoint HTTP response body for the "invalid_url" error. -type ListInvalidURLResponseBody struct { - // Name is the name of this class of errors. - Name *string `form:"name,omitempty" json:"name,omitempty" xml:"name,omitempty"` - // ID is a unique identifier for this particular occurrence of the problem. - ID *string `form:"id,omitempty" json:"id,omitempty" xml:"id,omitempty"` - // Message is a human-readable explanation specific to this occurrence of the - // problem. - Message *string `form:"message,omitempty" json:"message,omitempty" xml:"message,omitempty"` - // Is the error temporary? - Temporary *bool `form:"temporary,omitempty" json:"temporary,omitempty" xml:"temporary,omitempty"` - // Is the error a timeout? - Timeout *bool `form:"timeout,omitempty" json:"timeout,omitempty" xml:"timeout,omitempty"` - // Is the error a server-side fault? - Fault *bool `form:"fault,omitempty" json:"fault,omitempty" xml:"fault,omitempty"` -} - -// AddInvalidURLResponseBody is the type of the "indexes" service "add" -// endpoint HTTP response body for the "invalid_url" error. -type AddInvalidURLResponseBody struct { - // Name is the name of this class of errors. - Name *string `form:"name,omitempty" json:"name,omitempty" xml:"name,omitempty"` - // ID is a unique identifier for this particular occurrence of the problem. - ID *string `form:"id,omitempty" json:"id,omitempty" xml:"id,omitempty"` - // Message is a human-readable explanation specific to this occurrence of the - // problem. - Message *string `form:"message,omitempty" json:"message,omitempty" xml:"message,omitempty"` - // Is the error temporary? - Temporary *bool `form:"temporary,omitempty" json:"temporary,omitempty" xml:"temporary,omitempty"` - // Is the error a timeout? - Timeout *bool `form:"timeout,omitempty" json:"timeout,omitempty" xml:"timeout,omitempty"` - // Is the error a server-side fault? - Fault *bool `form:"fault,omitempty" json:"fault,omitempty" xml:"fault,omitempty"` -} - -// RemoveInvalidURLResponseBody is the type of the "indexes" service "remove" -// endpoint HTTP response body for the "invalid_url" error. -type RemoveInvalidURLResponseBody struct { - // Name is the name of this class of errors. - Name *string `form:"name,omitempty" json:"name,omitempty" xml:"name,omitempty"` - // ID is a unique identifier for this particular occurrence of the problem. - ID *string `form:"id,omitempty" json:"id,omitempty" xml:"id,omitempty"` - // Message is a human-readable explanation specific to this occurrence of the - // problem. - Message *string `form:"message,omitempty" json:"message,omitempty" xml:"message,omitempty"` - // Is the error temporary? - Temporary *bool `form:"temporary,omitempty" json:"temporary,omitempty" xml:"temporary,omitempty"` - // Is the error a timeout? - Timeout *bool `form:"timeout,omitempty" json:"timeout,omitempty" xml:"timeout,omitempty"` - // Is the error a server-side fault? - Fault *bool `form:"fault,omitempty" json:"fault,omitempty" xml:"fault,omitempty"` -} - -// NewAddRequestBody builds the HTTP request body from the payload of the "add" -// endpoint of the "indexes" service. -func NewAddRequestBody(p *indexes.IndexPayload) *AddRequestBody { - body := &AddRequestBody{ - URL: p.URL, - } - return body -} - -// NewRemoveRequestBody builds the HTTP request body from the payload of the -// "remove" endpoint of the "indexes" service. -func NewRemoveRequestBody(p *indexes.IndexPayload) *RemoveRequestBody { - body := &RemoveRequestBody{ - URL: p.URL, - } - return body -} - -// NewListInvalidURL builds a indexes service list endpoint invalid_url error. -func NewListInvalidURL(body *ListInvalidURLResponseBody) *goa.ServiceError { - v := &goa.ServiceError{ - Name: *body.Name, - ID: *body.ID, - Message: *body.Message, - Temporary: *body.Temporary, - Timeout: *body.Timeout, - Fault: *body.Fault, - } - return v -} - -// NewAddOperationOK builds a "indexes" service "add" endpoint result from a -// HTTP "OK" response. -func NewAddOperationOK(body *AddResponseBody) *indexesviews.OperationView { - v := &indexesviews.OperationView{ - Status: body.Status, - } - return v -} - -// NewAddInvalidURL builds a indexes service add endpoint invalid_url error. -func NewAddInvalidURL(body *AddInvalidURLResponseBody) *goa.ServiceError { - v := &goa.ServiceError{ - Name: *body.Name, - ID: *body.ID, - Message: *body.Message, - Temporary: *body.Temporary, - Timeout: *body.Timeout, - Fault: *body.Fault, - } - return v -} - -// NewRemoveOperationOK builds a "indexes" service "remove" endpoint result -// from a HTTP "OK" response. -func NewRemoveOperationOK(body *RemoveResponseBody) *indexesviews.OperationView { - v := &indexesviews.OperationView{ - Status: body.Status, - } - return v -} - -// NewRemoveInvalidURL builds a indexes service remove endpoint invalid_url -// error. -func NewRemoveInvalidURL(body *RemoveInvalidURLResponseBody) *goa.ServiceError { - v := &goa.ServiceError{ - Name: *body.Name, - ID: *body.ID, - Message: *body.Message, - Temporary: *body.Temporary, - Timeout: *body.Timeout, - Fault: *body.Fault, - } - return v -} - -// ValidateListInvalidURLResponseBody runs the validations defined on -// list_invalid_url_response_body -func ValidateListInvalidURLResponseBody(body *ListInvalidURLResponseBody) (err error) { - if body.Name == nil { - err = goa.MergeErrors(err, goa.MissingFieldError("name", "body")) - } - if body.ID == nil { - err = goa.MergeErrors(err, goa.MissingFieldError("id", "body")) - } - if body.Message == nil { - err = goa.MergeErrors(err, goa.MissingFieldError("message", "body")) - } - if body.Temporary == nil { - err = goa.MergeErrors(err, goa.MissingFieldError("temporary", "body")) - } - if body.Timeout == nil { - err = goa.MergeErrors(err, goa.MissingFieldError("timeout", "body")) - } - if body.Fault == nil { - err = goa.MergeErrors(err, goa.MissingFieldError("fault", "body")) - } - return -} - -// ValidateAddInvalidURLResponseBody runs the validations defined on -// add_invalid_url_response_body -func ValidateAddInvalidURLResponseBody(body *AddInvalidURLResponseBody) (err error) { - if body.Name == nil { - err = goa.MergeErrors(err, goa.MissingFieldError("name", "body")) - } - if body.ID == nil { - err = goa.MergeErrors(err, goa.MissingFieldError("id", "body")) - } - if body.Message == nil { - err = goa.MergeErrors(err, goa.MissingFieldError("message", "body")) - } - if body.Temporary == nil { - err = goa.MergeErrors(err, goa.MissingFieldError("temporary", "body")) - } - if body.Timeout == nil { - err = goa.MergeErrors(err, goa.MissingFieldError("timeout", "body")) - } - if body.Fault == nil { - err = goa.MergeErrors(err, goa.MissingFieldError("fault", "body")) - } - return -} - -// ValidateRemoveInvalidURLResponseBody runs the validations defined on -// remove_invalid_url_response_body -func ValidateRemoveInvalidURLResponseBody(body *RemoveInvalidURLResponseBody) (err error) { - if body.Name == nil { - err = goa.MergeErrors(err, goa.MissingFieldError("name", "body")) - } - if body.ID == nil { - err = goa.MergeErrors(err, goa.MissingFieldError("id", "body")) - } - if body.Message == nil { - err = goa.MergeErrors(err, goa.MissingFieldError("message", "body")) - } - if body.Temporary == nil { - err = goa.MergeErrors(err, goa.MissingFieldError("temporary", "body")) - } - if body.Timeout == nil { - err = goa.MergeErrors(err, goa.MissingFieldError("timeout", "body")) - } - if body.Fault == nil { - err = goa.MergeErrors(err, goa.MissingFieldError("fault", "body")) - } - return -} diff --git a/gen/http/indexes/server/encode_decode.go b/gen/http/indexes/server/encode_decode.go deleted file mode 100644 index 4172333cf..000000000 --- a/gen/http/indexes/server/encode_decode.go +++ /dev/null @@ -1,173 +0,0 @@ -// Code generated by goa v2.0.0-wip, DO NOT EDIT. -// -// indexes HTTP server encoders and decoders -// -// Command: -// $ goa gen github.com/arduino/arduino-create-agent/design - -package server - -import ( - "context" - "io" - "net/http" - - indexesviews "github.com/arduino/arduino-create-agent/gen/indexes/views" - goa "goa.design/goa" - goahttp "goa.design/goa/http" -) - -// EncodeListResponse returns an encoder for responses returned by the indexes -// list endpoint. -func EncodeListResponse(encoder func(context.Context, http.ResponseWriter) goahttp.Encoder) func(context.Context, http.ResponseWriter, interface{}) error { - return func(ctx context.Context, w http.ResponseWriter, v interface{}) error { - res := v.([]string) - enc := encoder(ctx, w) - body := res - w.WriteHeader(http.StatusOK) - return enc.Encode(body) - } -} - -// EncodeListError returns an encoder for errors returned by the list indexes -// endpoint. -func EncodeListError(encoder func(context.Context, http.ResponseWriter) goahttp.Encoder) func(context.Context, http.ResponseWriter, error) error { - encodeError := goahttp.ErrorEncoder(encoder) - return func(ctx context.Context, w http.ResponseWriter, v error) error { - en, ok := v.(ErrorNamer) - if !ok { - return encodeError(ctx, w, v) - } - switch en.ErrorName() { - case "invalid_url": - res := v.(*goa.ServiceError) - enc := encoder(ctx, w) - body := NewListInvalidURLResponseBody(res) - w.Header().Set("goa-error", "invalid_url") - w.WriteHeader(http.StatusBadRequest) - return enc.Encode(body) - default: - return encodeError(ctx, w, v) - } - } -} - -// EncodeAddResponse returns an encoder for responses returned by the indexes -// add endpoint. -func EncodeAddResponse(encoder func(context.Context, http.ResponseWriter) goahttp.Encoder) func(context.Context, http.ResponseWriter, interface{}) error { - return func(ctx context.Context, w http.ResponseWriter, v interface{}) error { - res := v.(*indexesviews.Operation) - enc := encoder(ctx, w) - body := NewAddResponseBody(res.Projected) - w.WriteHeader(http.StatusOK) - return enc.Encode(body) - } -} - -// DecodeAddRequest returns a decoder for requests sent to the indexes add -// endpoint. -func DecodeAddRequest(mux goahttp.Muxer, decoder func(*http.Request) goahttp.Decoder) func(*http.Request) (interface{}, error) { - return func(r *http.Request) (interface{}, error) { - var ( - body AddRequestBody - err error - ) - err = decoder(r).Decode(&body) - if err != nil { - if err == io.EOF { - return nil, goa.MissingPayloadError() - } - return nil, goa.DecodePayloadError(err.Error()) - } - err = ValidateAddRequestBody(&body) - if err != nil { - return nil, err - } - payload := NewAddIndexPayload(&body) - - return payload, nil - } -} - -// EncodeAddError returns an encoder for errors returned by the add indexes -// endpoint. -func EncodeAddError(encoder func(context.Context, http.ResponseWriter) goahttp.Encoder) func(context.Context, http.ResponseWriter, error) error { - encodeError := goahttp.ErrorEncoder(encoder) - return func(ctx context.Context, w http.ResponseWriter, v error) error { - en, ok := v.(ErrorNamer) - if !ok { - return encodeError(ctx, w, v) - } - switch en.ErrorName() { - case "invalid_url": - res := v.(*goa.ServiceError) - enc := encoder(ctx, w) - body := NewAddInvalidURLResponseBody(res) - w.Header().Set("goa-error", "invalid_url") - w.WriteHeader(http.StatusBadRequest) - return enc.Encode(body) - default: - return encodeError(ctx, w, v) - } - } -} - -// EncodeRemoveResponse returns an encoder for responses returned by the -// indexes remove endpoint. -func EncodeRemoveResponse(encoder func(context.Context, http.ResponseWriter) goahttp.Encoder) func(context.Context, http.ResponseWriter, interface{}) error { - return func(ctx context.Context, w http.ResponseWriter, v interface{}) error { - res := v.(*indexesviews.Operation) - enc := encoder(ctx, w) - body := NewRemoveResponseBody(res.Projected) - w.WriteHeader(http.StatusOK) - return enc.Encode(body) - } -} - -// DecodeRemoveRequest returns a decoder for requests sent to the indexes -// remove endpoint. -func DecodeRemoveRequest(mux goahttp.Muxer, decoder func(*http.Request) goahttp.Decoder) func(*http.Request) (interface{}, error) { - return func(r *http.Request) (interface{}, error) { - var ( - body RemoveRequestBody - err error - ) - err = decoder(r).Decode(&body) - if err != nil { - if err == io.EOF { - return nil, goa.MissingPayloadError() - } - return nil, goa.DecodePayloadError(err.Error()) - } - err = ValidateRemoveRequestBody(&body) - if err != nil { - return nil, err - } - payload := NewRemoveIndexPayload(&body) - - return payload, nil - } -} - -// EncodeRemoveError returns an encoder for errors returned by the remove -// indexes endpoint. -func EncodeRemoveError(encoder func(context.Context, http.ResponseWriter) goahttp.Encoder) func(context.Context, http.ResponseWriter, error) error { - encodeError := goahttp.ErrorEncoder(encoder) - return func(ctx context.Context, w http.ResponseWriter, v error) error { - en, ok := v.(ErrorNamer) - if !ok { - return encodeError(ctx, w, v) - } - switch en.ErrorName() { - case "invalid_url": - res := v.(*goa.ServiceError) - enc := encoder(ctx, w) - body := NewRemoveInvalidURLResponseBody(res) - w.Header().Set("goa-error", "invalid_url") - w.WriteHeader(http.StatusBadRequest) - return enc.Encode(body) - default: - return encodeError(ctx, w, v) - } - } -} diff --git a/gen/http/indexes/server/paths.go b/gen/http/indexes/server/paths.go deleted file mode 100644 index f1ec8674d..000000000 --- a/gen/http/indexes/server/paths.go +++ /dev/null @@ -1,23 +0,0 @@ -// Code generated by goa v2.0.0-wip, DO NOT EDIT. -// -// HTTP request path constructors for the indexes service. -// -// Command: -// $ goa gen github.com/arduino/arduino-create-agent/design - -package server - -// ListIndexesPath returns the URL path to the indexes service list HTTP endpoint. -func ListIndexesPath() string { - return "/v2/pkgs/indexes" -} - -// AddIndexesPath returns the URL path to the indexes service add HTTP endpoint. -func AddIndexesPath() string { - return "/v2/pkgs/indexes/add" -} - -// RemoveIndexesPath returns the URL path to the indexes service remove HTTP endpoint. -func RemoveIndexesPath() string { - return "/v2/pkgs/indexes/delete" -} diff --git a/gen/http/indexes/server/server.go b/gen/http/indexes/server/server.go deleted file mode 100644 index 99c912659..000000000 --- a/gen/http/indexes/server/server.go +++ /dev/null @@ -1,227 +0,0 @@ -// Code generated by goa v2.0.0-wip, DO NOT EDIT. -// -// indexes HTTP server -// -// Command: -// $ goa gen github.com/arduino/arduino-create-agent/design - -package server - -import ( - "context" - "net/http" - - indexes "github.com/arduino/arduino-create-agent/gen/indexes" - goa "goa.design/goa" - goahttp "goa.design/goa/http" -) - -// Server lists the indexes service endpoint HTTP handlers. -type Server struct { - Mounts []*MountPoint - List http.Handler - Add http.Handler - Remove http.Handler -} - -// ErrorNamer is an interface implemented by generated error structs that -// exposes the name of the error as defined in the design. -type ErrorNamer interface { - ErrorName() string -} - -// MountPoint holds information about the mounted endpoints. -type MountPoint struct { - // Method is the name of the service method served by the mounted HTTP handler. - Method string - // Verb is the HTTP method used to match requests to the mounted handler. - Verb string - // Pattern is the HTTP request path pattern used to match requests to the - // mounted handler. - Pattern string -} - -// New instantiates HTTP handlers for all the indexes service endpoints. -func New( - e *indexes.Endpoints, - mux goahttp.Muxer, - dec func(*http.Request) goahttp.Decoder, - enc func(context.Context, http.ResponseWriter) goahttp.Encoder, - eh func(context.Context, http.ResponseWriter, error), -) *Server { - return &Server{ - Mounts: []*MountPoint{ - {"List", "GET", "/v2/pkgs/indexes"}, - {"Add", "POST", "/v2/pkgs/indexes/add"}, - {"Remove", "POST", "/v2/pkgs/indexes/delete"}, - }, - List: NewListHandler(e.List, mux, dec, enc, eh), - Add: NewAddHandler(e.Add, mux, dec, enc, eh), - Remove: NewRemoveHandler(e.Remove, mux, dec, enc, eh), - } -} - -// Service returns the name of the service served. -func (s *Server) Service() string { return "indexes" } - -// Use wraps the server handlers with the given middleware. -func (s *Server) Use(m func(http.Handler) http.Handler) { - s.List = m(s.List) - s.Add = m(s.Add) - s.Remove = m(s.Remove) -} - -// Mount configures the mux to serve the indexes endpoints. -func Mount(mux goahttp.Muxer, h *Server) { - MountListHandler(mux, h.List) - MountAddHandler(mux, h.Add) - MountRemoveHandler(mux, h.Remove) -} - -// MountListHandler configures the mux to serve the "indexes" service "list" -// endpoint. -func MountListHandler(mux goahttp.Muxer, h http.Handler) { - f, ok := h.(http.HandlerFunc) - if !ok { - f = func(w http.ResponseWriter, r *http.Request) { - h.ServeHTTP(w, r) - } - } - mux.Handle("GET", "/v2/pkgs/indexes", f) -} - -// NewListHandler creates a HTTP handler which loads the HTTP request and calls -// the "indexes" service "list" endpoint. -func NewListHandler( - endpoint goa.Endpoint, - mux goahttp.Muxer, - dec func(*http.Request) goahttp.Decoder, - enc func(context.Context, http.ResponseWriter) goahttp.Encoder, - eh func(context.Context, http.ResponseWriter, error), -) http.Handler { - var ( - encodeResponse = EncodeListResponse(enc) - encodeError = EncodeListError(enc) - ) - return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - ctx := context.WithValue(r.Context(), goahttp.AcceptTypeKey, r.Header.Get("Accept")) - ctx = context.WithValue(ctx, goa.MethodKey, "list") - ctx = context.WithValue(ctx, goa.ServiceKey, "indexes") - - res, err := endpoint(ctx, nil) - - if err != nil { - if err := encodeError(ctx, w, err); err != nil { - eh(ctx, w, err) - } - return - } - if err := encodeResponse(ctx, w, res); err != nil { - eh(ctx, w, err) - } - }) -} - -// MountAddHandler configures the mux to serve the "indexes" service "add" -// endpoint. -func MountAddHandler(mux goahttp.Muxer, h http.Handler) { - f, ok := h.(http.HandlerFunc) - if !ok { - f = func(w http.ResponseWriter, r *http.Request) { - h.ServeHTTP(w, r) - } - } - mux.Handle("POST", "/v2/pkgs/indexes/add", f) -} - -// NewAddHandler creates a HTTP handler which loads the HTTP request and calls -// the "indexes" service "add" endpoint. -func NewAddHandler( - endpoint goa.Endpoint, - mux goahttp.Muxer, - dec func(*http.Request) goahttp.Decoder, - enc func(context.Context, http.ResponseWriter) goahttp.Encoder, - eh func(context.Context, http.ResponseWriter, error), -) http.Handler { - var ( - decodeRequest = DecodeAddRequest(mux, dec) - encodeResponse = EncodeAddResponse(enc) - encodeError = EncodeAddError(enc) - ) - return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - ctx := context.WithValue(r.Context(), goahttp.AcceptTypeKey, r.Header.Get("Accept")) - ctx = context.WithValue(ctx, goa.MethodKey, "add") - ctx = context.WithValue(ctx, goa.ServiceKey, "indexes") - payload, err := decodeRequest(r) - if err != nil { - if err := encodeError(ctx, w, err); err != nil { - eh(ctx, w, err) - } - return - } - - res, err := endpoint(ctx, payload) - - if err != nil { - if err := encodeError(ctx, w, err); err != nil { - eh(ctx, w, err) - } - return - } - if err := encodeResponse(ctx, w, res); err != nil { - eh(ctx, w, err) - } - }) -} - -// MountRemoveHandler configures the mux to serve the "indexes" service -// "remove" endpoint. -func MountRemoveHandler(mux goahttp.Muxer, h http.Handler) { - f, ok := h.(http.HandlerFunc) - if !ok { - f = func(w http.ResponseWriter, r *http.Request) { - h.ServeHTTP(w, r) - } - } - mux.Handle("POST", "/v2/pkgs/indexes/delete", f) -} - -// NewRemoveHandler creates a HTTP handler which loads the HTTP request and -// calls the "indexes" service "remove" endpoint. -func NewRemoveHandler( - endpoint goa.Endpoint, - mux goahttp.Muxer, - dec func(*http.Request) goahttp.Decoder, - enc func(context.Context, http.ResponseWriter) goahttp.Encoder, - eh func(context.Context, http.ResponseWriter, error), -) http.Handler { - var ( - decodeRequest = DecodeRemoveRequest(mux, dec) - encodeResponse = EncodeRemoveResponse(enc) - encodeError = EncodeRemoveError(enc) - ) - return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - ctx := context.WithValue(r.Context(), goahttp.AcceptTypeKey, r.Header.Get("Accept")) - ctx = context.WithValue(ctx, goa.MethodKey, "remove") - ctx = context.WithValue(ctx, goa.ServiceKey, "indexes") - payload, err := decodeRequest(r) - if err != nil { - if err := encodeError(ctx, w, err); err != nil { - eh(ctx, w, err) - } - return - } - - res, err := endpoint(ctx, payload) - - if err != nil { - if err := encodeError(ctx, w, err); err != nil { - eh(ctx, w, err) - } - return - } - if err := encodeResponse(ctx, w, res); err != nil { - eh(ctx, w, err) - } - }) -} diff --git a/gen/http/indexes/server/types.go b/gen/http/indexes/server/types.go deleted file mode 100644 index 4f6792278..000000000 --- a/gen/http/indexes/server/types.go +++ /dev/null @@ -1,188 +0,0 @@ -// Code generated by goa v2.0.0-wip, DO NOT EDIT. -// -// indexes HTTP server types -// -// Command: -// $ goa gen github.com/arduino/arduino-create-agent/design - -package server - -import ( - indexes "github.com/arduino/arduino-create-agent/gen/indexes" - indexesviews "github.com/arduino/arduino-create-agent/gen/indexes/views" - goa "goa.design/goa" -) - -// AddRequestBody is the type of the "indexes" service "add" endpoint HTTP -// request body. -type AddRequestBody struct { - // The url of the index file - URL *string `form:"url,omitempty" json:"url,omitempty" xml:"url,omitempty"` -} - -// RemoveRequestBody is the type of the "indexes" service "remove" endpoint -// HTTP request body. -type RemoveRequestBody struct { - // The url of the index file - URL *string `form:"url,omitempty" json:"url,omitempty" xml:"url,omitempty"` -} - -// AddResponseBody is the type of the "indexes" service "add" endpoint HTTP -// response body. -type AddResponseBody struct { - // The status of the operation - Status string `form:"status" json:"status" xml:"status"` -} - -// RemoveResponseBody is the type of the "indexes" service "remove" endpoint -// HTTP response body. -type RemoveResponseBody struct { - // The status of the operation - Status string `form:"status" json:"status" xml:"status"` -} - -// ListInvalidURLResponseBody is the type of the "indexes" service "list" -// endpoint HTTP response body for the "invalid_url" error. -type ListInvalidURLResponseBody struct { - // Name is the name of this class of errors. - Name string `form:"name" json:"name" xml:"name"` - // ID is a unique identifier for this particular occurrence of the problem. - ID string `form:"id" json:"id" xml:"id"` - // Message is a human-readable explanation specific to this occurrence of the - // problem. - Message string `form:"message" json:"message" xml:"message"` - // Is the error temporary? - Temporary bool `form:"temporary" json:"temporary" xml:"temporary"` - // Is the error a timeout? - Timeout bool `form:"timeout" json:"timeout" xml:"timeout"` - // Is the error a server-side fault? - Fault bool `form:"fault" json:"fault" xml:"fault"` -} - -// AddInvalidURLResponseBody is the type of the "indexes" service "add" -// endpoint HTTP response body for the "invalid_url" error. -type AddInvalidURLResponseBody struct { - // Name is the name of this class of errors. - Name string `form:"name" json:"name" xml:"name"` - // ID is a unique identifier for this particular occurrence of the problem. - ID string `form:"id" json:"id" xml:"id"` - // Message is a human-readable explanation specific to this occurrence of the - // problem. - Message string `form:"message" json:"message" xml:"message"` - // Is the error temporary? - Temporary bool `form:"temporary" json:"temporary" xml:"temporary"` - // Is the error a timeout? - Timeout bool `form:"timeout" json:"timeout" xml:"timeout"` - // Is the error a server-side fault? - Fault bool `form:"fault" json:"fault" xml:"fault"` -} - -// RemoveInvalidURLResponseBody is the type of the "indexes" service "remove" -// endpoint HTTP response body for the "invalid_url" error. -type RemoveInvalidURLResponseBody struct { - // Name is the name of this class of errors. - Name string `form:"name" json:"name" xml:"name"` - // ID is a unique identifier for this particular occurrence of the problem. - ID string `form:"id" json:"id" xml:"id"` - // Message is a human-readable explanation specific to this occurrence of the - // problem. - Message string `form:"message" json:"message" xml:"message"` - // Is the error temporary? - Temporary bool `form:"temporary" json:"temporary" xml:"temporary"` - // Is the error a timeout? - Timeout bool `form:"timeout" json:"timeout" xml:"timeout"` - // Is the error a server-side fault? - Fault bool `form:"fault" json:"fault" xml:"fault"` -} - -// NewAddResponseBody builds the HTTP response body from the result of the -// "add" endpoint of the "indexes" service. -func NewAddResponseBody(res *indexesviews.OperationView) *AddResponseBody { - body := &AddResponseBody{ - Status: *res.Status, - } - return body -} - -// NewRemoveResponseBody builds the HTTP response body from the result of the -// "remove" endpoint of the "indexes" service. -func NewRemoveResponseBody(res *indexesviews.OperationView) *RemoveResponseBody { - body := &RemoveResponseBody{ - Status: *res.Status, - } - return body -} - -// NewListInvalidURLResponseBody builds the HTTP response body from the result -// of the "list" endpoint of the "indexes" service. -func NewListInvalidURLResponseBody(res *goa.ServiceError) *ListInvalidURLResponseBody { - body := &ListInvalidURLResponseBody{ - Name: res.Name, - ID: res.ID, - Message: res.Message, - Temporary: res.Temporary, - Timeout: res.Timeout, - Fault: res.Fault, - } - return body -} - -// NewAddInvalidURLResponseBody builds the HTTP response body from the result -// of the "add" endpoint of the "indexes" service. -func NewAddInvalidURLResponseBody(res *goa.ServiceError) *AddInvalidURLResponseBody { - body := &AddInvalidURLResponseBody{ - Name: res.Name, - ID: res.ID, - Message: res.Message, - Temporary: res.Temporary, - Timeout: res.Timeout, - Fault: res.Fault, - } - return body -} - -// NewRemoveInvalidURLResponseBody builds the HTTP response body from the -// result of the "remove" endpoint of the "indexes" service. -func NewRemoveInvalidURLResponseBody(res *goa.ServiceError) *RemoveInvalidURLResponseBody { - body := &RemoveInvalidURLResponseBody{ - Name: res.Name, - ID: res.ID, - Message: res.Message, - Temporary: res.Temporary, - Timeout: res.Timeout, - Fault: res.Fault, - } - return body -} - -// NewAddIndexPayload builds a indexes service add endpoint payload. -func NewAddIndexPayload(body *AddRequestBody) *indexes.IndexPayload { - v := &indexes.IndexPayload{ - URL: *body.URL, - } - return v -} - -// NewRemoveIndexPayload builds a indexes service remove endpoint payload. -func NewRemoveIndexPayload(body *RemoveRequestBody) *indexes.IndexPayload { - v := &indexes.IndexPayload{ - URL: *body.URL, - } - return v -} - -// ValidateAddRequestBody runs the validations defined on AddRequestBody -func ValidateAddRequestBody(body *AddRequestBody) (err error) { - if body.URL == nil { - err = goa.MergeErrors(err, goa.MissingFieldError("url", "body")) - } - return -} - -// ValidateRemoveRequestBody runs the validations defined on RemoveRequestBody -func ValidateRemoveRequestBody(body *RemoveRequestBody) (err error) { - if body.URL == nil { - err = goa.MergeErrors(err, goa.MissingFieldError("url", "body")) - } - return -} diff --git a/gen/http/openapi.json b/gen/http/openapi.json index 2638bb9af..c0e427331 100644 --- a/gen/http/openapi.json +++ b/gen/http/openapi.json @@ -1 +1 @@ -{"swagger":"2.0","info":{"title":"Arduino Create Agent","description":"A companion of Arduino Create. \n\tAllows the website to perform operations on the user computer, \n\tsuch as detecting which boards are connected and upload sketches on them.","version":""},"host":"localhost:80","consumes":["application/json","application/xml","application/gob"],"produces":["application/json","application/xml","application/gob"],"paths":{"/v2/docs/pkgs":{"get":{"summary":"Download docs/pkgs.html","operationId":"docs#/v2/docs/pkgs","responses":{"200":{"description":"File downloaded","schema":{"type":"file"}}},"schemes":["http"]}},"/v2/pkgs/indexes":{"get":{"tags":["indexes"],"summary":"list indexes","operationId":"indexes#list","responses":{"200":{"description":"OK response.","schema":{"type":"array","items":{"type":"string","example":"Harum nostrum qui ipsa minima quia dolorem."}}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/Indexeslist_invalid_url_response_body"}}},"schemes":["http"]}},"/v2/pkgs/indexes/add":{"post":{"tags":["indexes"],"summary":"add indexes","operationId":"indexes#add","parameters":[{"name":"AddRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/IndexesAddRequestBody","required":["url"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/IndexesAddResponseBody"}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/Indexesadd_invalid_url_response_body"}}},"schemes":["http"]}},"/v2/pkgs/indexes/delete":{"post":{"tags":["indexes"],"summary":"remove indexes","operationId":"indexes#remove","parameters":[{"name":"RemoveRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/IndexesRemoveRequestBody","required":["url"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/IndexesRemoveResponseBody"}},"400":{"description":"Bad Request response.","schema":{"$ref":"#/definitions/Indexesremove_invalid_url_response_body"}}},"schemes":["http"]}},"/v2/pkgs/tools/available":{"get":{"tags":["tools"],"summary":"available tools","operationId":"tools#available","responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ToolsToolResponseCollection"}}},"schemes":["http"]}},"/v2/pkgs/tools/installed":{"get":{"tags":["tools"],"summary":"installed tools","operationId":"tools#installed","responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ToolsToolResponseCollection"}}},"schemes":["http"]},"post":{"tags":["tools"],"summary":"install tools","operationId":"tools#install","parameters":[{"name":"InstallRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/ToolsInstallRequestBody","required":["name","version","packager"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ToolsInstallResponseBody"}}},"schemes":["http"]}},"/v2/pkgs/tools/installed/{packager}/{name}/{version}":{"delete":{"tags":["tools"],"summary":"remove tools","operationId":"tools#remove","parameters":[{"name":"packager","in":"path","description":"The packager of the tool","required":true,"type":"string"},{"name":"name","in":"path","description":"The name of the tool","required":true,"type":"string"},{"name":"version","in":"path","description":"The version of the tool","required":true,"type":"string"},{"name":"RemoveRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/ToolsRemoveRequestBody"}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ToolsRemoveResponseBody"}}},"schemes":["http"]}}},"definitions":{"IndexesAddRequestBody":{"title":"IndexesAddRequestBody","type":"object","properties":{"url":{"type":"string","description":"The url of the index file","example":"http://downloads.arduino.cc/packages/package_index.json"}},"example":{"url":"http://downloads.arduino.cc/packages/package_index.json"},"required":["url"]},"IndexesAddResponseBody":{"title":"Mediatype identifier: application/vnd.arduino.operation; view=default","type":"object","properties":{"status":{"type":"string","description":"The status of the operation","example":"ok"}},"description":"AddResponseBody result type (default view)","example":{"status":"ok"},"required":["status"]},"IndexesRemoveRequestBody":{"title":"IndexesRemoveRequestBody","type":"object","properties":{"url":{"type":"string","description":"The url of the index file","example":"http://downloads.arduino.cc/packages/package_index.json"}},"example":{"url":"http://downloads.arduino.cc/packages/package_index.json"},"required":["url"]},"IndexesRemoveResponseBody":{"title":"Mediatype identifier: application/vnd.arduino.operation; view=default","type":"object","properties":{"status":{"type":"string","description":"The status of the operation","example":"ok"}},"description":"RemoveResponseBody result type (default view)","example":{"status":"ok"},"required":["status"]},"Indexesadd_invalid_url_response_body":{"title":"Mediatype identifier: application/vnd.goa.error; view=default","type":"object","properties":{"fault":{"type":"boolean","description":"Is the error a server-side fault?","example":false},"id":{"type":"string","description":"ID is a unique identifier for this particular occurrence of the problem.","example":"123abc"},"message":{"type":"string","description":"Message is a human-readable explanation specific to this occurrence of the problem.","example":"parameter 'p' must be an integer"},"name":{"type":"string","description":"Name is the name of this class of errors.","example":"bad_request"},"temporary":{"type":"boolean","description":"Is the error temporary?","example":false},"timeout":{"type":"boolean","description":"Is the error a timeout?","example":false}},"description":"url invalid (default view)","example":{"fault":true,"id":"123abc","message":"parameter 'p' must be an integer","name":"bad_request","temporary":true,"timeout":true},"required":["name","id","message","temporary","timeout","fault"]},"Indexeslist_invalid_url_response_body":{"title":"Mediatype identifier: application/vnd.goa.error; view=default","type":"object","properties":{"fault":{"type":"boolean","description":"Is the error a server-side fault?","example":true},"id":{"type":"string","description":"ID is a unique identifier for this particular occurrence of the problem.","example":"123abc"},"message":{"type":"string","description":"Message is a human-readable explanation specific to this occurrence of the problem.","example":"parameter 'p' must be an integer"},"name":{"type":"string","description":"Name is the name of this class of errors.","example":"bad_request"},"temporary":{"type":"boolean","description":"Is the error temporary?","example":false},"timeout":{"type":"boolean","description":"Is the error a timeout?","example":false}},"description":"url invalid (default view)","example":{"fault":false,"id":"123abc","message":"parameter 'p' must be an integer","name":"bad_request","temporary":false,"timeout":false},"required":["name","id","message","temporary","timeout","fault"]},"Indexesremove_invalid_url_response_body":{"title":"Mediatype identifier: application/vnd.goa.error; view=default","type":"object","properties":{"fault":{"type":"boolean","description":"Is the error a server-side fault?","example":false},"id":{"type":"string","description":"ID is a unique identifier for this particular occurrence of the problem.","example":"123abc"},"message":{"type":"string","description":"Message is a human-readable explanation specific to this occurrence of the problem.","example":"parameter 'p' must be an integer"},"name":{"type":"string","description":"Name is the name of this class of errors.","example":"bad_request"},"temporary":{"type":"boolean","description":"Is the error temporary?","example":true},"timeout":{"type":"boolean","description":"Is the error a timeout?","example":true}},"description":"url invalid (default view)","example":{"fault":false,"id":"123abc","message":"parameter 'p' must be an integer","name":"bad_request","temporary":true,"timeout":false},"required":["name","id","message","temporary","timeout","fault"]},"ToolResponse":{"title":"Mediatype identifier: application/vnd.arduino.tool; view=default","type":"object","properties":{"name":{"type":"string","description":"The name of the tool","example":"avrdude"},"packager":{"type":"string","description":"The packager of the tool","example":"arduino"},"version":{"type":"string","description":"The version of the tool","example":"6.3.0-arduino9"}},"description":"A tool is an executable program that can upload sketches. (default view)","example":{"name":"avrdude","packager":"arduino","version":"6.3.0-arduino9"},"required":["name","version","packager"]},"ToolsInstallRequestBody":{"title":"ToolsInstallRequestBody","type":"object","properties":{"checksum":{"type":"string","description":"A checksum of the archive. Mandatory when url is present. \n\tThis ensures that the package is downloaded correcly.","example":"Occaecati eum."},"name":{"type":"string","description":"The name of the tool","example":"avrdude"},"packager":{"type":"string","description":"The packager of the tool","example":"arduino"},"url":{"type":"string","description":"The url where the package can be found. Optional. \n\tIf present checksum must also be present.","example":"Sit quod dolor repellat."},"version":{"type":"string","description":"The version of the tool","example":"6.3.0-arduino9"}},"example":{"checksum":"Id ut totam.","name":"avrdude","packager":"arduino","url":"Vero ipsum corporis nihil.","version":"6.3.0-arduino9"},"required":["name","version","packager"]},"ToolsInstallResponseBody":{"title":"Mediatype identifier: application/vnd.arduino.operation; view=default","type":"object","properties":{"status":{"type":"string","description":"The status of the operation","example":"ok"}},"description":"InstallResponseBody result type (default view)","example":{"status":"ok"},"required":["status"]},"ToolsRemoveRequestBody":{"title":"ToolsRemoveRequestBody","type":"object","properties":{"checksum":{"type":"string","description":"A checksum of the archive. Mandatory when url is present. \n\tThis ensures that the package is downloaded correcly.","example":"Nobis officia optio inventore."},"url":{"type":"string","description":"The url where the package can be found. Optional. \n\tIf present checksum must also be present.","example":"Inventore exercitationem."}},"example":{"checksum":"Qui modi dolorem.","url":"In voluptatibus."}},"ToolsRemoveResponseBody":{"title":"Mediatype identifier: application/vnd.arduino.operation; view=default","type":"object","properties":{"status":{"type":"string","description":"The status of the operation","example":"ok"}},"description":"RemoveResponseBody result type (default view)","example":{"status":"ok"},"required":["status"]},"ToolsToolResponseCollection":{"title":"Mediatype identifier: application/vnd.arduino.tool; type=collection; view=default","type":"array","items":{"$ref":"#/definitions/ToolResponse"},"description":"AvailableResponseBody is the result type for an array of ToolResponse (default view)","example":[{"name":"avrdude","packager":"arduino","version":"6.3.0-arduino9"},{"name":"avrdude","packager":"arduino","version":"6.3.0-arduino9"},{"name":"avrdude","packager":"arduino","version":"6.3.0-arduino9"},{"name":"avrdude","packager":"arduino","version":"6.3.0-arduino9"}]}}} \ No newline at end of file +{"swagger":"2.0","info":{"title":"Arduino Create Agent","description":"A companion of Arduino Create. \n\tAllows the website to perform operations on the user computer, \n\tsuch as detecting which boards are connected and upload sketches on them.","version":"0.0.1"},"host":"localhost:80","basePath":"/v2","consumes":["application/json","plain/text"],"produces":["application/json","application/xml","application/gob"],"paths":{"/pkgs/tools/available":{"get":{"tags":["tools"],"summary":"available tools","operationId":"tools#available","responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ToolsToolResponseCollection"}}},"schemes":["http"]}},"/pkgs/tools/installed":{"get":{"tags":["tools"],"summary":"installed tools","operationId":"tools#installed","responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ToolsToolResponseCollection"}}},"schemes":["http"]},"post":{"tags":["tools"],"summary":"install tools","operationId":"tools#install","parameters":[{"name":"InstallRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/ToolsInstallRequestBody","required":["name","version","packager"]}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ToolsInstallResponseBody"}}},"schemes":["http"]},"head":{"tags":["tools"],"summary":"installedhead tools","operationId":"tools#installedhead","responses":{"200":{"description":"OK response."}},"schemes":["http"]}},"/pkgs/tools/installed/{packager}/{name}/{version}":{"delete":{"tags":["tools"],"summary":"remove tools","operationId":"tools#remove","parameters":[{"name":"packager","in":"path","description":"The packager of the tool","required":true,"type":"string"},{"name":"name","in":"path","description":"The name of the tool","required":true,"type":"string"},{"name":"version","in":"path","description":"The version of the tool","required":true,"type":"string"},{"name":"RemoveRequestBody","in":"body","required":true,"schema":{"$ref":"#/definitions/ToolsRemoveRequestBody"}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/ToolsRemoveResponseBody"}}},"schemes":["http"]}}},"definitions":{"ToolResponse":{"title":"Mediatype identifier: application/vnd.arduino.tool; view=default","type":"object","properties":{"name":{"type":"string","description":"The name of the tool","example":"bossac"},"packager":{"type":"string","description":"The packager of the tool","example":"arduino"},"version":{"type":"string","description":"The version of the tool","example":"1.7.0-arduino3"}},"description":"A tool is an executable program that can upload sketches. (default view)","example":{"name":"bossac","packager":"arduino","version":"1.7.0-arduino3"},"required":["name","version","packager"]},"ToolsInstallRequestBody":{"title":"ToolsInstallRequestBody","type":"object","properties":{"checksum":{"type":"string","description":"A checksum of the archive. Mandatory when url is present. \n\tThis ensures that the package is downloaded correcly.","example":"SHA-256:1ae54999c1f97234a5c603eb99ad39313b11746a4ca517269a9285afa05f9100"},"name":{"type":"string","description":"The name of the tool","example":"bossac"},"packager":{"type":"string","description":"The packager of the tool","example":"arduino"},"signature":{"type":"string","description":"The signature used to sign the url. Mandatory when url is present.\n\tThis ensure the security of the file downloaded","example":"382898a97b5a86edd74208f10107d2fecbf7059ffe9cc856e045266fb4db4e98802728a0859cfdcda1c0b9075ec01e42dbea1f430b813530d5a6ae1766dfbba64c3e689b59758062dc2ab2e32b2a3491dc2b9a80b9cda4ae514fbe0ec5af210111b6896976053ab76bac55bcecfcececa68adfa3299e3cde6b7f117b3552a7d80ca419374bb497e3c3f12b640cf5b20875416b45e662fc6150b99b178f8e41d6982b4c0a255925ea39773683f9aa9201dc5768b6fc857c87ff602b6a93452a541b8ec10ca07f166e61a9e9d91f0a6090bd2038ed4427af6251039fb9fe8eb62ec30d7b0f3df38bc9de7204dec478fb86f8eb3f71543710790ee169dce039d3e0"},"url":{"type":"string","description":"The url where the package can be found. Optional. \n\tIf present checksum must also be present.","example":"http://downloads.arduino.cc/tools/bossac-1.7.0-arduino3-linux64.tar.gz"},"version":{"type":"string","description":"The version of the tool","example":"1.7.0-arduino3"}},"example":{"checksum":"SHA-256:1ae54999c1f97234a5c603eb99ad39313b11746a4ca517269a9285afa05f9100","name":"bossac","packager":"arduino","signature":"382898a97b5a86edd74208f10107d2fecbf7059ffe9cc856e045266fb4db4e98802728a0859cfdcda1c0b9075ec01e42dbea1f430b813530d5a6ae1766dfbba64c3e689b59758062dc2ab2e32b2a3491dc2b9a80b9cda4ae514fbe0ec5af210111b6896976053ab76bac55bcecfcececa68adfa3299e3cde6b7f117b3552a7d80ca419374bb497e3c3f12b640cf5b20875416b45e662fc6150b99b178f8e41d6982b4c0a255925ea39773683f9aa9201dc5768b6fc857c87ff602b6a93452a541b8ec10ca07f166e61a9e9d91f0a6090bd2038ed4427af6251039fb9fe8eb62ec30d7b0f3df38bc9de7204dec478fb86f8eb3f71543710790ee169dce039d3e0","url":"http://downloads.arduino.cc/tools/bossac-1.7.0-arduino3-linux64.tar.gz","version":"1.7.0-arduino3"},"required":["name","version","packager"]},"ToolsInstallResponseBody":{"title":"Mediatype identifier: application/vnd.arduino.operation; view=default","type":"object","properties":{"status":{"type":"string","description":"The status of the operation","example":"ok"}},"description":"InstallResponseBody result type (default view)","example":{"status":"ok"},"required":["status"]},"ToolsRemoveRequestBody":{"title":"ToolsRemoveRequestBody","type":"object","properties":{"checksum":{"type":"string","description":"A checksum of the archive. Mandatory when url is present. \n\tThis ensures that the package is downloaded correcly.","example":"SHA-256:1ae54999c1f97234a5c603eb99ad39313b11746a4ca517269a9285afa05f9100"},"signature":{"type":"string","description":"The signature used to sign the url. Mandatory when url is present.\n\tThis ensure the security of the file downloaded","example":"382898a97b5a86edd74208f10107d2fecbf7059ffe9cc856e045266fb4db4e98802728a0859cfdcda1c0b9075ec01e42dbea1f430b813530d5a6ae1766dfbba64c3e689b59758062dc2ab2e32b2a3491dc2b9a80b9cda4ae514fbe0ec5af210111b6896976053ab76bac55bcecfcececa68adfa3299e3cde6b7f117b3552a7d80ca419374bb497e3c3f12b640cf5b20875416b45e662fc6150b99b178f8e41d6982b4c0a255925ea39773683f9aa9201dc5768b6fc857c87ff602b6a93452a541b8ec10ca07f166e61a9e9d91f0a6090bd2038ed4427af6251039fb9fe8eb62ec30d7b0f3df38bc9de7204dec478fb86f8eb3f71543710790ee169dce039d3e0"},"url":{"type":"string","description":"The url where the package can be found. Optional. \n\tIf present checksum must also be present.","example":"http://downloads.arduino.cc/tools/bossac-1.7.0-arduino3-linux64.tar.gz"}},"example":{"checksum":"SHA-256:1ae54999c1f97234a5c603eb99ad39313b11746a4ca517269a9285afa05f9100","signature":"382898a97b5a86edd74208f10107d2fecbf7059ffe9cc856e045266fb4db4e98802728a0859cfdcda1c0b9075ec01e42dbea1f430b813530d5a6ae1766dfbba64c3e689b59758062dc2ab2e32b2a3491dc2b9a80b9cda4ae514fbe0ec5af210111b6896976053ab76bac55bcecfcececa68adfa3299e3cde6b7f117b3552a7d80ca419374bb497e3c3f12b640cf5b20875416b45e662fc6150b99b178f8e41d6982b4c0a255925ea39773683f9aa9201dc5768b6fc857c87ff602b6a93452a541b8ec10ca07f166e61a9e9d91f0a6090bd2038ed4427af6251039fb9fe8eb62ec30d7b0f3df38bc9de7204dec478fb86f8eb3f71543710790ee169dce039d3e0","url":"http://downloads.arduino.cc/tools/bossac-1.7.0-arduino3-linux64.tar.gz"}},"ToolsRemoveResponseBody":{"title":"Mediatype identifier: application/vnd.arduino.operation; view=default","type":"object","properties":{"status":{"type":"string","description":"The status of the operation","example":"ok"}},"description":"RemoveResponseBody result type (default view)","example":{"status":"ok"},"required":["status"]},"ToolsToolResponseCollection":{"title":"Mediatype identifier: application/vnd.arduino.tool; type=collection; view=default","type":"array","items":{"$ref":"#/definitions/ToolResponse"},"description":"AvailableResponseBody is the result type for an array of ToolResponse (default view)","example":[{"name":"bossac","packager":"arduino","version":"1.7.0-arduino3"},{"name":"bossac","packager":"arduino","version":"1.7.0-arduino3"},{"name":"bossac","packager":"arduino","version":"1.7.0-arduino3"},{"name":"bossac","packager":"arduino","version":"1.7.0-arduino3"}]}}} \ No newline at end of file diff --git a/gen/http/openapi.yaml b/gen/http/openapi.yaml index f887b2660..3e5aeffd0 100644 --- a/gen/http/openapi.yaml +++ b/gen/http/openapi.yaml @@ -1,491 +1,241 @@ swagger: "2.0" info: - title: Arduino Create Agent - description: "A companion of Arduino Create. \n\tAllows the website to perform operations - on the user computer, \n\tsuch as detecting which boards are connected and upload - sketches on them." - version: "" + title: Arduino Create Agent + description: "A companion of Arduino Create. \n\tAllows the website to perform operations on the user computer, \n\tsuch as detecting which boards are connected and upload sketches on them." + version: 0.0.1 host: localhost:80 +basePath: /v2 consumes: -- application/json -- application/xml -- application/gob + - application/json + - plain/text produces: -- application/json -- application/xml -- application/gob + - application/json + - application/xml + - application/gob paths: - /v2/docs/pkgs: - get: - summary: Download docs/pkgs.html - operationId: docs#/v2/docs/pkgs - responses: - "200": - description: File downloaded - schema: - type: file - schemes: - - http - /v2/pkgs/indexes: - get: - tags: - - indexes - summary: list indexes - operationId: indexes#list - responses: - "200": - description: OK response. - schema: - type: array - items: - type: string - example: Harum nostrum qui ipsa minima quia dolorem. - "400": - description: Bad Request response. - schema: - $ref: '#/definitions/Indexeslist_invalid_url_response_body' - schemes: - - http - /v2/pkgs/indexes/add: - post: - tags: - - indexes - summary: add indexes - operationId: indexes#add - parameters: - - name: AddRequestBody - in: body - required: true - schema: - $ref: '#/definitions/IndexesAddRequestBody' - required: - - url - responses: - "200": - description: OK response. - schema: - $ref: '#/definitions/IndexesAddResponseBody' - "400": - description: Bad Request response. - schema: - $ref: '#/definitions/Indexesadd_invalid_url_response_body' - schemes: - - http - /v2/pkgs/indexes/delete: - post: - tags: - - indexes - summary: remove indexes - operationId: indexes#remove - parameters: - - name: RemoveRequestBody - in: body - required: true - schema: - $ref: '#/definitions/IndexesRemoveRequestBody' - required: - - url - responses: - "200": - description: OK response. - schema: - $ref: '#/definitions/IndexesRemoveResponseBody' - "400": - description: Bad Request response. - schema: - $ref: '#/definitions/Indexesremove_invalid_url_response_body' - schemes: - - http - /v2/pkgs/tools/available: - get: - tags: - - tools - summary: available tools - operationId: tools#available - responses: - "200": - description: OK response. - schema: - $ref: '#/definitions/ToolsToolResponseCollection' - schemes: - - http - /v2/pkgs/tools/installed: - get: - tags: - - tools - summary: installed tools - operationId: tools#installed - responses: - "200": - description: OK response. - schema: - $ref: '#/definitions/ToolsToolResponseCollection' - schemes: - - http - post: - tags: - - tools - summary: install tools - operationId: tools#install - parameters: - - name: InstallRequestBody - in: body - required: true - schema: - $ref: '#/definitions/ToolsInstallRequestBody' - required: - - name - - version - - packager - responses: - "200": - description: OK response. - schema: - $ref: '#/definitions/ToolsInstallResponseBody' - schemes: - - http - /v2/pkgs/tools/installed/{packager}/{name}/{version}: - delete: - tags: - - tools - summary: remove tools - operationId: tools#remove - parameters: - - name: packager - in: path - description: The packager of the tool - required: true - type: string - - name: name - in: path - description: The name of the tool - required: true - type: string - - name: version - in: path - description: The version of the tool - required: true - type: string - - name: RemoveRequestBody - in: body - required: true - schema: - $ref: '#/definitions/ToolsRemoveRequestBody' - responses: - "200": - description: OK response. - schema: - $ref: '#/definitions/ToolsRemoveResponseBody' - schemes: - - http + /pkgs/tools/available: + get: + tags: + - tools + summary: available tools + operationId: tools#available + responses: + "200": + description: OK response. + schema: + $ref: '#/definitions/ToolsToolResponseCollection' + schemes: + - http + /pkgs/tools/installed: + get: + tags: + - tools + summary: installed tools + operationId: tools#installed + responses: + "200": + description: OK response. + schema: + $ref: '#/definitions/ToolsToolResponseCollection' + schemes: + - http + post: + tags: + - tools + summary: install tools + operationId: tools#install + parameters: + - name: InstallRequestBody + in: body + required: true + schema: + $ref: '#/definitions/ToolsInstallRequestBody' + required: + - name + - version + - packager + responses: + "200": + description: OK response. + schema: + $ref: '#/definitions/ToolsInstallResponseBody' + schemes: + - http + head: + tags: + - tools + summary: installedhead tools + operationId: tools#installedhead + responses: + "200": + description: OK response. + schemes: + - http + /pkgs/tools/installed/{packager}/{name}/{version}: + delete: + tags: + - tools + summary: remove tools + operationId: tools#remove + parameters: + - name: packager + in: path + description: The packager of the tool + required: true + type: string + - name: name + in: path + description: The name of the tool + required: true + type: string + - name: version + in: path + description: The version of the tool + required: true + type: string + - name: RemoveRequestBody + in: body + required: true + schema: + $ref: '#/definitions/ToolsRemoveRequestBody' + responses: + "200": + description: OK response. + schema: + $ref: '#/definitions/ToolsRemoveResponseBody' + schemes: + - http definitions: - IndexesAddRequestBody: - title: IndexesAddRequestBody - type: object - properties: - url: - type: string - description: The url of the index file - example: http://downloads.arduino.cc/packages/package_index.json - example: - url: http://downloads.arduino.cc/packages/package_index.json - required: - - url - IndexesAddResponseBody: - title: 'Mediatype identifier: application/vnd.arduino.operation; view=default' - type: object - properties: - status: - type: string - description: The status of the operation - example: ok - description: AddResponseBody result type (default view) - example: - status: ok - required: - - status - IndexesRemoveRequestBody: - title: IndexesRemoveRequestBody - type: object - properties: - url: - type: string - description: The url of the index file - example: http://downloads.arduino.cc/packages/package_index.json - example: - url: http://downloads.arduino.cc/packages/package_index.json - required: - - url - IndexesRemoveResponseBody: - title: 'Mediatype identifier: application/vnd.arduino.operation; view=default' - type: object - properties: - status: - type: string - description: The status of the operation - example: ok - description: RemoveResponseBody result type (default view) - example: - status: ok - required: - - status - Indexesadd_invalid_url_response_body: - title: 'Mediatype identifier: application/vnd.goa.error; view=default' - type: object - properties: - fault: - type: boolean - description: Is the error a server-side fault? - example: false - id: - type: string - description: ID is a unique identifier for this particular occurrence of the - problem. - example: 123abc - message: - type: string - description: Message is a human-readable explanation specific to this occurrence - of the problem. - example: parameter 'p' must be an integer - name: - type: string - description: Name is the name of this class of errors. - example: bad_request - temporary: - type: boolean - description: Is the error temporary? - example: false - timeout: - type: boolean - description: Is the error a timeout? - example: false - description: url invalid (default view) - example: - fault: true - id: 123abc - message: parameter 'p' must be an integer - name: bad_request - temporary: true - timeout: true - required: - - name - - id - - message - - temporary - - timeout - - fault - Indexeslist_invalid_url_response_body: - title: 'Mediatype identifier: application/vnd.goa.error; view=default' - type: object - properties: - fault: - type: boolean - description: Is the error a server-side fault? - example: true - id: - type: string - description: ID is a unique identifier for this particular occurrence of the - problem. - example: 123abc - message: - type: string - description: Message is a human-readable explanation specific to this occurrence - of the problem. - example: parameter 'p' must be an integer - name: - type: string - description: Name is the name of this class of errors. - example: bad_request - temporary: - type: boolean - description: Is the error temporary? - example: false - timeout: - type: boolean - description: Is the error a timeout? - example: false - description: url invalid (default view) - example: - fault: false - id: 123abc - message: parameter 'p' must be an integer - name: bad_request - temporary: false - timeout: false - required: - - name - - id - - message - - temporary - - timeout - - fault - Indexesremove_invalid_url_response_body: - title: 'Mediatype identifier: application/vnd.goa.error; view=default' - type: object - properties: - fault: - type: boolean - description: Is the error a server-side fault? - example: false - id: - type: string - description: ID is a unique identifier for this particular occurrence of the - problem. - example: 123abc - message: - type: string - description: Message is a human-readable explanation specific to this occurrence - of the problem. - example: parameter 'p' must be an integer - name: - type: string - description: Name is the name of this class of errors. - example: bad_request - temporary: - type: boolean - description: Is the error temporary? - example: true - timeout: - type: boolean - description: Is the error a timeout? - example: true - description: url invalid (default view) - example: - fault: false - id: 123abc - message: parameter 'p' must be an integer - name: bad_request - temporary: true - timeout: false - required: - - name - - id - - message - - temporary - - timeout - - fault - ToolResponse: - title: 'Mediatype identifier: application/vnd.arduino.tool; view=default' - type: object - properties: - name: - type: string - description: The name of the tool - example: avrdude - packager: - type: string - description: The packager of the tool - example: arduino - version: - type: string - description: The version of the tool - example: 6.3.0-arduino9 - description: A tool is an executable program that can upload sketches. (default - view) - example: - name: avrdude - packager: arduino - version: 6.3.0-arduino9 - required: - - name - - version - - packager - ToolsInstallRequestBody: - title: ToolsInstallRequestBody - type: object - properties: - checksum: - type: string - description: "A checksum of the archive. Mandatory when url is present. \n\tThis - ensures that the package is downloaded correcly." - example: Occaecati eum. - name: - type: string - description: The name of the tool - example: avrdude - packager: - type: string - description: The packager of the tool - example: arduino - url: - type: string - description: "The url where the package can be found. Optional. \n\tIf present - checksum must also be present." - example: Sit quod dolor repellat. - version: - type: string - description: The version of the tool - example: 6.3.0-arduino9 - example: - checksum: Id ut totam. - name: avrdude - packager: arduino - url: Vero ipsum corporis nihil. - version: 6.3.0-arduino9 - required: - - name - - version - - packager - ToolsInstallResponseBody: - title: 'Mediatype identifier: application/vnd.arduino.operation; view=default' - type: object - properties: - status: - type: string - description: The status of the operation - example: ok - description: InstallResponseBody result type (default view) - example: - status: ok - required: - - status - ToolsRemoveRequestBody: - title: ToolsRemoveRequestBody - type: object - properties: - checksum: - type: string - description: "A checksum of the archive. Mandatory when url is present. \n\tThis - ensures that the package is downloaded correcly." - example: Nobis officia optio inventore. - url: - type: string - description: "The url where the package can be found. Optional. \n\tIf present - checksum must also be present." - example: Inventore exercitationem. - example: - checksum: Qui modi dolorem. - url: In voluptatibus. - ToolsRemoveResponseBody: - title: 'Mediatype identifier: application/vnd.arduino.operation; view=default' - type: object - properties: - status: - type: string - description: The status of the operation - example: ok - description: RemoveResponseBody result type (default view) - example: - status: ok - required: - - status - ToolsToolResponseCollection: - title: 'Mediatype identifier: application/vnd.arduino.tool; type=collection; view=default' - type: array - items: - $ref: '#/definitions/ToolResponse' - description: AvailableResponseBody is the result type for an array of ToolResponse - (default view) - example: - - name: avrdude - packager: arduino - version: 6.3.0-arduino9 - - name: avrdude - packager: arduino - version: 6.3.0-arduino9 - - name: avrdude - packager: arduino - version: 6.3.0-arduino9 - - name: avrdude - packager: arduino - version: 6.3.0-arduino9 + ToolResponse: + title: 'Mediatype identifier: application/vnd.arduino.tool; view=default' + type: object + properties: + name: + type: string + description: The name of the tool + example: bossac + packager: + type: string + description: The packager of the tool + example: arduino + version: + type: string + description: The version of the tool + example: 1.7.0-arduino3 + description: A tool is an executable program that can upload sketches. (default view) + example: + name: bossac + packager: arduino + version: 1.7.0-arduino3 + required: + - name + - version + - packager + ToolsInstallRequestBody: + title: ToolsInstallRequestBody + type: object + properties: + checksum: + type: string + description: "A checksum of the archive. Mandatory when url is present. \n\tThis ensures that the package is downloaded correcly." + example: SHA-256:1ae54999c1f97234a5c603eb99ad39313b11746a4ca517269a9285afa05f9100 + name: + type: string + description: The name of the tool + example: bossac + packager: + type: string + description: The packager of the tool + example: arduino + signature: + type: string + description: |- + The signature used to sign the url. Mandatory when url is present. + This ensure the security of the file downloaded + example: 382898a97b5a86edd74208f10107d2fecbf7059ffe9cc856e045266fb4db4e98802728a0859cfdcda1c0b9075ec01e42dbea1f430b813530d5a6ae1766dfbba64c3e689b59758062dc2ab2e32b2a3491dc2b9a80b9cda4ae514fbe0ec5af210111b6896976053ab76bac55bcecfcececa68adfa3299e3cde6b7f117b3552a7d80ca419374bb497e3c3f12b640cf5b20875416b45e662fc6150b99b178f8e41d6982b4c0a255925ea39773683f9aa9201dc5768b6fc857c87ff602b6a93452a541b8ec10ca07f166e61a9e9d91f0a6090bd2038ed4427af6251039fb9fe8eb62ec30d7b0f3df38bc9de7204dec478fb86f8eb3f71543710790ee169dce039d3e0 + url: + type: string + description: "The url where the package can be found. Optional. \n\tIf present checksum must also be present." + example: http://downloads.arduino.cc/tools/bossac-1.7.0-arduino3-linux64.tar.gz + version: + type: string + description: The version of the tool + example: 1.7.0-arduino3 + example: + checksum: SHA-256:1ae54999c1f97234a5c603eb99ad39313b11746a4ca517269a9285afa05f9100 + name: bossac + packager: arduino + signature: 382898a97b5a86edd74208f10107d2fecbf7059ffe9cc856e045266fb4db4e98802728a0859cfdcda1c0b9075ec01e42dbea1f430b813530d5a6ae1766dfbba64c3e689b59758062dc2ab2e32b2a3491dc2b9a80b9cda4ae514fbe0ec5af210111b6896976053ab76bac55bcecfcececa68adfa3299e3cde6b7f117b3552a7d80ca419374bb497e3c3f12b640cf5b20875416b45e662fc6150b99b178f8e41d6982b4c0a255925ea39773683f9aa9201dc5768b6fc857c87ff602b6a93452a541b8ec10ca07f166e61a9e9d91f0a6090bd2038ed4427af6251039fb9fe8eb62ec30d7b0f3df38bc9de7204dec478fb86f8eb3f71543710790ee169dce039d3e0 + url: http://downloads.arduino.cc/tools/bossac-1.7.0-arduino3-linux64.tar.gz + version: 1.7.0-arduino3 + required: + - name + - version + - packager + ToolsInstallResponseBody: + title: 'Mediatype identifier: application/vnd.arduino.operation; view=default' + type: object + properties: + status: + type: string + description: The status of the operation + example: ok + description: InstallResponseBody result type (default view) + example: + status: ok + required: + - status + ToolsRemoveRequestBody: + title: ToolsRemoveRequestBody + type: object + properties: + checksum: + type: string + description: "A checksum of the archive. Mandatory when url is present. \n\tThis ensures that the package is downloaded correcly." + example: SHA-256:1ae54999c1f97234a5c603eb99ad39313b11746a4ca517269a9285afa05f9100 + signature: + type: string + description: |- + The signature used to sign the url. Mandatory when url is present. + This ensure the security of the file downloaded + example: 382898a97b5a86edd74208f10107d2fecbf7059ffe9cc856e045266fb4db4e98802728a0859cfdcda1c0b9075ec01e42dbea1f430b813530d5a6ae1766dfbba64c3e689b59758062dc2ab2e32b2a3491dc2b9a80b9cda4ae514fbe0ec5af210111b6896976053ab76bac55bcecfcececa68adfa3299e3cde6b7f117b3552a7d80ca419374bb497e3c3f12b640cf5b20875416b45e662fc6150b99b178f8e41d6982b4c0a255925ea39773683f9aa9201dc5768b6fc857c87ff602b6a93452a541b8ec10ca07f166e61a9e9d91f0a6090bd2038ed4427af6251039fb9fe8eb62ec30d7b0f3df38bc9de7204dec478fb86f8eb3f71543710790ee169dce039d3e0 + url: + type: string + description: "The url where the package can be found. Optional. \n\tIf present checksum must also be present." + example: http://downloads.arduino.cc/tools/bossac-1.7.0-arduino3-linux64.tar.gz + example: + checksum: SHA-256:1ae54999c1f97234a5c603eb99ad39313b11746a4ca517269a9285afa05f9100 + signature: 382898a97b5a86edd74208f10107d2fecbf7059ffe9cc856e045266fb4db4e98802728a0859cfdcda1c0b9075ec01e42dbea1f430b813530d5a6ae1766dfbba64c3e689b59758062dc2ab2e32b2a3491dc2b9a80b9cda4ae514fbe0ec5af210111b6896976053ab76bac55bcecfcececa68adfa3299e3cde6b7f117b3552a7d80ca419374bb497e3c3f12b640cf5b20875416b45e662fc6150b99b178f8e41d6982b4c0a255925ea39773683f9aa9201dc5768b6fc857c87ff602b6a93452a541b8ec10ca07f166e61a9e9d91f0a6090bd2038ed4427af6251039fb9fe8eb62ec30d7b0f3df38bc9de7204dec478fb86f8eb3f71543710790ee169dce039d3e0 + url: http://downloads.arduino.cc/tools/bossac-1.7.0-arduino3-linux64.tar.gz + ToolsRemoveResponseBody: + title: 'Mediatype identifier: application/vnd.arduino.operation; view=default' + type: object + properties: + status: + type: string + description: The status of the operation + example: ok + description: RemoveResponseBody result type (default view) + example: + status: ok + required: + - status + ToolsToolResponseCollection: + title: 'Mediatype identifier: application/vnd.arduino.tool; type=collection; view=default' + type: array + items: + $ref: '#/definitions/ToolResponse' + description: AvailableResponseBody is the result type for an array of ToolResponse (default view) + example: + - name: bossac + packager: arduino + version: 1.7.0-arduino3 + - name: bossac + packager: arduino + version: 1.7.0-arduino3 + - name: bossac + packager: arduino + version: 1.7.0-arduino3 + - name: bossac + packager: arduino + version: 1.7.0-arduino3 diff --git a/gen/http/openapi3.json b/gen/http/openapi3.json new file mode 100644 index 000000000..de7209e7a --- /dev/null +++ b/gen/http/openapi3.json @@ -0,0 +1 @@ +{"openapi":"3.0.3","info":{"title":"Arduino Create Agent","description":"A companion of Arduino Create. \n\tAllows the website to perform operations on the user computer, \n\tsuch as detecting which boards are connected and upload sketches on them.","version":"0.0.1"},"servers":[{"url":"http://localhost:80","description":"Default server for arduino-create-agent"}],"paths":{"/v2/pkgs/tools/available":{"get":{"tags":["tools"],"summary":"available tools","operationId":"tools#available","responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolCollection"},"example":[{"name":"bossac","packager":"arduino","version":"1.7.0-arduino3"},{"name":"bossac","packager":"arduino","version":"1.7.0-arduino3"},{"name":"bossac","packager":"arduino","version":"1.7.0-arduino3"}]}}}}}},"/v2/pkgs/tools/installed":{"get":{"tags":["tools"],"summary":"installed tools","operationId":"tools#installed","responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolCollection"},"example":[{"name":"bossac","packager":"arduino","version":"1.7.0-arduino3"},{"name":"bossac","packager":"arduino","version":"1.7.0-arduino3"},{"name":"bossac","packager":"arduino","version":"1.7.0-arduino3"}]}}}}},"head":{"tags":["tools"],"summary":"installedhead tools","operationId":"tools#installedhead","responses":{"200":{"description":"OK response."}}},"post":{"tags":["tools"],"summary":"install tools","operationId":"tools#install","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InstallRequestBody"},"example":{"checksum":"SHA-256:1ae54999c1f97234a5c603eb99ad39313b11746a4ca517269a9285afa05f9100","name":"bossac","packager":"arduino","signature":"382898a97b5a86edd74208f10107d2fecbf7059ffe9cc856e045266fb4db4e98802728a0859cfdcda1c0b9075ec01e42dbea1f430b813530d5a6ae1766dfbba64c3e689b59758062dc2ab2e32b2a3491dc2b9a80b9cda4ae514fbe0ec5af210111b6896976053ab76bac55bcecfcececa68adfa3299e3cde6b7f117b3552a7d80ca419374bb497e3c3f12b640cf5b20875416b45e662fc6150b99b178f8e41d6982b4c0a255925ea39773683f9aa9201dc5768b6fc857c87ff602b6a93452a541b8ec10ca07f166e61a9e9d91f0a6090bd2038ed4427af6251039fb9fe8eb62ec30d7b0f3df38bc9de7204dec478fb86f8eb3f71543710790ee169dce039d3e0","url":"http://downloads.arduino.cc/tools/bossac-1.7.0-arduino3-linux64.tar.gz","version":"1.7.0-arduino3"}}}},"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Operation"},"example":{"status":"ok"}}}}}}},"/v2/pkgs/tools/installed/{packager}/{name}/{version}":{"delete":{"tags":["tools"],"summary":"remove tools","operationId":"tools#remove","parameters":[{"name":"packager","in":"path","description":"The packager of the tool","required":true,"schema":{"type":"string","description":"The packager of the tool","example":"arduino"},"example":"arduino"},{"name":"name","in":"path","description":"The name of the tool","required":true,"schema":{"type":"string","description":"The name of the tool","example":"bossac"},"example":"bossac"},{"name":"version","in":"path","description":"The version of the tool","required":true,"schema":{"type":"string","description":"The version of the tool","example":"1.7.0-arduino3"},"example":"1.7.0-arduino3"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RemoveRequestBody"},"example":{"checksum":"SHA-256:1ae54999c1f97234a5c603eb99ad39313b11746a4ca517269a9285afa05f9100","signature":"382898a97b5a86edd74208f10107d2fecbf7059ffe9cc856e045266fb4db4e98802728a0859cfdcda1c0b9075ec01e42dbea1f430b813530d5a6ae1766dfbba64c3e689b59758062dc2ab2e32b2a3491dc2b9a80b9cda4ae514fbe0ec5af210111b6896976053ab76bac55bcecfcececa68adfa3299e3cde6b7f117b3552a7d80ca419374bb497e3c3f12b640cf5b20875416b45e662fc6150b99b178f8e41d6982b4c0a255925ea39773683f9aa9201dc5768b6fc857c87ff602b6a93452a541b8ec10ca07f166e61a9e9d91f0a6090bd2038ed4427af6251039fb9fe8eb62ec30d7b0f3df38bc9de7204dec478fb86f8eb3f71543710790ee169dce039d3e0","url":"http://downloads.arduino.cc/tools/bossac-1.7.0-arduino3-linux64.tar.gz"}}}},"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Operation"},"example":{"status":"ok"}}}}}}}},"components":{"schemas":{"ArduinoTool":{"type":"object","properties":{"name":{"type":"string","description":"The name of the tool","example":"bossac"},"packager":{"type":"string","description":"The packager of the tool","example":"arduino"},"version":{"type":"string","description":"The version of the tool","example":"1.7.0-arduino3"}},"description":"A tool is an executable program that can upload sketches.","example":{"name":"bossac","packager":"arduino","version":"1.7.0-arduino3"},"required":["name","version","packager"]},"InstallRequestBody":{"type":"object","properties":{"checksum":{"type":"string","description":"A checksum of the archive. Mandatory when url is present. \n\tThis ensures that the package is downloaded correcly.","example":"SHA-256:1ae54999c1f97234a5c603eb99ad39313b11746a4ca517269a9285afa05f9100"},"name":{"type":"string","description":"The name of the tool","example":"bossac"},"packager":{"type":"string","description":"The packager of the tool","example":"arduino"},"signature":{"type":"string","description":"The signature used to sign the url. Mandatory when url is present.\n\tThis ensure the security of the file downloaded","example":"382898a97b5a86edd74208f10107d2fecbf7059ffe9cc856e045266fb4db4e98802728a0859cfdcda1c0b9075ec01e42dbea1f430b813530d5a6ae1766dfbba64c3e689b59758062dc2ab2e32b2a3491dc2b9a80b9cda4ae514fbe0ec5af210111b6896976053ab76bac55bcecfcececa68adfa3299e3cde6b7f117b3552a7d80ca419374bb497e3c3f12b640cf5b20875416b45e662fc6150b99b178f8e41d6982b4c0a255925ea39773683f9aa9201dc5768b6fc857c87ff602b6a93452a541b8ec10ca07f166e61a9e9d91f0a6090bd2038ed4427af6251039fb9fe8eb62ec30d7b0f3df38bc9de7204dec478fb86f8eb3f71543710790ee169dce039d3e0"},"url":{"type":"string","description":"The url where the package can be found. Optional. \n\tIf present checksum must also be present.","example":"http://downloads.arduino.cc/tools/bossac-1.7.0-arduino3-linux64.tar.gz"},"version":{"type":"string","description":"The version of the tool","example":"1.7.0-arduino3"}},"example":{"checksum":"SHA-256:1ae54999c1f97234a5c603eb99ad39313b11746a4ca517269a9285afa05f9100","name":"bossac","packager":"arduino","signature":"382898a97b5a86edd74208f10107d2fecbf7059ffe9cc856e045266fb4db4e98802728a0859cfdcda1c0b9075ec01e42dbea1f430b813530d5a6ae1766dfbba64c3e689b59758062dc2ab2e32b2a3491dc2b9a80b9cda4ae514fbe0ec5af210111b6896976053ab76bac55bcecfcececa68adfa3299e3cde6b7f117b3552a7d80ca419374bb497e3c3f12b640cf5b20875416b45e662fc6150b99b178f8e41d6982b4c0a255925ea39773683f9aa9201dc5768b6fc857c87ff602b6a93452a541b8ec10ca07f166e61a9e9d91f0a6090bd2038ed4427af6251039fb9fe8eb62ec30d7b0f3df38bc9de7204dec478fb86f8eb3f71543710790ee169dce039d3e0","url":"http://downloads.arduino.cc/tools/bossac-1.7.0-arduino3-linux64.tar.gz","version":"1.7.0-arduino3"},"required":["name","version","packager"]},"Operation":{"type":"object","properties":{"status":{"type":"string","description":"The status of the operation","example":"ok"}},"example":{"status":"ok"},"required":["status"]},"RemoveRequestBody":{"type":"object","properties":{"checksum":{"type":"string","description":"A checksum of the archive. Mandatory when url is present. \n\tThis ensures that the package is downloaded correcly.","example":"SHA-256:1ae54999c1f97234a5c603eb99ad39313b11746a4ca517269a9285afa05f9100"},"signature":{"type":"string","description":"The signature used to sign the url. Mandatory when url is present.\n\tThis ensure the security of the file downloaded","example":"382898a97b5a86edd74208f10107d2fecbf7059ffe9cc856e045266fb4db4e98802728a0859cfdcda1c0b9075ec01e42dbea1f430b813530d5a6ae1766dfbba64c3e689b59758062dc2ab2e32b2a3491dc2b9a80b9cda4ae514fbe0ec5af210111b6896976053ab76bac55bcecfcececa68adfa3299e3cde6b7f117b3552a7d80ca419374bb497e3c3f12b640cf5b20875416b45e662fc6150b99b178f8e41d6982b4c0a255925ea39773683f9aa9201dc5768b6fc857c87ff602b6a93452a541b8ec10ca07f166e61a9e9d91f0a6090bd2038ed4427af6251039fb9fe8eb62ec30d7b0f3df38bc9de7204dec478fb86f8eb3f71543710790ee169dce039d3e0"},"url":{"type":"string","description":"The url where the package can be found. Optional. \n\tIf present checksum must also be present.","example":"http://downloads.arduino.cc/tools/bossac-1.7.0-arduino3-linux64.tar.gz"}},"example":{"checksum":"SHA-256:1ae54999c1f97234a5c603eb99ad39313b11746a4ca517269a9285afa05f9100","signature":"382898a97b5a86edd74208f10107d2fecbf7059ffe9cc856e045266fb4db4e98802728a0859cfdcda1c0b9075ec01e42dbea1f430b813530d5a6ae1766dfbba64c3e689b59758062dc2ab2e32b2a3491dc2b9a80b9cda4ae514fbe0ec5af210111b6896976053ab76bac55bcecfcececa68adfa3299e3cde6b7f117b3552a7d80ca419374bb497e3c3f12b640cf5b20875416b45e662fc6150b99b178f8e41d6982b4c0a255925ea39773683f9aa9201dc5768b6fc857c87ff602b6a93452a541b8ec10ca07f166e61a9e9d91f0a6090bd2038ed4427af6251039fb9fe8eb62ec30d7b0f3df38bc9de7204dec478fb86f8eb3f71543710790ee169dce039d3e0","url":"http://downloads.arduino.cc/tools/bossac-1.7.0-arduino3-linux64.tar.gz"}},"ToolCollection":{"type":"array","items":{"$ref":"#/components/schemas/ArduinoTool"},"example":[{"name":"bossac","packager":"arduino","version":"1.7.0-arduino3"},{"name":"bossac","packager":"arduino","version":"1.7.0-arduino3"},{"name":"bossac","packager":"arduino","version":"1.7.0-arduino3"},{"name":"bossac","packager":"arduino","version":"1.7.0-arduino3"}]}}},"tags":[{"name":"tools","description":"The tools service manages the available and installed tools"}]} \ No newline at end of file diff --git a/gen/http/openapi3.yaml b/gen/http/openapi3.yaml new file mode 100644 index 000000000..4759cbca9 --- /dev/null +++ b/gen/http/openapi3.yaml @@ -0,0 +1,261 @@ +openapi: 3.0.3 +info: + title: Arduino Create Agent + description: "A companion of Arduino Create. \n\tAllows the website to perform operations on the user computer, \n\tsuch as detecting which boards are connected and upload sketches on them." + version: 0.0.1 +servers: + - url: http://localhost:80 + description: Default server for arduino-create-agent +paths: + /v2/pkgs/tools/available: + get: + tags: + - tools + summary: available tools + operationId: tools#available + responses: + "200": + description: OK response. + content: + application/json: + schema: + $ref: '#/components/schemas/ToolCollection' + example: + - name: bossac + packager: arduino + version: 1.7.0-arduino3 + - name: bossac + packager: arduino + version: 1.7.0-arduino3 + - name: bossac + packager: arduino + version: 1.7.0-arduino3 + /v2/pkgs/tools/installed: + get: + tags: + - tools + summary: installed tools + operationId: tools#installed + responses: + "200": + description: OK response. + content: + application/json: + schema: + $ref: '#/components/schemas/ToolCollection' + example: + - name: bossac + packager: arduino + version: 1.7.0-arduino3 + - name: bossac + packager: arduino + version: 1.7.0-arduino3 + - name: bossac + packager: arduino + version: 1.7.0-arduino3 + head: + tags: + - tools + summary: installedhead tools + operationId: tools#installedhead + responses: + "200": + description: OK response. + post: + tags: + - tools + summary: install tools + operationId: tools#install + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/InstallRequestBody' + example: + checksum: SHA-256:1ae54999c1f97234a5c603eb99ad39313b11746a4ca517269a9285afa05f9100 + name: bossac + packager: arduino + signature: 382898a97b5a86edd74208f10107d2fecbf7059ffe9cc856e045266fb4db4e98802728a0859cfdcda1c0b9075ec01e42dbea1f430b813530d5a6ae1766dfbba64c3e689b59758062dc2ab2e32b2a3491dc2b9a80b9cda4ae514fbe0ec5af210111b6896976053ab76bac55bcecfcececa68adfa3299e3cde6b7f117b3552a7d80ca419374bb497e3c3f12b640cf5b20875416b45e662fc6150b99b178f8e41d6982b4c0a255925ea39773683f9aa9201dc5768b6fc857c87ff602b6a93452a541b8ec10ca07f166e61a9e9d91f0a6090bd2038ed4427af6251039fb9fe8eb62ec30d7b0f3df38bc9de7204dec478fb86f8eb3f71543710790ee169dce039d3e0 + url: http://downloads.arduino.cc/tools/bossac-1.7.0-arduino3-linux64.tar.gz + version: 1.7.0-arduino3 + responses: + "200": + description: OK response. + content: + application/json: + schema: + $ref: '#/components/schemas/Operation' + example: + status: ok + /v2/pkgs/tools/installed/{packager}/{name}/{version}: + delete: + tags: + - tools + summary: remove tools + operationId: tools#remove + parameters: + - name: packager + in: path + description: The packager of the tool + required: true + schema: + type: string + description: The packager of the tool + example: arduino + example: arduino + - name: name + in: path + description: The name of the tool + required: true + schema: + type: string + description: The name of the tool + example: bossac + example: bossac + - name: version + in: path + description: The version of the tool + required: true + schema: + type: string + description: The version of the tool + example: 1.7.0-arduino3 + example: 1.7.0-arduino3 + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/RemoveRequestBody' + example: + checksum: SHA-256:1ae54999c1f97234a5c603eb99ad39313b11746a4ca517269a9285afa05f9100 + signature: 382898a97b5a86edd74208f10107d2fecbf7059ffe9cc856e045266fb4db4e98802728a0859cfdcda1c0b9075ec01e42dbea1f430b813530d5a6ae1766dfbba64c3e689b59758062dc2ab2e32b2a3491dc2b9a80b9cda4ae514fbe0ec5af210111b6896976053ab76bac55bcecfcececa68adfa3299e3cde6b7f117b3552a7d80ca419374bb497e3c3f12b640cf5b20875416b45e662fc6150b99b178f8e41d6982b4c0a255925ea39773683f9aa9201dc5768b6fc857c87ff602b6a93452a541b8ec10ca07f166e61a9e9d91f0a6090bd2038ed4427af6251039fb9fe8eb62ec30d7b0f3df38bc9de7204dec478fb86f8eb3f71543710790ee169dce039d3e0 + url: http://downloads.arduino.cc/tools/bossac-1.7.0-arduino3-linux64.tar.gz + responses: + "200": + description: OK response. + content: + application/json: + schema: + $ref: '#/components/schemas/Operation' + example: + status: ok +components: + schemas: + ArduinoTool: + type: object + properties: + name: + type: string + description: The name of the tool + example: bossac + packager: + type: string + description: The packager of the tool + example: arduino + version: + type: string + description: The version of the tool + example: 1.7.0-arduino3 + description: A tool is an executable program that can upload sketches. + example: + name: bossac + packager: arduino + version: 1.7.0-arduino3 + required: + - name + - version + - packager + InstallRequestBody: + type: object + properties: + checksum: + type: string + description: "A checksum of the archive. Mandatory when url is present. \n\tThis ensures that the package is downloaded correcly." + example: SHA-256:1ae54999c1f97234a5c603eb99ad39313b11746a4ca517269a9285afa05f9100 + name: + type: string + description: The name of the tool + example: bossac + packager: + type: string + description: The packager of the tool + example: arduino + signature: + type: string + description: |- + The signature used to sign the url. Mandatory when url is present. + This ensure the security of the file downloaded + example: 382898a97b5a86edd74208f10107d2fecbf7059ffe9cc856e045266fb4db4e98802728a0859cfdcda1c0b9075ec01e42dbea1f430b813530d5a6ae1766dfbba64c3e689b59758062dc2ab2e32b2a3491dc2b9a80b9cda4ae514fbe0ec5af210111b6896976053ab76bac55bcecfcececa68adfa3299e3cde6b7f117b3552a7d80ca419374bb497e3c3f12b640cf5b20875416b45e662fc6150b99b178f8e41d6982b4c0a255925ea39773683f9aa9201dc5768b6fc857c87ff602b6a93452a541b8ec10ca07f166e61a9e9d91f0a6090bd2038ed4427af6251039fb9fe8eb62ec30d7b0f3df38bc9de7204dec478fb86f8eb3f71543710790ee169dce039d3e0 + url: + type: string + description: "The url where the package can be found. Optional. \n\tIf present checksum must also be present." + example: http://downloads.arduino.cc/tools/bossac-1.7.0-arduino3-linux64.tar.gz + version: + type: string + description: The version of the tool + example: 1.7.0-arduino3 + example: + checksum: SHA-256:1ae54999c1f97234a5c603eb99ad39313b11746a4ca517269a9285afa05f9100 + name: bossac + packager: arduino + signature: 382898a97b5a86edd74208f10107d2fecbf7059ffe9cc856e045266fb4db4e98802728a0859cfdcda1c0b9075ec01e42dbea1f430b813530d5a6ae1766dfbba64c3e689b59758062dc2ab2e32b2a3491dc2b9a80b9cda4ae514fbe0ec5af210111b6896976053ab76bac55bcecfcececa68adfa3299e3cde6b7f117b3552a7d80ca419374bb497e3c3f12b640cf5b20875416b45e662fc6150b99b178f8e41d6982b4c0a255925ea39773683f9aa9201dc5768b6fc857c87ff602b6a93452a541b8ec10ca07f166e61a9e9d91f0a6090bd2038ed4427af6251039fb9fe8eb62ec30d7b0f3df38bc9de7204dec478fb86f8eb3f71543710790ee169dce039d3e0 + url: http://downloads.arduino.cc/tools/bossac-1.7.0-arduino3-linux64.tar.gz + version: 1.7.0-arduino3 + required: + - name + - version + - packager + Operation: + type: object + properties: + status: + type: string + description: The status of the operation + example: ok + example: + status: ok + required: + - status + RemoveRequestBody: + type: object + properties: + checksum: + type: string + description: "A checksum of the archive. Mandatory when url is present. \n\tThis ensures that the package is downloaded correcly." + example: SHA-256:1ae54999c1f97234a5c603eb99ad39313b11746a4ca517269a9285afa05f9100 + signature: + type: string + description: |- + The signature used to sign the url. Mandatory when url is present. + This ensure the security of the file downloaded + example: 382898a97b5a86edd74208f10107d2fecbf7059ffe9cc856e045266fb4db4e98802728a0859cfdcda1c0b9075ec01e42dbea1f430b813530d5a6ae1766dfbba64c3e689b59758062dc2ab2e32b2a3491dc2b9a80b9cda4ae514fbe0ec5af210111b6896976053ab76bac55bcecfcececa68adfa3299e3cde6b7f117b3552a7d80ca419374bb497e3c3f12b640cf5b20875416b45e662fc6150b99b178f8e41d6982b4c0a255925ea39773683f9aa9201dc5768b6fc857c87ff602b6a93452a541b8ec10ca07f166e61a9e9d91f0a6090bd2038ed4427af6251039fb9fe8eb62ec30d7b0f3df38bc9de7204dec478fb86f8eb3f71543710790ee169dce039d3e0 + url: + type: string + description: "The url where the package can be found. Optional. \n\tIf present checksum must also be present." + example: http://downloads.arduino.cc/tools/bossac-1.7.0-arduino3-linux64.tar.gz + example: + checksum: SHA-256:1ae54999c1f97234a5c603eb99ad39313b11746a4ca517269a9285afa05f9100 + signature: 382898a97b5a86edd74208f10107d2fecbf7059ffe9cc856e045266fb4db4e98802728a0859cfdcda1c0b9075ec01e42dbea1f430b813530d5a6ae1766dfbba64c3e689b59758062dc2ab2e32b2a3491dc2b9a80b9cda4ae514fbe0ec5af210111b6896976053ab76bac55bcecfcececa68adfa3299e3cde6b7f117b3552a7d80ca419374bb497e3c3f12b640cf5b20875416b45e662fc6150b99b178f8e41d6982b4c0a255925ea39773683f9aa9201dc5768b6fc857c87ff602b6a93452a541b8ec10ca07f166e61a9e9d91f0a6090bd2038ed4427af6251039fb9fe8eb62ec30d7b0f3df38bc9de7204dec478fb86f8eb3f71543710790ee169dce039d3e0 + url: http://downloads.arduino.cc/tools/bossac-1.7.0-arduino3-linux64.tar.gz + ToolCollection: + type: array + items: + $ref: '#/components/schemas/ArduinoTool' + example: + - name: bossac + packager: arduino + version: 1.7.0-arduino3 + - name: bossac + packager: arduino + version: 1.7.0-arduino3 + - name: bossac + packager: arduino + version: 1.7.0-arduino3 + - name: bossac + packager: arduino + version: 1.7.0-arduino3 +tags: + - name: tools + description: The tools service manages the available and installed tools diff --git a/gen/http/tools/client/cli.go b/gen/http/tools/client/cli.go index d708a242e..0f02f74bd 100644 --- a/gen/http/tools/client/cli.go +++ b/gen/http/tools/client/cli.go @@ -1,4 +1,4 @@ -// Code generated by goa v2.0.0-wip, DO NOT EDIT. +// Code generated by goa v3.16.1, DO NOT EDIT. // // tools HTTP client CLI support package // @@ -22,19 +22,18 @@ func BuildInstallPayload(toolsInstallBody string) (*tools.ToolPayload, error) { { err = json.Unmarshal([]byte(toolsInstallBody), &body) if err != nil { - return nil, fmt.Errorf("invalid JSON for body, example of valid JSON:\n%s", "'{\n \"checksum\": \"Quam voluptas voluptates expedita rem ipsum.\",\n \"name\": \"avrdude\",\n \"packager\": \"arduino\",\n \"url\": \"Iusto libero explicabo beatae dolor adipisci nulla.\",\n \"version\": \"6.3.0-arduino9\"\n }'") + return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"checksum\": \"SHA-256:1ae54999c1f97234a5c603eb99ad39313b11746a4ca517269a9285afa05f9100\",\n \"name\": \"bossac\",\n \"packager\": \"arduino\",\n \"signature\": \"382898a97b5a86edd74208f10107d2fecbf7059ffe9cc856e045266fb4db4e98802728a0859cfdcda1c0b9075ec01e42dbea1f430b813530d5a6ae1766dfbba64c3e689b59758062dc2ab2e32b2a3491dc2b9a80b9cda4ae514fbe0ec5af210111b6896976053ab76bac55bcecfcececa68adfa3299e3cde6b7f117b3552a7d80ca419374bb497e3c3f12b640cf5b20875416b45e662fc6150b99b178f8e41d6982b4c0a255925ea39773683f9aa9201dc5768b6fc857c87ff602b6a93452a541b8ec10ca07f166e61a9e9d91f0a6090bd2038ed4427af6251039fb9fe8eb62ec30d7b0f3df38bc9de7204dec478fb86f8eb3f71543710790ee169dce039d3e0\",\n \"url\": \"http://downloads.arduino.cc/tools/bossac-1.7.0-arduino3-linux64.tar.gz\",\n \"version\": \"1.7.0-arduino3\"\n }'") } } - if err != nil { - return nil, err - } v := &tools.ToolPayload{ - Name: body.Name, - Version: body.Version, - Packager: body.Packager, - URL: body.URL, - Checksum: body.Checksum, + Name: body.Name, + Version: body.Version, + Packager: body.Packager, + URL: body.URL, + Checksum: body.Checksum, + Signature: body.Signature, } + return v, nil } @@ -46,7 +45,7 @@ func BuildRemovePayload(toolsRemoveBody string, toolsRemovePackager string, tool { err = json.Unmarshal([]byte(toolsRemoveBody), &body) if err != nil { - return nil, fmt.Errorf("invalid JSON for body, example of valid JSON:\n%s", "'{\n \"url\": \"http://downloads.arduino.cc/packages/package_index.json\"\n }'") + return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "'{\n \"checksum\": \"SHA-256:1ae54999c1f97234a5c603eb99ad39313b11746a4ca517269a9285afa05f9100\",\n \"signature\": \"382898a97b5a86edd74208f10107d2fecbf7059ffe9cc856e045266fb4db4e98802728a0859cfdcda1c0b9075ec01e42dbea1f430b813530d5a6ae1766dfbba64c3e689b59758062dc2ab2e32b2a3491dc2b9a80b9cda4ae514fbe0ec5af210111b6896976053ab76bac55bcecfcececa68adfa3299e3cde6b7f117b3552a7d80ca419374bb497e3c3f12b640cf5b20875416b45e662fc6150b99b178f8e41d6982b4c0a255925ea39773683f9aa9201dc5768b6fc857c87ff602b6a93452a541b8ec10ca07f166e61a9e9d91f0a6090bd2038ed4427af6251039fb9fe8eb62ec30d7b0f3df38bc9de7204dec478fb86f8eb3f71543710790ee169dce039d3e0\",\n \"url\": \"http://downloads.arduino.cc/tools/bossac-1.7.0-arduino3-linux64.tar.gz\"\n }'") } } var packager string @@ -61,15 +60,14 @@ func BuildRemovePayload(toolsRemoveBody string, toolsRemovePackager string, tool { version = toolsRemoveVersion } - if err != nil { - return nil, err - } v := &tools.ToolPayload{ - URL: body.URL, - Checksum: body.Checksum, + URL: body.URL, + Checksum: body.Checksum, + Signature: body.Signature, } v.Packager = packager v.Name = name v.Version = version + return v, nil } diff --git a/gen/http/tools/client/client.go b/gen/http/tools/client/client.go index b2bb68414..70e5ec54b 100644 --- a/gen/http/tools/client/client.go +++ b/gen/http/tools/client/client.go @@ -1,4 +1,4 @@ -// Code generated by goa v2.0.0-wip, DO NOT EDIT. +// Code generated by goa v3.16.1, DO NOT EDIT. // // tools client HTTP transport // @@ -11,8 +11,8 @@ import ( "context" "net/http" - goa "goa.design/goa" - goahttp "goa.design/goa/http" + goahttp "goa.design/goa/v3/http" + goa "goa.design/goa/v3/pkg" ) // Client lists the tools service endpoint HTTP clients. @@ -21,6 +21,10 @@ type Client struct { // endpoint. AvailableDoer goahttp.Doer + // Installedhead Doer is the HTTP client used to make requests to the + // installedhead endpoint. + InstalledheadDoer goahttp.Doer + // Installed Doer is the HTTP client used to make requests to the installed // endpoint. InstalledDoer goahttp.Doer @@ -53,6 +57,7 @@ func NewClient( ) *Client { return &Client{ AvailableDoer: doer, + InstalledheadDoer: doer, InstalledDoer: doer, InstallDoer: doer, RemoveDoer: doer, @@ -70,13 +75,12 @@ func (c *Client) Available() goa.Endpoint { var ( decodeResponse = DecodeAvailableResponse(c.decoder, c.RestoreResponseBody) ) - return func(ctx context.Context, v interface{}) (interface{}, error) { + return func(ctx context.Context, v any) (any, error) { req, err := c.BuildAvailableRequest(ctx, v) if err != nil { return nil, err } resp, err := c.AvailableDoer.Do(req) - if err != nil { return nil, goahttp.ErrRequestError("tools", "available", err) } @@ -84,19 +88,37 @@ func (c *Client) Available() goa.Endpoint { } } +// Installedhead returns an endpoint that makes HTTP requests to the tools +// service installedhead server. +func (c *Client) Installedhead() goa.Endpoint { + var ( + decodeResponse = DecodeInstalledheadResponse(c.decoder, c.RestoreResponseBody) + ) + return func(ctx context.Context, v any) (any, error) { + req, err := c.BuildInstalledheadRequest(ctx, v) + if err != nil { + return nil, err + } + resp, err := c.InstalledheadDoer.Do(req) + if err != nil { + return nil, goahttp.ErrRequestError("tools", "installedhead", err) + } + return decodeResponse(resp) + } +} + // Installed returns an endpoint that makes HTTP requests to the tools service // installed server. func (c *Client) Installed() goa.Endpoint { var ( decodeResponse = DecodeInstalledResponse(c.decoder, c.RestoreResponseBody) ) - return func(ctx context.Context, v interface{}) (interface{}, error) { + return func(ctx context.Context, v any) (any, error) { req, err := c.BuildInstalledRequest(ctx, v) if err != nil { return nil, err } resp, err := c.InstalledDoer.Do(req) - if err != nil { return nil, goahttp.ErrRequestError("tools", "installed", err) } @@ -111,7 +133,7 @@ func (c *Client) Install() goa.Endpoint { encodeRequest = EncodeInstallRequest(c.encoder) decodeResponse = DecodeInstallResponse(c.decoder, c.RestoreResponseBody) ) - return func(ctx context.Context, v interface{}) (interface{}, error) { + return func(ctx context.Context, v any) (any, error) { req, err := c.BuildInstallRequest(ctx, v) if err != nil { return nil, err @@ -121,7 +143,6 @@ func (c *Client) Install() goa.Endpoint { return nil, err } resp, err := c.InstallDoer.Do(req) - if err != nil { return nil, goahttp.ErrRequestError("tools", "install", err) } @@ -136,7 +157,7 @@ func (c *Client) Remove() goa.Endpoint { encodeRequest = EncodeRemoveRequest(c.encoder) decodeResponse = DecodeRemoveResponse(c.decoder, c.RestoreResponseBody) ) - return func(ctx context.Context, v interface{}) (interface{}, error) { + return func(ctx context.Context, v any) (any, error) { req, err := c.BuildRemoveRequest(ctx, v) if err != nil { return nil, err @@ -146,7 +167,6 @@ func (c *Client) Remove() goa.Endpoint { return nil, err } resp, err := c.RemoveDoer.Do(req) - if err != nil { return nil, goahttp.ErrRequestError("tools", "remove", err) } diff --git a/gen/http/tools/client/encode_decode.go b/gen/http/tools/client/encode_decode.go index acb1d0468..b39e94bbe 100644 --- a/gen/http/tools/client/encode_decode.go +++ b/gen/http/tools/client/encode_decode.go @@ -1,4 +1,4 @@ -// Code generated by goa v2.0.0-wip, DO NOT EDIT. +// Code generated by goa v3.16.1, DO NOT EDIT. // // tools HTTP client encoders and decoders // @@ -10,18 +10,18 @@ package client import ( "bytes" "context" - "io/ioutil" + "io" "net/http" "net/url" tools "github.com/arduino/arduino-create-agent/gen/tools" toolsviews "github.com/arduino/arduino-create-agent/gen/tools/views" - goahttp "goa.design/goa/http" + goahttp "goa.design/goa/v3/http" ) // BuildAvailableRequest instantiates a HTTP request object with method and // path set to call the "tools" service "available" endpoint -func (c *Client) BuildAvailableRequest(ctx context.Context, v interface{}) (*http.Request, error) { +func (c *Client) BuildAvailableRequest(ctx context.Context, v any) (*http.Request, error) { u := &url.URL{Scheme: c.scheme, Host: c.host, Path: AvailableToolsPath()} req, err := http.NewRequest("GET", u.String(), nil) if err != nil { @@ -37,16 +37,16 @@ func (c *Client) BuildAvailableRequest(ctx context.Context, v interface{}) (*htt // DecodeAvailableResponse returns a decoder for responses returned by the // tools available endpoint. restoreBody controls whether the response body // should be restored after having been read. -func DecodeAvailableResponse(decoder func(*http.Response) goahttp.Decoder, restoreBody bool) func(*http.Response) (interface{}, error) { - return func(resp *http.Response) (interface{}, error) { +func DecodeAvailableResponse(decoder func(*http.Response) goahttp.Decoder, restoreBody bool) func(*http.Response) (any, error) { + return func(resp *http.Response) (any, error) { if restoreBody { - b, err := ioutil.ReadAll(resp.Body) + b, err := io.ReadAll(resp.Body) if err != nil { return nil, err } - resp.Body = ioutil.NopCloser(bytes.NewBuffer(b)) + resp.Body = io.NopCloser(bytes.NewBuffer(b)) defer func() { - resp.Body = ioutil.NopCloser(bytes.NewBuffer(b)) + resp.Body = io.NopCloser(bytes.NewBuffer(b)) }() } else { defer resp.Body.Close() @@ -63,22 +63,64 @@ func DecodeAvailableResponse(decoder func(*http.Response) goahttp.Decoder, resto } p := NewAvailableToolCollectionOK(body) view := "default" - vres := toolsviews.ToolCollection{p, view} + vres := toolsviews.ToolCollection{Projected: p, View: view} if err = toolsviews.ValidateToolCollection(vres); err != nil { return nil, goahttp.ErrValidationError("tools", "available", err) } res := tools.NewToolCollection(vres) return res, nil default: - body, _ := ioutil.ReadAll(resp.Body) + body, _ := io.ReadAll(resp.Body) return nil, goahttp.ErrInvalidResponse("tools", "available", resp.StatusCode, string(body)) } } } +// BuildInstalledheadRequest instantiates a HTTP request object with method and +// path set to call the "tools" service "installedhead" endpoint +func (c *Client) BuildInstalledheadRequest(ctx context.Context, v any) (*http.Request, error) { + u := &url.URL{Scheme: c.scheme, Host: c.host, Path: InstalledheadToolsPath()} + req, err := http.NewRequest("HEAD", u.String(), nil) + if err != nil { + return nil, goahttp.ErrInvalidURL("tools", "installedhead", u.String(), err) + } + if ctx != nil { + req = req.WithContext(ctx) + } + + return req, nil +} + +// DecodeInstalledheadResponse returns a decoder for responses returned by the +// tools installedhead endpoint. restoreBody controls whether the response body +// should be restored after having been read. +func DecodeInstalledheadResponse(decoder func(*http.Response) goahttp.Decoder, restoreBody bool) func(*http.Response) (any, error) { + return func(resp *http.Response) (any, error) { + if restoreBody { + b, err := io.ReadAll(resp.Body) + if err != nil { + return nil, err + } + resp.Body = io.NopCloser(bytes.NewBuffer(b)) + defer func() { + resp.Body = io.NopCloser(bytes.NewBuffer(b)) + }() + } else { + defer resp.Body.Close() + } + switch resp.StatusCode { + case http.StatusOK: + return nil, nil + default: + body, _ := io.ReadAll(resp.Body) + return nil, goahttp.ErrInvalidResponse("tools", "installedhead", resp.StatusCode, string(body)) + } + } +} + // BuildInstalledRequest instantiates a HTTP request object with method and // path set to call the "tools" service "installed" endpoint -func (c *Client) BuildInstalledRequest(ctx context.Context, v interface{}) (*http.Request, error) { +func (c *Client) BuildInstalledRequest(ctx context.Context, v any) (*http.Request, error) { u := &url.URL{Scheme: c.scheme, Host: c.host, Path: InstalledToolsPath()} req, err := http.NewRequest("GET", u.String(), nil) if err != nil { @@ -94,16 +136,16 @@ func (c *Client) BuildInstalledRequest(ctx context.Context, v interface{}) (*htt // DecodeInstalledResponse returns a decoder for responses returned by the // tools installed endpoint. restoreBody controls whether the response body // should be restored after having been read. -func DecodeInstalledResponse(decoder func(*http.Response) goahttp.Decoder, restoreBody bool) func(*http.Response) (interface{}, error) { - return func(resp *http.Response) (interface{}, error) { +func DecodeInstalledResponse(decoder func(*http.Response) goahttp.Decoder, restoreBody bool) func(*http.Response) (any, error) { + return func(resp *http.Response) (any, error) { if restoreBody { - b, err := ioutil.ReadAll(resp.Body) + b, err := io.ReadAll(resp.Body) if err != nil { return nil, err } - resp.Body = ioutil.NopCloser(bytes.NewBuffer(b)) + resp.Body = io.NopCloser(bytes.NewBuffer(b)) defer func() { - resp.Body = ioutil.NopCloser(bytes.NewBuffer(b)) + resp.Body = io.NopCloser(bytes.NewBuffer(b)) }() } else { defer resp.Body.Close() @@ -120,14 +162,14 @@ func DecodeInstalledResponse(decoder func(*http.Response) goahttp.Decoder, resto } p := NewInstalledToolCollectionOK(body) view := "default" - vres := toolsviews.ToolCollection{p, view} + vres := toolsviews.ToolCollection{Projected: p, View: view} if err = toolsviews.ValidateToolCollection(vres); err != nil { return nil, goahttp.ErrValidationError("tools", "installed", err) } res := tools.NewToolCollection(vres) return res, nil default: - body, _ := ioutil.ReadAll(resp.Body) + body, _ := io.ReadAll(resp.Body) return nil, goahttp.ErrInvalidResponse("tools", "installed", resp.StatusCode, string(body)) } } @@ -135,7 +177,7 @@ func DecodeInstalledResponse(decoder func(*http.Response) goahttp.Decoder, resto // BuildInstallRequest instantiates a HTTP request object with method and path // set to call the "tools" service "install" endpoint -func (c *Client) BuildInstallRequest(ctx context.Context, v interface{}) (*http.Request, error) { +func (c *Client) BuildInstallRequest(ctx context.Context, v any) (*http.Request, error) { u := &url.URL{Scheme: c.scheme, Host: c.host, Path: InstallToolsPath()} req, err := http.NewRequest("POST", u.String(), nil) if err != nil { @@ -150,8 +192,8 @@ func (c *Client) BuildInstallRequest(ctx context.Context, v interface{}) (*http. // EncodeInstallRequest returns an encoder for requests sent to the tools // install server. -func EncodeInstallRequest(encoder func(*http.Request) goahttp.Encoder) func(*http.Request, interface{}) error { - return func(req *http.Request, v interface{}) error { +func EncodeInstallRequest(encoder func(*http.Request) goahttp.Encoder) func(*http.Request, any) error { + return func(req *http.Request, v any) error { p, ok := v.(*tools.ToolPayload) if !ok { return goahttp.ErrInvalidType("tools", "install", "*tools.ToolPayload", v) @@ -167,16 +209,16 @@ func EncodeInstallRequest(encoder func(*http.Request) goahttp.Encoder) func(*htt // DecodeInstallResponse returns a decoder for responses returned by the tools // install endpoint. restoreBody controls whether the response body should be // restored after having been read. -func DecodeInstallResponse(decoder func(*http.Response) goahttp.Decoder, restoreBody bool) func(*http.Response) (interface{}, error) { - return func(resp *http.Response) (interface{}, error) { +func DecodeInstallResponse(decoder func(*http.Response) goahttp.Decoder, restoreBody bool) func(*http.Response) (any, error) { + return func(resp *http.Response) (any, error) { if restoreBody { - b, err := ioutil.ReadAll(resp.Body) + b, err := io.ReadAll(resp.Body) if err != nil { return nil, err } - resp.Body = ioutil.NopCloser(bytes.NewBuffer(b)) + resp.Body = io.NopCloser(bytes.NewBuffer(b)) defer func() { - resp.Body = ioutil.NopCloser(bytes.NewBuffer(b)) + resp.Body = io.NopCloser(bytes.NewBuffer(b)) }() } else { defer resp.Body.Close() @@ -193,14 +235,14 @@ func DecodeInstallResponse(decoder func(*http.Response) goahttp.Decoder, restore } p := NewInstallOperationOK(&body) view := "default" - vres := &toolsviews.Operation{p, view} + vres := &toolsviews.Operation{Projected: p, View: view} if err = toolsviews.ValidateOperation(vres); err != nil { return nil, goahttp.ErrValidationError("tools", "install", err) } res := tools.NewOperation(vres) return res, nil default: - body, _ := ioutil.ReadAll(resp.Body) + body, _ := io.ReadAll(resp.Body) return nil, goahttp.ErrInvalidResponse("tools", "install", resp.StatusCode, string(body)) } } @@ -208,7 +250,7 @@ func DecodeInstallResponse(decoder func(*http.Response) goahttp.Decoder, restore // BuildRemoveRequest instantiates a HTTP request object with method and path // set to call the "tools" service "remove" endpoint -func (c *Client) BuildRemoveRequest(ctx context.Context, v interface{}) (*http.Request, error) { +func (c *Client) BuildRemoveRequest(ctx context.Context, v any) (*http.Request, error) { var ( packager string name string @@ -237,8 +279,8 @@ func (c *Client) BuildRemoveRequest(ctx context.Context, v interface{}) (*http.R // EncodeRemoveRequest returns an encoder for requests sent to the tools remove // server. -func EncodeRemoveRequest(encoder func(*http.Request) goahttp.Encoder) func(*http.Request, interface{}) error { - return func(req *http.Request, v interface{}) error { +func EncodeRemoveRequest(encoder func(*http.Request) goahttp.Encoder) func(*http.Request, any) error { + return func(req *http.Request, v any) error { p, ok := v.(*tools.ToolPayload) if !ok { return goahttp.ErrInvalidType("tools", "remove", "*tools.ToolPayload", v) @@ -254,16 +296,16 @@ func EncodeRemoveRequest(encoder func(*http.Request) goahttp.Encoder) func(*http // DecodeRemoveResponse returns a decoder for responses returned by the tools // remove endpoint. restoreBody controls whether the response body should be // restored after having been read. -func DecodeRemoveResponse(decoder func(*http.Response) goahttp.Decoder, restoreBody bool) func(*http.Response) (interface{}, error) { - return func(resp *http.Response) (interface{}, error) { +func DecodeRemoveResponse(decoder func(*http.Response) goahttp.Decoder, restoreBody bool) func(*http.Response) (any, error) { + return func(resp *http.Response) (any, error) { if restoreBody { - b, err := ioutil.ReadAll(resp.Body) + b, err := io.ReadAll(resp.Body) if err != nil { return nil, err } - resp.Body = ioutil.NopCloser(bytes.NewBuffer(b)) + resp.Body = io.NopCloser(bytes.NewBuffer(b)) defer func() { - resp.Body = ioutil.NopCloser(bytes.NewBuffer(b)) + resp.Body = io.NopCloser(bytes.NewBuffer(b)) }() } else { defer resp.Body.Close() @@ -280,15 +322,27 @@ func DecodeRemoveResponse(decoder func(*http.Response) goahttp.Decoder, restoreB } p := NewRemoveOperationOK(&body) view := "default" - vres := &toolsviews.Operation{p, view} + vres := &toolsviews.Operation{Projected: p, View: view} if err = toolsviews.ValidateOperation(vres); err != nil { return nil, goahttp.ErrValidationError("tools", "remove", err) } res := tools.NewOperation(vres) return res, nil default: - body, _ := ioutil.ReadAll(resp.Body) + body, _ := io.ReadAll(resp.Body) return nil, goahttp.ErrInvalidResponse("tools", "remove", resp.StatusCode, string(body)) } } } + +// unmarshalToolResponseToToolsviewsToolView builds a value of type +// *toolsviews.ToolView from a value of type *ToolResponse. +func unmarshalToolResponseToToolsviewsToolView(v *ToolResponse) *toolsviews.ToolView { + res := &toolsviews.ToolView{ + Name: v.Name, + Version: v.Version, + Packager: v.Packager, + } + + return res +} diff --git a/gen/http/tools/client/paths.go b/gen/http/tools/client/paths.go index ab66d03f4..b6f7666d5 100644 --- a/gen/http/tools/client/paths.go +++ b/gen/http/tools/client/paths.go @@ -1,4 +1,4 @@ -// Code generated by goa v2.0.0-wip, DO NOT EDIT. +// Code generated by goa v3.16.1, DO NOT EDIT. // // HTTP request path constructors for the tools service. // @@ -16,6 +16,11 @@ func AvailableToolsPath() string { return "/v2/pkgs/tools/available" } +// InstalledheadToolsPath returns the URL path to the tools service installedhead HTTP endpoint. +func InstalledheadToolsPath() string { + return "/v2/pkgs/tools/installed" +} + // InstalledToolsPath returns the URL path to the tools service installed HTTP endpoint. func InstalledToolsPath() string { return "/v2/pkgs/tools/installed" diff --git a/gen/http/tools/client/types.go b/gen/http/tools/client/types.go index 255a61504..ed091792b 100644 --- a/gen/http/tools/client/types.go +++ b/gen/http/tools/client/types.go @@ -1,4 +1,4 @@ -// Code generated by goa v2.0.0-wip, DO NOT EDIT. +// Code generated by goa v3.16.1, DO NOT EDIT. // // tools HTTP client types // @@ -10,7 +10,7 @@ package client import ( tools "github.com/arduino/arduino-create-agent/gen/tools" toolsviews "github.com/arduino/arduino-create-agent/gen/tools/views" - goa "goa.design/goa" + goa "goa.design/goa/v3/pkg" ) // InstallRequestBody is the type of the "tools" service "install" endpoint @@ -28,6 +28,9 @@ type InstallRequestBody struct { // A checksum of the archive. Mandatory when url is present. // This ensures that the package is downloaded correcly. Checksum *string `form:"checksum,omitempty" json:"checksum,omitempty" xml:"checksum,omitempty"` + // The signature used to sign the url. Mandatory when url is present. + // This ensure the security of the file downloaded + Signature *string `form:"signature,omitempty" json:"signature,omitempty" xml:"signature,omitempty"` } // RemoveRequestBody is the type of the "tools" service "remove" endpoint HTTP @@ -39,6 +42,9 @@ type RemoveRequestBody struct { // A checksum of the archive. Mandatory when url is present. // This ensures that the package is downloaded correcly. Checksum *string `form:"checksum,omitempty" json:"checksum,omitempty" xml:"checksum,omitempty"` + // The signature used to sign the url. Mandatory when url is present. + // This ensure the security of the file downloaded + Signature *string `form:"signature,omitempty" json:"signature,omitempty" xml:"signature,omitempty"` } // AvailableResponseBody is the type of the "tools" service "available" @@ -77,11 +83,12 @@ type ToolResponse struct { // "install" endpoint of the "tools" service. func NewInstallRequestBody(p *tools.ToolPayload) *InstallRequestBody { body := &InstallRequestBody{ - Name: p.Name, - Version: p.Version, - Packager: p.Packager, - URL: p.URL, - Checksum: p.Checksum, + Name: p.Name, + Version: p.Version, + Packager: p.Packager, + URL: p.URL, + Checksum: p.Checksum, + Signature: p.Signature, } return body } @@ -90,8 +97,9 @@ func NewInstallRequestBody(p *tools.ToolPayload) *InstallRequestBody { // "remove" endpoint of the "tools" service. func NewRemoveRequestBody(p *tools.ToolPayload) *RemoveRequestBody { body := &RemoveRequestBody{ - URL: p.URL, - Checksum: p.Checksum, + URL: p.URL, + Checksum: p.Checksum, + Signature: p.Signature, } return body } @@ -101,12 +109,9 @@ func NewRemoveRequestBody(p *tools.ToolPayload) *RemoveRequestBody { func NewAvailableToolCollectionOK(body AvailableResponseBody) toolsviews.ToolCollectionView { v := make([]*toolsviews.ToolView, len(body)) for i, val := range body { - v[i] = &toolsviews.ToolView{ - Name: val.Name, - Version: val.Version, - Packager: val.Packager, - } + v[i] = unmarshalToolResponseToToolsviewsToolView(val) } + return v } @@ -115,12 +120,9 @@ func NewAvailableToolCollectionOK(body AvailableResponseBody) toolsviews.ToolCol func NewInstalledToolCollectionOK(body InstalledResponseBody) toolsviews.ToolCollectionView { v := make([]*toolsviews.ToolView, len(body)) for i, val := range body { - v[i] = &toolsviews.ToolView{ - Name: val.Name, - Version: val.Version, - Packager: val.Packager, - } + v[i] = unmarshalToolResponseToToolsviewsToolView(val) } + return v } @@ -130,6 +132,7 @@ func NewInstallOperationOK(body *InstallResponseBody) *toolsviews.OperationView v := &toolsviews.OperationView{ Status: body.Status, } + return v } @@ -139,6 +142,7 @@ func NewRemoveOperationOK(body *RemoveResponseBody) *toolsviews.OperationView { v := &toolsviews.OperationView{ Status: body.Status, } + return v } diff --git a/gen/http/tools/server/encode_decode.go b/gen/http/tools/server/encode_decode.go index 5746d12e4..c1ab298ca 100644 --- a/gen/http/tools/server/encode_decode.go +++ b/gen/http/tools/server/encode_decode.go @@ -1,4 +1,4 @@ -// Code generated by goa v2.0.0-wip, DO NOT EDIT. +// Code generated by goa v3.16.1, DO NOT EDIT. // // tools HTTP server encoders and decoders // @@ -13,14 +13,14 @@ import ( "net/http" toolsviews "github.com/arduino/arduino-create-agent/gen/tools/views" - goa "goa.design/goa" - goahttp "goa.design/goa/http" + goahttp "goa.design/goa/v3/http" + goa "goa.design/goa/v3/pkg" ) // EncodeAvailableResponse returns an encoder for responses returned by the // tools available endpoint. -func EncodeAvailableResponse(encoder func(context.Context, http.ResponseWriter) goahttp.Encoder) func(context.Context, http.ResponseWriter, interface{}) error { - return func(ctx context.Context, w http.ResponseWriter, v interface{}) error { +func EncodeAvailableResponse(encoder func(context.Context, http.ResponseWriter) goahttp.Encoder) func(context.Context, http.ResponseWriter, any) error { + return func(ctx context.Context, w http.ResponseWriter, v any) error { res := v.(toolsviews.ToolCollection) enc := encoder(ctx, w) body := NewToolResponseCollection(res.Projected) @@ -29,10 +29,19 @@ func EncodeAvailableResponse(encoder func(context.Context, http.ResponseWriter) } } +// EncodeInstalledheadResponse returns an encoder for responses returned by the +// tools installedhead endpoint. +func EncodeInstalledheadResponse(encoder func(context.Context, http.ResponseWriter) goahttp.Encoder) func(context.Context, http.ResponseWriter, any) error { + return func(ctx context.Context, w http.ResponseWriter, v any) error { + w.WriteHeader(http.StatusOK) + return nil + } +} + // EncodeInstalledResponse returns an encoder for responses returned by the // tools installed endpoint. -func EncodeInstalledResponse(encoder func(context.Context, http.ResponseWriter) goahttp.Encoder) func(context.Context, http.ResponseWriter, interface{}) error { - return func(ctx context.Context, w http.ResponseWriter, v interface{}) error { +func EncodeInstalledResponse(encoder func(context.Context, http.ResponseWriter) goahttp.Encoder) func(context.Context, http.ResponseWriter, any) error { + return func(ctx context.Context, w http.ResponseWriter, v any) error { res := v.(toolsviews.ToolCollection) enc := encoder(ctx, w) body := NewToolResponseCollection(res.Projected) @@ -43,8 +52,8 @@ func EncodeInstalledResponse(encoder func(context.Context, http.ResponseWriter) // EncodeInstallResponse returns an encoder for responses returned by the tools // install endpoint. -func EncodeInstallResponse(encoder func(context.Context, http.ResponseWriter) goahttp.Encoder) func(context.Context, http.ResponseWriter, interface{}) error { - return func(ctx context.Context, w http.ResponseWriter, v interface{}) error { +func EncodeInstallResponse(encoder func(context.Context, http.ResponseWriter) goahttp.Encoder) func(context.Context, http.ResponseWriter, any) error { + return func(ctx context.Context, w http.ResponseWriter, v any) error { res := v.(*toolsviews.Operation) enc := encoder(ctx, w) body := NewInstallResponseBody(res.Projected) @@ -55,8 +64,8 @@ func EncodeInstallResponse(encoder func(context.Context, http.ResponseWriter) go // DecodeInstallRequest returns a decoder for requests sent to the tools // install endpoint. -func DecodeInstallRequest(mux goahttp.Muxer, decoder func(*http.Request) goahttp.Decoder) func(*http.Request) (interface{}, error) { - return func(r *http.Request) (interface{}, error) { +func DecodeInstallRequest(mux goahttp.Muxer, decoder func(*http.Request) goahttp.Decoder) func(*http.Request) (any, error) { + return func(r *http.Request) (any, error) { var ( body InstallRequestBody err error @@ -80,8 +89,8 @@ func DecodeInstallRequest(mux goahttp.Muxer, decoder func(*http.Request) goahttp // EncodeRemoveResponse returns an encoder for responses returned by the tools // remove endpoint. -func EncodeRemoveResponse(encoder func(context.Context, http.ResponseWriter) goahttp.Encoder) func(context.Context, http.ResponseWriter, interface{}) error { - return func(ctx context.Context, w http.ResponseWriter, v interface{}) error { +func EncodeRemoveResponse(encoder func(context.Context, http.ResponseWriter) goahttp.Encoder) func(context.Context, http.ResponseWriter, any) error { + return func(ctx context.Context, w http.ResponseWriter, v any) error { res := v.(*toolsviews.Operation) enc := encoder(ctx, w) body := NewRemoveResponseBody(res.Projected) @@ -92,8 +101,8 @@ func EncodeRemoveResponse(encoder func(context.Context, http.ResponseWriter) goa // DecodeRemoveRequest returns a decoder for requests sent to the tools remove // endpoint. -func DecodeRemoveRequest(mux goahttp.Muxer, decoder func(*http.Request) goahttp.Decoder) func(*http.Request) (interface{}, error) { - return func(r *http.Request) (interface{}, error) { +func DecodeRemoveRequest(mux goahttp.Muxer, decoder func(*http.Request) goahttp.Decoder) func(*http.Request) (any, error) { + return func(r *http.Request) (any, error) { var ( body RemoveRequestBody err error @@ -121,3 +130,15 @@ func DecodeRemoveRequest(mux goahttp.Muxer, decoder func(*http.Request) goahttp. return payload, nil } } + +// marshalToolsviewsToolViewToToolResponse builds a value of type *ToolResponse +// from a value of type *toolsviews.ToolView. +func marshalToolsviewsToolViewToToolResponse(v *toolsviews.ToolView) *ToolResponse { + res := &ToolResponse{ + Name: *v.Name, + Version: *v.Version, + Packager: *v.Packager, + } + + return res +} diff --git a/gen/http/tools/server/paths.go b/gen/http/tools/server/paths.go index 49cffd067..f071aff60 100644 --- a/gen/http/tools/server/paths.go +++ b/gen/http/tools/server/paths.go @@ -1,4 +1,4 @@ -// Code generated by goa v2.0.0-wip, DO NOT EDIT. +// Code generated by goa v3.16.1, DO NOT EDIT. // // HTTP request path constructors for the tools service. // @@ -16,6 +16,11 @@ func AvailableToolsPath() string { return "/v2/pkgs/tools/available" } +// InstalledheadToolsPath returns the URL path to the tools service installedhead HTTP endpoint. +func InstalledheadToolsPath() string { + return "/v2/pkgs/tools/installed" +} + // InstalledToolsPath returns the URL path to the tools service installed HTTP endpoint. func InstalledToolsPath() string { return "/v2/pkgs/tools/installed" diff --git a/gen/http/tools/server/server.go b/gen/http/tools/server/server.go index f758b2c20..ad339e3de 100644 --- a/gen/http/tools/server/server.go +++ b/gen/http/tools/server/server.go @@ -1,4 +1,4 @@ -// Code generated by goa v2.0.0-wip, DO NOT EDIT. +// Code generated by goa v3.16.1, DO NOT EDIT. // // tools HTTP server // @@ -12,23 +12,18 @@ import ( "net/http" tools "github.com/arduino/arduino-create-agent/gen/tools" - goa "goa.design/goa" - goahttp "goa.design/goa/http" + goahttp "goa.design/goa/v3/http" + goa "goa.design/goa/v3/pkg" ) // Server lists the tools service endpoint HTTP handlers. type Server struct { - Mounts []*MountPoint - Available http.Handler - Installed http.Handler - Install http.Handler - Remove http.Handler -} - -// ErrorNamer is an interface implemented by generated error structs that -// exposes the name of the error as defined in the design. -type ErrorNamer interface { - ErrorName() string + Mounts []*MountPoint + Available http.Handler + Installedhead http.Handler + Installed http.Handler + Install http.Handler + Remove http.Handler } // MountPoint holds information about the mounted endpoints. @@ -42,25 +37,33 @@ type MountPoint struct { Pattern string } -// New instantiates HTTP handlers for all the tools service endpoints. +// New instantiates HTTP handlers for all the tools service endpoints using the +// provided encoder and decoder. The handlers are mounted on the given mux +// using the HTTP verb and path defined in the design. errhandler is called +// whenever a response fails to be encoded. formatter is used to format errors +// returned by the service methods prior to encoding. Both errhandler and +// formatter are optional and can be nil. func New( e *tools.Endpoints, mux goahttp.Muxer, - dec func(*http.Request) goahttp.Decoder, - enc func(context.Context, http.ResponseWriter) goahttp.Encoder, - eh func(context.Context, http.ResponseWriter, error), + decoder func(*http.Request) goahttp.Decoder, + encoder func(context.Context, http.ResponseWriter) goahttp.Encoder, + errhandler func(context.Context, http.ResponseWriter, error), + formatter func(ctx context.Context, err error) goahttp.Statuser, ) *Server { return &Server{ Mounts: []*MountPoint{ {"Available", "GET", "/v2/pkgs/tools/available"}, + {"Installedhead", "HEAD", "/v2/pkgs/tools/installed"}, {"Installed", "GET", "/v2/pkgs/tools/installed"}, {"Install", "POST", "/v2/pkgs/tools/installed"}, {"Remove", "DELETE", "/v2/pkgs/tools/installed/{packager}/{name}/{version}"}, }, - Available: NewAvailableHandler(e.Available, mux, dec, enc, eh), - Installed: NewInstalledHandler(e.Installed, mux, dec, enc, eh), - Install: NewInstallHandler(e.Install, mux, dec, enc, eh), - Remove: NewRemoveHandler(e.Remove, mux, dec, enc, eh), + Available: NewAvailableHandler(e.Available, mux, decoder, encoder, errhandler, formatter), + Installedhead: NewInstalledheadHandler(e.Installedhead, mux, decoder, encoder, errhandler, formatter), + Installed: NewInstalledHandler(e.Installed, mux, decoder, encoder, errhandler, formatter), + Install: NewInstallHandler(e.Install, mux, decoder, encoder, errhandler, formatter), + Remove: NewRemoveHandler(e.Remove, mux, decoder, encoder, errhandler, formatter), } } @@ -70,19 +73,29 @@ func (s *Server) Service() string { return "tools" } // Use wraps the server handlers with the given middleware. func (s *Server) Use(m func(http.Handler) http.Handler) { s.Available = m(s.Available) + s.Installedhead = m(s.Installedhead) s.Installed = m(s.Installed) s.Install = m(s.Install) s.Remove = m(s.Remove) } +// MethodNames returns the methods served. +func (s *Server) MethodNames() []string { return tools.MethodNames[:] } + // Mount configures the mux to serve the tools endpoints. func Mount(mux goahttp.Muxer, h *Server) { MountAvailableHandler(mux, h.Available) + MountInstalledheadHandler(mux, h.Installedhead) MountInstalledHandler(mux, h.Installed) MountInstallHandler(mux, h.Install) MountRemoveHandler(mux, h.Remove) } +// Mount configures the mux to serve the tools endpoints. +func (s *Server) Mount(mux goahttp.Muxer) { + Mount(mux, s) +} + // MountAvailableHandler configures the mux to serve the "tools" service // "available" endpoint. func MountAvailableHandler(mux goahttp.Muxer, h http.Handler) { @@ -100,29 +113,73 @@ func MountAvailableHandler(mux goahttp.Muxer, h http.Handler) { func NewAvailableHandler( endpoint goa.Endpoint, mux goahttp.Muxer, - dec func(*http.Request) goahttp.Decoder, - enc func(context.Context, http.ResponseWriter) goahttp.Encoder, - eh func(context.Context, http.ResponseWriter, error), + decoder func(*http.Request) goahttp.Decoder, + encoder func(context.Context, http.ResponseWriter) goahttp.Encoder, + errhandler func(context.Context, http.ResponseWriter, error), + formatter func(ctx context.Context, err error) goahttp.Statuser, ) http.Handler { var ( - encodeResponse = EncodeAvailableResponse(enc) - encodeError = goahttp.ErrorEncoder(enc) + encodeResponse = EncodeAvailableResponse(encoder) + encodeError = goahttp.ErrorEncoder(encoder, formatter) ) return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { ctx := context.WithValue(r.Context(), goahttp.AcceptTypeKey, r.Header.Get("Accept")) ctx = context.WithValue(ctx, goa.MethodKey, "available") ctx = context.WithValue(ctx, goa.ServiceKey, "tools") - + var err error res, err := endpoint(ctx, nil) + if err != nil { + if err := encodeError(ctx, w, err); err != nil { + errhandler(ctx, w, err) + } + return + } + if err := encodeResponse(ctx, w, res); err != nil { + errhandler(ctx, w, err) + } + }) +} +// MountInstalledheadHandler configures the mux to serve the "tools" service +// "installedhead" endpoint. +func MountInstalledheadHandler(mux goahttp.Muxer, h http.Handler) { + f, ok := h.(http.HandlerFunc) + if !ok { + f = func(w http.ResponseWriter, r *http.Request) { + h.ServeHTTP(w, r) + } + } + mux.Handle("HEAD", "/v2/pkgs/tools/installed", f) +} + +// NewInstalledheadHandler creates a HTTP handler which loads the HTTP request +// and calls the "tools" service "installedhead" endpoint. +func NewInstalledheadHandler( + endpoint goa.Endpoint, + mux goahttp.Muxer, + decoder func(*http.Request) goahttp.Decoder, + encoder func(context.Context, http.ResponseWriter) goahttp.Encoder, + errhandler func(context.Context, http.ResponseWriter, error), + formatter func(ctx context.Context, err error) goahttp.Statuser, +) http.Handler { + var ( + encodeResponse = EncodeInstalledheadResponse(encoder) + encodeError = goahttp.ErrorEncoder(encoder, formatter) + ) + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + ctx := context.WithValue(r.Context(), goahttp.AcceptTypeKey, r.Header.Get("Accept")) + ctx = context.WithValue(ctx, goa.MethodKey, "installedhead") + ctx = context.WithValue(ctx, goa.ServiceKey, "tools") + var err error + res, err := endpoint(ctx, nil) if err != nil { if err := encodeError(ctx, w, err); err != nil { - eh(ctx, w, err) + errhandler(ctx, w, err) } return } if err := encodeResponse(ctx, w, res); err != nil { - eh(ctx, w, err) + errhandler(ctx, w, err) } }) } @@ -144,29 +201,29 @@ func MountInstalledHandler(mux goahttp.Muxer, h http.Handler) { func NewInstalledHandler( endpoint goa.Endpoint, mux goahttp.Muxer, - dec func(*http.Request) goahttp.Decoder, - enc func(context.Context, http.ResponseWriter) goahttp.Encoder, - eh func(context.Context, http.ResponseWriter, error), + decoder func(*http.Request) goahttp.Decoder, + encoder func(context.Context, http.ResponseWriter) goahttp.Encoder, + errhandler func(context.Context, http.ResponseWriter, error), + formatter func(ctx context.Context, err error) goahttp.Statuser, ) http.Handler { var ( - encodeResponse = EncodeInstalledResponse(enc) - encodeError = goahttp.ErrorEncoder(enc) + encodeResponse = EncodeInstalledResponse(encoder) + encodeError = goahttp.ErrorEncoder(encoder, formatter) ) return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { ctx := context.WithValue(r.Context(), goahttp.AcceptTypeKey, r.Header.Get("Accept")) ctx = context.WithValue(ctx, goa.MethodKey, "installed") ctx = context.WithValue(ctx, goa.ServiceKey, "tools") - + var err error res, err := endpoint(ctx, nil) - if err != nil { if err := encodeError(ctx, w, err); err != nil { - eh(ctx, w, err) + errhandler(ctx, w, err) } return } if err := encodeResponse(ctx, w, res); err != nil { - eh(ctx, w, err) + errhandler(ctx, w, err) } }) } @@ -188,14 +245,15 @@ func MountInstallHandler(mux goahttp.Muxer, h http.Handler) { func NewInstallHandler( endpoint goa.Endpoint, mux goahttp.Muxer, - dec func(*http.Request) goahttp.Decoder, - enc func(context.Context, http.ResponseWriter) goahttp.Encoder, - eh func(context.Context, http.ResponseWriter, error), + decoder func(*http.Request) goahttp.Decoder, + encoder func(context.Context, http.ResponseWriter) goahttp.Encoder, + errhandler func(context.Context, http.ResponseWriter, error), + formatter func(ctx context.Context, err error) goahttp.Statuser, ) http.Handler { var ( - decodeRequest = DecodeInstallRequest(mux, dec) - encodeResponse = EncodeInstallResponse(enc) - encodeError = goahttp.ErrorEncoder(enc) + decodeRequest = DecodeInstallRequest(mux, decoder) + encodeResponse = EncodeInstallResponse(encoder) + encodeError = goahttp.ErrorEncoder(encoder, formatter) ) return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { ctx := context.WithValue(r.Context(), goahttp.AcceptTypeKey, r.Header.Get("Accept")) @@ -204,21 +262,19 @@ func NewInstallHandler( payload, err := decodeRequest(r) if err != nil { if err := encodeError(ctx, w, err); err != nil { - eh(ctx, w, err) + errhandler(ctx, w, err) } return } - res, err := endpoint(ctx, payload) - if err != nil { if err := encodeError(ctx, w, err); err != nil { - eh(ctx, w, err) + errhandler(ctx, w, err) } return } if err := encodeResponse(ctx, w, res); err != nil { - eh(ctx, w, err) + errhandler(ctx, w, err) } }) } @@ -240,14 +296,15 @@ func MountRemoveHandler(mux goahttp.Muxer, h http.Handler) { func NewRemoveHandler( endpoint goa.Endpoint, mux goahttp.Muxer, - dec func(*http.Request) goahttp.Decoder, - enc func(context.Context, http.ResponseWriter) goahttp.Encoder, - eh func(context.Context, http.ResponseWriter, error), + decoder func(*http.Request) goahttp.Decoder, + encoder func(context.Context, http.ResponseWriter) goahttp.Encoder, + errhandler func(context.Context, http.ResponseWriter, error), + formatter func(ctx context.Context, err error) goahttp.Statuser, ) http.Handler { var ( - decodeRequest = DecodeRemoveRequest(mux, dec) - encodeResponse = EncodeRemoveResponse(enc) - encodeError = goahttp.ErrorEncoder(enc) + decodeRequest = DecodeRemoveRequest(mux, decoder) + encodeResponse = EncodeRemoveResponse(encoder) + encodeError = goahttp.ErrorEncoder(encoder, formatter) ) return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { ctx := context.WithValue(r.Context(), goahttp.AcceptTypeKey, r.Header.Get("Accept")) @@ -256,21 +313,19 @@ func NewRemoveHandler( payload, err := decodeRequest(r) if err != nil { if err := encodeError(ctx, w, err); err != nil { - eh(ctx, w, err) + errhandler(ctx, w, err) } return } - res, err := endpoint(ctx, payload) - if err != nil { if err := encodeError(ctx, w, err); err != nil { - eh(ctx, w, err) + errhandler(ctx, w, err) } return } if err := encodeResponse(ctx, w, res); err != nil { - eh(ctx, w, err) + errhandler(ctx, w, err) } }) } diff --git a/gen/http/tools/server/types.go b/gen/http/tools/server/types.go index 49d37011d..72bacd4e9 100644 --- a/gen/http/tools/server/types.go +++ b/gen/http/tools/server/types.go @@ -1,4 +1,4 @@ -// Code generated by goa v2.0.0-wip, DO NOT EDIT. +// Code generated by goa v3.16.1, DO NOT EDIT. // // tools HTTP server types // @@ -10,7 +10,7 @@ package server import ( tools "github.com/arduino/arduino-create-agent/gen/tools" toolsviews "github.com/arduino/arduino-create-agent/gen/tools/views" - goa "goa.design/goa" + goa "goa.design/goa/v3/pkg" ) // InstallRequestBody is the type of the "tools" service "install" endpoint @@ -28,6 +28,9 @@ type InstallRequestBody struct { // A checksum of the archive. Mandatory when url is present. // This ensures that the package is downloaded correcly. Checksum *string `form:"checksum,omitempty" json:"checksum,omitempty" xml:"checksum,omitempty"` + // The signature used to sign the url. Mandatory when url is present. + // This ensure the security of the file downloaded + Signature *string `form:"signature,omitempty" json:"signature,omitempty" xml:"signature,omitempty"` } // RemoveRequestBody is the type of the "tools" service "remove" endpoint HTTP @@ -39,6 +42,9 @@ type RemoveRequestBody struct { // A checksum of the archive. Mandatory when url is present. // This ensures that the package is downloaded correcly. Checksum *string `form:"checksum,omitempty" json:"checksum,omitempty" xml:"checksum,omitempty"` + // The signature used to sign the url. Mandatory when url is present. + // This ensure the security of the file downloaded + Signature *string `form:"signature,omitempty" json:"signature,omitempty" xml:"signature,omitempty"` } // ToolResponseCollection is the type of the "tools" service "available" @@ -74,11 +80,7 @@ type ToolResponse struct { func NewToolResponseCollection(res toolsviews.ToolCollectionView) ToolResponseCollection { body := make([]*ToolResponse, len(res)) for i, val := range res { - body[i] = &ToolResponse{ - Name: *val.Name, - Version: *val.Version, - Packager: *val.Packager, - } + body[i] = marshalToolsviewsToolViewToToolResponse(val) } return body } @@ -104,24 +106,28 @@ func NewRemoveResponseBody(res *toolsviews.OperationView) *RemoveResponseBody { // NewInstallToolPayload builds a tools service install endpoint payload. func NewInstallToolPayload(body *InstallRequestBody) *tools.ToolPayload { v := &tools.ToolPayload{ - Name: *body.Name, - Version: *body.Version, - Packager: *body.Packager, - URL: body.URL, - Checksum: body.Checksum, + Name: *body.Name, + Version: *body.Version, + Packager: *body.Packager, + URL: body.URL, + Checksum: body.Checksum, + Signature: body.Signature, } + return v } // NewRemoveToolPayload builds a tools service remove endpoint payload. func NewRemoveToolPayload(body *RemoveRequestBody, packager string, name string, version string) *tools.ToolPayload { v := &tools.ToolPayload{ - URL: body.URL, - Checksum: body.Checksum, + URL: body.URL, + Checksum: body.Checksum, + Signature: body.Signature, } v.Packager = packager v.Name = name v.Version = version + return v } diff --git a/gen/indexes/client.go b/gen/indexes/client.go deleted file mode 100644 index a95c0f640..000000000 --- a/gen/indexes/client.go +++ /dev/null @@ -1,60 +0,0 @@ -// Code generated by goa v2.0.0-wip, DO NOT EDIT. -// -// indexes client -// -// Command: -// $ goa gen github.com/arduino/arduino-create-agent/design - -package indexes - -import ( - "context" - - goa "goa.design/goa" -) - -// Client is the "indexes" service client. -type Client struct { - ListEndpoint goa.Endpoint - AddEndpoint goa.Endpoint - RemoveEndpoint goa.Endpoint -} - -// NewClient initializes a "indexes" service client given the endpoints. -func NewClient(list, add, remove goa.Endpoint) *Client { - return &Client{ - ListEndpoint: list, - AddEndpoint: add, - RemoveEndpoint: remove, - } -} - -// List calls the "list" endpoint of the "indexes" service. -func (c *Client) List(ctx context.Context) (res []string, err error) { - var ires interface{} - ires, err = c.ListEndpoint(ctx, nil) - if err != nil { - return - } - return ires.([]string), nil -} - -// Add calls the "add" endpoint of the "indexes" service. -func (c *Client) Add(ctx context.Context, p *IndexPayload) (res *Operation, err error) { - var ires interface{} - ires, err = c.AddEndpoint(ctx, p) - if err != nil { - return - } - return ires.(*Operation), nil -} - -// Remove calls the "remove" endpoint of the "indexes" service. -func (c *Client) Remove(ctx context.Context, p *IndexPayload) (res *Operation, err error) { - var ires interface{} - ires, err = c.RemoveEndpoint(ctx, p) - if err != nil { - return - } - return ires.(*Operation), nil -} diff --git a/gen/indexes/endpoints.go b/gen/indexes/endpoints.go deleted file mode 100644 index 052938e1e..000000000 --- a/gen/indexes/endpoints.go +++ /dev/null @@ -1,73 +0,0 @@ -// Code generated by goa v2.0.0-wip, DO NOT EDIT. -// -// indexes endpoints -// -// Command: -// $ goa gen github.com/arduino/arduino-create-agent/design - -package indexes - -import ( - "context" - - goa "goa.design/goa" -) - -// Endpoints wraps the "indexes" service endpoints. -type Endpoints struct { - List goa.Endpoint - Add goa.Endpoint - Remove goa.Endpoint -} - -// NewEndpoints wraps the methods of the "indexes" service with endpoints. -func NewEndpoints(s Service) *Endpoints { - return &Endpoints{ - List: NewListEndpoint(s), - Add: NewAddEndpoint(s), - Remove: NewRemoveEndpoint(s), - } -} - -// Use applies the given middleware to all the "indexes" service endpoints. -func (e *Endpoints) Use(m func(goa.Endpoint) goa.Endpoint) { - e.List = m(e.List) - e.Add = m(e.Add) - e.Remove = m(e.Remove) -} - -// NewListEndpoint returns an endpoint function that calls the method "list" of -// service "indexes". -func NewListEndpoint(s Service) goa.Endpoint { - return func(ctx context.Context, req interface{}) (interface{}, error) { - return s.List(ctx) - } -} - -// NewAddEndpoint returns an endpoint function that calls the method "add" of -// service "indexes". -func NewAddEndpoint(s Service) goa.Endpoint { - return func(ctx context.Context, req interface{}) (interface{}, error) { - p := req.(*IndexPayload) - res, err := s.Add(ctx, p) - if err != nil { - return nil, err - } - vres := NewViewedOperation(res, "default") - return vres, nil - } -} - -// NewRemoveEndpoint returns an endpoint function that calls the method -// "remove" of service "indexes". -func NewRemoveEndpoint(s Service) goa.Endpoint { - return func(ctx context.Context, req interface{}) (interface{}, error) { - p := req.(*IndexPayload) - res, err := s.Remove(ctx, p) - if err != nil { - return nil, err - } - vres := NewViewedOperation(res, "default") - return vres, nil - } -} diff --git a/gen/indexes/service.go b/gen/indexes/service.go deleted file mode 100644 index ad57b8f88..000000000 --- a/gen/indexes/service.go +++ /dev/null @@ -1,97 +0,0 @@ -// Code generated by goa v2.0.0-wip, DO NOT EDIT. -// -// indexes service -// -// Command: -// $ goa gen github.com/arduino/arduino-create-agent/design - -package indexes - -import ( - "context" - - indexesviews "github.com/arduino/arduino-create-agent/gen/indexes/views" - "goa.design/goa" -) - -// The indexes service manages the package_index files -type Service interface { - // List implements list. - List(context.Context) (res []string, err error) - // Add implements add. - Add(context.Context, *IndexPayload) (res *Operation, err error) - // Remove implements remove. - Remove(context.Context, *IndexPayload) (res *Operation, err error) -} - -// ServiceName is the name of the service as defined in the design. This is the -// same value that is set in the endpoint request contexts under the ServiceKey -// key. -const ServiceName = "indexes" - -// MethodNames lists the service method names as defined in the design. These -// are the same values that are set in the endpoint request contexts under the -// MethodKey key. -var MethodNames = [3]string{"list", "add", "remove"} - -// IndexPayload is the payload type of the indexes service add method. -type IndexPayload struct { - // The url of the index file - URL string -} - -// Operation is the result type of the indexes service add method. -type Operation struct { - // The status of the operation - Status string -} - -// MakeInvalidURL builds a goa.ServiceError from an error. -func MakeInvalidURL(err error) *goa.ServiceError { - return &goa.ServiceError{ - Name: "invalid_url", - ID: goa.NewErrorID(), - Message: err.Error(), - } -} - -// NewOperation initializes result type Operation from viewed result type -// Operation. -func NewOperation(vres *indexesviews.Operation) *Operation { - var res *Operation - switch vres.View { - case "default", "": - res = newOperation(vres.Projected) - } - return res -} - -// NewViewedOperation initializes viewed result type Operation from result type -// Operation using the given view. -func NewViewedOperation(res *Operation, view string) *indexesviews.Operation { - var vres *indexesviews.Operation - switch view { - case "default", "": - p := newOperationView(res) - vres = &indexesviews.Operation{p, "default"} - } - return vres -} - -// newOperation converts projected type Operation to service type Operation. -func newOperation(vres *indexesviews.OperationView) *Operation { - res := &Operation{} - if vres.Status != nil { - res.Status = *vres.Status - } - return res -} - -// newOperationView projects result type Operation into projected type -// OperationView using the "default" view. -func newOperationView(res *Operation) *indexesviews.OperationView { - vres := &indexesviews.OperationView{ - Status: &res.Status, - } - return vres -} diff --git a/gen/indexes/views/view.go b/gen/indexes/views/view.go deleted file mode 100644 index fb5d90fc8..000000000 --- a/gen/indexes/views/view.go +++ /dev/null @@ -1,57 +0,0 @@ -// Code generated by goa v2.0.0-wip, DO NOT EDIT. -// -// indexes views -// -// Command: -// $ goa gen github.com/arduino/arduino-create-agent/design - -package views - -import ( - goa "goa.design/goa" -) - -// Operation is the viewed result type that is projected based on a view. -type Operation struct { - // Type to project - Projected *OperationView - // View to render - View string -} - -// OperationView is a type that runs validations on a projected type. -type OperationView struct { - // The status of the operation - Status *string -} - -var ( - // OperationMap is a map of attribute names in result type Operation indexed by - // view name. - OperationMap = map[string][]string{ - "default": []string{ - "status", - }, - } -) - -// ValidateOperation runs the validations defined on the viewed result type -// Operation. -func ValidateOperation(result *Operation) (err error) { - switch result.View { - case "default", "": - err = ValidateOperationView(result.Projected) - default: - err = goa.InvalidEnumValueError("view", result.View, []interface{}{"default"}) - } - return -} - -// ValidateOperationView runs the validations defined on OperationView using -// the "default" view. -func ValidateOperationView(result *OperationView) (err error) { - if result.Status == nil { - err = goa.MergeErrors(err, goa.MissingFieldError("status", "result")) - } - return -} diff --git a/gen/tools/client.go b/gen/tools/client.go index 8c3cc70f1..54ee57cb3 100644 --- a/gen/tools/client.go +++ b/gen/tools/client.go @@ -1,4 +1,4 @@ -// Code generated by goa v2.0.0-wip, DO NOT EDIT. +// Code generated by goa v3.16.1, DO NOT EDIT. // // tools client // @@ -10,30 +10,32 @@ package tools import ( "context" - goa "goa.design/goa" + goa "goa.design/goa/v3/pkg" ) // Client is the "tools" service client. type Client struct { - AvailableEndpoint goa.Endpoint - InstalledEndpoint goa.Endpoint - InstallEndpoint goa.Endpoint - RemoveEndpoint goa.Endpoint + AvailableEndpoint goa.Endpoint + InstalledheadEndpoint goa.Endpoint + InstalledEndpoint goa.Endpoint + InstallEndpoint goa.Endpoint + RemoveEndpoint goa.Endpoint } // NewClient initializes a "tools" service client given the endpoints. -func NewClient(available, installed, install, remove goa.Endpoint) *Client { +func NewClient(available, installedhead, installed, install, remove goa.Endpoint) *Client { return &Client{ - AvailableEndpoint: available, - InstalledEndpoint: installed, - InstallEndpoint: install, - RemoveEndpoint: remove, + AvailableEndpoint: available, + InstalledheadEndpoint: installedhead, + InstalledEndpoint: installed, + InstallEndpoint: install, + RemoveEndpoint: remove, } } // Available calls the "available" endpoint of the "tools" service. func (c *Client) Available(ctx context.Context) (res ToolCollection, err error) { - var ires interface{} + var ires any ires, err = c.AvailableEndpoint(ctx, nil) if err != nil { return @@ -41,9 +43,15 @@ func (c *Client) Available(ctx context.Context) (res ToolCollection, err error) return ires.(ToolCollection), nil } +// Installedhead calls the "installedhead" endpoint of the "tools" service. +func (c *Client) Installedhead(ctx context.Context) (err error) { + _, err = c.InstalledheadEndpoint(ctx, nil) + return +} + // Installed calls the "installed" endpoint of the "tools" service. func (c *Client) Installed(ctx context.Context) (res ToolCollection, err error) { - var ires interface{} + var ires any ires, err = c.InstalledEndpoint(ctx, nil) if err != nil { return @@ -53,10 +61,10 @@ func (c *Client) Installed(ctx context.Context) (res ToolCollection, err error) // Install calls the "install" endpoint of the "tools" service. // Install may return the following errors: -// - "not_found" (type *goa.ServiceError): tool not found -// - error: internal error +// - "not_found" (type *goa.ServiceError): tool not found +// - error: internal error func (c *Client) Install(ctx context.Context, p *ToolPayload) (res *Operation, err error) { - var ires interface{} + var ires any ires, err = c.InstallEndpoint(ctx, p) if err != nil { return @@ -66,7 +74,7 @@ func (c *Client) Install(ctx context.Context, p *ToolPayload) (res *Operation, e // Remove calls the "remove" endpoint of the "tools" service. func (c *Client) Remove(ctx context.Context, p *ToolPayload) (res *Operation, err error) { - var ires interface{} + var ires any ires, err = c.RemoveEndpoint(ctx, p) if err != nil { return diff --git a/gen/tools/endpoints.go b/gen/tools/endpoints.go index c2caa0d0a..de609c5f9 100644 --- a/gen/tools/endpoints.go +++ b/gen/tools/endpoints.go @@ -1,4 +1,4 @@ -// Code generated by goa v2.0.0-wip, DO NOT EDIT. +// Code generated by goa v3.16.1, DO NOT EDIT. // // tools endpoints // @@ -10,30 +10,33 @@ package tools import ( "context" - goa "goa.design/goa" + goa "goa.design/goa/v3/pkg" ) // Endpoints wraps the "tools" service endpoints. type Endpoints struct { - Available goa.Endpoint - Installed goa.Endpoint - Install goa.Endpoint - Remove goa.Endpoint + Available goa.Endpoint + Installedhead goa.Endpoint + Installed goa.Endpoint + Install goa.Endpoint + Remove goa.Endpoint } // NewEndpoints wraps the methods of the "tools" service with endpoints. func NewEndpoints(s Service) *Endpoints { return &Endpoints{ - Available: NewAvailableEndpoint(s), - Installed: NewInstalledEndpoint(s), - Install: NewInstallEndpoint(s), - Remove: NewRemoveEndpoint(s), + Available: NewAvailableEndpoint(s), + Installedhead: NewInstalledheadEndpoint(s), + Installed: NewInstalledEndpoint(s), + Install: NewInstallEndpoint(s), + Remove: NewRemoveEndpoint(s), } } // Use applies the given middleware to all the "tools" service endpoints. func (e *Endpoints) Use(m func(goa.Endpoint) goa.Endpoint) { e.Available = m(e.Available) + e.Installedhead = m(e.Installedhead) e.Installed = m(e.Installed) e.Install = m(e.Install) e.Remove = m(e.Remove) @@ -42,7 +45,7 @@ func (e *Endpoints) Use(m func(goa.Endpoint) goa.Endpoint) { // NewAvailableEndpoint returns an endpoint function that calls the method // "available" of service "tools". func NewAvailableEndpoint(s Service) goa.Endpoint { - return func(ctx context.Context, req interface{}) (interface{}, error) { + return func(ctx context.Context, req any) (any, error) { res, err := s.Available(ctx) if err != nil { return nil, err @@ -52,10 +55,18 @@ func NewAvailableEndpoint(s Service) goa.Endpoint { } } +// NewInstalledheadEndpoint returns an endpoint function that calls the method +// "installedhead" of service "tools". +func NewInstalledheadEndpoint(s Service) goa.Endpoint { + return func(ctx context.Context, req any) (any, error) { + return nil, s.Installedhead(ctx) + } +} + // NewInstalledEndpoint returns an endpoint function that calls the method // "installed" of service "tools". func NewInstalledEndpoint(s Service) goa.Endpoint { - return func(ctx context.Context, req interface{}) (interface{}, error) { + return func(ctx context.Context, req any) (any, error) { res, err := s.Installed(ctx) if err != nil { return nil, err @@ -68,7 +79,7 @@ func NewInstalledEndpoint(s Service) goa.Endpoint { // NewInstallEndpoint returns an endpoint function that calls the method // "install" of service "tools". func NewInstallEndpoint(s Service) goa.Endpoint { - return func(ctx context.Context, req interface{}) (interface{}, error) { + return func(ctx context.Context, req any) (any, error) { p := req.(*ToolPayload) res, err := s.Install(ctx, p) if err != nil { @@ -82,7 +93,7 @@ func NewInstallEndpoint(s Service) goa.Endpoint { // NewRemoveEndpoint returns an endpoint function that calls the method // "remove" of service "tools". func NewRemoveEndpoint(s Service) goa.Endpoint { - return func(ctx context.Context, req interface{}) (interface{}, error) { + return func(ctx context.Context, req any) (any, error) { p := req.(*ToolPayload) res, err := s.Remove(ctx, p) if err != nil { diff --git a/gen/tools/service.go b/gen/tools/service.go index 12d90c902..94440d66e 100644 --- a/gen/tools/service.go +++ b/gen/tools/service.go @@ -1,4 +1,4 @@ -// Code generated by goa v2.0.0-wip, DO NOT EDIT. +// Code generated by goa v3.16.1, DO NOT EDIT. // // tools service // @@ -11,13 +11,15 @@ import ( "context" toolsviews "github.com/arduino/arduino-create-agent/gen/tools/views" - "goa.design/goa" + goa "goa.design/goa/v3/pkg" ) // The tools service manages the available and installed tools type Service interface { // Available implements available. Available(context.Context) (res ToolCollection, err error) + // Installedhead implements installedhead. + Installedhead(context.Context) (err error) // Installed implements installed. Installed(context.Context) (res ToolCollection, err error) // Install implements install. @@ -26,6 +28,12 @@ type Service interface { Remove(context.Context, *ToolPayload) (res *Operation, err error) } +// APIName is the name of the API as defined in the design. +const APIName = "arduino-create-agent" + +// APIVersion is the version of the API as defined in the design. +const APIVersion = "0.0.1" + // ServiceName is the name of the service as defined in the design. This is the // same value that is set in the endpoint request contexts under the ServiceKey // key. @@ -34,7 +42,23 @@ const ServiceName = "tools" // MethodNames lists the service method names as defined in the design. These // are the same values that are set in the endpoint request contexts under the // MethodKey key. -var MethodNames = [4]string{"available", "installed", "install", "remove"} +var MethodNames = [5]string{"available", "installedhead", "installed", "install", "remove"} + +// Operation is the result type of the tools service install method. +type Operation struct { + // The status of the operation + Status string +} + +// A tool is an executable program that can upload sketches. +type Tool struct { + // The name of the tool + Name string + // The version of the tool + Version string + // The packager of the tool + Packager string +} // ToolCollection is the result type of the tools service available method. type ToolCollection []*Tool @@ -53,77 +77,40 @@ type ToolPayload struct { // A checksum of the archive. Mandatory when url is present. // This ensures that the package is downloaded correcly. Checksum *string -} - -// Operation is the result type of the tools service install method. -type Operation struct { - // The status of the operation - Status string -} - -// A tool is an executable program that can upload sketches. -type Tool struct { - // The name of the tool - Name string - // The version of the tool - Version string - // The packager of the tool - Packager string + // The signature used to sign the url. Mandatory when url is present. + // This ensure the security of the file downloaded + Signature *string } // MakeNotFound builds a goa.ServiceError from an error. func MakeNotFound(err error) *goa.ServiceError { - return &goa.ServiceError{ - Name: "not_found", - ID: goa.NewErrorID(), - Message: err.Error(), - } + return goa.NewServiceError(err, "not_found", false, false, false) } // NewToolCollection initializes result type ToolCollection from viewed result // type ToolCollection. func NewToolCollection(vres toolsviews.ToolCollection) ToolCollection { - var res ToolCollection - switch vres.View { - case "default", "": - res = newToolCollection(vres.Projected) - } - return res + return newToolCollection(vres.Projected) } // NewViewedToolCollection initializes viewed result type ToolCollection from // result type ToolCollection using the given view. func NewViewedToolCollection(res ToolCollection, view string) toolsviews.ToolCollection { - var vres toolsviews.ToolCollection - switch view { - case "default", "": - p := newToolCollectionView(res) - vres = toolsviews.ToolCollection{p, "default"} - } - return vres + p := newToolCollectionView(res) + return toolsviews.ToolCollection{Projected: p, View: "default"} } // NewOperation initializes result type Operation from viewed result type // Operation. func NewOperation(vres *toolsviews.Operation) *Operation { - var res *Operation - switch vres.View { - case "default", "": - res = newOperation(vres.Projected) - } - return res + return newOperation(vres.Projected) } // NewViewedOperation initializes viewed result type Operation from result type // Operation using the given view. func NewViewedOperation(res *Operation, view string) *toolsviews.Operation { - var vres *toolsviews.Operation - switch view { - case "default", "": - p := newOperationView(res) - vres = &toolsviews.Operation{p, "default"} - } - return vres + p := newOperationView(res) + return &toolsviews.Operation{Projected: p, View: "default"} } // newToolCollection converts projected type ToolCollection to service type @@ -136,8 +123,8 @@ func newToolCollection(vres toolsviews.ToolCollectionView) ToolCollection { return res } -// newToolCollectionView projects result type ToolCollection into projected -// type ToolCollectionView using the "default" view. +// newToolCollectionView projects result type ToolCollection to projected type +// ToolCollectionView using the "default" view. func newToolCollectionView(res ToolCollection) toolsviews.ToolCollectionView { vres := make(toolsviews.ToolCollectionView, len(res)) for i, n := range res { @@ -161,7 +148,7 @@ func newTool(vres *toolsviews.ToolView) *Tool { return res } -// newToolView projects result type Tool into projected type ToolView using the +// newToolView projects result type Tool to projected type ToolView using the // "default" view. func newToolView(res *Tool) *toolsviews.ToolView { vres := &toolsviews.ToolView{ @@ -181,7 +168,7 @@ func newOperation(vres *toolsviews.OperationView) *Operation { return res } -// newOperationView projects result type Operation into projected type +// newOperationView projects result type Operation to projected type // OperationView using the "default" view. func newOperationView(res *Operation) *toolsviews.OperationView { vres := &toolsviews.OperationView{ diff --git a/gen/tools/views/view.go b/gen/tools/views/view.go index 38df0ae7b..272e2449b 100644 --- a/gen/tools/views/view.go +++ b/gen/tools/views/view.go @@ -1,4 +1,4 @@ -// Code generated by goa v2.0.0-wip, DO NOT EDIT. +// Code generated by goa v3.16.1, DO NOT EDIT. // // tools views // @@ -8,7 +8,7 @@ package views import ( - goa "goa.design/goa" + goa "goa.design/goa/v3/pkg" ) // ToolCollection is the viewed result type that is projected based on a view. @@ -47,25 +47,24 @@ type OperationView struct { } var ( - // ToolCollectionMap is a map of attribute names in result type ToolCollection - // indexed by view name. + // ToolCollectionMap is a map indexing the attribute names of ToolCollection by + // view name. ToolCollectionMap = map[string][]string{ - "default": []string{ + "default": { "name", "version", "packager", }, } - // OperationMap is a map of attribute names in result type Operation indexed by - // view name. + // OperationMap is a map indexing the attribute names of Operation by view name. OperationMap = map[string][]string{ - "default": []string{ + "default": { "status", }, } - // ToolMap is a map of attribute names in result type Tool indexed by view name. + // ToolMap is a map indexing the attribute names of Tool by view name. ToolMap = map[string][]string{ - "default": []string{ + "default": { "name", "version", "packager", @@ -80,7 +79,7 @@ func ValidateToolCollection(result ToolCollection) (err error) { case "default", "": err = ValidateToolCollectionView(result.Projected) default: - err = goa.InvalidEnumValueError("view", result.View, []interface{}{"default"}) + err = goa.InvalidEnumValueError("view", result.View, []any{"default"}) } return } @@ -92,7 +91,7 @@ func ValidateOperation(result *Operation) (err error) { case "default", "": err = ValidateOperationView(result.Projected) default: - err = goa.InvalidEnumValueError("view", result.View, []interface{}{"default"}) + err = goa.InvalidEnumValueError("view", result.View, []any{"default"}) } return } diff --git a/globals/globals.go b/globals/globals.go new file mode 100644 index 000000000..ac4c14666 --- /dev/null +++ b/globals/globals.go @@ -0,0 +1,29 @@ +// Copyright 2022 Arduino SA +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published +// by the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +package globals + +var ( + // ArduinoSignaturePubKey is the public key used to verify commands and url sent by the builder + ArduinoSignaturePubKey = `-----BEGIN PUBLIC KEY----- +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvc0yZr1yUSen7qmE3cxF +IE12rCksDnqR+Hp7o0nGi9123eCSFcJ7CkIRC8F+8JMhgI3zNqn4cUEn47I3RKD1 +ZChPUCMiJCvbLbloxfdJrUi7gcSgUXrlKQStOKF5Iz7xv1M4XOP3JtjXLGo3EnJ1 +pFgdWTOyoSrA8/w1rck4c/ISXZSinVAggPxmLwVEAAln6Itj6giIZHKvA2fL2o8z +CeK057Lu8X6u2CG8tRWSQzVoKIQw/PKK6CNXCAy8vo4EkXudRutnEYHEJlPkVgPn +2qP06GI+I+9zKE37iqj0k1/wFaCVXHXIvn06YrmjQw6I0dDj/60Wvi500FuRVpn9 +twIDAQAB +-----END PUBLIC KEY-----` +) diff --git a/go.mod b/go.mod index 9199eb3ee..3bffc09ed 100644 --- a/go.mod +++ b/go.mod @@ -1,51 +1,85 @@ module github.com/arduino/arduino-create-agent -go 1.14 +go 1.23.0 require ( - github.com/andela/gin-cors v0.0.0-20160928171741-e8c3436a37e2 - github.com/arduino/arduino-cli v0.0.0-20210422154105-5aa424818026 + fyne.io/systray v1.10.0 + github.com/ProtonMail/go-crypto v1.1.0-alpha.5-proton + github.com/arduino/go-paths-helper v1.12.1 + github.com/arduino/go-serial-utils v0.1.2 + github.com/arduino/pluggable-discovery-protocol-handler/v2 v2.2.1 github.com/blang/semver v3.5.1+incompatible - github.com/codeclysm/extract/v3 v3.0.2 - github.com/davidmz/go-pageant v1.0.1 // indirect - github.com/dimfeld/httppath v0.0.0-20170720192232-ee938bf73598 // indirect - github.com/dimfeld/httptreemux v5.0.1+incompatible // indirect - github.com/getlantern/systray v1.1.0 - github.com/gin-gonic/gin v1.6.3 + github.com/codeclysm/extract/v4 v4.0.0 + github.com/gin-contrib/cors v1.7.2 + github.com/gin-gonic/gin v1.10.0 github.com/go-ini/ini v1.62.0 - github.com/go-playground/validator/v10 v10.4.1 // indirect - github.com/golang/protobuf v1.4.3 // indirect - github.com/google/gxui v0.0.0-20151028112939-f85e0a97b3a4 // indirect - github.com/googollee/go-engine.io v0.0.0-20180829091931-e2f255711dcb // indirect github.com/googollee/go-socket.io v0.0.0-20181101151912-c8aeb1ed9b49 - github.com/h2non/filetype v1.1.0 // indirect - github.com/json-iterator/go v1.1.10 // indirect - github.com/juju/errors v0.0.0-20200330140219-3fe23663418f // indirect - github.com/kardianos/osext v0.0.0-20170510131534-ae77be60afb1 - github.com/kr/binarydist v0.1.0 - github.com/manveru/faker v0.0.0-20171103152722-9fbc68a78c4d // indirect - github.com/manveru/gobdd v0.0.0-20131210092515-f1a17fdd710b // indirect - github.com/mattn/go-shellwords v1.0.11 - github.com/miekg/dns v1.1.35 // indirect + github.com/mattn/go-shellwords v1.0.12 github.com/mitchellh/go-homedir v1.1.0 - github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect - github.com/modern-go/reflect2 v1.0.1 // indirect - github.com/oleksandr/bonjour v0.0.0-20160508152359-5dcf00d8b228 github.com/pkg/errors v0.9.1 - github.com/pkg/sftp v1.12.0 // indirect - github.com/sfreiberg/simplessh v0.0.0-20180301191542-495cbb862a9c - github.com/sirupsen/logrus v1.8.0 - github.com/skratchdot/open-golang v0.0.0-20160302144031-75fb7ed4208c - github.com/stretchr/testify v1.7.0 - github.com/ugorji/go v1.2.3 // indirect + github.com/sirupsen/logrus v1.9.3 + github.com/skratchdot/open-golang v0.0.0-20200116055534-eef842397966 + github.com/stretchr/testify v1.9.0 github.com/xrash/smetrics v0.0.0-20170218160415-a3153f7040e9 - github.com/zach-klippenstein/goregen v0.0.0-20160303162051-795b5e3961ea // indirect - go.bug.st/downloader v0.0.0-20181116113543-9b8976a44d87 - go.bug.st/serial v1.1.3 - goa.design/goa v1.0.1-0.20190116060309-40843d63b0e4 - golang.org/x/crypto v0.0.0-20201124201722-c8d3bf9c5392 - golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c + go.bug.st/serial v1.6.4 + goa.design/goa/v3 v3.16.1 + golang.org/x/sys v0.23.0 gopkg.in/inconshreveable/go-update.v0 v0.0.0-20150814200126-d8b0b1d421aa - gopkg.in/ini.v1 v1.62.0 // indirect - gopkg.in/yaml.v2 v2.4.0 // indirect +) + +require ( + github.com/AnatolyRugalev/goregen v0.1.0 // indirect + github.com/arduino/go-properties-orderedmap v1.8.0 // indirect + github.com/bytedance/sonic v1.11.6 // indirect + github.com/bytedance/sonic/loader v0.1.1 // indirect + github.com/cloudflare/circl v1.3.7 // indirect + github.com/cloudwego/base64x v0.1.4 // indirect + github.com/cloudwego/iasm v0.2.0 // indirect + github.com/creack/goselect v0.1.2 // indirect + github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect + github.com/dimfeld/httppath v0.0.0-20170720192232-ee938bf73598 // indirect + github.com/gabriel-vasile/mimetype v1.4.3 // indirect + github.com/gin-contrib/sse v0.1.0 // indirect + github.com/go-chi/chi/v5 v5.0.12 // indirect + github.com/go-playground/locales v0.14.1 // indirect + github.com/go-playground/universal-translator v0.18.1 // indirect + github.com/go-playground/validator/v10 v10.20.0 // indirect + github.com/goccy/go-json v0.10.2 // indirect + github.com/godbus/dbus/v5 v5.0.4 // indirect + github.com/google/go-cmp v0.5.9 // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/googollee/go-engine.io v0.0.0-20180829091931-e2f255711dcb // indirect + github.com/gorilla/websocket v1.5.1 // indirect + github.com/h2non/filetype v1.1.3 // indirect + github.com/json-iterator/go v1.1.12 // indirect + github.com/juju/errors v1.0.0 // indirect + github.com/kardianos/osext v0.0.0-20190222173326-2bc1f35cddc0 // indirect + github.com/klauspost/compress v1.17.0 // indirect + github.com/klauspost/cpuid/v2 v2.2.7 // indirect + github.com/kr/binarydist v0.1.0 // indirect + github.com/kr/pretty v0.3.1 // indirect + github.com/leodido/go-urn v1.4.0 // indirect + github.com/manveru/faker v0.0.0-20171103152722-9fbc68a78c4d // indirect + github.com/mattn/go-isatty v0.0.20 // indirect + github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect + github.com/modern-go/reflect2 v1.0.2 // indirect + github.com/pelletier/go-toml/v2 v2.2.2 // indirect + github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect + github.com/rogpeppe/go-internal v1.12.0 // indirect + github.com/sergi/go-diff v1.3.1 // indirect + github.com/smartystreets/goconvey v1.6.4 // indirect + github.com/tevino/abool v1.2.0 // indirect + github.com/twitchyliquid64/golang-asm v0.15.1 // indirect + github.com/ugorji/go v1.1.6 // indirect + github.com/ulikunitz/xz v0.5.12 // indirect + golang.org/x/arch v0.8.0 // indirect + golang.org/x/crypto v0.23.0 // indirect + golang.org/x/mod v0.17.0 // indirect + golang.org/x/net v0.25.0 // indirect + golang.org/x/sync v0.7.0 // indirect + golang.org/x/text v0.15.0 // indirect + golang.org/x/tools v0.20.0 // indirect + google.golang.org/protobuf v1.34.1 // indirect + gopkg.in/ini.v1 v1.67.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/go.sum b/go.sum index 8a434abea..676649d56 100644 --- a/go.sum +++ b/go.sum @@ -1,532 +1,208 @@ -cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/GeertJohan/go.incremental v1.0.0/go.mod h1:6fAjUhbVuX1KcMD3c8TEgVUqmo4seqhv0i0kdATSkM0= -github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= -github.com/akavel/rsrc v0.8.0/go.mod h1:uLoCtb9J+EyAqh+26kdrTgmzRBFPGOolLWKpdxkKq+c= -github.com/alcortesm/tgz v0.0.0-20161220082320-9c5fe88206d7/go.mod h1:6zEj6s6u/ghQa61ZWa/C2Aw3RkjiTBOix7dkqa1VLIs= -github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/andela/gin-cors v0.0.0-20160928171741-e8c3436a37e2 h1:CEix/eilscZqWgZKpY1VU0VTxOv+jV6NVgJEZ/hMBVs= -github.com/andela/gin-cors v0.0.0-20160928171741-e8c3436a37e2/go.mod h1:qLg54VlozD6sRu86y3SzM1iybe6G2eaoZGKuGdxSsdc= -github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c= -github.com/arduino/arduino-cli v0.0.0-20210413144851-088d4276190d h1:M/AWWjUQiY7SMoV2Ha0Sq+BzkIuBmusNe+l/XcRZsJA= -github.com/arduino/arduino-cli v0.0.0-20210413144851-088d4276190d/go.mod h1:5dWroFPvaWuBNVuYMV0X8osqIhyUG5otRgJlRHN831E= -github.com/arduino/arduino-cli v0.0.0-20210419093035-6ca680d235a3 h1:QTdhyXMl5coZIKxCh0yX0H5vj5XJ9zI2hLiFDHyTWbU= -github.com/arduino/arduino-cli v0.0.0-20210419093035-6ca680d235a3/go.mod h1:5dWroFPvaWuBNVuYMV0X8osqIhyUG5otRgJlRHN831E= -github.com/arduino/arduino-cli v0.0.0-20210422154105-5aa424818026 h1:YzxiXS2tBkotw65inAy9hYkXEHcCmszj9mRNQXNEEnU= -github.com/arduino/arduino-cli v0.0.0-20210422154105-5aa424818026/go.mod h1:5dWroFPvaWuBNVuYMV0X8osqIhyUG5otRgJlRHN831E= -github.com/arduino/board-discovery v0.0.0-20180823133458-1ba29327fb0c h1:agh2JT96G8egU7FEb13L4dq3fnCN7lxXhJ86t69+W7s= -github.com/arduino/board-discovery v0.0.0-20180823133458-1ba29327fb0c/go.mod h1:HK7SpkEax/3P+0w78iRQx1sz1vCDYYw9RXwHjQTB5i8= +fyne.io/systray v1.10.0 h1:Yr1D9Lxeiw3+vSuZWPlaHC8BMjIHZXJKkek706AfYQk= +fyne.io/systray v1.10.0/go.mod h1:oM2AQqGJ1AMo4nNqZFYU8xYygSBZkW2hmdJ7n4yjedE= +github.com/AnatolyRugalev/goregen v0.1.0 h1:xrdXkLaskMnbxW0x4FWNj2yoednv0X2bcTBWpuJGYfE= +github.com/AnatolyRugalev/goregen v0.1.0/go.mod h1:sVlY1tjcirqLBRZnCcIq1+7/Lwmqz5g7IK8AStjOVzI= +github.com/ProtonMail/go-crypto v1.1.0-alpha.5-proton h1:KVBEgU3CJpmzLChnLiSuEyCuhGhcMt3eOST+7A+ckto= +github.com/ProtonMail/go-crypto v1.1.0-alpha.5-proton/go.mod h1:rA3QumHc/FZ8pAHreoekgiAbzpNsfQAosU5td4SnOrE= github.com/arduino/go-paths-helper v1.0.1/go.mod h1:HpxtKph+g238EJHq4geEPv9p+gl3v5YYu35Yb+w31Ck= -github.com/arduino/go-paths-helper v1.2.0 h1:qDW93PR5IZUN/jzO4rCtexiwF8P4OIcOmcSgAYLZfY4= -github.com/arduino/go-paths-helper v1.2.0/go.mod h1:HpxtKph+g238EJHq4geEPv9p+gl3v5YYu35Yb+w31Ck= -github.com/arduino/go-paths-helper v1.4.0 h1:ilnseAdxmN1bFnLxxXHRtcdmt9jBf3O4jtYfWfqule4= -github.com/arduino/go-paths-helper v1.4.0/go.mod h1:V82BWgAAp4IbmlybxQdk9Bpkz8M4Qyx+RAFKaG9NuvU= -github.com/arduino/go-properties-orderedmap v1.3.0 h1:4No/vQopB36e7WUIk6H6TxiSEJPiMrVOCZylYmua39o= -github.com/arduino/go-properties-orderedmap v1.3.0/go.mod h1:DKjD2VXY/NZmlingh4lSFMEYCVubfeArCsGPGDwb2yk= -github.com/arduino/go-timeutils v0.0.0-20171220113728-d1dd9e313b1b h1:9hDi4F2st6dbLC3y4i02zFT5quS4X6iioWifGlVwfy4= -github.com/arduino/go-timeutils v0.0.0-20171220113728-d1dd9e313b1b/go.mod h1:uwGy5PpN4lqW97FiLnbcx+xx8jly5YuPMJWfVwwjJiQ= -github.com/arduino/go-win32-utils v0.0.0-20180330194947-ed041402e83b h1:3PjgYG5gVPA7cipp7vIR2lF96KkEJIFBJ+ANnuv6J20= -github.com/arduino/go-win32-utils v0.0.0-20180330194947-ed041402e83b/go.mod h1:iIPnclBMYm1g32Q5kXoqng4jLhMStReIP7ZxaoUC2y8= -github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= -github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= -github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= -github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= +github.com/arduino/go-paths-helper v1.12.1 h1:WkxiVUxBjKWlLMiMuYy8DcmVrkxdP7aKxQOAq7r2lVM= +github.com/arduino/go-paths-helper v1.12.1/go.mod h1:jcpW4wr0u69GlXhTYydsdsqAjLaYK5n7oWHfKqOG6LM= +github.com/arduino/go-properties-orderedmap v1.8.0 h1:wEfa6hHdpezrVOh787OmClsf/Kd8qB+zE3P2Xbrn0CQ= +github.com/arduino/go-properties-orderedmap v1.8.0/go.mod h1:DKjD2VXY/NZmlingh4lSFMEYCVubfeArCsGPGDwb2yk= +github.com/arduino/go-serial-utils v0.1.2 h1:MRFwME4w/uaVkJ1R+wzz4KSbI9cF9IDVrYorazvjpTk= +github.com/arduino/go-serial-utils v0.1.2/go.mod h1:kzIsNPgz8DFAd1sAFKve4ubxrdGcwQ4XzvRLlztsgnE= +github.com/arduino/pluggable-discovery-protocol-handler/v2 v2.2.1 h1:Fw8zKj1b/FkcQrWgN7aBw3ubSxpKIUtdANLXvd1Qdzw= +github.com/arduino/pluggable-discovery-protocol-handler/v2 v2.2.1/go.mod h1:1dgblsmK2iBx3L5iNTyRIokeaxbTLUrYiUbHBK6yC3Y= github.com/blang/semver v3.5.1+incompatible h1:cQNTCjp13qL8KC3Nbxr/y2Bqb63oX6wdnnjpJbkM4JQ= github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= -github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= -github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cmaglie/go.rice v1.0.3 h1:ZBLmBdQp6ejc+n8eMNH0uuRSKkg6kKe6ORjXKnyHBYw= -github.com/cmaglie/go.rice v1.0.3/go.mod h1:AF3bOWkvdOpp8/S3UL8qbQ4N7DiISIbJtj54GWFPAsc= -github.com/cmaglie/pb v1.0.27 h1:ynGj8vBXR+dtj4B7Q/W/qGt31771Ux5iFfRQBnwdQiA= -github.com/cmaglie/pb v1.0.27/go.mod h1:GilkKZMXYjBA4NxItWFfO+lwkp59PLHQ+IOW/b/kmZI= -github.com/codeclysm/cc v1.2.2 h1:1ChS4EvWTjw6bH2sd6QiMcmih0itVVrWdh9MmOliX/I= -github.com/codeclysm/cc v1.2.2/go.mod h1:XtW4ArCNgQwFphcRGG9+sPX5WM1J6/u0gMy5ZdV3obA= -github.com/codeclysm/extract/v3 v3.0.2 h1:sB4LcE3Php7LkhZwN0n2p8GCwZe92PEQutdbGURf5xc= -github.com/codeclysm/extract/v3 v3.0.2/go.mod h1:NKsw+hqua9H+Rlwy/w/3Qgt9jDonYEgB6wJu+25eOKw= -github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= -github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= -github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= -github.com/cpuguy83/go-md2man/v2 v2.0.0 h1:EoUDS0afbrsXAZ9YQ9jdu/mZ2sXgT1/2yyNng4PGlyM= -github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= -github.com/creack/goselect v0.1.1/go.mod h1:a/NhLweNvqIYMuxcMOuWY516Cimucms3DglDzQP3hKY= +github.com/bytedance/sonic v1.11.6 h1:oUp34TzMlL+OY1OUWxHqsdkgC/Zfc85zGqw9siXjrc0= +github.com/bytedance/sonic v1.11.6/go.mod h1:LysEHSvpvDySVdC2f87zGWf6CIKJcAvqab1ZaiQtds4= +github.com/bytedance/sonic/loader v0.1.1 h1:c+e5Pt1k/cy5wMveRDyk2X4B9hF4g7an8N3zCYjJFNM= +github.com/bytedance/sonic/loader v0.1.1/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU= +github.com/cloudflare/circl v1.3.7 h1:qlCDlTPz2n9fu58M0Nh1J/JzcFpfgkFHHX3O35r5vcU= +github.com/cloudflare/circl v1.3.7/go.mod h1:sRTcRWXGLrKw6yIGJ+l7amYJFfAXbZG0kBSc8r4zxgA= +github.com/cloudwego/base64x v0.1.4 h1:jwCgWpFanWmN8xoIUHa2rtzmkd5J2plF/dnLS6Xd/0Y= +github.com/cloudwego/base64x v0.1.4/go.mod h1:0zlkT4Wn5C6NdauXdJRhSKRlJvmclQ1hhJgA0rcu/8w= +github.com/cloudwego/iasm v0.2.0 h1:1KNIy1I1H9hNNFEEH3DVnI4UujN+1zjpuk6gwHLTssg= +github.com/cloudwego/iasm v0.2.0/go.mod h1:8rXZaNYT2n95jn+zTI1sDr+IgcD2GVs0nlbbQPiEFhY= +github.com/codeclysm/extract/v4 v4.0.0 h1:H87LFsUNaJTu2e/8p/oiuiUsOK/TaPQ5wxsjPnwPEIY= +github.com/codeclysm/extract/v4 v4.0.0/go.mod h1:SFju1lj6as7FvUgalpSct7torJE0zttbJUWtryPRG6s= github.com/creack/goselect v0.1.2 h1:2DNy14+JPjRBgPzAd1thbQp4BSIihxcBf0IXhQXDRa0= github.com/creack/goselect v0.1.2/go.mod h1:a/NhLweNvqIYMuxcMOuWY516Cimucms3DglDzQP3hKY= -github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= -github.com/daaku/go.zipexe v1.0.0 h1:VSOgZtH418pH9L16hC/JrgSNJbbAL26pj7lmD1+CGdY= -github.com/daaku/go.zipexe v1.0.0/go.mod h1:z8IiR6TsVLEYKwXAoE/I+8ys/sDkgTzSL0CLnGVd57E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davidmz/go-pageant v1.0.1 h1:kzCt64aTc557QYvy5VBSN1pVWO/tNAcqzwlpUsZ8IEE= -github.com/davidmz/go-pageant v1.0.1/go.mod h1:WWOKE/93DhgsPq15jaipH4fVY+MLKKWH4Yku5Ei92rE= -github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= -github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/dimfeld/httppath v0.0.0-20170720192232-ee938bf73598 h1:MGKhKyiYrvMDZsmLR/+RGffQSXwEkXgfLSA08qDn9AI= github.com/dimfeld/httppath v0.0.0-20170720192232-ee938bf73598/go.mod h1:0FpDmbrt36utu8jEmeU05dPC9AB5tsLYVVi+ZHfyuwI= -github.com/dimfeld/httptreemux v5.0.1+incompatible h1:Qj3gVcDNoOthBAqftuD596rm4wg/adLLz5xh5CmpiCA= -github.com/dimfeld/httptreemux v5.0.1+incompatible/go.mod h1:rbUlSV+CCpv/SuqUTP/8Bk2O3LyUV436/yaRGkhP6Z0= -github.com/emirpasic/gods v1.12.0 h1:QAUIPSaCu4G+POclxeqb3F+WPpdKqFGlw36+yOzGlrg= -github.com/emirpasic/gods v1.12.0/go.mod h1:YfzfFFoVP/catgzJb4IKIqXjX78Ha8FMSDh3ymbK86o= -github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/fatih/color v1.7.0 h1:DkWD4oS2D8LGGgTQ6IvwJJXSL5Vp2ffcQg58nFV38Ys= -github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= -github.com/fluxio/iohelpers v0.0.0-20160419043813-3a4dd67a94d2 h1:C6sOwknxwWfLBEQ91zhmptlfxf7pVEs5s6wOnDxNpS4= -github.com/fluxio/iohelpers v0.0.0-20160419043813-3a4dd67a94d2/go.mod h1:c7sGIpDbBo0JZZ1tKyC1p5smWf8QcUjK4bFtZjHAecg= -github.com/fluxio/multierror v0.0.0-20160419044231-9c68d39025e5 h1:R8jFW6G/bjoXjWPFrEfw9G5YQDlYhwV4AC+Eonu6wmk= -github.com/fluxio/multierror v0.0.0-20160419044231-9c68d39025e5/go.mod h1:BEUDl7FG1cc76sM0J0x8dqr6RhiL4uqvk6oFkwuNyuM= -github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc= -github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I= -github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/getlantern/context v0.0.0-20190109183933-c447772a6520 h1:NRUJuo3v3WGC/g5YiyF790gut6oQr5f3FBI88Wv0dx4= -github.com/getlantern/context v0.0.0-20190109183933-c447772a6520/go.mod h1:L+mq6/vvYHKjCX2oez0CgEAJmbq1fbb/oNJIWQkBybY= -github.com/getlantern/errors v0.0.0-20190325191628-abdb3e3e36f7 h1:6uJ+sZ/e03gkbqZ0kUG6mfKoqDb4XMAzMIwlajq19So= -github.com/getlantern/errors v0.0.0-20190325191628-abdb3e3e36f7/go.mod h1:l+xpFBrCtDLpK9qNjxs+cHU6+BAdlBaxHqikB6Lku3A= -github.com/getlantern/golog v0.0.0-20190830074920-4ef2e798c2d7 h1:guBYzEaLz0Vfc/jv0czrr2z7qyzTOGC9hiQ0VC+hKjk= -github.com/getlantern/golog v0.0.0-20190830074920-4ef2e798c2d7/go.mod h1:zx/1xUUeYPy3Pcmet8OSXLbF47l+3y6hIPpyLWoR9oc= -github.com/getlantern/hex v0.0.0-20190417191902-c6586a6fe0b7 h1:micT5vkcr9tOVk1FiH8SWKID8ultN44Z+yzd2y/Vyb0= -github.com/getlantern/hex v0.0.0-20190417191902-c6586a6fe0b7/go.mod h1:dD3CgOrwlzca8ed61CsZouQS5h5jIzkK9ZWrTcf0s+o= -github.com/getlantern/hidden v0.0.0-20190325191715-f02dbb02be55 h1:XYzSdCbkzOC0FDNrgJqGRo8PCMFOBFL9py72DRs7bmc= -github.com/getlantern/hidden v0.0.0-20190325191715-f02dbb02be55/go.mod h1:6mmzY2kW1TOOrVy+r41Za2MxXM+hhqTtY3oBKd2AgFA= -github.com/getlantern/ops v0.0.0-20190325191751-d70cb0d6f85f h1:wrYrQttPS8FHIRSlsrcuKazukx/xqO/PpLZzZXsF+EA= -github.com/getlantern/ops v0.0.0-20190325191751-d70cb0d6f85f/go.mod h1:D5ao98qkA6pxftxoqzibIBBrLSUli+kYnJqrgBf9cIA= -github.com/getlantern/systray v1.1.0 h1:U0wCEqseLi2ok1fE6b88gJklzriavPJixZysZPkZd/Y= -github.com/getlantern/systray v1.1.0/go.mod h1:AecygODWIsBquJCJFop8MEQcJbWFfw/1yWbVabNgpCM= -github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/gabriel-vasile/mimetype v1.4.3 h1:in2uUcidCuFcDKtdcBxlR0rJ1+fsokWf+uqxgUFjbI0= +github.com/gabriel-vasile/mimetype v1.4.3/go.mod h1:d8uq/6HKRL6CGdk+aubisF/M5GcPfT7nKyLpA0lbSSk= +github.com/gin-contrib/cors v1.7.2 h1:oLDHxdg8W/XDoN/8zamqk/Drgt4oVZDvaV0YmvVICQw= +github.com/gin-contrib/cors v1.7.2/go.mod h1:SUJVARKgQ40dmrzgXEVxj2m7Ig1v1qIboQkPDTQ9t2E= github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= -github.com/gin-gonic/gin v1.6.3 h1:ahKqKTFpO5KTPHxWZjEdPScmYaGtLo8Y4DMHoEsnp14= -github.com/gin-gonic/gin v1.6.3/go.mod h1:75u5sXoLsGZoRN5Sgbi1eraJ4GU3++wFwWzhwvtwp4M= -github.com/gliderlabs/ssh v0.2.2/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0= +github.com/gin-gonic/gin v1.10.0 h1:nTuyha1TYqgedzytsKYqna+DfLos46nTv2ygFy86HFU= +github.com/gin-gonic/gin v1.10.0/go.mod h1:4PMNQiOhvDRa013RKVbsiNwoyezlm2rm0uX/T7kzp5Y= +github.com/go-chi/chi/v5 v5.0.12 h1:9euLV5sTrTNTRUU9POmDUvfxyj6LAABLUcEWO+JJb4s= +github.com/go-chi/chi/v5 v5.0.12/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/go-ini/ini v1.62.0 h1:7VJT/ZXjzqSrvtraFp4ONq80hTcRQth1c9ZnQ3uNQvU= github.com/go-ini/ini v1.62.0/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8= -github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= -github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= -github.com/go-playground/assert/v2 v2.0.1 h1:MsBgLAaY856+nPRTKrp3/OZK38U/wa0CcBYNjji3q3A= -github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= -github.com/go-playground/locales v0.13.0 h1:HyWk6mgj5qFqCT5fjGBuRArbVDfE4hi8+e8ceBS/t7Q= -github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= -github.com/go-playground/universal-translator v0.17.0 h1:icxd5fm+REJzpZx7ZfpaD876Lmtgy7VtROAbHHXk8no= -github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= -github.com/go-playground/validator/v10 v10.2.0 h1:KgJ0snyC2R9VXYN2rneOtQcw5aHQB1Vv0sFl1UcHBOY= -github.com/go-playground/validator/v10 v10.2.0/go.mod h1:uOYAAleCW8F/7oMFd6aG0GOhaH6EGOAJShg8Id5JGkI= -github.com/go-playground/validator/v10 v10.4.1 h1:pH2c5ADXtd66mxoE0Zm9SUhxE20r7aM3F26W0hOn+GE= -github.com/go-playground/validator/v10 v10.4.1/go.mod h1:nlOn6nFhuKACm19sB/8EGNn9GlaMV7XkbRSipzJ0Ii4= -github.com/go-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk= -github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/gofrs/uuid v3.2.0+incompatible h1:y12jRkkFxsd7GpqdSZ+/KCs/fJbqpEXSGd4+jfEaewE= -github.com/gofrs/uuid v3.2.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= -github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= -github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.3 h1:gyjaxf+svBWX08ZjK86iN9geUJF0H6gp2IRKX6Nf6/I= -github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= -github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= -github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= -github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= -github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= -github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= -github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.4.3 h1:JjCZWpVbqXDqFVmTfYWEVTMIYrL/NPdPSCHPJ0T/raM= -github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= -github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.0 h1:/QaMHBdZ26BB3SSst0Iwl10Epc+xhTquomWX0oZEB6w= -github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s= +github.com/go-playground/assert/v2 v2.2.0/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= +github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA= +github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY= +github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY= +github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY= +github.com/go-playground/validator/v10 v10.20.0 h1:K9ISHbSaI0lyB2eWMPJo+kOS/FBExVwjEviJTixqxL8= +github.com/go-playground/validator/v10 v10.20.0/go.mod h1:dbuPbCMFw/DrkbEynArYaCwl3amGuJotoKCe95atGMM= +github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU= +github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= +github.com/godbus/dbus/v5 v5.0.4 h1:9349emZab16e7zQvpmsbtjc18ykshndd8y2PG3sgJbA= +github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= +github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= +github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/gxui v0.0.0-20151028112939-f85e0a97b3a4 h1:OL2d27ueTKnlQJoqLW2fc9pWYulFnJYLWzomGV7HqZo= -github.com/google/gxui v0.0.0-20151028112939-f85e0a97b3a4/go.mod h1:Pw1H1OjSNHiqeuxAduB1BKYXIwFtsyrY47nEqSgEiCM= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googollee/go-engine.io v0.0.0-20180829091931-e2f255711dcb h1:n22Aukg/TjoypWc37dbKIpCsz0VMFPD36HQk1WKvg3A= github.com/googollee/go-engine.io v0.0.0-20180829091931-e2f255711dcb/go.mod h1:MBpz1MS3P4HtRcBpQU4HcjvWXZ9q+JWacMEh2/BFYbg= github.com/googollee/go-socket.io v0.0.0-20181101151912-c8aeb1ed9b49 h1:vKXGRzlhWE9TUVhLqAOcgQbfYvReAnsvQQIcnvWMfcg= github.com/googollee/go-socket.io v0.0.0-20181101151912-c8aeb1ed9b49/go.mod h1:ftBGBMhSYToR5oV4ImIPKvAIsNaTkLC+tTvoNafqxlQ= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= -github.com/gorilla/websocket v1.4.0 h1:WDFjx/TMzVgy9VdMMQi2K2Emtwi2QcUQsztZ/zLaH/Q= -github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= -github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= -github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= -github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= -github.com/h2non/filetype v1.0.6 h1:g84/+gdkAT1hnYO+tHpCLoikm13Ju55OkN4KCb1uGEQ= -github.com/h2non/filetype v1.0.6/go.mod h1:isekKqOuhMj+s/7r3rIeTErIRy4Rub5uBWHfvMusLMU= -github.com/h2non/filetype v1.0.8/go.mod h1:isekKqOuhMj+s/7r3rIeTErIRy4Rub5uBWHfvMusLMU= -github.com/h2non/filetype v1.1.0 h1:Or/gjocJrJRNK/Cri/TDEKFjAR+cfG6eK65NGYB6gBA= -github.com/h2non/filetype v1.1.0/go.mod h1:319b3zT68BvV+WRj7cwy856M2ehB3HqNOt6sy1HndBY= -github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= -github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= -github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= -github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= -github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOlocH6Fxy8MmwDt+yVQYULKfN0RoTN8A= -github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo= -github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= -github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= -github.com/json-iterator/go v1.1.9 h1:9yzud/Ht36ygwatGx56VwCZtlI/2AD15T1X2sjSuGns= -github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.10 h1:Kz6Cvnvv2wGdaG/V8yMvfkmNiXq9Ya2KUv4rouJJr68= -github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/gorilla/websocket v1.5.1 h1:gmztn0JnHVt9JZquRuzLw3g4wouNVzKL15iLr/zn/QY= +github.com/gorilla/websocket v1.5.1/go.mod h1:x3kM2JMyaluk02fnUJpQuwD2dCS5NDG2ZHL0uE0tcaY= +github.com/h2non/filetype v1.1.3 h1:FKkx9QbD7HR/zjK1Ia5XiBsq9zdLi5Kf3zGyFTAFkGg= +github.com/h2non/filetype v1.1.3/go.mod h1:319b3zT68BvV+WRj7cwy856M2ehB3HqNOt6sy1HndBY= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo= github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= -github.com/juju/clock v0.0.0-20180524022203-d293bb356ca4/go.mod h1:nD0vlnrUjcjJhqN5WuCWZyzfd5AHZAC9/ajvbSx69xA= -github.com/juju/errors v0.0.0-20150916125642-1b5e39b83d18/go.mod h1:W54LbzXuIE0boCoNJfwqpmkKJ1O4TCTZMetAt6jGk7Q= -github.com/juju/errors v0.0.0-20181118221551-089d3ea4e4d5 h1:rhqTjzJlm7EbkELJDKMTU7udov+Se0xZkWmugr6zGok= -github.com/juju/errors v0.0.0-20181118221551-089d3ea4e4d5/go.mod h1:W54LbzXuIE0boCoNJfwqpmkKJ1O4TCTZMetAt6jGk7Q= -github.com/juju/errors v0.0.0-20200330140219-3fe23663418f h1:MCOvExGLpaSIzLYB4iQXEHP4jYVU6vmzLNQPdMVrxnM= -github.com/juju/errors v0.0.0-20200330140219-3fe23663418f/go.mod h1:W54LbzXuIE0boCoNJfwqpmkKJ1O4TCTZMetAt6jGk7Q= -github.com/juju/loggo v0.0.0-20170605014607-8232ab8918d9 h1:Y+lzErDTURqeXqlqYi4YBYbDd7ycU74gW1ADt57/bgY= -github.com/juju/loggo v0.0.0-20170605014607-8232ab8918d9/go.mod h1:vgyd7OREkbtVEN/8IXZe5Ooef3LQePvuBm9UWj6ZL8U= -github.com/juju/loggo v0.0.0-20190526231331-6e530bcce5d8 h1:UUHMLvzt/31azWTN/ifGWef4WUqvXk0iRqdhdy/2uzI= -github.com/juju/loggo v0.0.0-20190526231331-6e530bcce5d8/go.mod h1:vgyd7OREkbtVEN/8IXZe5Ooef3LQePvuBm9UWj6ZL8U= -github.com/juju/retry v0.0.0-20160928201858-1998d01ba1c3/go.mod h1:OohPQGsr4pnxwD5YljhQ+TZnuVRYpa5irjugL1Yuif4= -github.com/juju/testing v0.0.0-20200510222523-6c8c298c77a0 h1:+WWUkhnTjV6RNOxkcwk79qrjeyHEHvBzlneueBsatX4= -github.com/juju/testing v0.0.0-20200510222523-6c8c298c77a0/go.mod h1:hpGvhGHPVbNBraRLZEhoQwFLMrjK8PSlO4D3nDjKYXo= -github.com/juju/utils v0.0.0-20180808125547-9dfc6dbfb02b/go.mod h1:6/KLg8Wz/y2KVGWEpkK9vMNGkOnu4k/cqs8Z1fKjTOk= -github.com/juju/version v0.0.0-20161031051906-1f41e27e54f2/go.mod h1:kE8gK5X0CImdr7qpSKl3xB2PmpySSmfj7zVbkZFs81U= -github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= -github.com/kardianos/osext v0.0.0-20170510131534-ae77be60afb1 h1:PJPDf8OUfOK1bb/NeTKd4f1QXZItOX389VN3B6qC8ro= -github.com/kardianos/osext v0.0.0-20170510131534-ae77be60afb1/go.mod h1:1NbS8ALrpOvjt0rHPNLyCIeMtbizbir8U//inJ+zuB8= -github.com/kevinburke/ssh_config v0.0.0-20190725054713-01f96b0aa0cd h1:Coekwdh0v2wtGp9Gmz1Ze3eVRAWJMLokvN3QjdzCHLY= -github.com/kevinburke/ssh_config v0.0.0-20190725054713-01f96b0aa0cd/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM= -github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= -github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/juju/errors v1.0.0 h1:yiq7kjCLll1BiaRuNY53MGI0+EQ3rF6GB+wvboZDefM= +github.com/juju/errors v1.0.0/go.mod h1:B5x9thDqx0wIMH3+aLIMP9HjItInYWObRovoCFM5Qe8= +github.com/kardianos/osext v0.0.0-20190222173326-2bc1f35cddc0 h1:iQTw/8FWTuc7uiaSepXwyf3o52HaUYcV+Tu66S3F5GA= +github.com/kardianos/osext v0.0.0-20190222173326-2bc1f35cddc0/go.mod h1:1NbS8ALrpOvjt0rHPNLyCIeMtbizbir8U//inJ+zuB8= +github.com/klauspost/compress v1.17.0 h1:Rnbp4K9EjcDuVuHtd0dgA4qNuv9yKDYKK1ulpJwgrqM= +github.com/klauspost/compress v1.17.0/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= +github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= +github.com/klauspost/cpuid/v2 v2.2.7 h1:ZWSB3igEs+d0qvnxR/ZBzXVmxkgt8DdzP6m9pfuVLDM= +github.com/klauspost/cpuid/v2 v2.2.7/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= +github.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M= github.com/kr/binarydist v0.1.0 h1:6kAoLA9FMMnNGSehX0s1PdjbEaACznAv/W219j2uvyo= github.com/kr/binarydist v0.1.0/go.mod h1:DY7S//GCoz1BCd0B0EVrinCKAZN3pXe+MDaIZbXQVgM= -github.com/kr/fs v0.1.0 h1:Jskdu9ieNAYnjxsi0LbQp1ulIKZV1LAFgK1tWhpZgl8= -github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= -github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw= -github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/leodido/go-urn v1.2.0 h1:hpXL4XnriNwQ/ABnpepYM/1vCLWNDfUNts8dX3xTG6Y= -github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= -github.com/leonelquinteros/gotext v1.4.0 h1:2NHPCto5IoMXbrT0bldPrxj0qM5asOCwtb1aUQZ1tys= -github.com/leonelquinteros/gotext v1.4.0/go.mod h1:yZGXREmoGTtBvZHNcc+Yfug49G/2spuF/i/Qlsvz1Us= -github.com/magefile/mage v1.10.0 h1:3HiXzCUY12kh9bIuyXShaVe529fJfyqoVM42o/uom2g= -github.com/magefile/mage v1.10.0/go.mod h1:z5UZb/iS3GoOSn0JgWuiw7dxlurVYTu+/jHXqQg881A= -github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/magiconair/properties v1.8.1 h1:ZC2Vc7/ZFkGmsVC9KvOjumD+G5lXy2RtTKyzRKO2BQ4= -github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= +github.com/leodido/go-urn v1.4.0 h1:WT9HwE9SGECu3lg4d/dIA+jxlljEa1/ffXKmRjqdmIQ= +github.com/leodido/go-urn v1.4.0/go.mod h1:bvxc+MVxLKB4z00jd1z+Dvzr47oO32F/QSNjSBOlFxI= github.com/manveru/faker v0.0.0-20171103152722-9fbc68a78c4d h1:Zj+PHjnhRYWBK6RqCDBcAhLXoi3TzC27Zad/Vn+gnVQ= github.com/manveru/faker v0.0.0-20171103152722-9fbc68a78c4d/go.mod h1:WZy8Q5coAB1zhY9AOBJP0O6J4BuDfbupUDavKY+I3+s= github.com/manveru/gobdd v0.0.0-20131210092515-f1a17fdd710b h1:3E44bLeN8uKYdfQqVQycPnaVviZdBLbizFhU49mtbe4= github.com/manveru/gobdd v0.0.0-20131210092515-f1a17fdd710b/go.mod h1:Bj8LjjP0ReT1eKt5QlKjwgi5AFm5mI6O1A2G4ChI0Ag= -github.com/marcinbor85/gohex v0.0.0-20210308104911-55fb1c624d84 h1:hyAgCuG5nqTMDeUD8KZs7HSPs6KprPgPP8QmGV8nyvk= -github.com/marcinbor85/gohex v0.0.0-20210308104911-55fb1c624d84/go.mod h1:Pb6XcsXyropB9LNHhnqaknG/vEwYztLkQzVCHv8sQ3M= -github.com/mattn/go-colorable v0.1.2 h1:/bC9yWikZXAL9uJdulbSfyVNIR3n3trXl+v8+1sx8mU= -github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= -github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY= -github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -github.com/mattn/go-runewidth v0.0.9 h1:Lm995f3rfxdpd6TSmuVCHVb/QhupuXlYr8sCI/QdE+0= -github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= -github.com/mattn/go-shellwords v1.0.11 h1:vCoR9VPpsk/TZFW2JwK5I9S0xdrtUq2bph6/YjEPnaw= -github.com/mattn/go-shellwords v1.0.11/go.mod h1:EZzvwXDESEeg03EKmM+RmDnNOPKG4lLtQsUlTZDWQ8Y= -github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= -github.com/mdlayher/genetlink v0.0.0-20190313224034-60417448a851/go.mod h1:EsbsAEUEs15qC1cosAwxgCWV0Qhd8TmkxnA9Kw1Vhl4= -github.com/mdlayher/netlink v0.0.0-20190313131330-258ea9dff42c/go.mod h1:eQB3mZE4aiYnlUsyGGCOpPETfdQq4Jhsgf1fk3cwQaA= -github.com/mdlayher/taskstats v0.0.0-20190313225729-7cbba52ee072/go.mod h1:sGdS7A6CAETR53zkdjGkgoFlh1vSm7MtX+i8XfEsTMA= -github.com/miekg/dns v1.0.5/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= -github.com/miekg/dns v1.1.35 h1:oTfOaDH+mZkdcgdIjH6yBajRGtIwcwcaR+rt23ZSrJs= -github.com/miekg/dns v1.1.35/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM= +github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= +github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/mattn/go-shellwords v1.0.12 h1:M2zGm7EW6UQJvDeQxo4T51eKPurbeFbe8WtebGE2xrk= +github.com/mattn/go-shellwords v1.0.12/go.mod h1:EZzvwXDESEeg03EKmM+RmDnNOPKG4lLtQsUlTZDWQ8Y= github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/mapstructure v1.1.2 h1:fmNYVwqnSfB9mZU6OS2O6GsXM+wcskZDuKQzvN1EDeE= -github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 h1:ZqeYNhU3OHLH3mGKHDcjJRFFRrJa6eAM5H+CtDdOsPc= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742 h1:Esafd1046DLDQ0W1YjYsBW+p8U2u7vzgW2SQVmlNazg= -github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.1 h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9AWI= -github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs= -github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= -github.com/nkovacs/streamquote v1.0.0/go.mod h1:BN+NaZ2CmdKqUuTUXUEm9j95B2TRbpOWpxbJYzzgUsc= -github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= -github.com/oleksandr/bonjour v0.0.0-20160508152359-5dcf00d8b228 h1:Cvfd2dOlXIPTeEkOT/h8PyK4phBngOM4at9/jlgy7d4= -github.com/oleksandr/bonjour v0.0.0-20160508152359-5dcf00d8b228/go.mod h1:MGuVJ1+5TX1SCoO2Sx0eAnjpdRytYla2uC1YIZfkC9c= -github.com/oxtoacart/bpool v0.0.0-20190530202638-03653db5a59c h1:rp5dCmg/yLR3mgFuSOe4oEnDDmGLROTvMragMUXpTQw= -github.com/oxtoacart/bpool v0.0.0-20190530202638-03653db5a59c/go.mod h1:X07ZCGwUbLaax7L0S3Tw4hpejzu63ZrrQiUe6W0hcy0= -github.com/pelletier/go-buffruneio v0.2.0/go.mod h1:JkE26KsDizTr40EUHkXVtNPvgGtbSNq5BcowyYOWdKo= -github.com/pelletier/go-toml v1.2.0 h1:T5zMGML61Wp+FlcbWjRDT7yAxhJNAiPPLOFECq181zc= -github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= -github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/pelletier/go-toml/v2 v2.2.2 h1:aYUidT7k73Pcl9nb2gScu7NSrKCSHIDE89b3+6Wq+LM= +github.com/pelletier/go-toml/v2 v2.2.2/go.mod h1:1t835xjRzz80PqgE6HHgN2JOsmgYu/h4qDAS4n929Rs= +github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/sftp v1.12.0 h1:/f3b24xrDhkhddlaobPe2JgBqfdt+gC/NYl0QY9IOuI= -github.com/pkg/sftp v1.12.0/go.mod h1:fUqqXB5vEgVCZ131L+9say31RAri6aF6KDViawhxKK8= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/pmylund/sortutil v0.0.0-20120526081524-abeda66eb583 h1:ogHi8YLNeIxABOaH6UgtbwkODheuAK+ErP8gWXYQVj0= -github.com/pmylund/sortutil v0.0.0-20120526081524-abeda66eb583/go.mod h1:sFPiU/UgDcsQVu3vkqpZLCXWFwUoQRpHGu9ATihPAl0= -github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= -github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= -github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= -github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= -github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= -github.com/rifflock/lfshook v0.0.0-20180920164130-b9218ef580f5 h1:mZHayPoR0lNmnHyvtYjDeq0zlVHn9K/ZXoy17ylucdo= -github.com/rifflock/lfshook v0.0.0-20180920164130-b9218ef580f5/go.mod h1:GEXHk5HgEKCvEIIrSpFI3ozzG5xOKA2DVlEX/gGnewM= -github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= -github.com/russross/blackfriday/v2 v2.0.1 h1:lPqVAte+HuHNfhJ/0LC98ESWRz8afy9tM/0RK8m9o+Q= -github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/schollz/closestmatch v2.1.0+incompatible h1:Uel2GXEpJqOWBrlyI+oY9LTiyyjYS17cCYRqP13/SHk= -github.com/schollz/closestmatch v2.1.0+incompatible/go.mod h1:RtP1ddjLong6gTkbtmuhtR2uUrrJOpYzYRvbcPAid+g= -github.com/segmentio/fasthash v0.0.0-20180216231524-a72b379d632e h1:uO75wNGioszjmIzcY/tvdDYKRLVvzggtAmmJkn9j4GQ= -github.com/segmentio/fasthash v0.0.0-20180216231524-a72b379d632e/go.mod h1:tm/wZFQ8e24NYaBGIlnO2WGCAi67re4HHuOm0sftE/M= -github.com/segmentio/objconv v1.0.1/go.mod h1:auayaH5k3137Cl4SoXTgrzQcuQDmvuVtZgS0fb1Ahys= -github.com/segmentio/stats/v4 v4.5.3 h1:Y/DSUWZ4c8ICgqJ9rQohzKvGqGWbLPWad5zmxVoKN+Y= -github.com/segmentio/stats/v4 v4.5.3/go.mod h1:LsaahUJR7iiSs8mnkvQvdQ/RLHAS5adGLxuntg0ydGo= -github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= -github.com/sergi/go-diff v1.1.0 h1:we8PVUC3FE2uYfodKH/nBHMSetSfHDR6scGdBi+erh0= -github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= -github.com/sfreiberg/simplessh v0.0.0-20180301191542-495cbb862a9c h1:7Q+2oF0uBoLEV+j13E3/xUkPkI7f+sFNPZOPo2jmrWk= -github.com/sfreiberg/simplessh v0.0.0-20180301191542-495cbb862a9c/go.mod h1:sB7d6wQapoRM+qx5MgQYB6JVHtel4YHRr0NXXCkXiwQ= -github.com/shurcooL/sanitized_anchor_name v1.0.0 h1:PdmoCO6wvbs+7yrJyMORt4/BmY5IYyJwS/kOiWx8mHo= -github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= -github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= -github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= -github.com/sirupsen/logrus v1.8.0 h1:nfhvjKcUMhBMVqbKHJlk5RPrrfYr/NMo3692g0dwfWU= -github.com/sirupsen/logrus v1.8.0/go.mod h1:4GuYW9TZmE769R5STWrRakJc4UqQ3+QQ95fyz7ENv1A= -github.com/skratchdot/open-golang v0.0.0-20160302144031-75fb7ed4208c h1:fyKiXKO1/I/B6Y2U8T7WdQGWzwehOuGIrljPtt7YTTI= -github.com/skratchdot/open-golang v0.0.0-20160302144031-75fb7ed4208c/go.mod h1:sUM3LWHvSMaG192sy56D9F7CNvL7jUJVXoqM1QKLnog= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= +github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= +github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= +github.com/sergi/go-diff v1.3.1 h1:xkr+Oxo4BOQKmkn/B9eMK0g5Kg/983T9DqqPHwYqD+8= +github.com/sergi/go-diff v1.3.1/go.mod h1:aMJSSKb2lpPvRNec0+w3fl7LP9IOFzdc9Pa4NFbPK1I= +github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= +github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= +github.com/skratchdot/open-golang v0.0.0-20200116055534-eef842397966 h1:JIAuq3EEf9cgbU6AtGPK4CTG3Zf6CKMNqf0MHTggAUA= +github.com/skratchdot/open-golang v0.0.0-20200116055534-eef842397966/go.mod h1:sUM3LWHvSMaG192sy56D9F7CNvL7jUJVXoqM1QKLnog= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s= github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= -github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= -github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/spf13/afero v1.1.2 h1:m8/z1t7/fwjysjQRYbP0RD+bUIF/8tJwPdEZsI83ACI= -github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= -github.com/spf13/cast v1.3.0 h1:oget//CVOEoFewqQxwr0Ej5yjygnqGkvggSE/gB35Q8= -github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cobra v1.0.1-0.20200710201246-675ae5f5a98c h1:/dP/1GnfVIlWnB0YDImenSmneUCw3wjyq2RMgAG1e2o= -github.com/spf13/cobra v1.0.1-0.20200710201246-675ae5f5a98c/go.mod h1:aeNIJzz/GSSVlS+gpCpQWZ83BKbsoW57mr90+YthtkQ= -github.com/spf13/jwalterweatherman v1.0.0 h1:XHEdyB+EcvlqZamSM4ZOMGlc93t6AcsBEu9Gc1vn7yk= -github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= -github.com/spf13/pflag v1.0.3 h1:zPAT6CGy6wXeQ7NtTnaTerfKOsV6V6F8agHXFiazDkg= -github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= -github.com/spf13/viper v1.6.2 h1:7aKfF+e8/k68gda3LOjo5RxiUqddoFxVq4BKBPrxk5E= -github.com/spf13/viper v1.6.2/go.mod h1:t3iDnF5Jlj76alVNuyFBk5oUMCvsrkbvZK0WQdfDi5k= -github.com/src-d/gcfg v1.4.0 h1:xXbNR5AlLSA315x2UO+fTSSAXCDf+Ar38/6oyGbDKQ4= -github.com/src-d/gcfg v1.4.0/go.mod h1:p/UMsR43ujA89BJY9duynAwIpvqEujIH/jFlfL7jWoI= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= -github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s= -github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= -github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= -github.com/ugorji/go v1.1.7 h1:/68gy2h+1mWMrwZFeD1kQialdSzAb432dtpeJ42ovdo= -github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= -github.com/ugorji/go v1.2.3 h1:WbFSXLxDFKVN69Sk8t+XHGzVCD7R8UoAATR8NqZgTbk= -github.com/ugorji/go v1.2.3/go.mod h1:5l8GZ8hZvmL4uMdy+mhCO1LjswGRYco9Q3HfuisB21A= -github.com/ugorji/go/codec v1.1.7 h1:2SvQaVZ1ouYrrKKwoSk2pzd4A9evlKJb9oTL+OaLUSs= -github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= -github.com/ugorji/go/codec v1.2.3 h1:/mVYEV+Jo3IZKeA5gBngN0AvNnQltEDkR+eQikkWQu0= -github.com/ugorji/go/codec v1.2.3/go.mod h1:5FxzDJIgeiWJZslYHPj+LS1dq1ZBQVelZFnjsFGI/Uc= -github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= -github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= -github.com/xanzy/ssh-agent v0.2.1 h1:TCbipTQL2JiiCprBWx9frJ2eJlCYT00NmctrHxVAr70= -github.com/xanzy/ssh-agent v0.2.1/go.mod h1:mLlQY/MoOhWBj+gOGMQkOeiEvkx+8pJSI+0Bx9h2kr4= -github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= -github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= +github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/tevino/abool v1.2.0 h1:heAkClL8H6w+mK5md9dzsuohKeXHUpY7Vw0ZCKW+huA= +github.com/tevino/abool v1.2.0/go.mod h1:qc66Pna1RiIsPa7O4Egxxs9OqkuxDX55zznh9K07Tzg= +github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI= +github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08= +github.com/ugorji/go v1.1.6 h1:zoJUBK8kLIUDNJ9LGB04qOQRfoDRoWBBpl0X7pZyi5I= +github.com/ugorji/go v1.1.6/go.mod h1:RaaajvHwnCbhlqWLTIB78hyPWp24YUXhQ3YXM7Hg7os= +github.com/ulikunitz/xz v0.5.12 h1:37Nm15o69RwBkXM0J6A5OlE67RZTfzUxTj8fB3dfcsc= +github.com/ulikunitz/xz v0.5.12/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= github.com/xrash/smetrics v0.0.0-20170218160415-a3153f7040e9 h1:w8V9v0qVympSF6GjdjIyeqR7+EVhAF9CBQmkmW7Zw0w= github.com/xrash/smetrics v0.0.0-20170218160415-a3153f7040e9/go.mod h1:N3UwUGtsrSj3ccvlPHLoLsHnpR27oXr4ZE984MbSER8= -github.com/zach-klippenstein/goregen v0.0.0-20160303162051-795b5e3961ea h1:CyhwejzVGvZ3Q2PSbQ4NRRYn+ZWv5eS1vlaEusT+bAI= -github.com/zach-klippenstein/goregen v0.0.0-20160303162051-795b5e3961ea/go.mod h1:eNr558nEUjP8acGw8FFjTeWvSgU1stO7FAO6eknhHe4= -go.bug.st/cleanup v1.0.0 h1:XVj1HZxkBXeq3gMT7ijWUpHyIC1j8XAoNSyQ06CskgA= -go.bug.st/cleanup v1.0.0/go.mod h1:EqVmTg2IBk4znLbPD28xne3abjsJftMdqqJEjhn70bk= -go.bug.st/downloader v0.0.0-20181116113543-9b8976a44d87 h1:8W/hwyrc25HrXxbtG8Ghiwgq/hDB8KCh7hKMf78gp90= -go.bug.st/downloader v0.0.0-20181116113543-9b8976a44d87/go.mod h1:OUL7bexo6Ir+BRE5E7Cs3qUvO6ZgJL5Hjk/qwiy6Ze0= -go.bug.st/downloader/v2 v2.1.1 h1:nyqbUizo3E2IxCCm4YFac4FtSqqFpqWP+Aae5GCMuw4= -go.bug.st/downloader/v2 v2.1.1/go.mod h1:VZW2V1iGKV8rJL2ZEGIDzzBeKowYv34AedJz13RzVII= -go.bug.st/relaxed-semver v0.0.0-20190922224835-391e10178d18 h1:F1qxtaFuewctYc/SsHRn+Q7Dtwi+yJGPgVq8YLtQz98= -go.bug.st/relaxed-semver v0.0.0-20190922224835-391e10178d18/go.mod h1:Cx1VqMtEhE9pIkEyUj3LVVVPkv89dgW8aCKrRPDR/uE= -go.bug.st/serial v1.1.2/go.mod h1:VmYBeyJWp5BnJ0tw2NUJHZdJTGl2ecBGABHlzRK1knY= -go.bug.st/serial v1.1.3 h1:YEBxJa9pKS9Wdg46B/jiaKbvvbUrjhZZZITfJHEJhaE= -go.bug.st/serial v1.1.3/go.mod h1:8TT7u/SwwNIpJ8QaG4s+HTjFt9ReXs2cdOU7ZEk50Dk= -go.bug.st/serial.v1 v0.0.0-20180827123349-5f7892a7bb45 h1:mACY1anK6HNCZtm/DK2Rf2ZPHggVqeB0+7rY9Gl6wyI= -go.bug.st/serial.v1 v0.0.0-20180827123349-5f7892a7bb45/go.mod h1:dRSl/CVCTf56CkXgJMDOdSwNfo2g1orOGE/gBGdvjZw= -go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= -go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= -go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= -goa.design/goa v1.0.1-0.20190116060309-40843d63b0e4 h1:+qjyw15FIXxmcA/QmrDrofQPLMAav6X2v+UYH/pQq8A= -goa.design/goa v1.0.1-0.20190116060309-40843d63b0e4/go.mod h1:NnzBwdNktihbNek+pPiFMQP9PPFsUt8MMPPyo9opDSo= -golang.org/x/crypto v0.0.0-20180214000028-650f4a345ab4/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20190219172222-a4c6cb3142f2/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +go.bug.st/serial v1.6.4 h1:7FmqNPgVp3pu2Jz5PoPtbZ9jJO5gnEnZIvnI1lzve8A= +go.bug.st/serial v1.6.4/go.mod h1:nofMJxTeNVny/m6+KaafC6vJGj3miwQZ6vW4BZUGJPI= +goa.design/goa/v3 v3.16.1 h1:yZwbKrfMpE8+sz0uf+n+BtArVOFQ0kNSC0twQKwQb04= +goa.design/goa/v3 v3.16.1/go.mod h1:Yd42LR0PYDbHSbsbF3vNd4YY/O+LG20Jb7+IyNdkQic= +golang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= +golang.org/x/arch v0.8.0 h1:3wRIsP3pM4yUptoR96otTUOXI367OS0+c9eeRi9doIc= +golang.org/x/arch v0.8.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550 h1:ObdrDkeb4kJdCP557AjRjq69pTHfNouLtWZG7j9rPN8= -golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20200406173513-056763e48d71/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9 h1:psW17arqaxU48Z5kZ0CQnkZWQJsqcURM6tKiBApRjXI= -golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20201124201722-c8d3bf9c5392 h1:xYJJ3S178yv++9zXV/hnr29plCAGO9vAFG9dorqaFQc= -golang.org/x/crypto v0.0.0-20201124201722-c8d3bf9c5392/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= -golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= -golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3 h1:XQyxROzUlZH+WIQwySDgnISgOivlhjIEwaQaJEJrrN0= -golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/net v0.0.0-20180406214816-61147c48b25b/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/crypto v0.23.0 h1:dIJU/v2J8Mdglj/8rJ6UUOM3Zc9zLZxVZwwxMooUSAI= +golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= +golang.org/x/mod v0.17.0 h1:zY54UmvipHiNd+pm+m0x9KhZ9hl1/7QNMyxXbc6ICqA= +golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190313220215-9f648a60d977/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -golang.org/x/net v0.0.0-20190620200207-3b0461eec859 h1:R/3boaszxrf1GEUWTVDzSKVwLmSJpwZ1yqXm8j0v2QI= -golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190923162816-aa69164e4478 h1:l5EDrHhldLYb3ZRHDUhXF7Om7MvYXnkV9/iQNo1lX6g= -golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e h1:3G+cUijn7XD+S4eJFddp53Pv7+slrESplyjG25HgL+k= -golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190423024810-112230192c58 h1:8gQV6CLnAEikrhgkHFbMAEhagSSnXWGV915qUMm9mrU= -golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= +golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= +golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= +golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190221075227-b4e8571b14e0/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200116001909-b77594299b42 h1:vEOn+mP2zCOVzKckCZy6YsCtDblrpj/w7B9nxGNELpg= -golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200909081042-eff7692f9009/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c h1:VwygUrnw9jn88c4u8GD3rZQbqrP/tgas88tPUbBxQrk= -golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/term v0.0.0-20201117132131-f5c789dd3221 h1:/ZHdbVpdR/jk3g30/d4yUL0JU9kksj8+F/bnQUVLGDM= -golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= +golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.23.0 h1:YfKFowiIMvtgl1UERQoTPPToxltDeZfbj4H7dVUCwmM= +golang.org/x/sys v0.23.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= -golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= -golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= -golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= +golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190729092621-ff9f1409240a/go.mod h1:jcCCGcm9btYwXyDqrUWc6MKQKKGJCWEQ3AfLSRIbEuI= -golang.org/x/tools v0.0.0-20191216052735-49a3e744a425 h1:VvQyQJN0tSuecqgcIxMWnnfG5kSmgy9KZR9sW3W5QeA= -golang.org/x/tools v0.0.0-20191216052735-49a3e744a425/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= -golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013 h1:+kGHl1aib/qcwaRi1CbqBZ1rk19r85MNUf8HaBghugY= -google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.27.0 h1:rRYRFMVgRv6E0D70Skyfsr28tDXIuuPZyWGMPdMcnXg= -google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= -google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= -google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= -google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= -google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= -google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.0 h1:4MY060fB1DLGMB/7MBTLnwQUY6+F09GEiz6SsrNqyzM= -google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.25.0 h1:Ejskq+SyPohKW+1uil0JJMtmHCgJPJ/qWTxr8qp+R4c= -google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= -gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= +golang.org/x/tools v0.20.0 h1:hz/CVckiOxybQvFw6h7b/q80NTr9IUQb4s1IIzW7KNY= +golang.org/x/tools v0.20.0/go.mod h1:WvitBU7JJf6A4jOdg4S1tviW9bhUxkgeCui/0JHctQg= +google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= +google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20160105164936-4f90aeace3a2/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU= -gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/inconshreveable/go-update.v0 v0.0.0-20150814200126-d8b0b1d421aa h1:drvf2JoUL1fz3ttkGNkw+rf3kZa2//7XkYGpSO4NHNA= gopkg.in/inconshreveable/go-update.v0 v0.0.0-20150814200126-d8b0b1d421aa/go.mod h1:tuNm0ntQ7IH9VSA39XxzLMpee5c2DwgIbjD4x3ydo8Y= -gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/ini.v1 v1.62.0 h1:duBzk771uxoUuOlyRLkHsygud9+5lrlGjdFBb4mSKDU= -gopkg.in/ini.v1 v1.62.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/mgo.v2 v2.0.0-20160818015218-f2b6f6c918c4 h1:hILp2hNrRnYjZpmIbx70psAHbBSEcQ1NIzDcUbJ1b6g= -gopkg.in/mgo.v2 v2.0.0-20160818015218-f2b6f6c918c4/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA= -gopkg.in/mgo.v2 v2.0.0-20180705113604-9856a29383ce h1:xcEWjVhvbDy+nHP67nPDDpbYrY+ILlfndk4bRioVHaU= -gopkg.in/mgo.v2 v2.0.0-20180705113604-9856a29383ce/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA= -gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= -gopkg.in/src-d/go-billy.v4 v4.3.2 h1:0SQA1pRztfTFx2miS8sA97XvooFeNOmvUenF4o0EcVg= -gopkg.in/src-d/go-billy.v4 v4.3.2/go.mod h1:nDjArDMp+XMs1aFAESLRjfGSgfvoYN0hDfzEk0GjC98= -gopkg.in/src-d/go-git-fixtures.v3 v3.5.0/go.mod h1:dLBcvytrw/TYZsNTWCnkNF2DSIlzWYqTe3rJR56Ac7g= -gopkg.in/src-d/go-git.v4 v4.13.1 h1:SRtFyV8Kxc0UP7aCHcijOMQGPxHSmMOPrzulQWolkYE= -gopkg.in/src-d/go-git.v4 v4.13.1/go.mod h1:nx5NYcxdKxq5fpltdHnPa2Exj4Sx0EclMWZQbYDu2z8= -gopkg.in/warnings.v0 v0.1.2 h1:wFXVbFY8DY5/xOe1ECiWdKCzZlxgshcYVNkBHstARME= -gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= -gopkg.in/yaml.v2 v2.0.0-20170712054546-1be3d31502d6/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= -gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= -gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw= +gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= +gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10= -gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +nullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50= +rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= diff --git a/home.html b/home.html index 7551a48dc..ee523981a 100644 --- a/home.html +++ b/home.html @@ -1,232 +1,346 @@ - - -Arduino Create Agent Debug Console - - - - - + + - - - -
-

-            
+      }
+
+      function clearLogs() {
+        const log1 = document.getElementById("log");
+        const log2 = document.getElementById("log-list");
+
+        messages = [];
+        log1.innerHTML = "";
+        log2.innerHTML = "";
+      }
+
+      function exportLogs() {
+        const link = document.createElement("a");
+        link.setAttribute("download", "agent-log.txt");
+        const text = document.getElementById("log").textContent;
+        link.setAttribute(
+          "href",
+          "data:text/plain;charset=utf-8," + encodeURIComponent(text)
+        );
+        link.click();
+      }
+    
+    
+  
+
+  
+    
+
+

+        

+      
+ +
+ diff --git a/hub.go b/hub.go index 46aa9f679..a162dd01a 100755 --- a/hub.go +++ b/hub.go @@ -1,7 +1,24 @@ +// Copyright 2022 Arduino SA +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published +// by the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + package main import ( "encoding/json" + "fmt" + "html" "io" "os" "runtime" @@ -38,60 +55,64 @@ var h = hub{ connections: make(map[*connection]bool), } +const commands = `{ + "Commands": [ + "list", + "open [bufferAlgorithm: ({default}, timed, timedraw)]", + "(send, sendnobuf, sendraw) ", + "close ", + "restart", + "exit", + "killupload", + "downloadtool ", + "log", + "memorystats", + "gc", + "hostname", + "version" + ] +}` + +func (h *hub) unregisterConnection(c *connection) { + if _, contains := h.connections[c]; !contains { + return + } + delete(h.connections, c) + close(c.send) +} + +func (h *hub) sendToRegisteredConnections(data []byte) { + for c := range h.connections { + select { + case c.send <- data: + //log.Print("did broadcast to ") + //log.Print(c.ws.RemoteAddr()) + //c.send <- []byte("hello world") + default: + h.unregisterConnection(c) + } + } +} + func (h *hub) run() { for { select { case c := <-h.register: h.connections[c] = true // send supported commands - c.send <- []byte("{\"Version\" : \"" + version + "\"} ") - c.send <- []byte("{\"Commands\" : [\"list\", \"open [portName] [baud] [bufferAlgorithm (optional)]\", \"send [portName] [cmd]\", \"sendnobuf [portName] [cmd]\", \"close [portName]\", \"bufferalgorithms\", \"baudrates\", \"restart\", \"exit\", \"program [portName] [board:name] [$path/to/filename/without/extension]\", \"programfromurl [portName] [board:name] [urlToHexFile]\"]} ") - c.send <- []byte("{\"Hostname\" : \"" + *hostname + "\"} ") - c.send <- []byte("{\"OS\" : \"" + runtime.GOOS + "\"} ") + c.send <- []byte(fmt.Sprintf(`{"Version" : "%s"} `, version)) + c.send <- []byte(html.EscapeString(commands)) + c.send <- []byte(fmt.Sprintf(`{"Hostname" : "%s"} `, *hostname)) + c.send <- []byte(fmt.Sprintf(`{"OS" : "%s"} `, runtime.GOOS)) case c := <-h.unregister: - delete(h.connections, c) - // put close in func cuz it was creating panics and want - // to isolate - func() { - // this method can panic if websocket gets disconnected - // from users browser and we see we need to unregister a couple - // of times, i.e. perhaps from incoming data from serial triggering - // an unregister. (NOT 100% sure why seeing c.send be closed twice here) - defer func() { - if e := recover(); e != nil { - log.Println("Got panic: ", e) - } - }() - close(c.send) - }() + h.unregisterConnection(c) case m := <-h.broadcast: if len(m) > 0 { checkCmd(m) - - for c := range h.connections { - select { - case c.send <- m: - //log.Print("did broadcast to ") - //log.Print(c.ws.RemoteAddr()) - //c.send <- []byte("hello world") - default: - delete(h.connections, c) - close(c.send) - } - } + h.sendToRegisteredConnections(m) } case m := <-h.broadcastSys: - for c := range h.connections { - select { - case c.send <- m: - //log.Print("did broadcast to ") - //log.Print(c.ws.RemoteAddr()) - //c.send <- []byte("hello world") - default: - delete(h.connections, c) - close(c.send) - } - } + h.sendToRegisteredConnections(m) } } } @@ -102,7 +123,7 @@ func checkCmd(m []byte) { sl := strings.ToLower(strings.Trim(s, "\n")) - if *hibernate == true { + if *hibernate { //do nothing return } @@ -127,7 +148,7 @@ func checkCmd(m []byte) { } // pass in buffer type now as string. if user does not // ask for a buffer type pass in empty string - bufferAlgorithm := "" + bufferAlgorithm := "default" // use the default buffer if none is specified if len(args) > 3 { // cool. we got a buffer type request buftype := strings.Replace(args[3], "\n", "", -1) @@ -153,15 +174,11 @@ func checkCmd(m []byte) { }() } else if strings.HasPrefix(sl, "send") { - // will catch send and sendnobuf + // will catch send and sendnobuf and sendraw go spWrite(s) } else if strings.HasPrefix(sl, "list") { - go spList(false) - go spList(true) + go serialPorts.List() } else if strings.HasPrefix(sl, "downloadtool") { - // Always delete root certificates when we receive a downloadtool command - // Useful if the install procedure was not followed strictly (eg. manually) - DeleteCertificates() go func() { args := strings.Split(s, " ") var tool, toolVersion, pack, behaviour string @@ -225,12 +242,12 @@ func checkCmd(m []byte) { func logAction(sl string) { if strings.HasPrefix(sl, "log on") { *logDump = "on" - multi_writer := io.MultiWriter(&logger_ws, os.Stderr) - log.SetOutput(multi_writer) + multiWriter := io.MultiWriter(&loggerWs, os.Stderr) + log.SetOutput(multiWriter) } else if strings.HasPrefix(sl, "log off") { *logDump = "off" log.SetOutput(os.Stderr) - } else if strings.HasPrefix(sl, "log show") { + // } else if strings.HasPrefix(sl, "log show") { // TODO: send all the saved log to websocket //h.broadcastSys <- []byte("{\"BufFlowDebug\" : \"" + *logDump + "\"}") } diff --git a/icon/icon.svg b/icon/icon.svg new file mode 100644 index 000000000..8bc6f5fb2 --- /dev/null +++ b/icon/icon.svg @@ -0,0 +1,63 @@ + + + + + + + + image/svg+xml + + + + + + + + + diff --git a/icon/icon_darwin.go b/icon/icon_darwin.go new file mode 100644 index 000000000..dfdfa34a7 --- /dev/null +++ b/icon/icon_darwin.go @@ -0,0 +1,23 @@ +package icon + +import _ "embed" // import embed to embed the icon + +// GetIcon will return the icon +func GetIcon() []byte { + return data +} + +// GetIconHiber will return the hibernated icon +func GetIconHiber() []byte { + return dataHibernate +} + +// data represents the icon +// +//go:embed icon_mac.png +var data []byte + +// dataHibernate represents the icon hibernated +// +//go:embed icon_mac_hiber.png +var dataHibernate []byte diff --git a/icon/icon_hiber.svg b/icon/icon_hiber.svg new file mode 100644 index 000000000..91021711e --- /dev/null +++ b/icon/icon_hiber.svg @@ -0,0 +1,63 @@ + + + + + + + + image/svg+xml + + + + + + + + + diff --git a/icon/icon_linux.go b/icon/icon_linux.go new file mode 100644 index 000000000..b00f743aa --- /dev/null +++ b/icon/icon_linux.go @@ -0,0 +1,23 @@ +package icon + +import _ "embed" // import embed to embed the icon + +// GetIcon will return the icon +func GetIcon() []byte { + return data +} + +// GetIconHiber will return the hibernated icon +func GetIconHiber() []byte { + return dataHibernate +} + +// data represents the icon +// +//go:embed icon_linux.png +var data []byte + +// dataHibernate represents the icon hibernated +// +//go:embed icon_linux_hiber.png +var dataHibernate []byte diff --git a/icon/icon_linux.png b/icon/icon_linux.png index c282ea137..b32940840 100644 Binary files a/icon/icon_linux.png and b/icon/icon_linux.png differ diff --git a/icon/icon_linux_hiber.png b/icon/icon_linux_hiber.png index 7a4078fcb..5995ce96a 100644 Binary files a/icon/icon_linux_hiber.png and b/icon/icon_linux_hiber.png differ diff --git a/icon/icon_mac.png b/icon/icon_mac.png index 0f6605b33..24dd8ae1b 100644 Binary files a/icon/icon_mac.png and b/icon/icon_mac.png differ diff --git a/icon/icon_mac_hiber.png b/icon/icon_mac_hiber.png index dcd47edb3..b57292690 100644 Binary files a/icon/icon_mac_hiber.png and b/icon/icon_mac_hiber.png differ diff --git a/icon/icon_mac_light.png b/icon/icon_mac_light.png deleted file mode 100644 index 9cc820e02..000000000 Binary files a/icon/icon_mac_light.png and /dev/null differ diff --git a/icon/icon_mac_light_hiber.png b/icon/icon_mac_light_hiber.png deleted file mode 100644 index 4280fd333..000000000 Binary files a/icon/icon_mac_light_hiber.png and /dev/null differ diff --git a/icon/icon_win.ico b/icon/icon_win.ico index f62cfde83..de577ec75 100644 Binary files a/icon/icon_win.ico and b/icon/icon_win.ico differ diff --git a/icon/icon_win_hiber.ico b/icon/icon_win_hiber.ico index 031a4c224..652370e13 100644 Binary files a/icon/icon_win_hiber.ico and b/icon/icon_win_hiber.ico differ diff --git a/icon/icon_windows.go b/icon/icon_windows.go new file mode 100644 index 000000000..2cf75b5e3 --- /dev/null +++ b/icon/icon_windows.go @@ -0,0 +1,23 @@ +package icon + +import _ "embed" // import embed to embed the icon + +// GetIcon will return the icon +func GetIcon() []byte { + return data +} + +// GetIconHiber will return the hibernated icon +func GetIconHiber() []byte { + return dataHibernate +} + +// data represents the icon +// +//go:embed icon_win.ico +var data []byte + +// dataHibernate represents the icon hibernated +// +//go:embed icon_win_hiber.ico +var dataHibernate []byte diff --git a/icon/icondarwin.go b/icon/icondarwin.go deleted file mode 100644 index c8f1d5454..000000000 --- a/icon/icondarwin.go +++ /dev/null @@ -1,303 +0,0 @@ -// +build darwin - -// File generated by 2goarray v0.1.0 (http://github.com/cratonica/2goarray) - -package icon - -import ( - "os/exec" - "strings" -) - -func IsDarkMode() bool { - cmd := exec.Command("defaults", "read", "-g", "AppleInterfaceStyle") - output, _ := cmd.Output() - return strings.Contains(string(output), "Dark") -} - -func GetIcon() []byte { - if IsDarkMode() { - return Data - } else { - return DataLight - } -} - -func GetIconHiber() []byte { - if IsDarkMode() { - return DataDarkHibernate - } else { - return DataLightHibernate - } -} - -var DataLight []byte = []byte{ - 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, - 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x24, - 0x08, 0x06, 0x00, 0x00, 0x00, 0xe1, 0x00, 0x98, 0x98, 0x00, 0x00, 0x00, - 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x0b, 0x13, 0x00, 0x00, 0x0b, - 0x13, 0x01, 0x00, 0x9a, 0x9c, 0x18, 0x00, 0x00, 0x00, 0x01, 0x73, 0x52, - 0x47, 0x42, 0x00, 0xae, 0xce, 0x1c, 0xe9, 0x00, 0x00, 0x00, 0x04, 0x67, - 0x41, 0x4d, 0x41, 0x00, 0x00, 0xb1, 0x8f, 0x0b, 0xfc, 0x61, 0x05, 0x00, - 0x00, 0x02, 0x16, 0x49, 0x44, 0x41, 0x54, 0x78, 0x01, 0xcd, 0x57, 0x81, - 0x75, 0x82, 0x30, 0x10, 0xfd, 0x76, 0x81, 0xda, 0x0d, 0xe2, 0x06, 0x1d, - 0x21, 0x1b, 0xc8, 0x06, 0xd2, 0x09, 0x6a, 0x27, 0x90, 0x0d, 0x64, 0x03, - 0xdd, 0xa0, 0xed, 0x04, 0x74, 0x03, 0xdd, 0x00, 0x3a, 0x01, 0x6e, 0xd0, - 0xe6, 0x1e, 0xc4, 0x9e, 0x47, 0x12, 0x04, 0x41, 0xfa, 0xdf, 0xfb, 0xef, - 0x49, 0x2e, 0x77, 0xfe, 0xdc, 0x25, 0x17, 0x98, 0xe1, 0x76, 0x28, 0xc3, - 0x79, 0xfd, 0xfb, 0x64, 0x58, 0xe0, 0xce, 0xd0, 0x86, 0xa9, 0x61, 0x6e, - 0xf8, 0xe3, 0xe1, 0xc1, 0x70, 0x67, 0x18, 0x61, 0x24, 0x50, 0x06, 0x36, - 0x86, 0x65, 0x40, 0x84, 0x8f, 0x24, 0x7c, 0x85, 0x01, 0x11, 0xf5, 0x14, - 0x32, 0xb8, 0x30, 0xca, 0xca, 0x76, 0x00, 0x21, 0x92, 0x5b, 0xf4, 0x00, - 0x89, 0x39, 0x8c, 0x20, 0x86, 0xef, 0xb1, 0x39, 0x3a, 0x60, 0x4c, 0x31, - 0x96, 0x19, 0xae, 0xc4, 0x18, 0x65, 0xea, 0x5d, 0xbe, 0xf8, 0x8e, 0x62, - 0x2c, 0xbd, 0xad, 0x81, 0x6a, 0x9a, 0x4f, 0x20, 0x28, 0x87, 0x67, 0x3f, - 0xad, 0x27, 0x10, 0x63, 0x99, 0x58, 0x11, 0x33, 0x26, 0x88, 0x94, 0x2a, - 0x87, 0xd0, 0xc2, 0xf0, 0xd3, 0xf0, 0x68, 0xf8, 0x68, 0xb8, 0x30, 0x5c, - 0x7a, 0xe6, 0xba, 0xfc, 0xf2, 0xfa, 0x39, 0xe4, 0x47, 0x57, 0xce, 0x13, - 0x1f, 0x88, 0xe0, 0x4e, 0xa5, 0x86, 0x1f, 0x31, 0xdc, 0x25, 0xee, 0xeb, - 0x77, 0xe1, 0xb3, 0x77, 0x04, 0x55, 0xcc, 0x4e, 0x35, 0x7e, 0xae, 0x9d, - 0x78, 0xbd, 0x69, 0x0e, 0x6f, 0x11, 0xb2, 0xbf, 0x84, 0xfc, 0xa4, 0xa8, - 0x94, 0x0b, 0x92, 0x7d, 0x47, 0x31, 0xdb, 0x06, 0xcd, 0xab, 0x63, 0xcb, - 0xfe, 0xc0, 0x36, 0xd1, 0x5c, 0x8c, 0xb9, 0xfc, 0x36, 0x2c, 0xae, 0x16, - 0xb6, 0x03, 0x17, 0xc4, 0x0d, 0x3b, 0x36, 0x1e, 0xea, 0x49, 0x5c, 0x80, - 0xc2, 0xdf, 0x22, 0x5c, 0xab, 0xf7, 0xc5, 0xcf, 0x84, 0xed, 0x1c, 0x80, - 0x0f, 0x2e, 0x3d, 0x2b, 0x70, 0x31, 0x43, 0x13, 0xae, 0x6c, 0x27, 0x70, - 0xef, 0x97, 0x58, 0xce, 0x7d, 0x40, 0xb3, 0x07, 0x7c, 0x33, 0x41, 0x16, - 0xd4, 0x12, 0x5e, 0x18, 0x4f, 0x6c, 0xce, 0x9a, 0xcd, 0x7b, 0x45, 0xb5, - 0x67, 0x08, 0x47, 0x36, 0xf7, 0xc3, 0xf0, 0x8d, 0xcd, 0xb3, 0x73, 0xbe, - 0x20, 0xf0, 0x80, 0x26, 0x4e, 0xe8, 0x86, 0x92, 0xfd, 0xe6, 0x6d, 0x24, - 0x74, 0x79, 0xce, 0x43, 0x73, 0x14, 0xfa, 0x97, 0xec, 0xdd, 0x11, 0x4f, - 0xee, 0x0b, 0x8a, 0x9f, 0x88, 0x31, 0x9b, 0xa1, 0x08, 0x9e, 0xc3, 0xe4, - 0xdb, 0x17, 0xfb, 0x80, 0x18, 0x7e, 0xc4, 0x15, 0x0b, 0xd6, 0x76, 0x05, - 0xa5, 0x81, 0xf8, 0x67, 0xc8, 0x00, 0x9a, 0xd9, 0x12, 0x61, 0x2b, 0xeb, - 0xb1, 0xb9, 0x10, 0x20, 0x8f, 0x7d, 0xea, 0xf1, 0x03, 0x5b, 0x84, 0x5c, - 0xe0, 0x19, 0xd2, 0x39, 0x47, 0xb3, 0x31, 0x6a, 0x54, 0xa9, 0x6e, 0x6b, - 0x8c, 0xdc, 0x0f, 0x01, 0x3f, 0x99, 0x84, 0x9d, 0x74, 0x72, 0xf5, 0x99, - 0x15, 0xfc, 0x88, 0xe0, 0xbf, 0x3a, 0x42, 0x7e, 0x31, 0xdc, 0xef, 0xe8, - 0x9a, 0x8c, 0xfc, 0x54, 0x94, 0x70, 0xef, 0xfa, 0x02, 0xd5, 0xf1, 0x3c, - 0xd6, 0xcf, 0x8b, 0xfa, 0x0f, 0xdb, 0x5e, 0x41, 0xbb, 0xf8, 0x15, 0xb5, - 0xfd, 0x02, 0x09, 0xda, 0x4f, 0xd5, 0x58, 0x74, 0x66, 0x74, 0xca, 0x17, - 0x34, 0x2f, 0xa2, 0x09, 0x04, 0xad, 0xd0, 0x82, 0xf4, 0x8e, 0x62, 0x52, - 0x5c, 0x89, 0x7f, 0xf5, 0x19, 0x44, 0x18, 0xfb, 0x43, 0x31, 0x43, 0xc7, - 0x0f, 0x45, 0x8b, 0x31, 0xca, 0x77, 0x75, 0x99, 0x7c, 0x88, 0x31, 0xcc, - 0xe9, 0xa3, 0x18, 0x1a, 0x03, 0x22, 0x46, 0x3f, 0x61, 0xf2, 0xee, 0x1b, - 0x1c, 0x1a, 0xd5, 0x2d, 0x1d, 0xda, 0x63, 0x64, 0x4b, 0xd1, 0x23, 0x23, - 0x33, 0xdc, 0x0e, 0x25, 0x9e, 0x0b, 0xdc, 0x80, 0x5f, 0x8e, 0x2c, 0xaa, - 0x54, 0xb0, 0x94, 0xe9, 0x09, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, - 0x44, 0xae, 0x42, 0x60, 0x82, -} - -var DataLightHibernate []byte = []byte{ - 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, - 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x24, - 0x08, 0x06, 0x00, 0x00, 0x00, 0xe1, 0x00, 0x98, 0x98, 0x00, 0x00, 0x00, - 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x0b, 0x13, 0x00, 0x00, 0x0b, - 0x13, 0x01, 0x00, 0x9a, 0x9c, 0x18, 0x00, 0x00, 0x00, 0x01, 0x73, 0x52, - 0x47, 0x42, 0x00, 0xae, 0xce, 0x1c, 0xe9, 0x00, 0x00, 0x00, 0x04, 0x67, - 0x41, 0x4d, 0x41, 0x00, 0x00, 0xb1, 0x8f, 0x0b, 0xfc, 0x61, 0x05, 0x00, - 0x00, 0x03, 0x1e, 0x49, 0x44, 0x41, 0x54, 0x78, 0x01, 0xc5, 0x58, 0x2d, - 0x9b, 0xda, 0x40, 0x10, 0x7e, 0x8f, 0x9e, 0x40, 0x20, 0x10, 0x15, 0x08, - 0x44, 0x44, 0x05, 0xa2, 0x02, 0x89, 0xa8, 0x40, 0x54, 0x20, 0x2a, 0x10, - 0x15, 0x48, 0xc4, 0xfd, 0x80, 0xca, 0xfe, 0x8c, 0xfe, 0x80, 0x0a, 0x64, - 0x45, 0x05, 0xa2, 0xe2, 0x44, 0x05, 0xe2, 0x04, 0x02, 0x71, 0xa2, 0x02, - 0x81, 0x88, 0x44, 0x54, 0x44, 0x9c, 0x40, 0x20, 0x9a, 0xf7, 0x32, 0xf3, - 0x64, 0xb2, 0xec, 0x06, 0xc2, 0x47, 0xfa, 0x3e, 0xcf, 0x1c, 0xc9, 0xee, - 0xce, 0xec, 0xec, 0x7c, 0xed, 0xe4, 0xee, 0x70, 0x39, 0xda, 0x29, 0x35, - 0xe5, 0x79, 0x97, 0x52, 0x82, 0x0b, 0x70, 0x87, 0xea, 0x88, 0x52, 0xea, - 0x09, 0xb5, 0x03, 0x6b, 0xb6, 0x42, 0x6b, 0xa1, 0xab, 0x2b, 0x44, 0x0b, - 0x0c, 0x84, 0x9a, 0xa8, 0x06, 0x5a, 0x6c, 0x91, 0xd2, 0xf3, 0x29, 0x8b, - 0x4f, 0x51, 0x88, 0x96, 0x18, 0x9f, 0xa1, 0x88, 0x8b, 0x93, 0x14, 0x7b, - 0x53, 0x32, 0x47, 0x05, 0x3e, 0xa6, 0x34, 0x4a, 0xe9, 0x1e, 0x97, 0x83, - 0xf2, 0x7a, 0xf2, 0xbb, 0x09, 0x2d, 0xba, 0x2b, 0x61, 0x9e, 0xa6, 0xd4, - 0xc1, 0x6d, 0xc0, 0xf8, 0x9a, 0x21, 0x4b, 0x82, 0x02, 0x42, 0x16, 0x7a, - 0xb8, 0xa1, 0x32, 0x44, 0x2b, 0xa5, 0x2e, 0x3c, 0xee, 0xf3, 0x29, 0x44, - 0x17, 0xf5, 0x70, 0x7b, 0x68, 0xb9, 0xd8, 0x94, 0x29, 0xd4, 0x47, 0x16, - 0x37, 0x75, 0x81, 0x56, 0xa2, 0xfb, 0xfe, 0xea, 0x40, 0xc3, 0x4c, 0x52, - 0xdb, 0x21, 0xea, 0xc7, 0x08, 0x26, 0x83, 0xad, 0x42, 0xb4, 0x4e, 0x1b, - 0xf5, 0x83, 0x7b, 0x0e, 0xf4, 0xc5, 0xa6, 0xf3, 0x20, 0xc0, 0xc0, 0xfa, - 0xc1, 0x6a, 0x4b, 0xd3, 0x36, 0x45, 0x40, 0x59, 0x95, 0x76, 0xf9, 0x12, - 0xb3, 0x71, 0x88, 0x8f, 0x7b, 0x2f, 0xf8, 0xa0, 0x69, 0xcf, 0x85, 0x13, - 0x8f, 0xc0, 0x79, 0x4a, 0x31, 0xfc, 0xa0, 0x45, 0x87, 0x9e, 0x0d, 0xce, - 0xe5, 0x9b, 0x91, 0x47, 0x83, 0xfa, 0x03, 0x8a, 0x69, 0x9e, 0xc8, 0x82, - 0xad, 0xbc, 0xd3, 0x32, 0x6f, 0x85, 0x58, 0x3b, 0xf6, 0xc8, 0xef, 0xaa, - 0x08, 0x59, 0x1a, 0x43, 0xc6, 0xbe, 0x23, 0x0f, 0xd2, 0x32, 0x3e, 0x2d, - 0x92, 0x0a, 0xce, 0x6f, 0xd4, 0x65, 0x1d, 0x8f, 0xb6, 0x6a, 0xea, 0x21, - 0x0e, 0xef, 0xb0, 0x25, 0x32, 0x13, 0xab, 0xe2, 0x53, 0x99, 0x9f, 0x89, - 0xe0, 0xd0, 0xdd, 0xb7, 0x30, 0x7c, 0x73, 0xe1, 0x53, 0x44, 0xfc, 0xa3, - 0x16, 0xfa, 0x64, 0x26, 0x9e, 0x91, 0x17, 0x2c, 0x66, 0x00, 0xad, 0xe7, - 0x5e, 0x1d, 0x4c, 0xd7, 0xf7, 0xb2, 0xee, 0xf5, 0x64, 0xf2, 0xfc, 0x82, - 0xcc, 0x15, 0x2c, 0xac, 0x3d, 0x0f, 0x5f, 0x24, 0xf3, 0x1a, 0x5b, 0xfa, - 0x4e, 0xd0, 0xca, 0x8b, 0x06, 0x0e, 0x7d, 0xb9, 0x36, 0xcc, 0xa1, 0x40, - 0x87, 0xf0, 0x69, 0xdc, 0x25, 0xc8, 0x2d, 0x3a, 0x71, 0x64, 0x7e, 0x83, - 0x04, 0xac, 0xa0, 0x2f, 0xb2, 0x81, 0xc3, 0x4a, 0xdd, 0xe6, 0x09, 0xdc, - 0x5b, 0x3c, 0x31, 0x0a, 0x29, 0x1e, 0x51, 0xbc, 0x77, 0xb4, 0x76, 0x44, - 0xa2, 0xf4, 0x52, 0xc6, 0xf9, 0xac, 0xee, 0xdf, 0xca, 0x38, 0xf9, 0xd6, - 0xf2, 0x3b, 0x92, 0x39, 0xae, 0x89, 0xe1, 0x09, 0xfc, 0x06, 0x0e, 0xb1, - 0x43, 0x35, 0x84, 0xd6, 0x97, 0xb5, 0x2b, 0xcd, 0xd0, 0x9a, 0x7b, 0x8f, - 0x40, 0x6a, 0x4f, 0x2b, 0xc5, 0x66, 0x6c, 0x04, 0x3f, 0x78, 0x72, 0x6b, - 0x76, 0x5a, 0x84, 0xb1, 0x13, 0x21, 0x73, 0xdb, 0x18, 0x99, 0xcb, 0x38, - 0x36, 0x74, 0xf8, 0x00, 0x4f, 0x4d, 0x6a, 0xe0, 0xb0, 0x07, 0xd6, 0xb8, - 0x89, 0x51, 0xde, 0x4c, 0xd1, 0x25, 0x73, 0x23, 0x58, 0x85, 0xff, 0x70, - 0x64, 0x7e, 0x71, 0x94, 0x59, 0x22, 0x2f, 0x27, 0xee, 0x25, 0x9e, 0x68, - 0x96, 0x31, 0xd0, 0x9a, 0x46, 0x78, 0x8c, 0xbc, 0xd2, 0x12, 0x91, 0x61, - 0xa2, 0x45, 0x9f, 0x52, 0xfa, 0x85, 0x3c, 0xc5, 0x1f, 0x44, 0x86, 0x66, - 0x1d, 0x7f, 0x69, 0xfd, 0xae, 0x87, 0xef, 0xb7, 0xd9, 0x67, 0x8c, 0xe2, - 0x01, 0x57, 0x5a, 0xa9, 0xe9, 0x12, 0x9b, 0x51, 0x5a, 0x5f, 0xf4, 0xa4, - 0xdc, 0xb4, 0x83, 0xfc, 0xab, 0x62, 0x67, 0x84, 0x4e, 0x50, 0x0c, 0x64, - 0xd7, 0x42, 0x51, 0x80, 0x6f, 0x8a, 0xa2, 0xcb, 0x78, 0x88, 0xb9, 0x5a, - 0x68, 0x2f, 0x27, 0x84, 0x51, 0xa0, 0x27, 0x02, 0xb6, 0x32, 0x4f, 0x81, - 0x2f, 0xf2, 0x0c, 0x99, 0xff, 0x8c, 0xac, 0x0a, 0x2b, 0x5a, 0x0e, 0x1f, - 0x3c, 0x7c, 0x7d, 0x39, 0x44, 0x0b, 0x45, 0x30, 0x93, 0x13, 0xdb, 0xc2, - 0x7e, 0x85, 0x3f, 0x33, 0x34, 0xc0, 0xb7, 0xe6, 0x74, 0x7d, 0x1c, 0x6f, - 0xfa, 0xab, 0xf0, 0x71, 0x2d, 0x83, 0xbf, 0xd0, 0x53, 0x0f, 0xf1, 0x7f, - 0xfa, 0x21, 0x82, 0xc9, 0xf1, 0x9a, 0x40, 0xb6, 0x0e, 0x31, 0xfa, 0x13, - 0xd4, 0x8f, 0x04, 0x26, 0x9b, 0xad, 0x42, 0xf4, 0xfb, 0x23, 0xea, 0xc7, - 0xc2, 0xbe, 0xb8, 0x3d, 0x35, 0xdb, 0x06, 0xfa, 0xb8, 0x8b, 0x7a, 0x40, - 0xaf, 0x3c, 0xd9, 0x01, 0xdf, 0xd5, 0x41, 0x2b, 0x6d, 0x71, 0x7b, 0xc4, - 0xf0, 0x78, 0x24, 0xf4, 0x5d, 0xf6, 0x27, 0xa5, 0x77, 0x38, 0x4c, 0xcd, - 0x6b, 0x2a, 0xc3, 0x7a, 0xb5, 0xc7, 0x89, 0x0a, 0x71, 0xe1, 0x0a, 0xb7, - 0x71, 0x1f, 0xdd, 0xf4, 0x13, 0x1e, 0x65, 0xca, 0x14, 0x52, 0xb0, 0xf1, - 0x62, 0x16, 0xb0, 0x12, 0x1f, 0xab, 0x3b, 0xc7, 0x40, 0x39, 0xb4, 0xca, - 0xaa, 0x6c, 0x51, 0x95, 0xff, 0x0f, 0x85, 0x9a, 0xf3, 0x63, 0x60, 0xf6, - 0x2e, 0x91, 0xf7, 0x46, 0xb8, 0x96, 0x42, 0x8a, 0x08, 0x99, 0x72, 0x1d, - 0x84, 0xbf, 0xff, 0x99, 0x14, 0x31, 0xb2, 0xcb, 0x39, 0x46, 0x05, 0x9c, - 0xa3, 0x90, 0x0b, 0xdf, 0x67, 0xd0, 0xd9, 0xf8, 0x07, 0x55, 0x8b, 0xc7, - 0x4d, 0x28, 0x32, 0x9b, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, - 0x44, 0xae, 0x42, 0x60, 0x82, -} - -var Data []byte = []byte{ - 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, - 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x24, - 0x08, 0x06, 0x00, 0x00, 0x00, 0xe1, 0x00, 0x98, 0x98, 0x00, 0x00, 0x00, - 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x0b, 0x13, 0x00, 0x00, 0x0b, - 0x13, 0x01, 0x00, 0x9a, 0x9c, 0x18, 0x00, 0x00, 0x00, 0x01, 0x73, 0x52, - 0x47, 0x42, 0x00, 0xae, 0xce, 0x1c, 0xe9, 0x00, 0x00, 0x00, 0x04, 0x67, - 0x41, 0x4d, 0x41, 0x00, 0x00, 0xb1, 0x8f, 0x0b, 0xfc, 0x61, 0x05, 0x00, - 0x00, 0x02, 0x40, 0x49, 0x44, 0x41, 0x54, 0x78, 0x01, 0xcd, 0x58, 0x8b, - 0x71, 0xc2, 0x30, 0x0c, 0x55, 0x58, 0xa0, 0xe9, 0x06, 0x61, 0x03, 0xba, - 0x41, 0x36, 0x80, 0x0d, 0xa0, 0x13, 0x14, 0x26, 0x80, 0x0d, 0xc8, 0x06, - 0xb0, 0x41, 0xdb, 0x09, 0xd2, 0x0d, 0xc2, 0x06, 0x4e, 0x27, 0x80, 0x0d, - 0x54, 0xf9, 0xe2, 0x50, 0x45, 0xb1, 0x4d, 0x42, 0x3e, 0xf0, 0xee, 0x74, - 0xc1, 0x1f, 0x29, 0xcf, 0x96, 0x25, 0x39, 0x04, 0xd0, 0x11, 0x88, 0x18, - 0xd1, 0x23, 0x34, 0xcd, 0x4b, 0x10, 0x04, 0x39, 0x8c, 0x09, 0x22, 0x10, - 0x93, 0x24, 0x24, 0x0a, 0xdd, 0xc8, 0x48, 0x0e, 0x24, 0x0b, 0x18, 0x02, - 0x64, 0x38, 0x24, 0xd9, 0x92, 0x9c, 0xb1, 0x3d, 0x14, 0xc9, 0x12, 0xfa, - 0x82, 0x5e, 0xe5, 0x9d, 0x44, 0xfa, 0x25, 0x66, 0x76, 0x65, 0x8f, 0xfd, - 0x63, 0x0f, 0x6d, 0x61, 0xc8, 0x64, 0x38, 0x1c, 0xb4, 0xed, 0xb0, 0x0d, - 0xa1, 0x21, 0xc9, 0x94, 0x48, 0x9b, 0x92, 0x19, 0xc2, 0x4d, 0x2e, 0xec, - 0x6f, 0x91, 0x59, 0xe1, 0xf8, 0xa8, 0xa4, 0x86, 0x80, 0x91, 0xd1, 0x3e, - 0xcd, 0x48, 0x22, 0x18, 0x17, 0x39, 0xc9, 0x1b, 0x25, 0xd4, 0x8b, 0x6e, - 0x4c, 0xd8, 0xc0, 0xea, 0x01, 0x64, 0xc0, 0xbc, 0x73, 0x5d, 0x36, 0xf8, - 0x0e, 0x29, 0xb0, 0x13, 0xca, 0x49, 0xbe, 0x49, 0x4e, 0x24, 0x2f, 0x24, - 0x53, 0x92, 0x39, 0xdc, 0x26, 0x5f, 0xea, 0x29, 0xd3, 0xf6, 0xe9, 0xe9, - 0x92, 0xf3, 0x0a, 0x8c, 0xcc, 0xc2, 0xe2, 0x5b, 0x45, 0x12, 0x83, 0x03, - 0x58, 0x9c, 0x37, 0xd5, 0xa3, 0x5e, 0xcc, 0x27, 0x1d, 0x2d, 0x46, 0x23, - 0x36, 0xae, 0xf3, 0xd2, 0x0c, 0x8b, 0x3a, 0x16, 0xb2, 0xfe, 0x08, 0xab, - 0x29, 0x22, 0x13, 0xe3, 0x3e, 0x3d, 0x25, 0xde, 0x99, 0x70, 0x42, 0x32, - 0xef, 0x70, 0x32, 0x5b, 0xac, 0x97, 0x8e, 0x7d, 0xf9, 0x02, 0xfc, 0x4f, - 0xa2, 0x4a, 0xf4, 0xd9, 0xf4, 0xb6, 0xcc, 0x6e, 0x2c, 0xc6, 0x32, 0x4e, - 0x88, 0xe3, 0xc0, 0xfa, 0x7d, 0x39, 0x49, 0x31, 0x02, 0x51, 0xb9, 0x08, - 0xb4, 0xaf, 0xde, 0x65, 0x3f, 0xe5, 0x03, 0x7c, 0xfb, 0x38, 0xe6, 0x8e, - 0x15, 0xd8, 0x50, 0xcb, 0xb6, 0x68, 0xd9, 0x6d, 0x92, 0x9d, 0xe8, 0x8b, - 0xd9, 0x79, 0xaa, 0xcc, 0xd5, 0x61, 0x2f, 0x6b, 0xca, 0xaf, 0x79, 0xc6, - 0xac, 0x4f, 0x87, 0xe5, 0x3b, 0x93, 0x4b, 0x39, 0x87, 0x8c, 0xac, 0x19, - 0x99, 0x0f, 0x7a, 0xcc, 0x4c, 0xf3, 0xc4, 0xe6, 0x7e, 0x91, 0x6c, 0x98, - 0xbd, 0x72, 0xce, 0x0f, 0x08, 0x4c, 0xa0, 0x8e, 0x0b, 0xb4, 0xc3, 0x99, - 0xfd, 0x0e, 0xd8, 0x6f, 0x5f, 0xf1, 0x0c, 0x9d, 0x73, 0xb0, 0x9b, 0xcb, - 0x3e, 0x2d, 0xf6, 0xd2, 0x06, 0x2e, 0x9b, 0x99, 0xb9, 0x32, 0xdd, 0x44, - 0xa5, 0x11, 0x8e, 0x94, 0x19, 0x3f, 0xa2, 0x1b, 0xd7, 0x10, 0xc7, 0xea, - 0xa1, 0xd6, 0x11, 0xa6, 0x3c, 0x7a, 0x89, 0xcb, 0x3e, 0x5f, 0x95, 0x34, - 0x10, 0xb3, 0x31, 0xb9, 0xba, 0xb3, 0xe9, 0x0b, 0x05, 0x01, 0x25, 0xfa, - 0x12, 0x9b, 0x9e, 0xc7, 0x33, 0x95, 0xb0, 0x97, 0xca, 0x0a, 0xeb, 0x89, - 0x51, 0xbb, 0x70, 0x86, 0xb7, 0x13, 0x63, 0x24, 0x5c, 0xe8, 0xd2, 0x53, - 0xe2, 0x9d, 0x07, 0xa9, 0x84, 0x16, 0x52, 0xce, 0x3b, 0x30, 0x16, 0xfe, - 0x57, 0x77, 0xe8, 0xad, 0xd0, 0x7e, 0x47, 0x8f, 0xf5, 0x38, 0x2f, 0xae, - 0x3a, 0x5a, 0x6c, 0x91, 0x91, 0x43, 0x11, 0x9e, 0x27, 0xd3, 0xd6, 0x45, - 0x72, 0x09, 0xfe, 0x28, 0x6a, 0xab, 0x97, 0x53, 0x71, 0x9d, 0x4a, 0xe6, - 0x3b, 0x7c, 0x1c, 0xae, 0x3b, 0xfa, 0x14, 0x17, 0x34, 0xbe, 0x3b, 0xd7, - 0xc4, 0x68, 0x6e, 0x6c, 0x1b, 0x18, 0x1f, 0x3b, 0xef, 0x28, 0xd6, 0x23, - 0x6e, 0x48, 0x24, 0xd0, 0x04, 0xf8, 0x4c, 0x9f, 0x41, 0x86, 0xd0, 0xd0, - 0x1f, 0x8a, 0x29, 0xb6, 0xf9, 0x50, 0x1c, 0xd8, 0x7d, 0xcd, 0xdc, 0xe4, - 0x21, 0xe5, 0xba, 0x03, 0xb7, 0x85, 0x42, 0xcf, 0x5d, 0x7b, 0x4c, 0x62, - 0x95, 0xda, 0xd7, 0x3b, 0xb0, 0x28, 0x33, 0xba, 0x4a, 0xfb, 0xce, 0x98, - 0x1e, 0x4b, 0xee, 0xd9, 0x91, 0x00, 0x3a, 0x02, 0x45, 0x31, 0xed, 0xfa, - 0x97, 0xde, 0x1f, 0xd5, 0x42, 0xb4, 0x70, 0xf7, 0x10, 0xdd, 0x39, 0x00, - 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82, -} - -var DataDarkHibernate []byte = []byte{ - 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, - 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x24, - 0x08, 0x06, 0x00, 0x00, 0x00, 0xe1, 0x00, 0x98, 0x98, 0x00, 0x00, 0x00, - 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x0b, 0x13, 0x00, 0x00, 0x0b, - 0x13, 0x01, 0x00, 0x9a, 0x9c, 0x18, 0x00, 0x00, 0x00, 0x01, 0x73, 0x52, - 0x47, 0x42, 0x00, 0xae, 0xce, 0x1c, 0xe9, 0x00, 0x00, 0x00, 0x04, 0x67, - 0x41, 0x4d, 0x41, 0x00, 0x00, 0xb1, 0x8f, 0x0b, 0xfc, 0x61, 0x05, 0x00, - 0x00, 0x02, 0xf2, 0x49, 0x44, 0x41, 0x54, 0x78, 0x01, 0xc5, 0x58, 0x2d, - 0xb7, 0xe2, 0x40, 0x0c, 0xbd, 0xe5, 0x3c, 0x81, 0x44, 0x22, 0x2b, 0x91, - 0x48, 0x64, 0x25, 0x72, 0x25, 0xb2, 0x3f, 0x61, 0xe5, 0xfe, 0x8c, 0x95, - 0x48, 0x24, 0x12, 0xf9, 0x24, 0xb2, 0x12, 0x89, 0xac, 0x7c, 0xb2, 0xb2, - 0x8e, 0x9d, 0xdb, 0x26, 0x6c, 0x3a, 0x9d, 0xce, 0xa3, 0x7c, 0xbd, 0x7b, - 0x4e, 0x4f, 0xcb, 0x74, 0x92, 0xb9, 0x4d, 0x32, 0x49, 0x86, 0x04, 0x0f, - 0xe2, 0x72, 0xb9, 0xcc, 0xdc, 0x6d, 0x2a, 0x3f, 0xeb, 0x24, 0x49, 0x2a, - 0x3c, 0x80, 0x04, 0x23, 0xe1, 0x08, 0xa4, 0xee, 0xb6, 0x90, 0x6b, 0x36, - 0x30, 0xed, 0x4b, 0xae, 0xb3, 0x23, 0x78, 0xc6, 0xb3, 0x09, 0x39, 0x12, - 0xb4, 0xc0, 0x4a, 0xae, 0x29, 0xc6, 0x81, 0x16, 0x3b, 0x3a, 0x62, 0xa7, - 0x5b, 0x26, 0x7f, 0x4b, 0xc8, 0x91, 0xa1, 0x25, 0x7e, 0xdd, 0x41, 0x04, - 0xf7, 0x10, 0x4b, 0x22, 0x44, 0x48, 0x20, 0x43, 0x6b, 0x95, 0x67, 0xa2, - 0x70, 0xa4, 0x3e, 0x31, 0x86, 0x90, 0x90, 0xc9, 0xdd, 0x35, 0xc7, 0x6b, - 0xc0, 0xf8, 0xda, 0x39, 0x62, 0xb5, 0xff, 0x62, 0x32, 0x20, 0x90, 0xbf, - 0x90, 0x0c, 0x44, 0xf7, 0x26, 0xf4, 0xa2, 0x47, 0xc8, 0x59, 0x67, 0x8d, - 0xd7, 0x92, 0x51, 0xa4, 0xb2, 0xd6, 0x30, 0x21, 0x37, 0x61, 0x89, 0xe7, - 0xc7, 0x4c, 0x0c, 0x2b, 0xd9, 0x34, 0x7d, 0x42, 0x26, 0x88, 0xdf, 0x8d, - 0xb5, 0xac, 0xdd, 0x25, 0xe4, 0x40, 0xeb, 0xcc, 0xf0, 0x7e, 0x70, 0xcd, - 0xab, 0x57, 0x3e, 0xcc, 0x8b, 0x21, 0x57, 0x31, 0x7f, 0x30, 0xdb, 0x72, - 0x67, 0x4c, 0x45, 0x41, 0x2c, 0x4b, 0xfb, 0x72, 0x95, 0x59, 0x78, 0x48, - 0x8e, 0x6b, 0x1f, 0xf9, 0xd0, 0x6c, 0x7b, 0xf1, 0xe3, 0x26, 0xa0, 0xf0, - 0xe0, 0xb6, 0x66, 0x19, 0x50, 0xa0, 0xf1, 0x96, 0x05, 0x16, 0xb8, 0x57, - 0x8e, 0x69, 0xa0, 0x54, 0x97, 0x2d, 0x02, 0x4a, 0x77, 0xaa, 0x94, 0x3e, - 0x76, 0xd7, 0x9c, 0x75, 0x4c, 0xfd, 0x2d, 0x19, 0x77, 0x87, 0xd6, 0x72, - 0x0a, 0x3e, 0x6f, 0x6f, 0x94, 0xf3, 0x8b, 0x70, 0xc3, 0x41, 0x5d, 0x36, - 0x0f, 0xb0, 0xad, 0x44, 0x69, 0x06, 0xaf, 0x86, 0xb9, 0xb1, 0x02, 0x6d, - 0x19, 0xa8, 0xdc, 0xf3, 0x0e, 0x6d, 0xde, 0x9a, 0x8a, 0x5c, 0x3d, 0x54, - 0xfb, 0xdc, 0x38, 0x65, 0x54, 0xee, 0x20, 0x72, 0x8a, 0x74, 0x88, 0xd0, - 0xc9, 0x90, 0x59, 0x23, 0x1c, 0x5b, 0x1c, 0x5b, 0xb8, 0xf7, 0x5b, 0x21, - 0xb0, 0x97, 0xaf, 0xaf, 0xa5, 0x1d, 0xc9, 0x11, 0x8e, 0x95, 0x8c, 0xef, - 0xdd, 0xbc, 0xc6, 0xa5, 0xee, 0xb9, 0x54, 0x22, 0xca, 0x61, 0x22, 0x0a, - 0x2c, 0xce, 0x42, 0x26, 0x45, 0x3c, 0x27, 0x51, 0x6e, 0x23, 0x44, 0x2a, - 0xd3, 0x07, 0x6d, 0xd0, 0x25, 0xf3, 0x17, 0x12, 0xb0, 0x82, 0xa5, 0xe8, - 0x26, 0x3a, 0x85, 0x96, 0x5c, 0x68, 0x21, 0xbf, 0x8a, 0xab, 0xe2, 0xd4, - 0x8c, 0xb1, 0x18, 0xda, 0xba, 0xb3, 0x16, 0x39, 0xc6, 0xc6, 0xca, 0x91, - 0x29, 0x44, 0x21, 0x3f, 0x40, 0xad, 0xcd, 0x78, 0x2a, 0x44, 0xee, 0x2c, - 0x77, 0xcd, 0xcc, 0x9c, 0x53, 0xca, 0xd5, 0x41, 0xa8, 0x96, 0xd5, 0x18, - 0x87, 0xa1, 0xf9, 0xb1, 0x76, 0x65, 0x3a, 0x34, 0xe7, 0x23, 0xa0, 0x90, - 0xec, 0x69, 0xa5, 0xd2, 0x8c, 0xf5, 0x6a, 0x8e, 0xe0, 0x6c, 0xfb, 0x1b, - 0x5a, 0x4a, 0x52, 0x48, 0x8a, 0xd6, 0x6d, 0xec, 0xa3, 0xe8, 0x32, 0x8e, - 0x65, 0x56, 0x4e, 0xee, 0xbd, 0x38, 0x9b, 0x04, 0x7a, 0xe0, 0x95, 0x28, - 0x2f, 0xe1, 0xf9, 0xd8, 0x03, 0x5d, 0xc2, 0x9d, 0xd2, 0xf8, 0xde, 0xc4, - 0xe2, 0x1e, 0xdd, 0x2d, 0xfd, 0xdb, 0x23, 0xc3, 0x7e, 0x48, 0x53, 0x45, - 0x27, 0xdd, 0x90, 0x8b, 0xba, 0xcc, 0x2a, 0x48, 0x35, 0xe8, 0xb8, 0x1b, - 0xd0, 0x0d, 0x48, 0xa2, 0x96, 0x31, 0xbb, 0xc5, 0x73, 0x5e, 0x7c, 0x96, - 0x1e, 0x67, 0x8b, 0x36, 0x7e, 0x7a, 0x72, 0xda, 0x9c, 0xc9, 0x07, 0x2c, - 0xbd, 0x0f, 0xbc, 0x66, 0x6a, 0x7f, 0x7b, 0x6b, 0x62, 0xd4, 0xed, 0xcf, - 0x45, 0xe7, 0xa2, 0xb4, 0xd2, 0xc6, 0x4a, 0x94, 0x6e, 0xd0, 0x0d, 0xe4, - 0xbd, 0xb5, 0xba, 0x7c, 0x5c, 0x48, 0x2e, 0x47, 0xd7, 0x65, 0xa7, 0x26, - 0x1d, 0x18, 0xa1, 0xdc, 0xfb, 0xa2, 0x68, 0x0f, 0x2c, 0xb1, 0xb2, 0x46, - 0xb8, 0x74, 0xc4, 0xe4, 0x96, 0xf8, 0xbf, 0x4b, 0x2d, 0x9a, 0xca, 0x90, - 0x98, 0x89, 0x7f, 0x10, 0xde, 0x19, 0x1a, 0xe0, 0xea, 0x77, 0x35, 0xf5, - 0x77, 0x4d, 0xff, 0x18, 0x39, 0x5a, 0x8f, 0xc1, 0x0f, 0x4b, 0x28, 0xc3, - 0xcf, 0xf4, 0x43, 0xc4, 0x41, 0x2d, 0x6a, 0xf3, 0x10, 0x83, 0xb0, 0xc2, - 0xfb, 0x51, 0x59, 0xf7, 0x5e, 0x09, 0x49, 0xc0, 0x7d, 0xe2, 0xfd, 0x38, - 0xda, 0x1f, 0x9d, 0x4c, 0x2d, 0xc7, 0xde, 0x02, 0xef, 0x43, 0xe1, 0x07, - 0x7f, 0xaf, 0x74, 0x48, 0x9e, 0xf8, 0xc2, 0xeb, 0x51, 0x86, 0x0e, 0x8c, - 0x43, 0xe7, 0xb2, 0x1d, 0x5e, 0x4b, 0xaa, 0x44, 0x9b, 0xd1, 0x7b, 0x88, - 0x9e, 0xed, 0x23, 0xfd, 0xd0, 0x23, 0x18, 0x7f, 0x94, 0xb6, 0x88, 0xf4, - 0xc0, 0x63, 0x11, 0xed, 0xb5, 0x6f, 0x26, 0xa4, 0x78, 0x80, 0x18, 0x77, - 0x2f, 0x37, 0x4a, 0x11, 0x3a, 0xcb, 0xdf, 0x4d, 0xc8, 0x10, 0x4b, 0xd1, - 0x66, 0xdc, 0x39, 0x86, 0x8f, 0xdc, 0x8c, 0xbf, 0x12, 0x6d, 0x7b, 0x52, - 0x62, 0x04, 0x46, 0x13, 0xf2, 0xe1, 0xb7, 0xc0, 0x8f, 0xfe, 0xa5, 0xf7, - 0x0f, 0x7b, 0x0e, 0x6f, 0xa0, 0x07, 0xba, 0x9c, 0x76, 0x00, 0x00, 0x00, - 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82, -} diff --git a/icon/iconlinux.go b/icon/iconlinux.go deleted file mode 100644 index 98fee30e4..000000000 --- a/icon/iconlinux.go +++ /dev/null @@ -1,292 +0,0 @@ -// +build linux - -// File generated by 2goarray v0.1.0 (http://github.com/cratonica/2goarray) - -package icon - -func GetIcon() []byte { - return Data -} - -func GetIconHiber() []byte { - return DataHibernate -} - -var Data []byte = []byte{ - 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, - 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, 0x48, - 0x08, 0x06, 0x00, 0x00, 0x00, 0x55, 0xed, 0xb3, 0x47, 0x00, 0x00, 0x00, - 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x0b, 0x13, 0x00, 0x00, 0x0b, - 0x13, 0x01, 0x00, 0x9a, 0x9c, 0x18, 0x00, 0x00, 0x00, 0x01, 0x73, 0x52, - 0x47, 0x42, 0x00, 0xae, 0xce, 0x1c, 0xe9, 0x00, 0x00, 0x00, 0x04, 0x67, - 0x41, 0x4d, 0x41, 0x00, 0x00, 0xb1, 0x8f, 0x0b, 0xfc, 0x61, 0x05, 0x00, - 0x00, 0x05, 0xa5, 0x49, 0x44, 0x41, 0x54, 0x78, 0x01, 0xed, 0x5c, 0xe1, - 0x75, 0xdb, 0x36, 0x10, 0x3e, 0xf5, 0xf9, 0x7f, 0xd5, 0x09, 0xca, 0x4e, - 0x10, 0x25, 0x0b, 0x98, 0xe9, 0x02, 0x51, 0xbb, 0x80, 0x9c, 0x09, 0xec, - 0x76, 0x01, 0x51, 0x13, 0x58, 0x59, 0xa0, 0xd2, 0x06, 0x6e, 0x17, 0x28, - 0x94, 0x09, 0xe4, 0x2c, 0x50, 0x72, 0x82, 0xca, 0x13, 0xf4, 0x8a, 0x0b, - 0xc0, 0x88, 0x91, 0x0e, 0x07, 0x80, 0xa4, 0x48, 0x51, 0xca, 0xf7, 0x1e, - 0x4c, 0x99, 0x3c, 0xe0, 0x80, 0x4f, 0x07, 0xe0, 0x70, 0x00, 0x05, 0xf0, - 0x0d, 0x22, 0x46, 0xd0, 0x23, 0x10, 0x31, 0xd1, 0x97, 0xb1, 0x4e, 0xe5, - 0xb5, 0x8a, 0xc2, 0x5e, 0x9f, 0x47, 0xa3, 0xd1, 0x0b, 0xf4, 0x84, 0xce, - 0x08, 0xd2, 0x64, 0x10, 0x01, 0x53, 0x9d, 0x26, 0x3a, 0xdd, 0x02, 0x4f, - 0x8a, 0x0b, 0x44, 0xd0, 0xb3, 0x4e, 0x9f, 0x74, 0xda, 0x50, 0xea, 0x93, - 0xb4, 0xd6, 0x40, 0xa4, 0xe8, 0x74, 0xaf, 0x93, 0xc2, 0xf6, 0xa1, 0x74, - 0x9a, 0x59, 0x2b, 0x1c, 0x16, 0x74, 0xa5, 0x53, 0x9d, 0x9e, 0x74, 0xda, - 0x61, 0x37, 0x58, 0x0d, 0x82, 0x28, 0x4b, 0x8c, 0xc2, 0xfe, 0xb0, 0xc2, - 0x73, 0x24, 0x0a, 0x4d, 0x57, 0x7a, 0xc4, 0xf3, 0xc1, 0x0a, 0xcf, 0x85, - 0x28, 0x5d, 0x91, 0x29, 0x76, 0xd7, 0x95, 0x62, 0x90, 0xeb, 0x34, 0x83, - 0xbe, 0x80, 0xe7, 0x67, 0x35, 0x2e, 0x3c, 0x42, 0x03, 0xd4, 0x9a, 0xe6, - 0xd1, 0x98, 0xef, 0x13, 0x98, 0x29, 0x7b, 0x08, 0x28, 0x74, 0x7a, 0xab, - 0x5d, 0x83, 0x02, 0x22, 0x11, 0x4d, 0x90, 0x25, 0x47, 0x81, 0xf1, 0x63, - 0x86, 0x84, 0x02, 0x6a, 0x90, 0x14, 0x45, 0x90, 0x26, 0x87, 0x2c, 0x86, - 0xc8, 0x09, 0x75, 0xf0, 0xce, 0x0d, 0x05, 0x44, 0x92, 0x14, 0x4c, 0x90, - 0xb5, 0x9c, 0x2d, 0x0c, 0x97, 0x9c, 0x12, 0x05, 0x44, 0x90, 0xf4, 0x5d, - 0x88, 0x50, 0xa5, 0x5b, 0x0d, 0x9d, 0x1c, 0x42, 0xa2, 0x93, 0xc2, 0x40, - 0x37, 0xc0, 0x6b, 0x41, 0x68, 0xd6, 0x50, 0x5b, 0x18, 0xde, 0x98, 0xe3, - 0x03, 0x2d, 0x82, 0x5f, 0xfb, 0x84, 0x42, 0x2c, 0x68, 0x0e, 0x97, 0x47, - 0x0e, 0x61, 0x12, 0xe2, 0x02, 0x88, 0x16, 0xa4, 0x0b, 0xb8, 0xd3, 0x97, - 0x15, 0x5c, 0x36, 0x68, 0x3c, 0xda, 0xb8, 0x1e, 0x3a, 0x09, 0x1a, 0xf0, - 0x74, 0x1e, 0x8b, 0x42, 0xa7, 0xd7, 0xae, 0xf0, 0x89, 0xd4, 0xc5, 0x32, - 0xb8, 0x7c, 0x72, 0x08, 0x09, 0x98, 0x61, 0x84, 0x05, 0x6b, 0x41, 0xd6, - 0x7a, 0x72, 0xb8, 0x2e, 0xfc, 0xc4, 0x4d, 0xfd, 0x2e, 0x0b, 0xca, 0xe0, - 0xfa, 0xc0, 0x8e, 0xb5, 0x47, 0x16, 0x74, 0xa5, 0xd6, 0x53, 0xe2, 0x68, - 0xc0, 0xbe, 0x61, 0x84, 0x32, 0x68, 0x86, 0xa2, 0xf2, 0x79, 0x0c, 0xa7, - 0x77, 0x2e, 0x8b, 0x83, 0xff, 0x13, 0xa8, 0x0f, 0x8a, 0x99, 0x6f, 0x9c, - 0x4f, 0xc9, 0x7a, 0x30, 0x1e, 0x14, 0x0b, 0xca, 0xd0, 0x44, 0x13, 0xc7, - 0x4c, 0x99, 0x63, 0xfb, 0x6c, 0x8d, 0x26, 0x46, 0xd3, 0x14, 0xa7, 0xd4, - 0xb7, 0xe3, 0xca, 0xac, 0x16, 0x7e, 0x17, 0x51, 0x58, 0x8e, 0x35, 0x02, - 0x52, 0x56, 0x47, 0x8e, 0xf1, 0xc8, 0x3b, 0xd2, 0xf7, 0x20, 0x15, 0xa6, - 0x02, 0x0b, 0x59, 0xa2, 0xc4, 0x74, 0x58, 0xc5, 0x33, 0x0c, 0x47, 0x23, - 0x7d, 0x68, 0x7a, 0xc6, 0x3a, 0x50, 0x97, 0x92, 0x0a, 0x09, 0x41, 0x06, - 0x2d, 0x01, 0xfd, 0xe1, 0x5a, 0x7a, 0x96, 0x42, 0x4b, 0xc0, 0xb0, 0x2f, - 0xe5, 0xab, 0x6e, 0x56, 0x1d, 0xa4, 0x43, 0xa2, 0x83, 0x0b, 0x3d, 0xca, - 0x67, 0x42, 0x05, 0x26, 0xb6, 0x9c, 0xc4, 0xde, 0xda, 0xe9, 0xf4, 0x51, - 0xe7, 0x79, 0xe6, 0xe4, 0xf5, 0xfd, 0x3f, 0x75, 0x9e, 0x02, 0xf8, 0x48, - 0x01, 0xdd, 0x17, 0xc3, 0x12, 0x35, 0xf4, 0x11, 0x41, 0xf4, 0xd1, 0xe9, - 0x18, 0xda, 0x7a, 0x50, 0x99, 0x9b, 0x43, 0x65, 0x4b, 0x0f, 0xb3, 0x4f, - 0xe0, 0xae, 0xe8, 0x3d, 0xca, 0x96, 0x90, 0xa3, 0x30, 0x7e, 0x50, 0x43, - 0x0f, 0xf2, 0xd3, 0xe7, 0x44, 0x90, 0x9f, 0x37, 0xd4, 0xa7, 0x50, 0xc6, - 0x32, 0x36, 0x13, 0x5b, 0x61, 0x34, 0xdd, 0x52, 0x61, 0x38, 0x72, 0x74, - 0x34, 0x1c, 0x4d, 0x77, 0x2b, 0x31, 0x05, 0x37, 0x91, 0x39, 0x86, 0x43, - 0x09, 0xf5, 0x96, 0x08, 0x56, 0x9c, 0x72, 0x29, 0xc3, 0xca, 0xa1, 0x24, - 0xc7, 0x78, 0x90, 0x1e, 0x17, 0x01, 0x64, 0xc5, 0x99, 0xe3, 0xd9, 0x0c, - 0xeb, 0x6d, 0x2f, 0xe5, 0xc8, 0xbb, 0x03, 0xd2, 0x78, 0xb4, 0x3b, 0x14, - 0x1e, 0x7b, 0x94, 0x24, 0x8c, 0x82, 0xd0, 0x59, 0xc1, 0x85, 0x14, 0x02, - 0x81, 0x86, 0x1c, 0x17, 0xf2, 0x4a, 0x72, 0xc1, 0xf5, 0x05, 0x4b, 0x18, - 0x57, 0x85, 0x53, 0x41, 0x50, 0x31, 0x85, 0xa7, 0xd8, 0x1c, 0xe2, 0x38, - 0x73, 0xd0, 0x10, 0xc9, 0x72, 0xd2, 0xc0, 0x06, 0xa7, 0x4c, 0xd9, 0x5b, - 0x41, 0x3e, 0x21, 0x99, 0x90, 0x88, 0xe2, 0x27, 0xe6, 0xde, 0x3d, 0x34, - 0x07, 0x7d, 0x43, 0x0a, 0x05, 0xff, 0xc6, 0x3e, 0x6b, 0x2b, 0x16, 0xce, - 0x75, 0xeb, 0x8f, 0x82, 0x7c, 0x42, 0x7f, 0x6e, 0xaa, 0xff, 0x38, 0xc0, - 0x4d, 0x99, 0xa9, 0x43, 0xee, 0xc5, 0xa3, 0x30, 0x61, 0xee, 0xd1, 0x94, - 0xfb, 0x9b, 0x23, 0x8f, 0x2b, 0xdc, 0x5b, 0xc0, 0x7e, 0x0d, 0x56, 0xd5, - 0xb9, 0xb1, 0xd7, 0x72, 0xaa, 0xae, 0xe2, 0x9d, 0x4e, 0x87, 0x5e, 0x32, - 0xeb, 0x0e, 0x54, 0xea, 0x66, 0x80, 0xf2, 0x12, 0x23, 0x3d, 0xcc, 0x29, - 0x99, 0xa4, 0x0b, 0x28, 0x8f, 0x59, 0x09, 0x23, 0x2f, 0x75, 0x99, 0xcc, - 0xa3, 0x8b, 0x1d, 0x02, 0x18, 0x39, 0xa9, 0xdd, 0x77, 0x24, 0x13, 0xd2, - 0xc5, 0xbe, 0x87, 0x7e, 0x70, 0x16, 0x5b, 0x4c, 0x37, 0x01, 0x32, 0x3f, - 0x30, 0xf7, 0xc8, 0xac, 0x0f, 0x1b, 0x40, 0x07, 0x19, 0xa4, 0x2e, 0x76, - 0xeb, 0xb8, 0xbf, 0xe0, 0xbc, 0x65, 0xf2, 0x86, 0x75, 0x79, 0x1f, 0x80, - 0x1f, 0xef, 0xde, 0xe9, 0x67, 0x3f, 0x56, 0xf3, 0xa3, 0x19, 0xaf, 0xca, - 0x5d, 0x0a, 0x8e, 0x5c, 0xae, 0x3b, 0x49, 0x5f, 0xc2, 0x7e, 0xaa, 0xc7, - 0xaf, 0x9d, 0xb4, 0x43, 0x1c, 0x79, 0x95, 0xd8, 0x7c, 0x8a, 0x2f, 0x21, - 0x06, 0xe6, 0xd0, 0xb8, 0x1f, 0xb9, 0xa7, 0x8c, 0xd4, 0xca, 0xfa, 0x66, - 0x31, 0x6e, 0xaa, 0x5f, 0xfa, 0xca, 0x2d, 0xbb, 0x58, 0x21, 0xd4, 0xf3, - 0x15, 0x73, 0x6f, 0x0d, 0xcd, 0x51, 0xe8, 0xf4, 0x56, 0x12, 0xb0, 0x3b, - 0x0d, 0x24, 0xd3, 0xc6, 0x81, 0xcd, 0x05, 0x73, 0xef, 0x56, 0x90, 0xdf, - 0xeb, 0xc4, 0x18, 0xa7, 0x69, 0x9f, 0xe7, 0x09, 0xeb, 0x83, 0xfc, 0x1a, - 0x76, 0x71, 0xec, 0xd0, 0x95, 0x7a, 0xca, 0xca, 0x51, 0xb6, 0x34, 0xae, - 0x17, 0xc4, 0xb5, 0x19, 0x65, 0x67, 0x2c, 0xe3, 0x1a, 0x82, 0xf5, 0x97, - 0x1a, 0x2e, 0x72, 0xe6, 0xe8, 0xd8, 0xed, 0xc4, 0xfa, 0x27, 0xd9, 0xc8, - 0x19, 0xe4, 0x48, 0x97, 0x86, 0x89, 0x1d, 0x57, 0x01, 0x25, 0x65, 0xc0, - 0x76, 0x16, 0xab, 0x0a, 0xdd, 0x8b, 0xd5, 0xfb, 0x8a, 0xdc, 0xcc, 0x21, - 0x13, 0xbb, 0xfe, 0x53, 0xc8, 0x93, 0xe3, 0xb3, 0x1e, 0x76, 0xb1, 0xba, - 0x8c, 0xce, 0xb4, 0xcf, 0x7b, 0xe7, 0xa9, 0xb8, 0xc2, 0xf8, 0x70, 0xc7, - 0xa4, 0xa1, 0xbe, 0xa9, 0x90, 0x7f, 0xeb, 0x69, 0xeb, 0x97, 0x2e, 0x39, - 0xaa, 0x64, 0xa2, 0x02, 0x9d, 0x31, 0x1f, 0x8b, 0x4c, 0x0f, 0x9c, 0x0b, - 0x41, 0x71, 0x19, 0xbc, 0x2a, 0x1b, 0x57, 0x80, 0x39, 0x15, 0x5f, 0x78, - 0xf2, 0x70, 0xcb, 0x89, 0xcf, 0x03, 0xb4, 0x2b, 0xf8, 0xd5, 0x40, 0x1f, - 0x79, 0xe7, 0x19, 0xc8, 0x38, 0xde, 0xaf, 0x47, 0xff, 0x8a, 0xbe, 0xc4, - 0x1c, 0x5a, 0x02, 0x86, 0x85, 0x30, 0x1e, 0xa0, 0x25, 0xa0, 0x19, 0xe3, - 0x42, 0x30, 0x76, 0x15, 0xa0, 0x02, 0x0b, 0x58, 0x61, 0x83, 0x73, 0xc8, - 0x18, 0x7f, 0x42, 0xf6, 0xb1, 0x05, 0x7d, 0xa1, 0xb3, 0xae, 0x92, 0x0a, - 0x7a, 0xc0, 0x70, 0xe4, 0x18, 0xb9, 0x0d, 0x63, 0x2b, 0x3a, 0xc7, 0xfa, - 0x81, 0xaf, 0x2e, 0xf4, 0xcd, 0x7c, 0x05, 0xc6, 0x56, 0x3e, 0x47, 0x63, - 0x51, 0xe4, 0xab, 0xb8, 0x36, 0xf2, 0x68, 0x8a, 0x5e, 0x62, 0x3d, 0x62, - 0x5c, 0xfa, 0xa6, 0x28, 0x6f, 0x1c, 0xd6, 0xd1, 0x77, 0xb4, 0x71, 0xc8, - 0xed, 0xcd, 0xaf, 0xf5, 0xa5, 0xc9, 0x09, 0xf5, 0x17, 0xd8, 0x7b, 0xa1, - 0x5d, 0x6c, 0x3d, 0xb7, 0xa9, 0x6f, 0xad, 0x07, 0xe7, 0xf7, 0xd5, 0x1b, - 0x1c, 0x41, 0x29, 0x98, 0x59, 0xe5, 0x1a, 0x71, 0x74, 0x04, 0xe6, 0x28, - 0xdc, 0x61, 0xa7, 0xb7, 0x0d, 0x5c, 0x1f, 0xd6, 0x6c, 0x54, 0x81, 0x93, - 0xbc, 0x52, 0x2b, 0x0a, 0x3f, 0x40, 0x65, 0xad, 0xe8, 0x03, 0x5c, 0x0f, - 0x96, 0x2e, 0xe7, 0x52, 0x3a, 0xc4, 0x49, 0x83, 0x1d, 0xc5, 0x6b, 0xce, - 0x22, 0xb2, 0x77, 0x42, 0x50, 0x1b, 0xdf, 0x44, 0x1f, 0xe2, 0xb4, 0x19, - 0xde, 0xc3, 0xe5, 0xe3, 0xf7, 0x91, 0xf0, 0x82, 0xb0, 0x18, 0x93, 0xa6, - 0xc3, 0x05, 0x70, 0xd9, 0x5d, 0x6d, 0x61, 0xdb, 0xe8, 0x44, 0xe8, 0xab, - 0x08, 0x34, 0x60, 0x4f, 0xe0, 0xb2, 0xb0, 0xd5, 0xe4, 0xbc, 0xf1, 0x09, - 0x79, 0x77, 0x35, 0xac, 0xf9, 0xfd, 0x02, 0x72, 0x58, 0x76, 0x68, 0xa0, - 0x71, 0xe7, 0xd7, 0x10, 0xc1, 0xd8, 0xd7, 0xa1, 0x2e, 0xe1, 0xe4, 0x3d, - 0x91, 0xf3, 0x73, 0xe8, 0xeb, 0x50, 0xb1, 0x2f, 0xd4, 0x25, 0x30, 0x6c, - 0x92, 0xa2, 0xc8, 0x21, 0x5c, 0xd3, 0x2b, 0x99, 0xd1, 0xe4, 0x10, 0x82, - 0x5e, 0xa8, 0xab, 0xc2, 0x2a, 0xa0, 0xad, 0x98, 0x67, 0x18, 0x0e, 0xe8, - 0x0b, 0x8d, 0x26, 0xa7, 0x31, 0xd0, 0x1f, 0xc7, 0xee, 0x1b, 0xff, 0x61, - 0xc3, 0xd7, 0xc2, 0xdb, 0x20, 0xc9, 0x17, 0x40, 0xef, 0x0b, 0xff, 0x60, - 0x8b, 0x27, 0x64, 0x1b, 0x01, 0xe3, 0xce, 0x21, 0x9f, 0x1a, 0x64, 0x35, - 0x19, 0x36, 0x3c, 0xc7, 0x7d, 0x12, 0x60, 0xbf, 0x44, 0x11, 0x31, 0x7f, - 0xe0, 0x40, 0x7e, 0x05, 0xa6, 0x2b, 0xa2, 0x88, 0x94, 0x7f, 0xb1, 0x61, - 0x50, 0xbf, 0x37, 0xa0, 0x89, 0x0f, 0xd3, 0x18, 0xa5, 0xb0, 0x3d, 0x94, - 0xa4, 0xfc, 0x6d, 0xcb, 0x3e, 0x69, 0x57, 0xea, 0xfa, 0x27, 0xba, 0x68, - 0x3d, 0x47, 0x1b, 0x94, 0xaf, 0xec, 0x67, 0x5f, 0xe3, 0xca, 0x53, 0x61, - 0xd5, 0x9f, 0xe8, 0xfa, 0x0b, 0x3a, 0xfc, 0x5d, 0xb3, 0xce, 0x08, 0xe2, - 0x60, 0x49, 0x4b, 0x60, 0x1f, 0x6c, 0xaf, 0x12, 0x56, 0xd8, 0xf4, 0x32, - 0xba, 0x84, 0xdf, 0x2b, 0xbb, 0x54, 0xfc, 0x0f, 0x85, 0xc2, 0xcb, 0xde, - 0x42, 0x6f, 0xed, 0x5f, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, - 0xae, 0x42, 0x60, 0x82, -} - - -var DataHibernate []byte = []byte{ - 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, - 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, 0x48, - 0x08, 0x06, 0x00, 0x00, 0x00, 0x55, 0xed, 0xb3, 0x47, 0x00, 0x00, 0x00, - 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x0b, 0x13, 0x00, 0x00, 0x0b, - 0x13, 0x01, 0x00, 0x9a, 0x9c, 0x18, 0x00, 0x00, 0x00, 0x01, 0x73, 0x52, - 0x47, 0x42, 0x00, 0xae, 0xce, 0x1c, 0xe9, 0x00, 0x00, 0x00, 0x04, 0x67, - 0x41, 0x4d, 0x41, 0x00, 0x00, 0xb1, 0x8f, 0x0b, 0xfc, 0x61, 0x05, 0x00, - 0x00, 0x06, 0x38, 0x49, 0x44, 0x41, 0x54, 0x78, 0x01, 0xed, 0x5c, 0xab, - 0x76, 0xeb, 0x3a, 0x10, 0xdd, 0xe9, 0x2a, 0x08, 0x2c, 0x2c, 0x34, 0x2c, - 0x2c, 0x0c, 0x34, 0x0c, 0x2c, 0x2c, 0x0c, 0x3c, 0xf0, 0xc0, 0xfb, 0x09, - 0x17, 0x1e, 0x78, 0x60, 0x60, 0x60, 0x60, 0xa1, 0x61, 0x60, 0x61, 0xa0, - 0x61, 0x60, 0x60, 0x59, 0xaf, 0x26, 0x1e, 0xe5, 0x2a, 0xca, 0xcc, 0x58, - 0x7e, 0xc4, 0x79, 0x75, 0xaf, 0xe5, 0xe5, 0x46, 0x95, 0x35, 0xf2, 0xd6, - 0x8c, 0x1e, 0xdb, 0xb2, 0x81, 0x1f, 0x98, 0x18, 0xe1, 0x8c, 0xf8, 0xfe, - 0xfe, 0x7e, 0x72, 0xa7, 0xb1, 0x3b, 0xfc, 0x39, 0xc4, 0x96, 0xcf, 0x9b, - 0xd1, 0x68, 0xf4, 0x85, 0x33, 0x61, 0x30, 0x82, 0x1c, 0x19, 0x44, 0xc0, - 0x8b, 0x3b, 0x9e, 0xdd, 0x91, 0x41, 0x26, 0x45, 0x03, 0x11, 0xb4, 0xe1, - 0xa3, 0xa4, 0x63, 0x28, 0xd2, 0x4e, 0x4a, 0x10, 0x93, 0xf2, 0x8a, 0x8a, - 0x98, 0x0c, 0xfd, 0xa2, 0x74, 0xc7, 0x27, 0x2a, 0xb2, 0xb6, 0x38, 0x11, - 0x4e, 0x42, 0x90, 0x23, 0x26, 0x73, 0xa7, 0x09, 0x2a, 0x52, 0x52, 0xbd, - 0xa4, 0x0b, 0x88, 0xa8, 0xe2, 0x14, 0x44, 0xf5, 0x4a, 0x10, 0x13, 0x93, - 0xa3, 0x7f, 0x6f, 0x49, 0x45, 0xef, 0x44, 0xf5, 0x42, 0x10, 0x87, 0x52, - 0x8e, 0xca, 0x6b, 0x2e, 0x01, 0xbd, 0x11, 0xd5, 0x99, 0x20, 0x47, 0x0e, - 0xf5, 0x2f, 0x6f, 0x18, 0x26, 0x94, 0x9a, 0x80, 0xc8, 0x21, 0x92, 0x3e, - 0xd1, 0x01, 0xad, 0x09, 0xba, 0x40, 0xaf, 0xd1, 0xb0, 0x72, 0x24, 0x7d, - 0xa0, 0x25, 0x5a, 0x11, 0xc4, 0xf3, 0x97, 0x77, 0x54, 0x43, 0xf6, 0x35, - 0x80, 0xbc, 0x69, 0xde, 0x26, 0xe4, 0x1a, 0x13, 0xc4, 0xe4, 0xcc, 0x50, - 0xcd, 0x63, 0xae, 0x09, 0xad, 0x48, 0x6a, 0x44, 0x90, 0x23, 0x87, 0x3c, - 0x66, 0x86, 0xcb, 0xeb, 0x6f, 0x52, 0xd1, 0x98, 0xa4, 0x87, 0xd4, 0x8c, - 0x81, 0xe7, 0x5c, 0x2b, 0x39, 0x84, 0xdd, 0x3d, 0xf0, 0xbd, 0x24, 0x21, - 0x89, 0xa0, 0x1b, 0x21, 0xc7, 0xa3, 0x11, 0x49, 0xb5, 0x04, 0xf1, 0x68, - 0x35, 0xc3, 0xf5, 0xf5, 0x39, 0x16, 0xfc, 0x20, 0x53, 0x8b, 0x14, 0x0f, - 0xca, 0x71, 0x5b, 0xe4, 0x78, 0x3c, 0xbb, 0xc6, 0x9f, 0xd6, 0x65, 0x32, - 0x09, 0x72, 0x05, 0xd0, 0x42, 0xf3, 0xd2, 0xe7, 0x39, 0x5d, 0x30, 0xe1, - 0xe5, 0x91, 0x0a, 0x95, 0x20, 0x8e, 0xd1, 0x1c, 0xb7, 0x8f, 0x37, 0xee, - 0x46, 0x44, 0x58, 0x1e, 0x94, 0xe3, 0x36, 0x43, 0x2b, 0x86, 0xe9, 0x08, - 0x22, 0x41, 0xec, 0x3d, 0xaf, 0xb8, 0x1f, 0x4c, 0xb4, 0x51, 0x4d, 0xf3, - 0xa0, 0x1c, 0xf7, 0x87, 0x37, 0x29, 0xf1, 0x88, 0xa0, 0x3b, 0xf4, 0x1e, - 0x8f, 0x4c, 0xea, 0xb0, 0x1f, 0x85, 0x8c, 0x39, 0xba, 0x21, 0x9c, 0xc6, - 0x8f, 0x71, 0xfa, 0xc9, 0x65, 0xbc, 0x6c, 0xe8, 0xd2, 0x6f, 0x92, 0x74, - 0x53, 0x86, 0x09, 0x07, 0x04, 0xb5, 0xf4, 0x1e, 0x12, 0xcf, 0x57, 0x5c, - 0xf0, 0xd1, 0x13, 0x08, 0x1e, 0x21, 0x9e, 0xb9, 0xdc, 0x0c, 0xdd, 0x3b, - 0xfe, 0x53, 0xda, 0x7b, 0x75, 0xd7, 0x17, 0x61, 0x99, 0xa3, 0xa8, 0x70, - 0x2a, 0xf4, 0x2d, 0xb1, 0xb0, 0x56, 0x82, 0x14, 0xdb, 0xc8, 0xd1, 0x9c, - 0xa8, 0xa1, 0xec, 0x7d, 0x38, 0x1b, 0x2b, 0xff, 0x23, 0x26, 0x68, 0x86, - 0x34, 0x3d, 0x99, 0x0a, 0x28, 0xba, 0x3c, 0x7a, 0x71, 0xb6, 0x72, 0xa4, - 0x87, 0x73, 0x27, 0x7b, 0xc1, 0x9c, 0x2e, 0x25, 0x3a, 0xe8, 0x29, 0xc9, - 0xdc, 0xff, 0x78, 0x8c, 0x0a, 0xc9, 0x12, 0x0a, 0xa0, 0x8a, 0x16, 0xe8, - 0x08, 0x2a, 0xc3, 0xd9, 0xa4, 0xe7, 0x5c, 0x96, 0x5c, 0x4b, 0x84, 0x2c, - 0x5c, 0xde, 0x12, 0xdd, 0x6c, 0x91, 0xf7, 0x2d, 0x9d, 0x3d, 0x3a, 0xe7, - 0x35, 0xd9, 0x69, 0x09, 0x32, 0xf6, 0x8d, 0x11, 0xf6, 0x41, 0x29, 0xea, - 0xa0, 0x49, 0x0e, 0xeb, 0x45, 0x74, 0x78, 0x77, 0x26, 0x23, 0xd4, 0x22, - 0x1b, 0x29, 0xbf, 0x4b, 0x5f, 0xbb, 0x6b, 0xe6, 0x90, 0x95, 0x82, 0x5a, - 0xed, 0xa6, 0x85, 0x3d, 0x6a, 0x14, 0xfa, 0x33, 0x87, 0x0e, 0xdf, 0x87, - 0x95, 0xf4, 0x23, 0x24, 0x28, 0x83, 0x8d, 0xb5, 0x46, 0x8e, 0x33, 0x3a, - 0x61, 0xa3, 0x63, 0xe5, 0xff, 0x6a, 0xff, 0x41, 0x37, 0x23, 0x90, 0x44, - 0x37, 0xaa, 0x92, 0xc3, 0xe1, 0x39, 0x69, 0x69, 0xaf, 0xe0, 0xe1, 0x3c, - 0x83, 0x8e, 0xfd, 0x68, 0x16, 0xce, 0x83, 0x2c, 0x0f, 0xa2, 0x0a, 0x7f, - 0x08, 0x15, 0x79, 0xe2, 0x7e, 0x6b, 0x0a, 0x7b, 0x38, 0xa7, 0x16, 0xa6, - 0x35, 0xcf, 0x6f, 0x69, 0xc6, 0xca, 0x2d, 0xbe, 0x0c, 0x92, 0x96, 0x12, - 0x39, 0xe4, 0x31, 0x54, 0x06, 0x8c, 0xc6, 0x88, 0xec, 0x69, 0xba, 0xcf, - 0x92, 0xef, 0x49, 0xc3, 0x9e, 0x8b, 0x54, 0x82, 0xd6, 0x71, 0x85, 0x03, - 0x11, 0x2d, 0x43, 0x3a, 0xe8, 0x9a, 0x5f, 0xfc, 0xa8, 0xe8, 0x00, 0x14, - 0x6e, 0xf8, 0xbf, 0x33, 0x5e, 0xc7, 0xff, 0xe7, 0xd1, 0x68, 0x86, 0x66, - 0xa3, 0x5f, 0x86, 0x4a, 0x1c, 0x1b, 0x47, 0xb6, 0xb6, 0x6c, 0x4b, 0xc3, - 0x21, 0x41, 0x5c, 0x80, 0xd5, 0x22, 0x85, 0x90, 0x96, 0xa3, 0xdd, 0x9c, - 0x86, 0xec, 0xbc, 0x4b, 0xb3, 0x56, 0x7a, 0x3c, 0x23, 0x85, 0x71, 0x30, - 0xfd, 0x90, 0xea, 0xb8, 0x0d, 0x0e, 0x09, 0x54, 0x47, 0x49, 0xf7, 0xb1, - 0xa6, 0x0b, 0x63, 0x4f, 0xaa, 0xf7, 0x20, 0xcb, 0x7b, 0x4a, 0xc1, 0x7b, - 0x32, 0x74, 0x5f, 0x8e, 0xbc, 0xa7, 0xc8, 0x9e, 0x9c, 0xc7, 0x12, 0xb6, - 0x28, 0x1c, 0xff, 0xb8, 0xf3, 0xdc, 0xc8, 0xf3, 0x1a, 0x37, 0x08, 0xdf, - 0xd3, 0xc6, 0xb8, 0xe6, 0x80, 0x20, 0x0b, 0x52, 0x21, 0x7d, 0x88, 0x68, - 0x3b, 0x29, 0xd7, 0xd2, 0x62, 0x02, 0xb9, 0xb7, 0x8f, 0xe5, 0xca, 0x8b, - 0x90, 0x56, 0x1a, 0xf9, 0x77, 0x8d, 0xf7, 0x18, 0xfe, 0x50, 0x20, 0x11, - 0x94, 0x29, 0xf9, 0xbe, 0x6a, 0x0c, 0x3e, 0x09, 0x69, 0x39, 0x84, 0x01, - 0x80, 0x91, 0x43, 0xae, 0x5b, 0x18, 0x52, 0xa1, 0xcd, 0x92, 0xcf, 0x7e, - 0xa8, 0x0e, 0xf1, 0x22, 0xd8, 0xb1, 0x3c, 0xe8, 0x80, 0x20, 0x0b, 0x52, - 0x6c, 0x4b, 0x2d, 0xba, 0xa8, 0x99, 0xb3, 0x50, 0x1f, 0x22, 0x85, 0x25, - 0x69, 0x31, 0x2b, 0x65, 0x10, 0xd0, 0x3c, 0xf5, 0x33, 0xee, 0xab, 0xf8, - 0xfa, 0x39, 0x5f, 0x9b, 0xa1, 0xf2, 0xbc, 0x10, 0x6d, 0xfa, 0xcb, 0xa4, - 0x10, 0x3b, 0xd7, 0xa3, 0x9e, 0x73, 0xd9, 0x3d, 0x40, 0x8a, 0x07, 0x49, - 0x15, 0xfd, 0x12, 0xd2, 0xa7, 0xae, 0xe5, 0xac, 0x10, 0xcb, 0x94, 0x74, - 0x71, 0x9b, 0x0a, 0x4f, 0x20, 0x69, 0x28, 0x96, 0xbc, 0xe8, 0x25, 0xe8, - 0xe0, 0x77, 0xd7, 0x73, 0x7f, 0x35, 0x35, 0xea, 0x2c, 0x85, 0x93, 0xd5, - 0x08, 0x07, 0x4b, 0x8d, 0xa4, 0x49, 0x53, 0x00, 0x9a, 0xa7, 0xc4, 0xe1, - 0x22, 0x75, 0x82, 0x75, 0xd8, 0xd6, 0xac, 0xeb, 0x0a, 0x2e, 0xf7, 0x49, - 0xa8, 0x93, 0xaf, 0x17, 0x0d, 0xd7, 0x44, 0xb0, 0xdf, 0xee, 0xa7, 0x41, - 0x22, 0xc8, 0x0a, 0xbb, 0x1d, 0x27, 0x3e, 0xc4, 0xb6, 0x46, 0x46, 0x89, - 0x20, 0x6b, 0x0e, 0x91, 0x8a, 0x7d, 0x9f, 0xa1, 0x81, 0x17, 0x8c, 0x94, - 0xa7, 0xb5, 0x6a, 0x10, 0xa0, 0x10, 0xd2, 0x32, 0x23, 0x7f, 0xb2, 0x07, - 0x65, 0xe1, 0xea, 0x96, 0x40, 0xab, 0x6b, 0x97, 0x46, 0x5e, 0xd4, 0xc6, - 0x6b, 0xbc, 0xbd, 0x85, 0xb2, 0x9c, 0x88, 0x6d, 0x51, 0xf8, 0x2c, 0x70, - 0xdc, 0xe9, 0x7a, 0xbc, 0xd7, 0x84, 0x36, 0x41, 0x1b, 0x04, 0xac, 0xf9, - 0xdf, 0x2e, 0xff, 0x83, 0xaf, 0x04, 0x6c, 0x92, 0xa4, 0x7e, 0x60, 0x09, - 0xdb, 0xf3, 0x34, 0xf8, 0x85, 0xe8, 0x91, 0xcb, 0x6b, 0x1a, 0x11, 0xcb, - 0x1d, 0x0b, 0xc8, 0x75, 0xf4, 0xfb, 0xac, 0xb5, 0x70, 0x21, 0x3b, 0x85, - 0x90, 0x9e, 0xc3, 0xa8, 0xa3, 0x6f, 0xa4, 0x87, 0xa8, 0x20, 0x0d, 0x47, - 0x8f, 0x45, 0x02, 0xf7, 0x2f, 0x91, 0x0e, 0xca, 0xfb, 0x57, 0x21, 0xc7, - 0x2b, 0x02, 0x13, 0x5e, 0x5a, 0x20, 0xb2, 0x47, 0x1e, 0xfb, 0x17, 0xcd, - 0x1a, 0xa5, 0x44, 0xd5, 0x18, 0xb1, 0x2c, 0x5b, 0x27, 0x2d, 0xef, 0xeb, - 0x37, 0x0a, 0x2e, 0xa2, 0x11, 0xc0, 0x9a, 0x21, 0x1f, 0x28, 0x6d, 0x91, - 0xc1, 0x3a, 0x59, 0xb3, 0x44, 0x35, 0x77, 0xf9, 0x54, 0xae, 0x8f, 0xf7, - 0x1d, 0xa9, 0x5e, 0xd6, 0xc0, 0xde, 0x4a, 0x5a, 0xf4, 0xf2, 0xf5, 0xbf, - 0x60, 0x87, 0xd7, 0x7e, 0xdb, 0x5e, 0x48, 0x10, 0xf5, 0x27, 0xef, 0xb0, - 0x91, 0x22, 0x98, 0x85, 0xb1, 0x4d, 0xad, 0x5d, 0x26, 0x88, 0x5e, 0x33, - 0x1c, 0x0f, 0xb9, 0x26, 0x49, 0x1d, 0xec, 0xe5, 0xa8, 0x57, 0x15, 0xe7, - 0x5e, 0xc5, 0x0c, 0x09, 0xa2, 0x0a, 0xfe, 0x83, 0x7a, 0xf4, 0x22, 0xb9, - 0xb2, 0x4d, 0xf2, 0x84, 0x3a, 0x2d, 0xe9, 0x40, 0x44, 0xef, 0x68, 0x2f, - 0x47, 0x9a, 0x0e, 0xfe, 0xef, 0x91, 0xe4, 0x4a, 0x09, 0xae, 0x80, 0x12, - 0xf5, 0xfa, 0x4e, 0xce, 0x31, 0xdc, 0x7a, 0x1f, 0x72, 0xc3, 0x1d, 0xb2, - 0x53, 0xb6, 0xb7, 0xea, 0x68, 0xef, 0x0d, 0x69, 0xa3, 0x6e, 0x69, 0x3d, - 0xf6, 0xa1, 0x0a, 0x4f, 0x91, 0x06, 0x55, 0xd6, 0xd4, 0xc0, 0x15, 0x9d, - 0xc0, 0x90, 0x4b, 0x2f, 0xc0, 0xde, 0x32, 0xb4, 0x31, 0x12, 0x0a, 0xfc, - 0x8d, 0x66, 0x95, 0xdf, 0xc5, 0x3d, 0xaa, 0xc9, 0xa3, 0xf6, 0x20, 0x2f, - 0xe3, 0xe3, 0x15, 0xdd, 0xd7, 0x58, 0xde, 0x1e, 0x75, 0xc0, 0xa5, 0xf1, - 0xe0, 0xf0, 0xa5, 0x85, 0x3d, 0x2a, 0xeb, 0x8f, 0xea, 0x41, 0x6c, 0x40, - 0x5b, 0x75, 0x37, 0x31, 0xe2, 0x0d, 0x0c, 0xf1, 0xe8, 0xb9, 0x4f, 0x7b, - 0x34, 0xd2, 0x2e, 0xc3, 0x04, 0x69, 0xb1, 0x4a, 0x9e, 0xd0, 0x85, 0xa0, - 0x21, 0x48, 0x39, 0x95, 0xbd, 0x22, 0x4e, 0x38, 0x92, 0x3b, 0x78, 0x78, - 0x2b, 0x71, 0x7f, 0xf8, 0x94, 0x06, 0x01, 0x4d, 0x0f, 0x2a, 0x70, 0x7f, - 0x28, 0xa4, 0x44, 0x91, 0x20, 0xf6, 0xa2, 0x5e, 0xe6, 0x1e, 0x57, 0x02, - 0x75, 0x0a, 0x61, 0x29, 0x8a, 0x05, 0xfa, 0x91, 0x19, 0x2e, 0x1d, 0xbb, - 0xe9, 0x83, 0xf6, 0x4f, 0x95, 0x20, 0x1e, 0xea, 0x96, 0xb8, 0x7d, 0x7c, - 0x8c, 0x8c, 0x5d, 0x23, 0xa6, 0x26, 0x1d, 0x3c, 0xed, 0xbc, 0x55, 0x14, - 0xda, 0x82, 0xd6, 0x23, 0x45, 0xb4, 0x2f, 0x60, 0x4b, 0x21, 0xd7, 0x8a, - 0x4d, 0xca, 0x9a, 0xb2, 0x96, 0x20, 0x76, 0x3f, 0x12, 0xab, 0x5a, 0xad, - 0x83, 0x2e, 0x14, 0x74, 0x2f, 0x8b, 0x94, 0x8c, 0xc9, 0xef, 0x8b, 0x5d, - 0xf1, 0x8b, 0x74, 0x31, 0x6a, 0xf7, 0x1d, 0x85, 0x68, 0xfa, 0x42, 0xdd, - 0xb5, 0x93, 0xd4, 0x88, 0x1c, 0xc2, 0xcf, 0x2b, 0x99, 0x35, 0xb8, 0x97, - 0x97, 0x7a, 0x4b, 0x28, 0x9b, 0xb2, 0xea, 0xd0, 0xe9, 0xbd, 0xf9, 0x04, - 0x1d, 0xfb, 0x12, 0x30, 0xfc, 0x6b, 0xe1, 0x21, 0xbe, 0xdb, 0xef, 0x7b, - 0x3e, 0x35, 0xc8, 0x5b, 0x96, 0xa3, 0xae, 0x3b, 0x64, 0xd1, 0x03, 0x1a, - 0xee, 0x43, 0x1e, 0x02, 0x05, 0x2a, 0xcf, 0xe9, 0xbc, 0x54, 0xea, 0xfb, - 0xe3, 0x26, 0xe7, 0x26, 0x8a, 0xb4, 0xac, 0xcb, 0xfb, 0xb8, 0x49, 0x8c, - 0x81, 0x89, 0x22, 0x2f, 0x21, 0x62, 0x56, 0x7d, 0x12, 0xe3, 0x31, 0xc4, - 0x07, 0x96, 0xbc, 0x36, 0x9c, 0xa1, 0x3f, 0xf8, 0x2f, 0x52, 0x11, 0x31, - 0xeb, 0x3e, 0x42, 0x49, 0xc3, 0xd0, 0x9f, 0xe8, 0xf2, 0x62, 0xba, 0xdf, - 0xbe, 0x92, 0x2a, 0x95, 0x7a, 0x42, 0xe8, 0xa0, 0xc5, 0xe5, 0x60, 0xdf, - 0x35, 0x3b, 0xf7, 0x47, 0xde, 0xfc, 0xc6, 0x83, 0x31, 0x8e, 0xb5, 0x65, - 0xbf, 0x0f, 0xf1, 0x6b, 0x28, 0x32, 0x7e, 0xd0, 0x02, 0xff, 0x01, 0x68, - 0x32, 0xf2, 0xde, 0x6e, 0x41, 0xa4, 0xf6, 0x00, 0x00, 0x00, 0x00, 0x49, - 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82, -} diff --git a/icon/iconwin.go b/icon/iconwin.go deleted file mode 100644 index fa03c28f7..000000000 --- a/icon/iconwin.go +++ /dev/null @@ -1,1631 +0,0 @@ -// +build windows - -// File generated by 2goarray v0.1.0 (http://github.com/cratonica/2goarray) - -package icon - -func GetIcon() []byte { - return Data -} - -func GetIconHiber() []byte { - return DataHibernate -} - -var Data []byte = []byte{ - 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x30, 0x30, 0x00, 0x00, 0x01, 0x00, - 0x20, 0x00, 0xa8, 0x25, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x28, 0x00, - 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x01, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x13, 0x0b, - 0x00, 0x00, 0x13, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xff, 0xff, 0xff, 0x40, 0xff, 0xff, 0xff, 0x6f, 0xff, 0xff, - 0xff, 0xaf, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, - 0xff, 0xdf, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, - 0xff, 0xbf, 0xff, 0xff, 0xff, 0x9f, 0xff, 0xff, 0xff, 0x6f, 0xff, 0xff, - 0xff, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xff, 0xff, 0xff, 0x40, 0xff, 0xff, 0xff, 0xa0, 0xff, 0xff, - 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, 0x9f, 0xff, 0xff, - 0xff, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x60, 0xff, 0xff, - 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 0x5f, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, - 0xff, 0x20, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xbf, 0xff, 0xff, 0xff, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, - 0xff, 0x10, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xbf, 0xff, 0xff, 0xff, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x20, 0xff, 0xff, - 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, 0x20, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xff, 0xff, 0xff, 0x10, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, - 0xff, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xaf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, - 0xff, 0x90, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x40, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xff, 0xff, 0xff, 0x60, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x5f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xdf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, - 0xff, 0x40, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xbf, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x50, 0xff, 0xff, - 0xff, 0x40, 0xff, 0xff, 0xff, 0x50, 0xff, 0xff, 0xff, 0x6f, 0xff, 0xff, - 0xff, 0xbf, 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xaf, 0xff, 0xff, 0xff, 0x6f, 0xff, 0xff, - 0xff, 0x40, 0xff, 0xff, 0xff, 0x40, 0xff, 0xff, 0xff, 0x50, 0xff, 0xff, - 0xff, 0x6f, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, - 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, 0x20, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xff, 0xff, 0xff, 0x10, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, - 0xff, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x40, 0xff, 0xff, - 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x9f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x10, 0xff, 0xff, - 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, - 0xff, 0x30, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xdf, 0xff, 0xff, 0xff, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x40, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xff, 0xff, 0xff, 0x40, 0xff, 0xff, 0xff, 0x90, 0xff, 0xff, - 0xff, 0x9f, 0xff, 0xff, 0xff, 0x9f, 0xff, 0xff, 0xff, 0x60, 0xff, 0xff, - 0xff, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xff, 0xff, 0xff, 0x20, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, - 0xff, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xff, 0xff, 0xff, 0x20, 0xff, 0xff, 0xff, 0x60, 0xff, 0xff, - 0xff, 0x90, 0xff, 0xff, 0xff, 0x9f, 0xff, 0xff, 0xff, 0x90, 0xff, 0xff, - 0xff, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x70, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x20, 0xff, 0xff, - 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xef, 0xff, 0xff, 0xff, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x20, 0xff, 0xff, - 0xff, 0xdf, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0x20, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, - 0xff, 0x70, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 0x20, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, - 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xa0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xff, 0xff, 0xff, 0x20, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, - 0xff, 0x40, 0xff, 0xff, 0xff, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x90, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, - 0xff, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, - 0xff, 0x60, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xef, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xff, 0xff, 0xff, 0x90, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x4f, 0xff, 0xff, 0xff, 0x40, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x9f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x9f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, - 0xff, 0x20, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x5f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, - 0xff, 0x70, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x20, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xff, 0xff, 0xff, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, - 0xff, 0x60, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0xff, 0xff, 0xff, 0x20, 0xff, 0xff, - 0xff, 0x20, 0xff, 0xff, 0xff, 0x20, 0xff, 0xff, 0xff, 0x20, 0xff, 0xff, - 0xff, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0x20, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x10, 0xff, 0xff, - 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0xff, 0xff, 0xff, 0x20, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x20, 0xff, 0xff, - 0xff, 0x50, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x4f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xff, 0xff, 0xff, 0x90, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, - 0xff, 0x50, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0xff, 0xff, 0xff, 0x20, 0xff, 0xff, - 0xff, 0x20, 0xff, 0xff, 0xff, 0x20, 0xff, 0xff, 0xff, 0x20, 0xff, 0xff, - 0xff, 0x70, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, 0x10, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x20, 0xff, 0xff, - 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0xff, 0xff, 0xff, 0x20, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x20, 0xff, 0xff, - 0xff, 0x60, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x4f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xff, 0xff, 0xff, 0x90, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xb0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, - 0xff, 0x30, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, - 0xff, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x20, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xff, 0xff, 0xff, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xdf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x8f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x60, 0xff, 0xff, 0xff, 0x40, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xaf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xff, 0xff, 0xff, 0x20, 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, - 0xff, 0x40, 0xff, 0xff, 0xff, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x9f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, - 0xff, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, - 0xff, 0x40, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x9f, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x20, 0xff, 0xff, - 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xdf, 0xff, 0xff, 0xff, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x20, 0xff, 0xff, - 0xff, 0xdf, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0x20, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, - 0xff, 0x6f, 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0x20, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, - 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x40, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xff, 0xff, 0xff, 0x40, 0xff, 0xff, 0xff, 0x90, 0xff, 0xff, - 0xff, 0x9f, 0xff, 0xff, 0xff, 0x9f, 0xff, 0xff, 0xff, 0x5f, 0xff, 0xff, - 0xff, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xff, 0xff, 0xff, 0x20, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, - 0xff, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xff, 0xff, 0xff, 0x10, 0xff, 0xff, 0xff, 0x6f, 0xff, 0xff, - 0xff, 0x9f, 0xff, 0xff, 0xff, 0x9f, 0xff, 0xff, 0xff, 0x90, 0xff, 0xff, - 0xff, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x90, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, - 0xff, 0x20, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xdf, 0xff, 0xff, 0xff, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, - 0xff, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 0x40, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xff, 0xff, 0xff, 0x20, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x20, 0xff, 0xff, - 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x9f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, - 0xff, 0x50, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xbf, 0xff, 0xff, 0xff, 0x6f, 0xff, 0xff, 0xff, 0x50, 0xff, 0xff, - 0xff, 0x40, 0xff, 0xff, 0xff, 0x40, 0xff, 0xff, 0xff, 0x6f, 0xff, 0xff, - 0xff, 0xa0, 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xef, 0xff, 0xff, 0xff, 0x9f, 0xff, 0xff, 0xff, 0x60, 0xff, 0xff, - 0xff, 0x40, 0xff, 0xff, 0xff, 0x40, 0xff, 0xff, 0xff, 0x40, 0xff, 0xff, - 0xff, 0x6f, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xcf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xff, 0xff, 0xff, 0x60, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x5f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x30, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, - 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xff, 0xff, 0xff, 0x20, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, - 0xff, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x20, 0xff, 0xff, - 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0x20, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, - 0xff, 0x10, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xbf, 0xff, 0xff, 0xff, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, - 0xff, 0x40, 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xdf, 0xff, 0xff, 0xff, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x60, 0xff, 0xff, - 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0x5f, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xff, 0xff, 0xff, 0x40, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xff, - 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, 0x9f, 0xff, 0xff, - 0xff, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, - 0xff, 0x10, 0xff, 0xff, 0xff, 0x40, 0xff, 0xff, 0xff, 0x6f, 0xff, 0xff, - 0xff, 0x9f, 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, - 0xff, 0xdf, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, - 0xff, 0xbf, 0xff, 0xff, 0xff, 0xaf, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, - 0xc0, 0x03, 0xff, 0xff, 0x00, 0x00, 0xff, 0xfe, 0x00, 0x00, 0x7f, 0xff, - 0x00, 0x00, 0xff, 0xf8, 0x00, 0x00, 0x1f, 0xff, 0x00, 0x00, 0xff, 0xe0, - 0x00, 0x00, 0x07, 0xff, 0x00, 0x00, 0xff, 0xc0, 0x00, 0x00, 0x03, 0xff, - 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0xfe, 0x00, - 0x00, 0x00, 0x00, 0x7f, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x3f, - 0x00, 0x00, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0xf8, 0x00, - 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x0f, - 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0xe0, 0x00, - 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x07, - 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0xc0, 0x1f, - 0xc0, 0x03, 0xf8, 0x03, 0x00, 0x00, 0x80, 0x7f, 0xf0, 0x0f, 0xfe, 0x03, - 0x00, 0x00, 0x80, 0xf0, 0x38, 0x1c, 0x0f, 0x01, 0x00, 0x00, 0x81, 0xc0, - 0x1c, 0x38, 0x03, 0x81, 0x00, 0x00, 0x81, 0x80, 0x0e, 0x70, 0x01, 0x81, - 0x00, 0x00, 0x83, 0x80, 0x07, 0xe0, 0x01, 0xc1, 0x00, 0x00, 0x83, 0x00, - 0x03, 0xc0, 0x40, 0xc1, 0x00, 0x00, 0x83, 0x00, 0x01, 0x80, 0xc0, 0xc1, - 0x00, 0x00, 0x83, 0x00, 0x01, 0x80, 0xc0, 0xc1, 0x00, 0x00, 0x83, 0x00, - 0x03, 0xc0, 0x40, 0xc1, 0x00, 0x00, 0x83, 0x80, 0x07, 0xe0, 0x01, 0xc1, - 0x00, 0x00, 0x81, 0x80, 0x0e, 0x70, 0x01, 0x81, 0x00, 0x00, 0x81, 0xc0, - 0x1c, 0x38, 0x03, 0x81, 0x00, 0x00, 0x80, 0xf0, 0x38, 0x1c, 0x0f, 0x01, - 0x00, 0x00, 0xc0, 0x7f, 0xf0, 0x0f, 0xfe, 0x03, 0x00, 0x00, 0xc0, 0x1f, - 0xc0, 0x03, 0xf8, 0x03, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x03, - 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0xe0, 0x00, - 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x0f, - 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0xf8, 0x00, - 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x3f, - 0x00, 0x00, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0xfe, 0x00, - 0x00, 0x00, 0x00, 0x7f, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, - 0x00, 0x00, 0xff, 0xc0, 0x00, 0x00, 0x03, 0xff, 0x00, 0x00, 0xff, 0xe0, - 0x00, 0x00, 0x07, 0xff, 0x00, 0x00, 0xff, 0xf8, 0x00, 0x00, 0x1f, 0xff, - 0x00, 0x00, 0xff, 0xfe, 0x00, 0x00, 0x7f, 0xff, 0x00, 0x00, 0xff, 0xff, - 0x80, 0x03, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x00, 0x00, -} - -var DataHibernate []byte = []byte{ - 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x30, 0x30, 0x00, 0x00, 0x01, 0x00, - 0x20, 0x00, 0xa8, 0x25, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x28, 0x00, - 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x01, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x13, 0x0b, - 0x00, 0x00, 0x13, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xff, 0xff, 0xff, 0x20, 0xff, 0xff, 0xff, 0x38, 0xff, 0xff, - 0xff, 0x58, 0xff, 0xff, 0xff, 0x60, 0xff, 0xff, 0xff, 0x70, 0xff, 0xff, - 0xff, 0x70, 0xff, 0xff, 0xff, 0x70, 0xff, 0xff, 0xff, 0x70, 0xff, 0xff, - 0xff, 0x60, 0xff, 0xff, 0xff, 0x50, 0xff, 0xff, 0xff, 0x38, 0xff, 0xff, - 0xff, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xff, 0xff, 0xff, 0x20, 0xff, 0xff, 0xff, 0x50, 0xff, 0xff, - 0xff, 0x78, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x78, 0xff, 0xff, 0xff, 0x50, 0xff, 0xff, - 0xff, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x30, 0xff, 0xff, - 0xff, 0x70, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x60, 0xff, 0xff, 0xff, 0x30, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, - 0xff, 0x10, 0xff, 0xff, 0xff, 0x70, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x60, 0xff, 0xff, 0xff, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x40, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x38, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, - 0xff, 0x08, 0xff, 0xff, 0xff, 0x60, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x60, 0xff, 0xff, 0xff, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x10, 0xff, 0xff, - 0xff, 0x70, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x68, 0xff, 0xff, 0xff, 0x10, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xff, 0xff, 0xff, 0x08, 0xff, 0xff, 0xff, 0x70, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x68, 0xff, 0xff, - 0xff, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xff, 0xff, 0xff, 0x60, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x58, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, - 0xff, 0x48, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x20, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x10, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x60, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x70, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xff, 0xff, 0xff, 0x30, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xff, 0xff, 0xff, 0x70, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, - 0xff, 0x20, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x60, 0xff, 0xff, 0xff, 0x40, 0xff, 0xff, 0xff, 0x28, 0xff, 0xff, - 0xff, 0x20, 0xff, 0xff, 0xff, 0x28, 0xff, 0xff, 0xff, 0x38, 0xff, 0xff, - 0xff, 0x60, 0xff, 0xff, 0xff, 0x78, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x58, 0xff, 0xff, 0xff, 0x38, 0xff, 0xff, - 0xff, 0x20, 0xff, 0xff, 0xff, 0x20, 0xff, 0xff, 0xff, 0x28, 0xff, 0xff, - 0xff, 0x38, 0xff, 0xff, 0xff, 0x60, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, - 0xff, 0x60, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x68, 0xff, 0xff, 0xff, 0x10, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xff, 0xff, 0xff, 0x08, 0xff, 0xff, 0xff, 0x40, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x48, 0xff, 0xff, - 0xff, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x20, 0xff, 0xff, - 0xff, 0x60, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x08, 0xff, 0xff, - 0xff, 0x78, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, - 0xff, 0x18, 0xff, 0xff, 0xff, 0x70, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x70, 0xff, 0xff, 0xff, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xff, 0xff, 0xff, 0x40, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x20, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x48, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xff, 0xff, 0xff, 0x20, 0xff, 0xff, 0xff, 0x48, 0xff, 0xff, - 0xff, 0x50, 0xff, 0xff, 0xff, 0x50, 0xff, 0xff, 0xff, 0x30, 0xff, 0xff, - 0xff, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xff, 0xff, 0xff, 0x10, 0xff, 0xff, 0xff, 0x70, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x70, 0xff, 0xff, - 0xff, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xff, 0xff, 0xff, 0x10, 0xff, 0xff, 0xff, 0x30, 0xff, 0xff, - 0xff, 0x48, 0xff, 0xff, 0xff, 0x50, 0xff, 0xff, 0xff, 0x48, 0xff, 0xff, - 0xff, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x40, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x20, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x38, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x68, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x10, 0xff, 0xff, - 0xff, 0x70, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x78, 0xff, 0xff, 0xff, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x10, 0xff, 0xff, - 0xff, 0x70, 0xff, 0xff, 0xff, 0x70, 0xff, 0xff, 0xff, 0x10, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, - 0xff, 0x38, 0xff, 0xff, 0xff, 0x70, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x60, 0xff, 0xff, 0xff, 0x10, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, - 0xff, 0x70, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x38, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x50, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xff, 0xff, 0xff, 0x10, 0xff, 0xff, 0xff, 0x70, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x48, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, - 0xff, 0x20, 0xff, 0xff, 0xff, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x48, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x70, 0xff, 0xff, - 0xff, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, - 0xff, 0x30, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x58, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x68, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xff, 0xff, 0xff, 0x60, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xff, 0xff, 0xff, 0x48, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x28, 0xff, 0xff, 0xff, 0x20, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xff, 0xff, 0xff, 0x70, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x70, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, - 0xff, 0x10, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, - 0xff, 0x38, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x10, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xff, 0xff, 0xff, 0x58, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x70, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x70, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x48, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, - 0xff, 0x30, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x20, 0xff, 0xff, 0xff, 0x10, 0xff, 0xff, - 0xff, 0x10, 0xff, 0xff, 0xff, 0x10, 0xff, 0xff, 0xff, 0x10, 0xff, 0xff, - 0xff, 0x38, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x70, 0xff, 0xff, 0xff, 0x10, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x08, 0xff, 0xff, - 0xff, 0x78, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x38, 0xff, 0xff, 0xff, 0x10, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x10, 0xff, 0xff, - 0xff, 0x28, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xff, 0xff, 0xff, 0x48, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x70, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x70, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, - 0xff, 0x28, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x20, 0xff, 0xff, 0xff, 0x10, 0xff, 0xff, - 0xff, 0x10, 0xff, 0xff, 0xff, 0x10, 0xff, 0xff, 0xff, 0x10, 0xff, 0xff, - 0xff, 0x38, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x78, 0xff, 0xff, 0xff, 0x08, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x10, 0xff, 0xff, - 0xff, 0x70, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x38, 0xff, 0xff, 0xff, 0x10, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x10, 0xff, 0xff, - 0xff, 0x30, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xff, 0xff, 0xff, 0x48, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x70, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x70, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x58, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, - 0xff, 0x18, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, - 0xff, 0x38, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x10, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xff, 0xff, 0xff, 0x58, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x70, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x60, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xff, 0xff, 0xff, 0x60, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x48, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xff, 0xff, 0xff, 0x48, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x30, 0xff, 0xff, 0xff, 0x20, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xff, 0xff, 0xff, 0x78, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x58, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xff, 0xff, 0xff, 0x10, 0xff, 0xff, 0xff, 0x78, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x48, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, - 0xff, 0x20, 0xff, 0xff, 0xff, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x50, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x70, 0xff, 0xff, - 0xff, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, - 0xff, 0x20, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x50, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x40, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x10, 0xff, 0xff, - 0xff, 0x68, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x70, 0xff, 0xff, 0xff, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x10, 0xff, 0xff, - 0xff, 0x70, 0xff, 0xff, 0xff, 0x70, 0xff, 0xff, 0xff, 0x10, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, - 0xff, 0x38, 0xff, 0xff, 0xff, 0x78, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x70, 0xff, 0xff, 0xff, 0x10, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, - 0xff, 0x68, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x38, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x20, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x40, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xff, 0xff, 0xff, 0x20, 0xff, 0xff, 0xff, 0x48, 0xff, 0xff, - 0xff, 0x50, 0xff, 0xff, 0xff, 0x50, 0xff, 0xff, 0xff, 0x30, 0xff, 0xff, - 0xff, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xff, 0xff, 0xff, 0x10, 0xff, 0xff, 0xff, 0x70, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x70, 0xff, 0xff, - 0xff, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xff, 0xff, 0xff, 0x08, 0xff, 0xff, 0xff, 0x38, 0xff, 0xff, - 0xff, 0x50, 0xff, 0xff, 0xff, 0x50, 0xff, 0xff, 0xff, 0x48, 0xff, 0xff, - 0xff, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x48, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x20, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, - 0xff, 0x10, 0xff, 0xff, 0xff, 0x70, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x70, 0xff, 0xff, 0xff, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xff, 0xff, 0xff, 0x40, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, - 0xff, 0x58, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x60, 0xff, 0xff, 0xff, 0x20, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xff, 0xff, 0xff, 0x10, 0xff, 0xff, 0xff, 0x40, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x78, 0xff, 0xff, 0xff, 0x40, 0xff, 0xff, - 0xff, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x10, 0xff, 0xff, - 0xff, 0x60, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, - 0xff, 0x28, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x60, 0xff, 0xff, 0xff, 0x38, 0xff, 0xff, 0xff, 0x28, 0xff, 0xff, - 0xff, 0x20, 0xff, 0xff, 0xff, 0x20, 0xff, 0xff, 0xff, 0x38, 0xff, 0xff, - 0xff, 0x50, 0xff, 0xff, 0xff, 0x78, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x78, 0xff, 0xff, 0xff, 0x50, 0xff, 0xff, 0xff, 0x30, 0xff, 0xff, - 0xff, 0x20, 0xff, 0xff, 0xff, 0x20, 0xff, 0xff, 0xff, 0x20, 0xff, 0xff, - 0xff, 0x38, 0xff, 0xff, 0xff, 0x60, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xff, 0xff, 0xff, 0x70, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x68, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xff, 0xff, 0xff, 0x30, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x70, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x18, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x20, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, - 0xff, 0x40, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xff, 0xff, 0xff, 0x68, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xff, 0xff, 0xff, 0x10, 0xff, 0xff, 0xff, 0x70, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x70, 0xff, 0xff, - 0xff, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x10, 0xff, 0xff, - 0xff, 0x70, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x70, 0xff, 0xff, 0xff, 0x10, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, - 0xff, 0x08, 0xff, 0xff, 0xff, 0x60, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x60, 0xff, 0xff, 0xff, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x48, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x40, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, - 0xff, 0x20, 0xff, 0xff, 0xff, 0x68, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x70, 0xff, 0xff, 0xff, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x30, 0xff, 0xff, - 0xff, 0x70, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x70, 0xff, 0xff, 0xff, 0x30, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xff, 0xff, 0xff, 0x20, 0xff, 0xff, 0xff, 0x60, 0xff, 0xff, - 0xff, 0x78, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0x78, 0xff, 0xff, 0xff, 0x50, 0xff, 0xff, - 0xff, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, - 0xff, 0x08, 0xff, 0xff, 0xff, 0x20, 0xff, 0xff, 0xff, 0x38, 0xff, 0xff, - 0xff, 0x50, 0xff, 0xff, 0xff, 0x68, 0xff, 0xff, 0xff, 0x70, 0xff, 0xff, - 0xff, 0x70, 0xff, 0xff, 0xff, 0x70, 0xff, 0xff, 0xff, 0x70, 0xff, 0xff, - 0xff, 0x60, 0xff, 0xff, 0xff, 0x58, 0xff, 0xff, 0xff, 0x40, 0xff, 0xff, - 0xff, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, - 0xc0, 0x03, 0xff, 0xff, 0x00, 0x00, 0xff, 0xfe, 0x00, 0x00, 0x7f, 0xff, - 0x00, 0x00, 0xff, 0xf8, 0x00, 0x00, 0x1f, 0xff, 0x00, 0x00, 0xff, 0xe0, - 0x00, 0x00, 0x07, 0xff, 0x00, 0x00, 0xff, 0xc0, 0x00, 0x00, 0x03, 0xff, - 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0xfe, 0x00, - 0x00, 0x00, 0x00, 0x7f, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x3f, - 0x00, 0x00, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0xf8, 0x00, - 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x0f, - 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0xe0, 0x00, - 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x07, - 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0xc0, 0x1f, - 0xc0, 0x03, 0xf8, 0x03, 0x00, 0x00, 0x80, 0x7f, 0xf0, 0x0f, 0xfe, 0x03, - 0x00, 0x00, 0x80, 0xf0, 0x38, 0x1c, 0x0f, 0x01, 0x00, 0x00, 0x81, 0xc0, - 0x1c, 0x38, 0x03, 0x81, 0x00, 0x00, 0x81, 0x80, 0x0e, 0x70, 0x01, 0x81, - 0x00, 0x00, 0x83, 0x80, 0x07, 0xe0, 0x01, 0xc1, 0x00, 0x00, 0x83, 0x00, - 0x03, 0xc0, 0x40, 0xc1, 0x00, 0x00, 0x83, 0x00, 0x01, 0x80, 0xc0, 0xc1, - 0x00, 0x00, 0x83, 0x00, 0x01, 0x80, 0xc0, 0xc1, 0x00, 0x00, 0x83, 0x00, - 0x03, 0xc0, 0x40, 0xc1, 0x00, 0x00, 0x83, 0x80, 0x07, 0xe0, 0x01, 0xc1, - 0x00, 0x00, 0x81, 0x80, 0x0e, 0x70, 0x01, 0x81, 0x00, 0x00, 0x81, 0xc0, - 0x1c, 0x38, 0x03, 0x81, 0x00, 0x00, 0x80, 0xf0, 0x38, 0x1c, 0x0f, 0x01, - 0x00, 0x00, 0xc0, 0x7f, 0xf0, 0x0f, 0xfe, 0x03, 0x00, 0x00, 0xc0, 0x1f, - 0xc0, 0x03, 0xf8, 0x03, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x03, - 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0xe0, 0x00, - 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x0f, - 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0xf8, 0x00, - 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x3f, - 0x00, 0x00, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0xfe, 0x00, - 0x00, 0x00, 0x00, 0x7f, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, - 0x00, 0x00, 0xff, 0xc0, 0x00, 0x00, 0x03, 0xff, 0x00, 0x00, 0xff, 0xe0, - 0x00, 0x00, 0x07, 0xff, 0x00, 0x00, 0xff, 0xf8, 0x00, 0x00, 0x1f, 0xff, - 0x00, 0x00, 0xff, 0xfe, 0x00, 0x00, 0x7f, 0xff, 0x00, 0x00, 0xff, 0xff, - 0x80, 0x03, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x00, 0x00, -} diff --git a/icon/make_icon.bat b/icon/make_icon.bat deleted file mode 100644 index 93ada6c1b..000000000 --- a/icon/make_icon.bat +++ /dev/null @@ -1,41 +0,0 @@ -@ECHO OFF - -IF "%GOPATH%"=="" GOTO NOGO -IF NOT EXIST %GOPATH%\bin\2goarray.exe GOTO INSTALL -:POSTINSTALL -IF "%1"=="" GOTO NOICO -IF NOT EXIST %1 GOTO BADFILE -ECHO Creating iconwin.go -ECHO // +build windows > iconwin.go -ECHO. >> iconwin.go -TYPE %1 | %GOPATH%\bin\2goarray Data icon >> iconwin.go -GOTO DONE - -:CREATEFAIL -ECHO Unable to create output file -GOTO DONE - -:INSTALL -ECHO Installing 2goarray... -go get github.com/cratonica/2goarray -IF ERRORLEVEL 1 GOTO GETFAIL -GOTO POSTINSTALL - -:GETFAIL -ECHO Failure running go get github.com/cratonica/2goarray. Ensure that go and git are in PATH -GOTO DONE - -:NOGO -ECHO GOPATH environment variable not set -GOTO DONE - -:NOICO -ECHO Please specify a .ico file -GOTO DONE - -:BADFILE -ECHO %1 is not a valid file -GOTO DONE - -:DONE - diff --git a/icon/make_icon.sh b/icon/make_icon.sh deleted file mode 100755 index 7e48c0216..000000000 --- a/icon/make_icon.sh +++ /dev/null @@ -1,41 +0,0 @@ -#/bin/sh - -if [ -z "$GOPATH" ]; then - echo GOPATH environment variable not set - exit -fi - -if [ ! -e "$GOPATH/bin/2goarray" ]; then - echo "Installing 2goarray..." - go get github.com/cratonica/2goarray - if [ $? -ne 0 ]; then - echo Failure executing go get github.com/cratonica/2goarray - exit - fi -fi - -if [ -z "$1" ]; then - echo Please specify a PNG file - exit -fi - -if [ ! -f "$1" ]; then - echo $1 is not a valid file - exit -fi - -if [ -z "$2" ]; then - OUTPUT="$1.go" -else - OUTPUT=$2 -fi - -echo Generating $OUTPUT -echo "// +build linux darwin" > $OUTPUT -echo >> $OUTPUT -cat "$1" | $GOPATH/bin/2goarray Data icon >> $OUTPUT -if [ $? -ne 0 ]; then - echo Failure generating $OUTPUT - exit -fi -echo Finished diff --git a/index/hidefile_default.go b/index/hidefile_default.go new file mode 100644 index 000000000..b777bcd5d --- /dev/null +++ b/index/hidefile_default.go @@ -0,0 +1,23 @@ +// Copyright 2022 Arduino SA +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published +// by the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +//go:build !windows + +package index + +// hideFile will do nothing in this platform +func hideFile(path string) error { + return nil +} diff --git a/index/hidefile_windows.go b/index/hidefile_windows.go new file mode 100644 index 000000000..78a613d46 --- /dev/null +++ b/index/hidefile_windows.go @@ -0,0 +1,33 @@ +// Copyright 2022 Arduino SA +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published +// by the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +package index + +import ( + "syscall" +) + +// hideFile will set the hidden attribute on the file +func hideFile(path string) error { + filenameW, err := syscall.UTF16PtrFromString(path) + if err != nil { + return err + } + err = syscall.SetFileAttributes(filenameW, syscall.FILE_ATTRIBUTE_HIDDEN) + if err != nil { + return err + } + return nil +} diff --git a/index/index.go b/index/index.go new file mode 100644 index 000000000..8e9c01191 --- /dev/null +++ b/index/index.go @@ -0,0 +1,146 @@ +// Copyright 2022 Arduino SA +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published +// by the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +package index + +import ( + "bytes" + "encoding/hex" + "io" + "log" + "net/http" + "net/url" + "path" + "time" + + "github.com/ProtonMail/go-crypto/openpgp" + "github.com/arduino/go-paths-helper" +) + +// Resource represent the index of the system +type Resource struct { + LastRefresh time.Time // Last time the index was downloaded + IndexURL url.URL // The URL used to host the index.json + IndexFile paths.Path // The location of the index on the filesystem + IndexSignature paths.Path // The location of the signature on the filesystem +} + +// gpg --export YOURKEYID --export-options export-minimal,no-export-attributes | hexdump /dev/stdin -v -e '/1 "%02X"' +var publicKeyHex string = "99020D0452FAA2FA011000D0C5604932111750628F171E4E612D599ABEA8E4309888B9B9E87CCBD3AAD014B27454B0AF08E7CDD019DA72D492B6CF882AD7FA8571E985C538582DA096C371E7FCD95B71BC00C0E92BDDC26801F1B11C86814E0EA849E5973F630FC426E6A5F262C22986CB489B5304005202BA729D519725E3E6042C9199C8ECE734052B7376CF40A864679C3594C93203EBFB3F82CD42CD956F961792233B4C7C1A28252360F48F1D6D8662F2CF93F87DB40A99304F61828AF8A3EB07239E984629DC0B1D5C6494C9AFB5C8F8B9A53F1324C254A1AEA4CD9219AB4DF8667653AC9A6E76C3DB37CE8F60B546F78ECA43A90CB82A2278A291D2E98D66753B56F0595280C6E33B274F631846806D97447DD5C9438E7EC85779D9FA2173E088CE6FA156E291FAFD432C4FC2B1EB251DAFD13C721FF6618F696B77C122FB75E3CBCB446FAAA7FFFDD071C81C6C3D2360D495964C623617352915BBB30FA7C903EA096BF01E77FC84C8B51C02EB11BC9F03F19C7E81254F1F786E64A7A9F7F438873583CFA40F49C0F041432EAECCEC7EE9BA465A30320306F0E2E65EBE01E533CBBD8B1C1C04222213D5D05F4B689193DB60A68A6F1FC8B2ADD9E58A104E482AAD3869CCC42236EDC9CBE8561E105837AB6F7A764DCE5D8CB62608E8133F0FDD5F8FAFBE3BC57EE551ADC7386AADD443B331716EC032ACF9C639BF9DFE62301D4F197221F10DEF0011010001B42041726475696E6F204C4C43203C737570706F72744061726475696E6F2E63633E890238041301020022050252FAA2FA021B03060B090807030206150802090A0B0416020301021E01021780000A09107BAF404C2DFAB4AEF8090FFE20C3B36BF786D692969DA2ECFD7BCA3961E735D3CBB5585D7AB04BB8A0B64B64528ED76DB4752FA24523AA1E07B69A6A66CDDAE074A6A572800228194DD5916A956BF22606D866C7FD81F32878E06FEC200DDB0703D805E1A61006EB0B5BDB3AA89C095BB259BD93C7AAE8BDB18468A6DBE30F85BD6A3271F5456EB22BC2BCE99DB3A054D9BCA8F562C01B99E6BF4C2136B62771EEF54CB2AE95F8E2FE543284C37EB77E5104D49939ABAEF323CA5F1A66CA48ED423DBB3A2CFF12792CCA71ACD1E3032186CC7D05A13E0D66A3258E443527AAF921B7EA70C6CC10E2A51FCAB4DD130A10D3D29B1B01FB4207EF6501D3A9186BDB652ECCC9F354599A114DD3F80F9ED3493AC51A5C4F1F3BB59049EE7EC61411E90E02F27789E87B18A860551DFDFFA870E8542F6128E167CE1875C5C5B1128259347B85265487006B173AA631F1CDA1EDC68C54978E1D0FE3B310CC0F49F9AE84F37B1472437B69DA125BAFDC99AE57C2245F70747E1EFD52849C40469247CF13CB679A31AF4700468E09ED1ECFE5A53F67C80C48A0B0C1334FAE9650584DFD406ADA30FFBEED659256D40924432B029BBB24CEF22195D389381F0B1EB964C6494942335E74A373D869D1FB0C7967F30F79D71AB06929CEBB660514C2567284BD9EC32470B263539B3AFF5D3FBA9A275D4665E6B502B4031B63F511C1DFDD16B617A6FB046FCEB018A7A01CEFB9020D0452FAA2FA011000D6DE1747395EB3836103D30FA5CF555F6FBC982FB8B0FD72389CD6E99A88ACA1BCBD8BAD35211929AB5AB7F656BA1AFFA8C9A5AF83436FC8FE36AB403453E3E6EC679371AD81657FA1506956B1165D8887E3FB7EF366EFCCA82EE543E0B22170D0164A6702EF5280398A901CB6262E63C0AE378FD8CA1957EEED9CE48AA3D481BD117A2CA0341C3E16FE20CB6A5C3130A19B364F656CDC45E2216DE7ACFAD429967D71D101CADE10BA64F4075801ED2E9E3A3293114543456A26236CCA459DC7700D2E9C692BADCA9BA0CDE7189CD594B20CA4D1F20A70B02B9B50F70CFC6F7697B1D500702CE29492C7CD28C5D555475788DDE57482BC39E8465A720E25866AC931D5D7030AB61136BF702B25BC850A5089D1E6F0F68B8AE894ADFC3C92BB836888E3DB5A940426DBE7BBC5BDD3DDD6F5123627D1CE6FD1845CC66A920094391BE783069CB05746C0A55DAFC869FDAF0A08F81099E4F4CD07D05C7269C538C341CF1EDB94114B8CD97B44214EA58EEDB93FAB772013A1D77A08B9208082F9617A6CFE39B56F0078406C6267ABF5CF1078C49B1AB9B60EA1451351CF889EF72D7D696B23B22F753B28979AF10237B579A350FA5596A3B22244FA91402562AE530E814EF19A9E3448F465F78C16220DE0663F7B97C7F0EF1629E2F64A76B21BB695A3DE505B22B09B3459A3CE2180424BD67C8482EBD5EBC8128F98634EEE8707001101000189021F041801020009050252FAA2FA021B0C000A09107BAF404C2DFAB4AE050B1000C1434E8CC0D6F8E60E2FB091AA5EA04E7612B29D3823E09914F704DE1835A7B202D3F619183BD3A16439BFA31A6AF342672E8F59184333C4F56D18AF3B7CE8326F655F7C8DD1D4B38A1964E6A4D7550D159CE1B5EC44BC2091B1097CABE724C0E8C4942C2CF82672E3F209322270D133313CF601E07756B705946A45235DAF7294BCD34292D989EFDFDA2F46AF0AEAEC72F55DC6B2940C7C6A409B7FAD3354D5CA30C3E4EE29F9218A56EF8D7FBA2A7BB8E6304110A21DF0C847C4B761CDE408CE156D53091535A800C1C522CA33C71105B11550A145FD0E41B464146B46D46F08DFAEF9B03D313D54A1E4A82E8749895AB78521DAA8E66EEF6F7B17A0CA4B4CBFCB937713B9806269556EBD88AE87996EFAC0846ACBA0D3412FC0A5E90923C261CD443E4D6C1AE93D83166937C5F606A14FD73DB4919A0ED416D4B3163420F57FACCE9C9347BD5501BE3FC830472B64068E5FF5B09E7425030625246720D21608DEE829F84E8365527F764C91DA93372C72AA4054B458104CAFC2BDCED63DC80F36E7BD4BE0D3A19E20E3FED90F80F9E1584853B971B8E847C27027123B9AA19C3E90B41B3A643D3D5BE2FC134ADA8396D072D37E7101B64CE83E1802D0D5DDA9150B6C21564987950C9601FC2147F139C7A9906640A0883981B452F25AF7A0F32FAA2148ECDD9B04B93AFCED00F11AA0E6695C2F92676B8DB9E93172FD7779B9020D04530B05A7011000CAA1A8FF4BF9D0F0AC9EDBCA3B4D26E3E569DFEA04341F3E6ACE23AE5D87D62C2600DFF10B106144A1B52FF8B695A590D65C681F69DEE454800C235160EBE3FC1436193E1278D56C86E2BBB2187BEAAC1E1D04D40A392B1457471D10A2B6BF39CDF35D1A090A9406BCB06BDEF83A12A490C5E17D68884AD2686042669E2B458AD3CC0377DDA9C58D7070CE29A53E0E7C876D61B29A2DE2A9D73F914D0FF3B0E35E2ED361B60A8C3C3D4C7E77E17A939283BFDA2EC5725A2BFAAC18C6A64ACBEC776760D7086EA42BD93031E8B59FB8DFEFF77E5F80DBEB84ADE74B3A6F9E4D0F3140A8D0F576ED00548883C85271AA7F2450D1061F56CB839786038861D5A2473B7F58EBC00D2BB9EFEB1A2DF612A7B9087C326FBB08F2879102253316784272967A886089D61D5AB0FDB33737D35F27C2886ABB4D4E88F541D0BBAD04AEF7BD3ED66A1282B762BD6F8EEDC3760773B157C1A2D4E4586E43B28879C54E7599F9A34E1524E6E7F9B8EA13CC5A2DF5C1920AF74833EDDEC8EB9A8BE33196702DFD656D81ACBBFE3A10DA882EAA3065D9C9476C0A7B66C15D0063CB7AD1A2EB31537CB443F21B81642436943FE6C45E6AF9C2B595D4DFCB64B83F2CA6B4DD536726C6EC4761A340C18E32B2D7210640B9AB1D8E2165C0DD38BC9FD9DB6A30B380DF08C3F10002A6636FDC79CD2312B606F5F116AC665618A56BBE46C494FC7E23C7001101000189043E0418010200090502530B05A7021B02022909107BAF404C2DFAB4AEC15D200419010200060502530B05A7000A091024A26BAD7F29429187700FFE30ED1B7C96B3846AC7B363F9602D2886F7913A9C451C31E043AD75597024D460B59E6A60A6EE3D58E656901237A2465F8402169A816B38170AF550284EB420B7E827386D66852D68125A27FA6770F139EE7FCAEF43000673B7C7D168614877603C875AD593E333AE9237DB77065FB8375CE98FA1BF7FB1733034AAC61F1D23A3EFF8665702C10968C7991458F88D151B3448C7D9334059431A63D30A9C8E636A99D88DA8DB04CB8C64F1183AC873FF0942EF9555B6B3F192AD5F221AC9737F875CCAE21E88EC45CB35E40C0FF1AAF0A8FE44876D93A930A03CC4846A29102C956F39F2AC5808CCBCD7F4868A8E8E8B9A66EA18C275CEF9C371AB0592796ED57D757A3BAB31FF8E3887F6041E61BDA433E7D68CB2D5F28E81F57843D5032D73BF67119C137FC4CE8BEF4F705D690E47A530B1A85B8B6A09A4AE16A2973C11D69031B89BE92B0751DB7FE74F6F1C219C8B93E5C68EC1403856DF28E96E27737A7FB9C80F6EE9EC485A0609DC4EB8DF444F61C76A97F32ADFA2D8B4784DF3ABA4DE1B57894B9CF89934A143451308D73CF79ECC8BF382B8A34F24DC335238D8353767B363F5432D9A81C84F7D2FAB6E36E7188FA911120A905C67342A996251EBECAC13BD543A9B3C2C063AE294FDD15C66D5DD9224F3E936325F525700F2129D0B31CE8CCD4EBA5DEDB89F0A2BFC0C43E732F695161E4F33CE5DED14B1E98654547B110FFF7CBC2BA513721A96DD18964635069343FA8EEF4D492BFA55C930F9C78DF1F7454F1BDD40F4B04BDE9F9B9A9923A303D96D0CBFA361921AFEF13AED098D0CF70E84C0DDB20C58821351D2359B131671AAF5D2484717A4CAF385DB0CC19FBC37A3FC04F4F387D6934C1E84B9C1291231A14F69A1BF6708875C7DE00E3EFE3C7855A2459C96245C5F0D21FC00E87A0C18F80A3B79C0E28EA27493309C535254421BE7CDFBEFB5B44DAEA56B6859430FCCBEE766048F891AD5CB503866B98E521ED69B37E4165012A45E29836E2A0380728C1108E4C8A32EA186E1A855F78DA5506B6CF86DB888A87FAB6E15A90E3416469522DF5BD8872D729B35E6D82C974CD80076C26008015AB216C83FAF64E488F07D2BD01F51B0963F87BE0AB8392B442227BF7215148038B0C55189024D7C1B032DB1B3C56C66953E530C5B323634FC584A476CAD285EF1108011D14D9D180A75A9DFC936AFC7EF9E6C3F3CFEDD894894CE60358E7156B3A65ED7644DEA343A133F5D4DE4D33B74281086A0C20515AC4151CFED93C56DD574E578FDEE72C4115C25CAEC5EAD97C147F27F4EAE67FEFFEA0DC1CDF5D636AC331CB74DF477C9C3B3706F9DAF50C2E13AC8DE8CC9DD3C79E59EC779EE489D915CF22FDC53E3B3C7710FE8368DF11B9ACDF5F3CAE1F43CB7312E5E9F57F248692B3681CBA3E49207878FD33ED2A47CE9CE9B4E4A6EFD8F0AD2CD" + +// Init will initialize the IndexResource structure and will return it. +// It will take indexString as a paramenter. +func Init(indexString string, directory *paths.Path) *Resource { + if directory == nil { + log.Fatalf("configuration directory not provided") + } + if !directory.Exist() { + err := directory.Mkdir() + if err != nil { + log.Fatalf("cannot create config dir: %s", err) + } + err = hideFile(directory.String()) + if err != nil { + log.Printf("cannot make config dir hidden: %s", err) + } + } + indexParsed, err := url.Parse(indexString) + if err != nil { + log.Fatalf("cannot parse provided index: %s", indexString) + } + + indexFile := path.Base(indexParsed.Path) // == package_index.json + signatureFile := indexFile + ".sig" + + var ir = Resource{ + IndexURL: *indexParsed, + IndexFile: *directory.Join(indexFile), + IndexSignature: *directory.Join(signatureFile), + } + + if err := ir.DownloadAndVerify(); err != nil { + log.Fatalf("cannot download index: %s", err) + } + + return &ir +} + +// DownloadAndVerify will download an index file located at IndexURL and verify the signature +// if everything matches the files are overwritten +func (ir *Resource) DownloadAndVerify() error { + // Fetch the index + resp, err := http.Get(ir.IndexURL.String()) + if err != nil { + return err + } + defer resp.Body.Close() + + // Read the index body + body, err := io.ReadAll(resp.Body) + if err != nil { + return err + } + + // Fetch the signature + signature, err := http.Get(ir.IndexURL.String() + ".sig") + if err != nil { + return err + } + defer signature.Body.Close() + + // Read the signature body + signatureBody, err := io.ReadAll(signature.Body) + if err != nil { + return err + } + + err = checkGPGSig(bytes.NewReader(body), bytes.NewReader(signatureBody)) + if err != nil { + return err + } + + // we overwrite the files if the signature is valid + ir.IndexFile.WriteFile(body) + ir.IndexSignature.WriteFile(signatureBody) + + ir.LastRefresh = time.Now() + + return nil +} + +// checkGPGSign takes a signed io.Reader and a detached signature io.Reader +// and returns if the signature is valid +func checkGPGSig(signed, signature io.Reader) error { + publicKeyBin, err := hex.DecodeString(publicKeyHex) + if err != nil { + return err + } + keyring, _ := openpgp.ReadKeyRing(bytes.NewReader(publicKeyBin)) + + _, err = openpgp.CheckDetachedSignature(keyring, signed, signature, nil) + return err +} + +// Read will read the index file. In case it doesn't exists or the latest downloaded +// version is older than 1 hour, it will be downloaded again. +func (ir *Resource) Read() ([]byte, error) { + if !ir.IndexFile.Exist() || time.Since(ir.LastRefresh) > 1*time.Hour { + // Download the file again and save it + if err := ir.DownloadAndVerify(); err != nil { + return nil, err + } + } + return ir.IndexFile.ReadFile() +} diff --git a/index/index_test.go b/index/index_test.go new file mode 100644 index 000000000..4a19a02be --- /dev/null +++ b/index/index_test.go @@ -0,0 +1,25 @@ +package index + +import ( + "net/url" + "testing" + + "github.com/arduino/go-paths-helper" + "github.com/stretchr/testify/require" +) + +func TestInit(t *testing.T) { + indexURL := "https://downloads.arduino.cc/packages/package_index.json" + // Instantiate Index + tempDir := paths.New(t.TempDir()).Join(".arduino-create") + Index := Init(indexURL, tempDir) + require.DirExists(t, tempDir.String()) + fileName := "package_index.json" + signatureName := fileName + ".sig" + parsedURL, _ := url.Parse(indexURL) + require.Equal(t, Index.IndexURL, *parsedURL) + require.Contains(t, Index.IndexFile.String(), fileName) + require.Contains(t, Index.IndexSignature.String(), signatureName) + require.FileExists(t, tempDir.Join(fileName).String()) + require.FileExists(t, tempDir.Join(signatureName).String()) +} diff --git a/info.go b/info.go index e7bad1b7e..88145c02b 100644 --- a/info.go +++ b/info.go @@ -1,3 +1,18 @@ +// Copyright 2022 Arduino SA +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published +// by the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + package main import ( @@ -20,7 +35,7 @@ func infoHandler(c *gin.Context) { "ws": "ws://" + host + port, "wss": "wss://localhost" + portSSL, "origins": origins, - "update_url": updateUrl, + "update_url": updateURL, "os": runtime.GOOS + ":" + runtime.GOARCH, }) } diff --git a/killbrowser.go b/killbrowser.go deleted file mode 100644 index e46b6f5cb..000000000 --- a/killbrowser.go +++ /dev/null @@ -1,49 +0,0 @@ -package main - -import ( - "errors" - "net/http" - - "github.com/arduino/arduino-create-agent/killbrowser" - "github.com/gin-gonic/gin" -) - -func killBrowserHandler(c *gin.Context) { - - var data struct { - Action string `json:"action"` - Process string `json:"process"` - URL string `json:"url"` - } - - c.BindJSON(&data) - - if data.Process != "chrome" && data.Process != "chrom" { - c.JSON(http.StatusBadRequest, errors.New("You can't kill the process"+data.Process)) - return - } - - command, err := browser.Find(data.Process) - - if err != nil { - c.JSON(http.StatusInternalServerError, err.Error()) - return - } - - if data.Action == "kill" || data.Action == "restart" { - _, err := browser.Kill(data.Process) - if err != nil { - c.JSON(http.StatusInternalServerError, err.Error()) - return - } - } - - if data.Action == "restart" { - _, err := browser.Start(command, data.URL) - if err != nil { - c.JSON(http.StatusInternalServerError, err.Error()) - return - } - } - -} diff --git a/killbrowser/killbrowser_darwin.go b/killbrowser/killbrowser_darwin.go deleted file mode 100644 index 4b36295b0..000000000 --- a/killbrowser/killbrowser_darwin.go +++ /dev/null @@ -1,13 +0,0 @@ -package browser - -func Find(process string) ([]byte, error) { - return nil, nil -} - -func Kill(process string) ([]byte, error) { - return nil, nil -} - -func Start(command []byte, url string) ([]byte, error) { - return nil, nil -} diff --git a/killbrowser/killbrowser_linux.go b/killbrowser/killbrowser_linux.go deleted file mode 100644 index badb596bd..000000000 --- a/killbrowser/killbrowser_linux.go +++ /dev/null @@ -1,27 +0,0 @@ -package browser - -import ( - "os/exec" - "strings" - - "github.com/arduino/arduino-create-agent/utilities" -) - -func Find(process string) ([]byte, error) { - ps := exec.Command("ps", "-A", "-o", "command") - grep := exec.Command("grep", process) - head := exec.Command("head", "-n", "1") - - return utilities.PipeCommands(ps, grep, head) -} - -func Kill(process string) ([]byte, error) { - cmd := exec.Command("pkill", "-9", process) - return cmd.Output() -} - -func Start(command []byte, url string) ([]byte, error) { - parts := strings.Split(string(command), " ") - cmd := exec.Command(parts[0], url) - return cmd.Output() -} diff --git a/killbrowser/killbrowser_windows.go b/killbrowser/killbrowser_windows.go deleted file mode 100644 index f2d238453..000000000 --- a/killbrowser/killbrowser_windows.go +++ /dev/null @@ -1,17 +0,0 @@ -package browser - -import "os/exec" - -func Find(process string) ([]byte, error) { - return []byte(process), nil -} - -func Kill(process string) ([]byte, error) { - cmd := exec.Command("Taskkill", "/F", "/IM", process+".exe") - return cmd.Output() -} - -func Start(command []byte, url string) ([]byte, error) { - cmd := exec.Command("cmd", "/C", "start", string(command), url) - return cmd.Output() -} diff --git a/main.go b/main.go index bdfa8af87..41f824b1b 100755 --- a/main.go +++ b/main.go @@ -1,42 +1,59 @@ +// Copyright 2022 Arduino SA +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published +// by the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + // Version 1.82 // Supports Windows, Linux, Mac, and Raspberry Pi, Beagle Bone Black package main import ( + _ "embed" "encoding/json" "flag" - "io/ioutil" + "html/template" + "io" "os" - "os/user" - "path/filepath" + "regexp" "runtime" "runtime/debug" "strconv" "strings" - "text/template" "time" - cors "github.com/andela/gin-cors" + cert "github.com/arduino/arduino-create-agent/certificates" + "github.com/arduino/arduino-create-agent/config" + "github.com/arduino/arduino-create-agent/globals" + "github.com/arduino/arduino-create-agent/index" "github.com/arduino/arduino-create-agent/systray" "github.com/arduino/arduino-create-agent/tools" "github.com/arduino/arduino-create-agent/updater" "github.com/arduino/arduino-create-agent/utilities" v2 "github.com/arduino/arduino-create-agent/v2" + paths "github.com/arduino/go-paths-helper" + cors "github.com/gin-contrib/cors" "github.com/gin-gonic/gin" "github.com/go-ini/ini" - "github.com/kardianos/osext" log "github.com/sirupsen/logrus" //"github.com/sanbornm/go-selfupdate/selfupdate" #included in update.go to change heavily ) var ( - version = "x.x.x-dev" //don't modify it, Jenkins will take care - git_revision = "xxxxxxxx" //don't modify it, Jenkins will take care - embedded_autoextract = false - port string - portSSL string - requiredToolsAPILevel = "v1" + version = "x.x.x-dev" //don't modify it, Jenkins will take care + commit = "xxxxxxxx" //don't modify it, Jenkins will take care + port string + portSSL string ) // regular flags @@ -53,33 +70,43 @@ var ( // iniflags var ( - address = iniConf.String("address", "127.0.0.1", "The address where to listen. Defaults to localhost") - appName = iniConf.String("appName", "", "") - gcType = iniConf.String("gc", "std", "Type of garbage collection. std = Normal garbage collection allowing system to decide (this has been known to cause a stop the world in the middle of a CNC job which can cause lost responses from the CNC controller and thus stalled jobs. use max instead to solve.), off = let memory grow unbounded (you have to send in the gc command manually to garbage collect or you will run out of RAM eventually), max = Force garbage collection on each recv or send on a serial port (this minimizes stop the world events and thus lost serial responses, but increases CPU usage)") - hostname = iniConf.String("hostname", "unknown-hostname", "Override the hostname we get from the OS") - httpProxy = iniConf.String("httpProxy", "", "Proxy server for HTTP requests") - httpsProxy = iniConf.String("httpsProxy", "", "Proxy server for HTTPS requests") - indexURL = iniConf.String("indexURL", "https://downloads.arduino.cc/packages/package_staging_index.json", "The address from where to download the index json containing the location of upload tools") - iniConf = flag.NewFlagSet("ini", flag.ContinueOnError) - logDump = iniConf.String("log", "off", "off = (default)") - origins = iniConf.String("origins", "", "Allowed origin list for CORS") - regExpFilter = iniConf.String("regex", "usb|acm|com", "Regular expression to filter serial port list") - signatureKey = iniConf.String("signatureKey", "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvc0yZr1yUSen7qmE3cxF\nIE12rCksDnqR+Hp7o0nGi9123eCSFcJ7CkIRC8F+8JMhgI3zNqn4cUEn47I3RKD1\nZChPUCMiJCvbLbloxfdJrUi7gcSgUXrlKQStOKF5Iz7xv1M4XOP3JtjXLGo3EnJ1\npFgdWTOyoSrA8/w1rck4c/ISXZSinVAggPxmLwVEAAln6Itj6giIZHKvA2fL2o8z\nCeK057Lu8X6u2CG8tRWSQzVoKIQw/PKK6CNXCAy8vo4EkXudRutnEYHEJlPkVgPn\n2qP06GI+I+9zKE37iqj0k1/wFaCVXHXIvn06YrmjQw6I0dDj/60Wvi500FuRVpn9\ntwIDAQAB\n-----END PUBLIC KEY-----", "Pem-encoded public key to verify signed commandlines") - updateUrl = iniConf.String("updateUrl", "", "") - verbose = iniConf.Bool("v", true, "show debug logging") - crashreport = iniConf.Bool("crashreport", false, "enable crashreport logging") + address = iniConf.String("address", "127.0.0.1", "The address where to listen. Defaults to localhost") + appName = iniConf.String("appName", "", "") + gcType = iniConf.String("gc", "std", "Type of garbage collection. std = Normal garbage collection allowing system to decide (this has been known to cause a stop the world in the middle of a CNC job which can cause lost responses from the CNC controller and thus stalled jobs. use max instead to solve.), off = let memory grow unbounded (you have to send in the gc command manually to garbage collect or you will run out of RAM eventually), max = Force garbage collection on each recv or send on a serial port (this minimizes stop the world events and thus lost serial responses, but increases CPU usage)") + hostname = iniConf.String("hostname", "unknown-hostname", "Override the hostname we get from the OS") + httpProxy = iniConf.String("httpProxy", "", "Proxy server for HTTP requests") + httpsProxy = iniConf.String("httpsProxy", "", "Proxy server for HTTPS requests") + indexURL = iniConf.String("indexURL", "https://downloads.arduino.cc/packages/package_index.json", "The address from where to download the index json containing the location of upload tools") + iniConf = flag.NewFlagSet("ini", flag.ContinueOnError) + logDump = iniConf.String("log", "off", "off = (default)") + origins = iniConf.String("origins", "", "Allowed origin list for CORS") + portsFilterRegexp = iniConf.String("regex", "usb|acm|com", "Regular expression to filter serial port list") + signatureKey = iniConf.String("signatureKey", globals.ArduinoSignaturePubKey, "Pem-encoded public key to verify signed commandlines") + updateURL = iniConf.String("updateUrl", "", "") + verbose = iniConf.Bool("v", true, "show debug logging") + crashreport = iniConf.Bool("crashreport", false, "enable crashreport logging") + autostartMacOS = iniConf.Bool("autostartMacOS", true, "the Arduino Create Agent is able to start automatically after login on macOS (launchd agent)") + installCerts = iniConf.Bool("installCerts", false, "install the HTTPS certificate for Safari and keep it updated") ) +// the ports filter provided by the user via the -regex flag, if any +var portsFilter *regexp.Regexp + +var homeTemplate = template.Must(template.New("home").Parse(homeTemplateHTML)) + +// If you navigate to this server's homepage, you'll get this HTML +// so you can directly interact with the serial port server +// +//go:embed home.html +var homeTemplateHTML string + // global clients var ( - Tools tools.Tools + Tools *tools.Tools Systray systray.Systray + Index *index.Resource ) -type NullWriter int - -func (NullWriter) Write([]byte) (int, error) { return 0, nil } - type logWriter struct{} func (u *logWriter) Write(p []byte) (n int, err error) { @@ -87,7 +114,7 @@ func (u *logWriter) Write(p []byte) (n int, err error) { return len(p), nil } -var logger_ws logWriter +var loggerWs logWriter func homeHandler(c *gin.Context) { homeTemplate.Execute(c.Writer, c.Request.Host) @@ -107,117 +134,161 @@ func main() { flag.Parse() // Generate certificates - if *genCert == true { - generateCertificates() + if *genCert { + cert.GenerateCertificates(config.GetCertificatesDir()) os.Exit(0) } + // Check if certificates made with Agent <=1.2.7 needs to be moved over the new location + cert.MigrateCertificatesGeneratedWithOldAgentVersions(config.GetCertificatesDir()) // Launch main loop in a goroutine go loop() // SetupSystray is the main thread + configDir := config.GetDefaultConfigDir() Systray = systray.Systray{ Hibernate: *hibernate, - Version: version + "-" + git_revision, + Version: version + "-" + commit, DebugURL: func() string { return "http://" + *address + port }, AdditionalConfig: *additionalConfig, + ConfigDir: configDir, } - path, err := osext.Executable() - if err != nil { + if src, err := os.Executable(); err != nil { panic(err) - } - - // If the executable is temporary, copy it to the full path, then restart - if strings.Contains(path, "-temp") { - newPath := updater.BinPath(path) - err := copyExe(path, newPath) - if err != nil { - log.Println("Copy error: ", err) - panic(err) - } - - Systray.Update(newPath) + } else if restartPath := updater.Start(src); restartPath != "" { + Systray.RestartWith(restartPath) } else { - // Otherwise copy to a path with -temp suffix - err := copyExe(path, updater.TempPath(path)) - if err != nil { - panic(err) - } Systray.Start() } } -func copyExe(from, to string) error { - data, err := ioutil.ReadFile(from) - if err != nil { - log.Println("Cannot read file: ", from) - return err - } - err = ioutil.WriteFile(to, data, 0755) - if err != nil { - log.Println("Cannot write file: ", to) - return err - } - return nil -} - func loop() { if *hibernate { return } - // autoextract self - src, _ := osext.Executable() - dest := filepath.Dir(src) - - if embedded_autoextract { - // save the config.ini (if it exists) - if _, err := os.Stat(filepath.Join(dest, "config.ini")); os.IsNotExist(err) { - log.Println("First run, unzipping self") - err := utilities.Unzip(src, dest) - log.Println("Self extraction, err:", err) - } + + log.SetLevel(log.InfoLevel) + log.SetOutput(os.Stdout) + + // We used to install the agent in $HOME/Applications before versions <= 1.2.7-ventura + // With version > 1.3.0 we changed the install path of the agent in /Applications. + // If we are updating manually from 1.2.7 to 1.3.0 we have to uninstall the old agent manually first. + // This check will inform the user if he needs to run the uninstall first + if runtime.GOOS == "darwin" && oldInstallExists() { + utilities.UserPrompt("Old agent installation of the Arduino Create Agent found, please uninstall it before launching the new one", "\"OK\"", "OK", "OK", "Error") + os.Exit(0) } - // Parse ini config - args, err := parseIni(filepath.Join(dest, "config.ini")) - if err != nil { - panic(err) + logger := func(msg string) { + mapD := map[string]string{"DownloadStatus": "Pending", "Msg": msg} + mapB, _ := json.Marshal(mapD) + h.broadcastSys <- mapB } - err = iniConf.Parse(args) - if err != nil { - panic(err) + + // Let's handle the config + configDir := config.GetDefaultConfigDir() + var configPath *paths.Path + + // see if the env var is defined, if it is take the config from there, this will override the default path + if envConfig := os.Getenv("ARDUINO_CREATE_AGENT_CONFIG"); envConfig != "" { + configPath = paths.New(envConfig) + if configPath.NotExist() { + log.Panicf("config from env var %s does not exists", envConfig) + } + log.Infof("using config from env variable: %s", configPath) + } else if defaultConfigPath := configDir.Join("config.ini"); defaultConfigPath.Exist() { + // by default take the config from the ~/.arduino-create/config.ini file + configPath = defaultConfigPath + log.Infof("using config from default: %s", configPath) + } else { + // Fall back to the old config.ini location + src, _ := os.Executable() + oldConfigPath := paths.New(src).Parent().Join("config.ini") + if oldConfigPath.Exist() { + err := oldConfigPath.CopyTo(defaultConfigPath) + if err != nil { + log.Errorf("cannot copy old %s, to %s, generating new config", oldConfigPath, configPath) + } else { + configPath = defaultConfigPath + log.Infof("copied old %s, to %s", oldConfigPath, configPath) + } + } + } + if configPath == nil { + configPath = config.GenerateConfig(configDir) } - // Parse additional ini config - args, err = parseIni(filepath.Join(dest, *additionalConfig)) + // if the default browser is Safari, prompt the user to install HTTPS certificates + // and eventually install them + if runtime.GOOS == "darwin" { + if exist, err := installCertsKeyExists(configPath.String()); err != nil { + log.Panicf("config.ini cannot be parsed: %s", err) + } else if !exist { + if cert.CertInKeychain() || config.CertsExist() { + err = config.SetInstallCertsIni(configPath.String(), "true") + if err != nil { + log.Panicf("config.ini cannot be parsed: %s", err) + } + } else if cert.GetDefaultBrowserName() == "Safari" { + if promptInstallCertsSafari() { + err = config.SetInstallCertsIni(configPath.String(), "true") + if err != nil { + log.Panicf("config.ini cannot be parsed: %s", err) + } + cert.GenerateAndInstallCertificates(config.GetCertificatesDir()) + } else { + err = config.SetInstallCertsIni(configPath.String(), "false") + if err != nil { + log.Panicf("config.ini cannot be parsed: %s", err) + } + } + } + } + } + + // Parse the config.ini + args, err := parseIni(configPath.String()) if err != nil { - panic(err) + log.Panicf("config.ini cannot be parsed: %s", err) } err = iniConf.Parse(args) if err != nil { - panic(err) + log.Panicf("cannot parse arguments: %s", err) } + Systray.SetCurrentConfigFile(configPath) - // Instantiate Tools - usr, _ := user.Current() - directory := filepath.Join(usr.HomeDir, ".arduino-create") - Tools = tools.Tools{ - Directory: directory, - IndexURL: *indexURL, - Logger: func(msg string) { - mapD := map[string]string{"DownloadStatus": "Pending", "Msg": msg} - mapB, _ := json.Marshal(mapD) - h.broadcastSys <- mapB - }, + // Parse additional ini config if defined + if len(*additionalConfig) > 0 { + additionalConfigPath := paths.New(*additionalConfig) + if additionalConfigPath.NotExist() { + log.Infof("additional config file not found in %s", additionalConfigPath.String()) + } else { + args, err = parseIni(additionalConfigPath.String()) + if err != nil { + log.Panicf("additional config cannot be parsed: %s", err) + } + err = iniConf.Parse(args) + if err != nil { + log.Panicf("cannot parse arguments: %s", err) + } + log.Infof("using additional config from %s", additionalConfigPath.String()) + } } - Tools.Init(requiredToolsAPILevel) - log.SetLevel(log.InfoLevel) + if signatureKey == nil || len(*signatureKey) == 0 { + log.Panicf("signature public key should be set") + } + signaturePubKey, err := utilities.ParseRsaPublicKey([]byte(*signatureKey)) + if err != nil { + log.Panicf("cannot parse signature key '%s'. %s", *signatureKey, err) + } - log.SetOutput(os.Stdout) + // Instantiate Index and Tools + Index = index.Init(*indexURL, config.GetDataDir()) + Tools = tools.New(config.GetDataDir(), Index, logger, signaturePubKey) // see if we are supposed to wait 5 seconds if *isLaunchSelf { @@ -272,39 +343,26 @@ func loop() { } // see if they provided a regex filter - if len(*regExpFilter) > 0 { - log.Printf("You specified a serial port regular expression filter: %v\n", *regExpFilter) - } - - // list serial ports - portList, _ := GetList(false) - log.Println("Your serial ports:") - if len(portList) == 0 { - log.Println("\tThere are no serial ports to list.") - } - for _, element := range portList { - log.Printf("\t%v\n", element) - + if len(*portsFilterRegexp) > 0 { + log.Printf("You specified a serial port regular expression filter: %v\n", *portsFilterRegexp) + if filter, err := regexp.Compile("(?i)" + *portsFilterRegexp); err != nil { + log.Panicf("Error compiling the regex filter: %v\n", err) + } else { + portsFilter = filter + } } if !*verbose { - log.Println("You can enter verbose mode to see all logging by starting with the -v command line switch.") - log.SetOutput(new(NullWriter)) //route all logging to nullwriter + log.Println("You can enter verbose mode to see all logging by setting the v key in the configuration file to true.") + log.SetOutput(io.Discard) } // save crashreport to file if *crashreport { logFilename := "crashreport_" + time.Now().Format("20060102150405") + ".log" - currDir, err := osext.ExecutableFolder() - if err != nil { - panic(err) - } // handle logs directory creation - logsDir := filepath.Join(currDir, "logs") - if _, err := os.Stat(logsDir); os.IsNotExist(err) { - os.Mkdir(logsDir, 0700) - } - logFile, err := os.OpenFile(filepath.Join(logsDir, logFilename), os.O_WRONLY|os.O_CREATE|os.O_SYNC|os.O_APPEND, 0644) + logsDir := config.GetLogsDir() + logFile, err := os.OpenFile(logsDir.Join(logFilename).String(), os.O_WRONLY|os.O_CREATE|os.O_SYNC|os.O_APPEND, 0644) if err != nil { log.Print("Cannot create file used for crash-report") } else { @@ -312,21 +370,67 @@ func loop() { } } + // macos agent launchd autostart + if runtime.GOOS == "darwin" { + if *autostartMacOS { + config.InstallPlistFile() + } else { + config.UninstallPlistFile() + } + } + + // check if the HTTPS certificates are expired or expiring and prompt the user to update them on macOS + if runtime.GOOS == "darwin" && *installCerts { + if cert.CertInKeychain() || config.CertsExist() { + certDir := config.GetCertificatesDir() + if expired, err := cert.IsExpired(); err != nil { + log.Errorf("cannot check if certificates are expired something went wrong: %s", err) + } else if expired { + buttonPressed := utilities.UserPrompt("The Arduino Agent needs a local HTTPS certificate to work correctly with Safari.\nYour certificate is expired or close to expiration. Do you want to update it?", "{\"Do not update\", \"Update the certificate for Safari\"}", "Update the certificate for Safari", "Update the certificate for Safari", "Arduino Agent: Update certificate") + if buttonPressed { + err := cert.UninstallCertificates() + if err != nil { + log.Errorf("cannot uninstall certificates something went wrong: %s", err) + } else { + cert.DeleteCertificates(certDir) + cert.GenerateAndInstallCertificates(certDir) + } + } else { + err = config.SetInstallCertsIni(configPath.String(), "false") + if err != nil { + log.Panicf("config.ini cannot be parsed: %s", err) + } + } + } + } else if promptInstallCertsSafari() { + // installing the certificates from scratch at this point should only happen if + // something went wrong during previous installation attempts + cert.GenerateAndInstallCertificates(config.GetCertificatesDir()) + } else { + err = config.SetInstallCertsIni(configPath.String(), "false") + if err != nil { + log.Panicf("config.ini cannot be parsed: %s", err) + } + } + } + + // launch the discoveries for the running system + go serialPorts.Run() // launch the hub routine which is the singleton for the websocket server go h.run() - // launch our serial port routine - go sh.run() // launch our dummy data routine //go d.run() - go discoverLoop() - r := gin.New() socketHandler := wsHandler().ServeHTTP extraOrigins := []string{ "https://create.arduino.cc", + "https://cloud.arduino.cc", + "https://app.arduino.cc", + "https://board-registration.arduino.cc", + "https://*.app.arduino.cc", } for i := 8990; i < 9001; i++ { @@ -334,40 +438,47 @@ func loop() { extraOrigins = append(extraOrigins, "http://localhost:"+port) extraOrigins = append(extraOrigins, "https://localhost:"+port) extraOrigins = append(extraOrigins, "http://127.0.0.1:"+port) + extraOrigins = append(extraOrigins, "https://127.0.0.1:"+port) } - r.Use(cors.Middleware(cors.Config{ - Origins: *origins + ", " + strings.Join(extraOrigins, ", "), - Methods: "GET, PUT, POST, DELETE", - RequestHeaders: "Origin, Authorization, Content-Type", - ExposedHeaders: "", - MaxAge: 50 * time.Second, - Credentials: true, - ValidateHeaders: false, + allowOrigins := strings.Split(*origins, ",") + // We need to trim possible spaces from the origins, otherwise the CORS middleware + // validation might not work as expected + for i := range allowOrigins { + allowOrigins[i] = strings.TrimSpace(allowOrigins[i]) + } + allowOrigins = append(allowOrigins, extraOrigins...) + r.Use(cors.New(cors.Config{ + AllowWildcard: true, + AllowOrigins: allowOrigins, + AllowMethods: []string{"PUT", "GET", "POST", "DELETE"}, + AllowHeaders: []string{"Origin", "Authorization", "Content-Type"}, + ExposeHeaders: []string{}, + AllowCredentials: true, + MaxAge: 50 * time.Second, + AllowPrivateNetwork: true, })) r.LoadHTMLFiles("templates/nofirefox.html") r.GET("/", homeHandler) - r.GET("/certificate.crt", certHandler) - r.DELETE("/certificate.crt", deleteCertHandler) - r.POST("/upload", uploadHandler) + r.POST("/upload", uploadHandler(signaturePubKey)) r.GET("/socket.io/", socketHandler) r.POST("/socket.io/", socketHandler) r.Handle("WS", "/socket.io/", socketHandler) r.Handle("WSS", "/socket.io/", socketHandler) r.GET("/info", infoHandler) - r.POST("/killbrowser", killBrowserHandler) r.POST("/pause", pauseHandler) r.POST("/update", updateHandler) // Mount goa handlers - goa := v2.Server(directory) + goa := v2.Server(config.GetDataDir().String(), Index, signaturePubKey) r.Any("/v2/*path", gin.WrapH(goa)) go func() { // check if certificates exist; if not, use plain http - if _, err := os.Stat(filepath.Join(dest, "cert.pem")); os.IsNotExist(err) { + certsDir := config.GetCertificatesDir() + if certsDir.Join("cert.pem").NotExist() { log.Error("Could not find HTTPS certificate. Using plain HTTP only.") return } @@ -378,7 +489,7 @@ func loop() { for i < end { i = i + 1 portSSL = ":" + strconv.Itoa(i) - if err := r.RunTLS(*address+portSSL, filepath.Join(dest, "cert.pem"), filepath.Join(dest, "key.pem")); err != nil { + if err := r.RunTLS(*address+portSSL, certsDir.Join("cert.pem").String(), certsDir.Join("key.pem").String()); err != nil { log.Printf("Error trying to bind to port: %v, so exiting...", err) continue } else { @@ -406,245 +517,20 @@ func loop() { }() } -var homeTemplate = template.Must(template.New("home").Parse(homeTemplateHtml)) - -// If you navigate to this server's homepage, you'll get this HTML -// so you can directly interact with the serial port server -const homeTemplateHtml = ` - - -Arduino Create Agent Debug Console - - - - - - - - -
-

-            
-        
- - -` func parseIni(filename string) (args []string, err error) { - cfg, err := ini.LoadSources(ini.LoadOptions{IgnoreInlineComment: false}, filename) + cfg, err := ini.LoadSources(ini.LoadOptions{IgnoreInlineComment: false, AllowPythonMultilineValues: true}, filename) if err != nil { return nil, err } @@ -667,3 +553,15 @@ func parseIni(filename string) (args []string, err error) { return args, nil } + +func installCertsKeyExists(filename string) (bool, error) { + cfg, err := ini.LoadSources(ini.LoadOptions{IgnoreInlineComment: false, AllowPythonMultilineValues: true}, filename) + if err != nil { + return false, err + } + return cfg.Section("").HasKey("installCerts"), nil +} + +func promptInstallCertsSafari() bool { + return utilities.UserPrompt("The Arduino Agent needs a local HTTPS certificate to work correctly with Safari.\nIf you use Safari, you need to install it.", "{\"Do not install\", \"Install the certificate for Safari\"}", "Install the certificate for Safari", "Install the certificate for Safari", "Arduino Agent: Install certificate") +} diff --git a/main_test.go b/main_test.go new file mode 100644 index 000000000..1387fd221 --- /dev/null +++ b/main_test.go @@ -0,0 +1,226 @@ +// Copyright 2022 Arduino SA +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published +// by the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +package main + +import ( + "bytes" + "crypto/x509" + "encoding/base64" + "encoding/json" + "encoding/pem" + "fmt" + "io" + "net/http" + "net/http/httptest" + "path/filepath" + "testing" + + "github.com/arduino/arduino-create-agent/config" + "github.com/arduino/arduino-create-agent/gen/tools" + "github.com/arduino/arduino-create-agent/globals" + "github.com/arduino/arduino-create-agent/index" + "github.com/arduino/arduino-create-agent/upload" + "github.com/arduino/arduino-create-agent/utilities" + v2 "github.com/arduino/arduino-create-agent/v2" + "github.com/gin-gonic/gin" + "github.com/stretchr/testify/require" +) + +func TestValidSignatureKey(t *testing.T) { + testfile := filepath.Join("tests", "testdata", "test.ini") + args, err := parseIni(testfile) + require.NoError(t, err) + require.NotNil(t, args) + err = iniConf.Parse(args) + require.NoError(t, err) + print(*signatureKey) + block, _ := pem.Decode([]byte(*signatureKey)) + require.NotNil(t, block) + key, err := x509.ParsePKIXPublicKey(block.Bytes) + require.NoError(t, err) + require.NotNil(t, key) +} + +func TestUploadHandlerAgainstEvilFileNames(t *testing.T) { + r := gin.New() + r.POST("/", uploadHandler(utilities.MustParseRsaPublicKey([]byte(globals.ArduinoSignaturePubKey)))) + ts := httptest.NewServer(r) + + uploadEvilFileName := Upload{ + Port: "/dev/ttyACM0", + Board: "arduino:avr:uno", + Extra: upload.Extra{Network: true}, + Hex: []byte("test"), + Filename: "../evil.txt", + ExtraFiles: []additionalFile{{Hex: []byte("test"), Filename: "../evil.txt"}}, + } + uploadEvilExtraFile := Upload{ + Port: "/dev/ttyACM0", + Board: "arduino:avr:uno", + Extra: upload.Extra{Network: true}, + Hex: []byte("test"), + Filename: "file.txt", + ExtraFiles: []additionalFile{{Hex: []byte("test"), Filename: "../evil.txt"}}, + } + + for _, request := range []Upload{uploadEvilFileName, uploadEvilExtraFile} { + payload, err := json.Marshal(request) + require.NoError(t, err) + + resp, err := http.Post(ts.URL, "encoding/json", bytes.NewBuffer(payload)) + require.NoError(t, err) + require.Equal(t, http.StatusBadRequest, resp.StatusCode) + + body, err := io.ReadAll(resp.Body) + require.NoError(t, err) + require.Contains(t, string(body), "unsafe path join") + } +} + +func TestUploadHandlerAgainstBase64WithoutPaddingMustFail(t *testing.T) { + r := gin.New() + r.POST("/", uploadHandler(utilities.MustParseRsaPublicKey([]byte(globals.ArduinoSignaturePubKey)))) + ts := httptest.NewServer(r) + defer ts.Close() + + // When calling the `BindJSON` func, when a json field will be Unmarshaled + // in a []byte type, we expect to receive a base64 padded string in input. + // In case we receive a base64 unpadded string BindJSON fails. + // The expectation here is that the upload handler won't continue with the + // upload operation. + base64ContentWithoutPadding := base64.RawStdEncoding.EncodeToString([]byte("test")) + payload := fmt.Sprintf(`{"hex": "%s"}`, base64ContentWithoutPadding) + + resp, err := http.Post(ts.URL, "encoding/json", bytes.NewBufferString(payload)) + require.NoError(t, err) + require.Equal(t, http.StatusBadRequest, resp.StatusCode) + + defer resp.Body.Close() + body, err := io.ReadAll(resp.Body) + require.NoError(t, err) + require.Contains(t, string(body), "err with the payload. illegal base64 data at input") +} + +func TestInstallToolV2(t *testing.T) { + + indexURL := "https://downloads.arduino.cc/packages/package_index.json" + // Instantiate Index + Index := index.Init(indexURL, config.GetDataDir()) + + r := gin.New() + goa := v2.Server(config.GetDataDir().String(), Index, utilities.MustParseRsaPublicKey([]byte(globals.ArduinoSignaturePubKey))) + r.Any("/v2/*path", gin.WrapH(goa)) + ts := httptest.NewServer(r) + + type test struct { + request tools.ToolPayload + responseCode int + responseBody string + } + + bossacURL := "http://downloads.arduino.cc/tools/bossac-1.7.0-arduino3-linux64.tar.gz" + bossacChecksum := "SHA-256:1ae54999c1f97234a5c603eb99ad39313b11746a4ca517269a9285afa05f9100" + bossacSignature := "382898a97b5a86edd74208f10107d2fecbf7059ffe9cc856e045266fb4db4e98802728a0859cfdcda1c0b9075ec01e42dbea1f430b813530d5a6ae1766dfbba64c3e689b59758062dc2ab2e32b2a3491dc2b9a80b9cda4ae514fbe0ec5af210111b6896976053ab76bac55bcecfcececa68adfa3299e3cde6b7f117b3552a7d80ca419374bb497e3c3f12b640cf5b20875416b45e662fc6150b99b178f8e41d6982b4c0a255925ea39773683f9aa9201dc5768b6fc857c87ff602b6a93452a541b8ec10ca07f166e61a9e9d91f0a6090bd2038ed4427af6251039fb9fe8eb62ec30d7b0f3df38bc9de7204dec478fb86f8eb3f71543710790ee169dce039d3e0" + bossacInstallURLOK := tools.ToolPayload{ + Name: "bossac", + Version: "1.7.0-arduino3", + Packager: "arduino", + URL: &bossacURL, + Checksum: &bossacChecksum, + Signature: &bossacSignature, + } + + esptoolURL := "https://github.com/earlephilhower/esp-quick-toolchain/releases/download/2.5.0-3/x86_64-linux-gnu.esptool-f80ae31.tar.gz" + esptoolChecksum := "SHA-256:bded1dca953377838b6086a9bcd40a1dc5286ba5f69f2372c22a1d1819baad24" + esptoolSignature := "852b58871419ce5e5633ecfaa72c0f0fa890ceb51164b362b8133bc0e3e003a21cec48935b8cdc078f4031219cbf17fb7edd9d7c9ca8ed85492911c9ca6353c9aa4691eb91fda99563a6bd49aeca0d9981fb05ec76e45c6024f8a6822862ad1e34ddc652fbbf4fa909887a255d4f087398ec386577efcec523c21203be3d10fc9e9b0f990a7536875a77dc2bc5cbffea7734b62238e31719111b718bacccebffc9be689545540e81d23b81caa66214376f58a0d6a45cf7efc5d3af62ab932b371628162fffe403906f41d5534921e5be081c5ac2ecc9db5caec03a105cc44b00ce19a95ad079843501eb8182e0717ce327867380c0e39d2b48698547fc1d0d66" + esptoolInstallURLOK := tools.ToolPayload{ + Name: "esptool", + Version: "2.5.0-3-20ed2b9", + Packager: "esp8266", + URL: &esptoolURL, + Checksum: &esptoolChecksum, + Signature: &esptoolSignature, + } + + wrongSignature := "wr0ngs1gn4tur3" + bossacInstallWrongSig := tools.ToolPayload{ + Name: "bossac", + Version: "1.7.0-arduino3", + Packager: "arduino", + URL: &bossacURL, + Checksum: &bossacChecksum, + Signature: &wrongSignature, + } + + wrongChecksum := "wr0ngch3cksum" + bossacInstallWrongCheck := tools.ToolPayload{ + Name: "bossac", + Version: "1.7.0-arduino3", + Packager: "arduino", + URL: &bossacURL, + Checksum: &wrongChecksum, + Signature: &bossacSignature, + } + + bossacInstallNoURL := tools.ToolPayload{ + Name: "bossac", + Version: "1.7.0-arduino3", + Packager: "arduino", + } + + tests := []test{ + {bossacInstallURLOK, http.StatusOK, "ok"}, + {bossacInstallWrongSig, http.StatusInternalServerError, "verification error"}, + {bossacInstallWrongCheck, http.StatusInternalServerError, "checksum of downloaded file doesn't match"}, + {bossacInstallNoURL, http.StatusOK, "ok"}, + {esptoolInstallURLOK, http.StatusOK, "ok"}, + } + + for _, test := range tests { + t.Run(fmt.Sprintf("Installing %s", test.request.Name), func(t *testing.T) { + payload, err := json.Marshal(test.request) + require.NoError(t, err) + + // for some reason the fronted sends requests with "text/plain" content type. + // Even if the request body contains a json object. + // With this test we verify is parsed correctly. + for _, encoding := range []string{"encoding/json", "text/plain"} { + resp, err := http.Post(ts.URL+"/v2/pkgs/tools/installed", encoding, bytes.NewBuffer(payload)) + require.NoError(t, err) + body, err := io.ReadAll(resp.Body) + require.NoError(t, err) + require.Contains(t, string(body), test.responseBody) + require.Equal(t, test.responseCode, resp.StatusCode) + } + }) + } +} + +func TestInstalledHead(t *testing.T) { + indexURL := "https://downloads.arduino.cc/packages/package_index.json" + // Instantiate Index + Index := index.Init(indexURL, config.GetDataDir()) + + r := gin.New() + goa := v2.Server(config.GetDataDir().String(), Index, utilities.MustParseRsaPublicKey([]byte(globals.ArduinoSignaturePubKey))) + r.Any("/v2/*path", gin.WrapH(goa)) + ts := httptest.NewServer(r) + + resp, err := http.Head(ts.URL + "/v2/pkgs/tools/installed") + require.NoError(t, err) + require.NotEqual(t, resp.StatusCode, http.StatusMethodNotAllowed) + require.Equal(t, resp.StatusCode, http.StatusOK) +} diff --git a/poetry.lock b/poetry.lock index 0d51c0ae4..8d932e078 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,8 +1,16 @@ +[[package]] +name = "asyncio" +version = "3.4.3" +description = "reference implementation of PEP 3156" +category = "main" +optional = false +python-versions = "*" + [[package]] name = "atomicwrites" version = "1.4.0" description = "Atomic file writes." -category = "dev" +category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" @@ -10,7 +18,7 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" name = "attrs" version = "20.3.0" description = "Classes Without Boilerplate" -category = "dev" +category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" @@ -24,23 +32,23 @@ tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (> name = "certifi" version = "2020.12.5" description = "Python package for providing Mozilla's CA Bundle." -category = "dev" +category = "main" optional = false python-versions = "*" [[package]] name = "chardet" -version = "4.0.0" +version = "3.0.4" description = "Universal encoding detector for Python 2 and 3" -category = "dev" +category = "main" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +python-versions = "*" [[package]] name = "colorama" version = "0.4.4" description = "Cross-platform colored terminal text." -category = "dev" +category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" @@ -48,7 +56,7 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" name = "idna" version = "2.10" description = "Internationalized Domain Names in Applications (IDNA)" -category = "dev" +category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" @@ -56,7 +64,7 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" name = "iniconfig" version = "1.1.1" description = "iniconfig: brain-dead simple config-ini parsing" -category = "dev" +category = "main" optional = false python-versions = "*" @@ -64,15 +72,15 @@ python-versions = "*" name = "invoke" version = "1.5.0" description = "Pythonic task execution" -category = "dev" +category = "main" optional = false python-versions = "*" [[package]] name = "packaging" -version = "20.8" +version = "20.9" description = "Core utilities for Python packages" -category = "dev" +category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" @@ -83,7 +91,7 @@ pyparsing = ">=2.0.2" name = "pluggy" version = "0.13.1" description = "plugin and hook calling mechanisms for python" -category = "dev" +category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" @@ -105,7 +113,7 @@ test = ["ipaddress", "mock", "unittest2", "enum34", "pywin32", "wmi"] name = "py" version = "1.10.0" description = "library with cross-python path, ini-parsing, io, code, log facilities" -category = "dev" +category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" @@ -113,15 +121,15 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" name = "pyparsing" version = "2.4.7" description = "Python parsing module" -category = "dev" +category = "main" optional = false python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" [[package]] name = "pytest" -version = "6.2.1" +version = "6.2.5" description = "pytest: simple powerful testing with Python" -category = "dev" +category = "main" optional = false python-versions = ">=3.6" @@ -131,18 +139,49 @@ attrs = ">=19.2.0" colorama = {version = "*", markers = "sys_platform == \"win32\""} iniconfig = "*" packaging = "*" -pluggy = ">=0.12,<1.0.0a1" +pluggy = ">=0.12,<2.0" py = ">=1.8.2" toml = "*" [package.extras] testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "requests", "xmlschema"] +[[package]] +name = "python-engineio" +version = "3.14.2" +description = "Engine.IO server" +category = "main" +optional = false +python-versions = "*" + +[package.dependencies] +six = ">=1.9.0" + +[package.extras] +asyncio_client = ["aiohttp (>=3.4)"] +client = ["requests (>=2.21.0)", "websocket-client (>=0.54.0)"] + +[[package]] +name = "python-socketio" +version = "4.6.1" +description = "Socket.IO server" +category = "main" +optional = false +python-versions = "*" + +[package.dependencies] +python-engineio = ">=3.13.0,<4" +six = ">=1.9.0" + +[package.extras] +asyncio_client = ["aiohttp (>=3.4)", "websockets (>=7.0)"] +client = ["requests (>=2.21.0)", "websocket-client (>=0.54.0)"] + [[package]] name = "requests" version = "2.25.1" description = "Python HTTP for Humans." -category = "dev" +category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" @@ -156,19 +195,27 @@ urllib3 = ">=1.21.1,<1.27" security = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)"] socks = ["PySocks (>=1.5.6,!=1.5.7)", "win-inet-pton"] +[[package]] +name = "six" +version = "1.15.0" +description = "Python 2 and 3 compatibility utilities" +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" + [[package]] name = "toml" version = "0.10.2" description = "Python Library for Tom's Obvious, Minimal Language" -category = "dev" +category = "main" optional = false python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" [[package]] name = "urllib3" -version = "1.26.2" +version = "1.26.3" description = "HTTP library with thread-safe connection pooling, file post, and more." -category = "dev" +category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4" @@ -180,9 +227,15 @@ socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] [metadata] lock-version = "1.1" python-versions = "^3.9" -content-hash = "d4024a50235f771811ce457845b6cfef87950b8eb07a8a6e3ad10005482c8a05" +content-hash = "d0635b74687a82bc83a3454d4ebc35c19a80d49cc28a6c632b47a54596ab31a3" [metadata.files] +asyncio = [ + {file = "asyncio-3.4.3-cp33-none-win32.whl", hash = "sha256:b62c9157d36187eca799c378e572c969f0da87cd5fc42ca372d92cdb06e7e1de"}, + {file = "asyncio-3.4.3-cp33-none-win_amd64.whl", hash = "sha256:c46a87b48213d7464f22d9a497b9eef8c1928b68320a2fa94240f969f6fec08c"}, + {file = "asyncio-3.4.3-py3-none-any.whl", hash = "sha256:c4d18b22701821de07bd6aea8b53d21449ec0ec5680645e5317062ea21817d2d"}, + {file = "asyncio-3.4.3.tar.gz", hash = "sha256:83360ff8bc97980e4ff25c964c7bd3923d333d177aa4f7fb736b019f26c7cb41"}, +] atomicwrites = [ {file = "atomicwrites-1.4.0-py2.py3-none-any.whl", hash = "sha256:6d1784dea7c0c8d4a5172b6c620f40b6e4cbfdf96d783691f2e1302a7b88e197"}, {file = "atomicwrites-1.4.0.tar.gz", hash = "sha256:ae70396ad1a434f9c7046fd2dd196fc04b12f9e91ffb859164193be8b6168a7a"}, @@ -196,8 +249,8 @@ certifi = [ {file = "certifi-2020.12.5.tar.gz", hash = "sha256:1a4995114262bffbc2413b159f2a1a480c969de6e6eb13ee966d470af86af59c"}, ] chardet = [ - {file = "chardet-4.0.0-py2.py3-none-any.whl", hash = "sha256:f864054d66fd9118f2e67044ac8981a54775ec5b67aed0441892edb553d21da5"}, - {file = "chardet-4.0.0.tar.gz", hash = "sha256:0d6f53a15db4120f2b08c94f11e7d93d2c911ee118b6b30a04ec3ee8310179fa"}, + {file = "chardet-3.0.4-py2.py3-none-any.whl", hash = "sha256:fc323ffcaeaed0e0a02bf4d117757b98aed530d9ed4531e3e15460124c106691"}, + {file = "chardet-3.0.4.tar.gz", hash = "sha256:84ab92ed1c4d4f16916e05906b6b75a6c0fb5db821cc65e70cbd64a3e2a5eaae"}, ] colorama = [ {file = "colorama-0.4.4-py2.py3-none-any.whl", hash = "sha256:9f47eda37229f68eee03b24b9748937c7dc3868f906e8ba69fbcbdd3bc5dc3e2"}, @@ -217,8 +270,8 @@ invoke = [ {file = "invoke-1.5.0.tar.gz", hash = "sha256:f0c560075b5fb29ba14dad44a7185514e94970d1b9d57dcd3723bec5fed92650"}, ] packaging = [ - {file = "packaging-20.8-py2.py3-none-any.whl", hash = "sha256:24e0da08660a87484d1602c30bb4902d74816b6985b93de36926f5bc95741858"}, - {file = "packaging-20.8.tar.gz", hash = "sha256:78598185a7008a470d64526a8059de9aaa449238f280fc9eb6b13ba6c4109093"}, + {file = "packaging-20.9-py2.py3-none-any.whl", hash = "sha256:67714da7f7bc052e064859c05c595155bd1ee9f69f76557e21f051443c20947a"}, + {file = "packaging-20.9.tar.gz", hash = "sha256:5b327ac1320dc863dca72f4514ecc086f31186744b84a230374cc1fd776feae5"}, ] pluggy = [ {file = "pluggy-0.13.1-py2.py3-none-any.whl", hash = "sha256:966c145cd83c96502c3c3868f50408687b38434af77734af1e9ca461a4081d2d"}, @@ -263,18 +316,30 @@ pyparsing = [ {file = "pyparsing-2.4.7.tar.gz", hash = "sha256:c203ec8783bf771a155b207279b9bccb8dea02d8f0c9e5f8ead507bc3246ecc1"}, ] pytest = [ - {file = "pytest-6.2.1-py3-none-any.whl", hash = "sha256:1969f797a1a0dbd8ccf0fecc80262312729afea9c17f1d70ebf85c5e76c6f7c8"}, - {file = "pytest-6.2.1.tar.gz", hash = "sha256:66e419b1899bc27346cb2c993e12c5e5e8daba9073c1fbce33b9807abc95c306"}, + {file = "pytest-6.2.5-py3-none-any.whl", hash = "sha256:7310f8d27bc79ced999e760ca304d69f6ba6c6649c0b60fb0e04a4a77cacc134"}, + {file = "pytest-6.2.5.tar.gz", hash = "sha256:131b36680866a76e6781d13f101efb86cf674ebb9762eb70d3082b6f29889e89"}, +] +python-engineio = [ + {file = "python-engineio-3.14.2.tar.gz", hash = "sha256:eab4553f2804c1ce97054c8b22cf0d5a9ab23128075248b97e1a5b2f29553085"}, + {file = "python_engineio-3.14.2-py2.py3-none-any.whl", hash = "sha256:5a9e6086d192463b04a1428ff1f85b6ba631bbb19d453b144ffc04f530542b84"}, +] +python-socketio = [ + {file = "python-socketio-4.6.1.tar.gz", hash = "sha256:cd1f5aa492c1eb2be77838e837a495f117e17f686029ebc03d62c09e33f4fa10"}, + {file = "python_socketio-4.6.1-py2.py3-none-any.whl", hash = "sha256:5a21da53fdbdc6bb6c8071f40e13d100e0b279ad997681c2492478e06f370523"}, ] requests = [ {file = "requests-2.25.1-py2.py3-none-any.whl", hash = "sha256:c210084e36a42ae6b9219e00e48287def368a26d03a048ddad7bfee44f75871e"}, {file = "requests-2.25.1.tar.gz", hash = "sha256:27973dd4a904a4f13b263a19c866c13b92a39ed1c964655f025f3f8d3d75b804"}, ] +six = [ + {file = "six-1.15.0-py2.py3-none-any.whl", hash = "sha256:8b74bedcbbbaca38ff6d7491d76f2b06b3592611af620f8426e82dddb04a5ced"}, + {file = "six-1.15.0.tar.gz", hash = "sha256:30639c035cdb23534cd4aa2dd52c3bf48f06e5f4a941509c8bafd8ce11080259"}, +] toml = [ {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, ] urllib3 = [ - {file = "urllib3-1.26.2-py2.py3-none-any.whl", hash = "sha256:d8ff90d979214d7b4f8ce956e80f4028fc6860e4431f731ea4a8c08f23f99473"}, - {file = "urllib3-1.26.2.tar.gz", hash = "sha256:19188f96923873c92ccb987120ec4acaa12f0461fa9ce5d3d0772bc965a39e08"}, + {file = "urllib3-1.26.3-py2.py3-none-any.whl", hash = "sha256:1b465e494e3e0d8939b50680403e3aedaa2bc434b7d5af64dfd3c958d7f5ae80"}, + {file = "urllib3-1.26.3.tar.gz", hash = "sha256:de3eedaad74a2683334e282005cd8d7f22f4d55fa690a2a1020a416cb0a47e73"}, ] diff --git a/pyproject.toml b/pyproject.toml index c3d576b7c..9e087f2fb 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -8,11 +8,13 @@ license = "GPLv2" [tool.poetry.dependencies] python = "^3.9" psutil = "^5.8.0" - -[tool.poetry.dev-dependencies] -pytest = "^6.2.1" +pytest = "^6.2.2" requests = "^2.25.1" invoke = "^1.5.0" +asyncio = "^3.4.3" +python-socketio = "^4" + +[tool.poetry.dev-dependencies] [build-system] requires = ["poetry-core>=1.0.0"] diff --git a/redirect_stderr_unix.go b/redirect_stderr_unix.go index e3a5ff819..ed3e3f988 100644 --- a/redirect_stderr_unix.go +++ b/redirect_stderr_unix.go @@ -1,6 +1,21 @@ +// Copyright 2022 Arduino SA +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published +// by the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + // Log the panic under unix to the log file -// +build !windows +//go:build !windows package main diff --git a/redirect_stderr_win.go b/redirect_stderr_win.go index 87053c8b1..19279c756 100644 --- a/redirect_stderr_win.go +++ b/redirect_stderr_win.go @@ -4,7 +4,7 @@ // // https://play.golang.org/p/kLtct7lSUg -// +build windows +//go:build windows package main diff --git a/serial.go b/serial.go index 38057ff6c..1a43f3644 100755 --- a/serial.go +++ b/serial.go @@ -1,42 +1,48 @@ +// Copyright 2022 Arduino SA +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published +// by the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + // Supports Windows, Linux, Mac, BeagleBone Black, and Raspberry Pi package main import ( "encoding/json" + "slices" "strconv" "strings" + "sync" "time" - "github.com/arduino/arduino-create-agent/upload" + discovery "github.com/arduino/pluggable-discovery-protocol-handler/v2" + "github.com/sirupsen/logrus" ) -type writeRequest struct { - p *serport - d string - buffer bool - id string -} - type serialhub struct { // Opened serial ports. - ports map[*serport]bool - - //write chan *serport, chan []byte - write chan writeRequest + ports map[string]*serport - // Register requests from the connections. - register chan *serport - - // Unregister requests from connections. - unregister chan *serport + mu sync.Mutex } -type SpPortList struct { - Ports []SpPortItem - Network bool +// SerialPortList is the serial port list +type SerialPortList struct { + Ports []*SpPortItem + portsLock sync.Mutex } +// SpPortItem is the serial port item type SpPortItem struct { Name string SerialNumber string @@ -46,68 +52,50 @@ type SpPortItem struct { Baud int BufferAlgorithm string Ver string - NetworkPort bool VendorID string ProductID string } -// SerialPorts contains the ports attached to the machine -var SerialPorts SpPortList - -// NetworkPorts contains the ports on the network -var NetworkPorts SpPortList +// serialPorts contains the ports attached to the machine +var serialPorts SerialPortList var sh = serialhub{ - //write: make(chan *serport, chan []byte), - write: make(chan writeRequest), - register: make(chan *serport), - unregister: make(chan *serport), - ports: make(map[*serport]bool), + ports: make(map[string]*serport), } -func (sh *serialhub) run() { - - //log.Print("Inside run of serialhub") - //cmdIdCtr := 0 - - for { - select { - case p := <-sh.register: - //log.Print("Registering a port: ", p.portConf.Name) - h.broadcastSys <- []byte("{\"Cmd\":\"Open\",\"Desc\":\"Got register/open on port.\",\"Port\":\"" + p.portConf.Name + "\",\"Baud\":" + strconv.Itoa(p.portConf.Baud) + ",\"BufferType\":\"" + p.BufferType + "\"}") - sh.ports[p] = true - case p := <-sh.unregister: - //log.Print("Unregistering a port: ", p.portConf.Name) - h.broadcastSys <- []byte("{\"Cmd\":\"Close\",\"Desc\":\"Got unregister/close on port.\",\"Port\":\"" + p.portConf.Name + "\",\"Baud\":" + strconv.Itoa(p.portConf.Baud) + "}") - delete(sh.ports, p) - close(p.sendBuffered) - close(p.sendNoBuf) - case wr := <-sh.write: - // if user sent in the commands as one text mode line - write(wr, "") - } - } +// Register serial ports from the connections. +func (sh *serialhub) Register(port *serport) { + sh.mu.Lock() + //log.Print("Registering a port: ", p.portConf.Name) + h.broadcastSys <- []byte("{\"Cmd\":\"Open\",\"Desc\":\"Got register/open on port.\",\"Port\":\"" + port.portConf.Name + "\",\"Baud\":" + strconv.Itoa(port.portConf.Baud) + ",\"BufferType\":\"" + port.BufferType + "\"}") + sh.ports[port.portName] = port + sh.mu.Unlock() } -func write(wr writeRequest, id string) { - if wr.buffer { - //log.Println("Send was normal send, so sending to wr.p.sendBuffered") - wr.p.sendBuffered <- wr.d - } else { - //log.Println("Send was sendnobuf, so sending to wr.p.sendNoBuf") - wr.p.sendNoBuf <- wr.d - } +// Unregister requests from connections. +func (sh *serialhub) Unregister(port *serport) { + sh.mu.Lock() + //log.Print("Unregistering a port: ", p.portConf.Name) + h.broadcastSys <- []byte("{\"Cmd\":\"Close\",\"Desc\":\"Got unregister/close on port.\",\"Port\":\"" + port.portConf.Name + "\",\"Baud\":" + strconv.Itoa(port.portConf.Baud) + "}") + delete(sh.ports, port.portName) + close(port.sendBuffered) + close(port.sendNoBuf) + sh.mu.Unlock() } -// spList broadcasts a Json representation of the ports found -func spList(network bool) { - var list SpPortList - if network { - list = NetworkPorts - } else { - list = SerialPorts - } - ls, err := json.MarshalIndent(list, "", "\t") +func (sh *serialhub) FindPortByName(portname string) (*serport, bool) { + sh.mu.Lock() + defer sh.mu.Unlock() + port, ok := sh.ports[portname] + return port, ok +} + +// List broadcasts a Json representation of the ports found +func (sp *SerialPortList) List() { + sp.portsLock.Lock() + ls, err := json.MarshalIndent(sp, "", "\t") + sp.portsLock.Unlock() + if err != nil { //log.Println(err) h.broadcastSys <- []byte("Error creating json on port list " + @@ -117,109 +105,147 @@ func spList(network bool) { } } -// discoverLoop periodically update the list of ports found -func discoverLoop() { - SerialPorts.Network = false - SerialPorts.Ports = make([]SpPortItem, 0) - NetworkPorts.Network = true - NetworkPorts.Ports = make([]SpPortItem, 0) - - go func() { - for { - if !upload.Busy { - spListDual(false) - } - time.Sleep(2 * time.Second) - } - }() - go func() { - for { - spListDual(true) - time.Sleep(2 * time.Second) - } - }() +// Run is the main loop for port discovery and management +func (sp *SerialPortList) Run() { + for retries := 0; retries < 10; retries++ { + sp.runSerialDiscovery() + + logrus.Errorf("Serial discovery stopped working, restarting it in 10 seconds...") + time.Sleep(10 * time.Second) + } + logrus.Errorf("Failed restarting serial discovery. Giving up...") } -func spListDual(network bool) { +func (sp *SerialPortList) runSerialDiscovery() { + // First ensure that all the discoveries are available + if err := Tools.Download("builtin", "serial-discovery", "latest", "keep"); err != nil { + logrus.Errorf("Error downloading serial-discovery: %s", err) + panic(err) + } + sd, err := Tools.GetLocation("serial-discovery") + if err != nil { + logrus.Errorf("Error downloading serial-discovery: %s", err) + panic(err) + } + d := discovery.NewClient("serial", sd+"/serial-discovery") + dLogger := logrus.WithField("discovery", "serial") + if *verbose { + d.SetLogger(dLogger) + } + d.SetUserAgent("arduino-create-agent/" + version) + if err := d.Run(); err != nil { + logrus.Errorf("Error running serial-discovery: %s", err) + panic(err) + } + defer d.Quit() - // call our os specific implementation of getting the serial list - list, err := GetList(network) + events, err := d.StartSync(10) + if err != nil { + logrus.Errorf("Error starting event watcher on serial-discovery: %s", err) + panic(err) + } - //log.Println(list) - //log.Println(err) + logrus.Infof("Serial discovery started, watching for events") + for ev := range events { + logrus.WithField("event", ev).Debugf("Serial discovery event") + switch ev.Type { + case "add": + sp.add(ev.Port) + case "remove": + sp.remove(ev.Port) + } + } - if err != nil { - // avoid reporting dummy data if an error occurred + sp.reset() + logrus.Errorf("Serial discovery stopped.") +} + +func (sp *SerialPortList) reset() { + sp.portsLock.Lock() + defer sp.portsLock.Unlock() + sp.Ports = []*SpPortItem{} +} + +func (sp *SerialPortList) add(addedPort *discovery.Port) { + if addedPort.Protocol != "serial" { + return + } + props := addedPort.Properties + if !props.ContainsKey("vid") { + return + } + vid, pid := props.Get("vid"), props.Get("pid") + if vid == "0x0000" || pid == "0x0000" { return } + if portsFilter != nil && !portsFilter.MatchString(addedPort.Address) { + logrus.Debugf("ignoring port not matching filter. port: %v\n", addedPort.Address) + return + } + + sp.portsLock.Lock() + defer sp.portsLock.Unlock() - // do a quick loop to see if any of our open ports - // did not end up in the list port list. this can - // happen on windows in a fallback scenario where an - // open port can't be identified because it is locked, - // so just solve that by manually inserting - // if network { - // for port := range sh.ports { - - // isFound := false - // for _, item := range list { - // if strings.ToLower(port.portConf.Name) == strings.ToLower(item.Name) { - // isFound = true - // } - // } - - // if !isFound { - // // artificially push to front of port list - // log.Println(fmt.Sprintf("Did not find an open port in the serial port list. We are going to artificially push it onto the list. port:%v", port.portConf.Name)) - // var ossp OsSerialPort - // ossp.Name = port.portConf.Name - // ossp.FriendlyName = port.portConf.Name - // list = append([]OsSerialPort{ossp}, list...) - // } - // } - // } - - // we have a full clean list of ports now. iterate thru them - // to append the open/close state, baud rates, etc to make - // a super clean nice list to send back to browser - n := len(list) - spl := SpPortList{make([]SpPortItem, n, n), network} - - ctr := 0 - - for _, item := range list { - - spl.Ports[ctr] = SpPortItem{ - Name: item.Name, - SerialNumber: item.ISerial, - DeviceClass: item.DeviceClass, - IsOpen: false, - IsPrimary: false, - Baud: 0, - BufferAlgorithm: "", - Ver: version, - NetworkPort: item.NetworkPort, - VendorID: item.IdVendor, - ProductID: item.IdProduct, + // If the port is already in the list, just update the metadata... + for _, oldPort := range sp.Ports { + if oldPort.Name == addedPort.Address { + oldPort.SerialNumber = props.Get("serialNumber") + oldPort.VendorID = vid + oldPort.ProductID = pid + return } + } + // ...otherwise, add it to the list + sp.Ports = append(sp.Ports, &SpPortItem{ + Name: addedPort.Address, + SerialNumber: props.Get("serialNumber"), + VendorID: vid, + ProductID: pid, + Ver: version, + IsOpen: false, + IsPrimary: false, + Baud: 0, + BufferAlgorithm: "", + }) +} - // figure out if port is open - myport, isFound := findPortByName(item.Name) +func (sp *SerialPortList) remove(removedPort *discovery.Port) { + sp.portsLock.Lock() + defer sp.portsLock.Unlock() - if isFound { - // we found our port - spl.Ports[ctr].IsOpen = true - spl.Ports[ctr].Baud = myport.portConf.Baud - spl.Ports[ctr].BufferAlgorithm = myport.BufferType - } - ctr++ + // Remove the port from the list + sp.Ports = slices.DeleteFunc(sp.Ports, func(oldPort *SpPortItem) bool { + return oldPort.Name == removedPort.Address + }) +} + +// MarkPortAsOpened marks a port as opened by the user +func (sp *SerialPortList) MarkPortAsOpened(portname string) { + sp.portsLock.Lock() + defer sp.portsLock.Unlock() + port := sp.getPortByName(portname) + if port != nil { + port.IsOpen = true } +} - if network { - NetworkPorts = spl - } else { - SerialPorts = spl +// MarkPortAsClosed marks a port as no more opened by the user +func (sp *SerialPortList) MarkPortAsClosed(portname string) { + sp.portsLock.Lock() + defer sp.portsLock.Unlock() + port := sp.getPortByName(portname) + if port != nil { + port.IsOpen = false + } +} + +func (sp *SerialPortList) getPortByName(portname string) *SpPortItem { + for _, port := range sp.Ports { + if port.Name == portname { + return port + } } + return nil } func spErr(err string) { @@ -229,18 +255,10 @@ func spErr(err string) { } func spClose(portname string) { - // look up the registered port by name - // then call the close method inside serialport - // that should cause an unregister channel call back - // to myself - - myport, isFound := findPortByName(portname) - - if isFound { - // we found our port - spHandlerClose(myport) + if myport, ok := sh.FindPortByName(portname); ok { + h.broadcastSys <- []byte("Closing serial port " + portname) + myport.Close() } else { - // we couldn't find the port, so send err spErr("We could not find the serial port " + portname + " that you were trying to close.") } } @@ -257,38 +275,30 @@ func spWrite(arg string) { spErr(errstr) return } + bufferingMode := args[0] portname := strings.Trim(args[1], " ") - //log.Println("The port to write to is:" + portname + "---") - //log.Println("The data is:" + args[2] + "---") + data := args[2] - // see if we have this port open - myport, isFound := findPortByName(portname) + //log.Println("The port to write to is:" + portname + "---") + //log.Println("The data is:" + data + "---") - if !isFound { + // See if we have this port open + port, ok := sh.FindPortByName(portname) + if !ok { // we couldn't find the port, so send err spErr("We could not find the serial port " + portname + " that you were trying to write to.") return } - // we found our port - // create our write request - var wr writeRequest - wr.p = myport - - // see if args[0] is send or sendnobuf - if args[0] != "sendnobuf" { - // we were just given a "send" so buffer it - wr.buffer = true - } else { - //log.Println("sendnobuf specified so wr.buffer is false") - wr.buffer = false + // see if bufferingMode is valid + switch bufferingMode { + case "send", "sendnobuf", "sendraw": + // valid buffering mode, go ahead + default: + spErr("Unsupported send command:" + args[0] + ". Please specify a valid one") + return } - // include newline or not in the write? that is the question. - // for now lets skip the newline - //wr.d = []byte(args[2] + "\n") - wr.d = args[2] //[]byte(args[2]) - // send it to the write channel - sh.write <- wr + port.Write(data, bufferingMode) } diff --git a/seriallist.go b/seriallist.go deleted file mode 100755 index 4e26f4dee..000000000 --- a/seriallist.go +++ /dev/null @@ -1,93 +0,0 @@ -// Supports Windows, Linux, Mac, and Raspberry Pi - -package main - -import ( - "fmt" - "regexp" - "strings" - - log "github.com/sirupsen/logrus" - "go.bug.st/serial/enumerator" -) - -type OsSerialPort struct { - Name string - DeviceClass string - Manufacturer string - Product string - IdProduct string - IdVendor string - ISerial string - NetworkPort bool -} - -func GetList(network bool) ([]OsSerialPort, error) { - - if network { - netportList, err := GetNetworkList() - return netportList, err - } - - // will timeout in 2 seconds - arrPorts := []OsSerialPort{} - ports, err := enumerator.GetDetailedPortsList() - if err != nil { - return arrPorts, err - } - - for _, element := range ports { - if element.IsUSB { - vid := element.VID - pid := element.PID - vidString := fmt.Sprintf("0x%s", vid) - pidString := fmt.Sprintf("0x%s", pid) - if vid != "0000" && pid != "0000" { - arrPorts = append(arrPorts, OsSerialPort{Name: element.Name, IdVendor: vidString, IdProduct: pidString, ISerial: element.SerialNumber}) - } - } - } - - // see if we should filter the list - if len(*regExpFilter) > 0 { - // yes, user asked for a filter - reFilter := regexp.MustCompile("(?i)" + *regExpFilter) - - newarrPorts := []OsSerialPort{} - for _, element := range arrPorts { - // if matches regex, include - if reFilter.MatchString(element.Name) { - newarrPorts = append(newarrPorts, element) - } else { - log.Debugf("serial port did not match. port: %v\n", element) - } - - } - arrPorts = newarrPorts - } - - return arrPorts, err -} - -func findPortByName(portname string) (*serport, bool) { - portnamel := strings.ToLower(portname) - for port := range sh.ports { - if strings.ToLower(port.portConf.Name) == portnamel { - // we found our port - //spHandlerClose(port) - return port, true - } - } - return nil, false -} - -func findPortByNameRerun(portname string, network bool) (OsSerialPort, bool) { - portnamel := strings.ToLower(portname) - list, _ := GetList(network) - for _, item := range list { - if strings.ToLower(item.Name) == portnamel { - return item, true - } - } - return OsSerialPort{}, false -} diff --git a/serialport.go b/serialport.go index c7e574a7a..b3418fe5d 100755 --- a/serialport.go +++ b/serialport.go @@ -1,10 +1,27 @@ +// Copyright 2022 Arduino SA +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published +// by the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + package main import ( "bytes" - "encoding/json" + "encoding/base64" "io" "strconv" + "sync" + "sync/atomic" "time" "unicode/utf8" @@ -12,20 +29,10 @@ import ( serial "go.bug.st/serial" ) +// SerialConfig is the serial port configuration type SerialConfig struct { - Name string - Baud int - - // Size int // 0 get translated to 8 - // Parity SomeNewTypeToGetCorrectDefaultOf_None - // StopBits SomeNewTypeToGetCorrectDefaultOf_1 - - // RTSFlowControl bool - // DTRFlowControl bool - // XONFlowControl bool - - // CRLFTranslate bool - // TimeoutStuff int + Name string + Baud int RtsOn bool DtrOn bool } @@ -34,23 +41,22 @@ type serport struct { // The serial port connection. portConf *SerialConfig portIo io.ReadWriteCloser - - done chan bool // signals the end of this request + portName string // Keep track of whether we're being actively closed // just so we don't show scary error messages - isClosing bool + isClosing atomic.Bool isClosingDueToError bool - // counter incremented on queue, decremented on write - itemsInBuffer int - // buffered channel containing up to 25600 outbound messages. sendBuffered chan string // unbuffered channel of outbound messages that bypass internal serial port buffer - sendNoBuf chan string + sendNoBuf chan []byte + + // channel containing raw base64 encoded binary data (outbound messages) + sendRaw chan string // Do we have an extra channel/thread to watch our buffer? BufferType string @@ -58,120 +64,71 @@ type serport struct { bufferwatcher Bufferflow } -type Cmd struct { - data string - id string - skippedBuffer bool - willHandleCompleteResponse bool -} - -type CmdComplete struct { - Cmd string - Id string - P string - BufSize int `json:"-"` - D string `json:"-"` -} - -type qwReport struct { - Cmd string - QCnt int - Id string - D string `json:"-"` - Buf string `json:"-"` - P string -} - +// SpPortMessage is the serial port message type SpPortMessage struct { P string // the port, i.e. com22 D string // the data, i.e. G0 X0 Y0 } +// SpPortMessageRaw is the raw serial port message type SpPortMessageRaw struct { P string // the port, i.e. com22 D []byte // the data, i.e. G0 X0 Y0 } -func (p *serport) reader() { +func (p *serport) reader(buftype string) { - //var buf bytes.Buffer - ch := make([]byte, 1024) timeCheckOpen := time.Now() - var buffered_ch bytes.Buffer + var bufferedCh bytes.Buffer + serialBuffer := make([]byte, 1024) for { + n, err := p.portIo.Read(serialBuffer) + bufferPart := serialBuffer[:n] - n, err := p.portIo.Read(ch) - - //if we detect that port is closing, break out o this for{} loop. - if p.isClosing { + //if we detect that port is closing, break out of this for{} loop. + if p.isClosing.Load() { strmsg := "Shutting down reader on " + p.portConf.Name log.Println(strmsg) h.broadcastSys <- []byte(strmsg) break } - if err == nil { - ch = append(buffered_ch.Bytes(), ch[:n]...) - n += len(buffered_ch.Bytes()) - buffered_ch.Reset() - } - // read can return legitimate bytes as well as an error - // so process the bytes if n > 0 - if n > 0 { - //log.Print("Read " + strconv.Itoa(n) + " bytes ch: " + string(ch)) + // so process the n bytes red, if n > 0 + if n > 0 && err == nil { - data := "" - - for i, w := 0, 0; i < n; i += w { - runeValue, width := utf8.DecodeRune(ch[i:n]) - if runeValue == utf8.RuneError { - buffered_ch.Write(append(ch[i:n])) - break - } - if i == n { - buffered_ch.Reset() - } - data += string(runeValue) - w = width - } + log.Print("Read " + strconv.Itoa(n) + " bytes ch: " + string(bufferPart[:n])) - //log.Print("The data i will convert to json is:") - //log.Print(data) - - // give the data to our bufferflow so it can do it's work - // to read/translate the data to see if it wants to block - // writes to the serialport. each bufferflow type will decide - // this on its own based on its logic, i.e. tinyg vs grbl vs others - //p.b.bufferwatcher..OnIncomingData(data) - p.bufferwatcher.OnIncomingData(data) - - // see if the OnIncomingData handled the broadcast back - // to the user. this option was added in case the OnIncomingData wanted - // to do something fancier or implementation specific, i.e. TinyG Buffer - // actually sends back data on a perline basis rather than our method - // where we just send the moment we get it. the reason for this is that - // the browser was sometimes getting back packets out of order which - // of course would screw things up when parsing - - if p.bufferwatcher.IsBufferGloballySendingBackIncomingData() == false { - //m := SpPortMessage{"Alice", "Hello"} - m := SpPortMessage{p.portConf.Name, data} - //log.Print("The m obj struct is:") - //log.Print(m) - - //b, err := json.MarshalIndent(m, "", "\t") - b, err := json.Marshal(m) - if err != nil { - log.Println(err) - h.broadcastSys <- []byte("Error creating json on " + p.portConf.Name + " " + - err.Error() + " The data we were trying to convert is: " + string(ch[:n])) - break + data := "" + switch buftype { + case "timedraw", "timed": + data = string(bufferPart[:n]) + // give the data to our bufferflow so it can do it's work + // to read/translate the data to see if it wants to block + // writes to the serialport. each bufferflow type will decide + // this on its own based on its logic + p.bufferwatcher.OnIncomingData(data) + case "default": // the bufferbuftype is actually called default 🤷‍♂️ + // save the left out bytes for the next iteration due to UTF-8 encoding + bufferPart = append(bufferedCh.Bytes(), bufferPart[:n]...) + n += len(bufferedCh.Bytes()) + bufferedCh.Reset() + for i, w := 0, 0; i < n; i += w { + runeValue, width := utf8.DecodeRune(bufferPart[i:n]) // try to decode the first i bytes in the buffer (UTF8 runes do not have a fixed length) + if runeValue == utf8.RuneError { + bufferedCh.Write(bufferPart[i:n]) + break + } + if i == n { + bufferedCh.Reset() + } + data += string(runeValue) + w = width } - //log.Print("Printing out json byte data...") - //log.Print(string(b)) - h.broadcastSys <- b + p.bufferwatcher.OnIncomingData(data) + default: + log.Panicf("unknown buffer type %s", buftype) } } @@ -203,18 +160,29 @@ func (p *serport) reader() { // Keep track of time difference between two consecutive read with n == 0 and err == nil // we get here if the port has been disconnected while open (cpu usage will jump to 100%) // let's close the port only if the events are extremely fast (<1ms) - if err == nil { - diff := time.Since(timeCheckOpen) - if diff.Nanoseconds() < 1000000 { - p.isClosingDueToError = true - break - } - timeCheckOpen = time.Now() + diff := time.Since(timeCheckOpen) + if diff.Nanoseconds() < 1000000 { + p.isClosingDueToError = true + break } + timeCheckOpen = time.Now() } } if p.isClosingDueToError { - spCloseReal(p) + p.Close() + } +} + +// Write data to the serial port. +func (p *serport) Write(data string, sendMode string) { + // if user sent in the commands as one text mode line + switch sendMode { + case "send": + p.sendBuffered <- data + case "sendnobuf": + p.sendNoBuf <- []byte(data) + case "sendraw": + p.sendRaw <- data } } @@ -235,18 +203,10 @@ func (p *serport) writerBuffered() { // sees something come in for data := range p.sendBuffered { - // we want to block here if we are being asked to pause. - goodToGo, _ := p.bufferwatcher.BlockUntilReady(string(data), "") + // send to the non-buffered serial port writer + //log.Println("About to send to p.sendNoBuf channel") + p.sendNoBuf <- []byte(data) - if goodToGo == false { - log.Println("We got back from BlockUntilReady() but apparently we must cancel this cmd") - // since we won't get a buffer decrement in p.sendNoBuf, we must do it here - p.itemsInBuffer-- - } else { - // send to the non-buffered serial port writer - //log.Println("About to send to p.sendNoBuf channel") - p.sendNoBuf <- data - } } msgstr := "writerBuffered just got closed. make sure you make a new one. port:" + p.portConf.Name log.Println(msgstr) @@ -263,13 +223,9 @@ func (p *serport) writerNoBuf() { // if we get here, we were able to write successfully // to the serial port because it blocks until it can write - // decrement counter - p.itemsInBuffer-- - log.Printf("itemsInBuffer:%v\n", p.itemsInBuffer) - // FINALLY, OF ALL THE CODE IN THIS PROJECT // WE TRULY/FINALLY GET TO WRITE TO THE SERIAL PORT! - n2, err := p.portIo.Write([]byte(data)) + n2, err := p.portIo.Write(data) log.Print("Just wrote ", n2, " bytes to serial: ", string(data)) if err != nil { @@ -283,11 +239,48 @@ func (p *serport) writerNoBuf() { log.Println(msgstr) h.broadcastSys <- []byte(msgstr) p.portIo.Close() - spListDual(false) - spList(false) + serialPorts.List() } +// this method runs as its own thread because it's instantiated +// as a "go" method. so if it blocks inside, it is ok +func (p *serport) writerRaw() { + // this method can panic if user closes serial port and something is + // in BlockUntilReady() and then a send occurs on p.sendNoBuf + + defer func() { + if e := recover(); e != nil { + log.Println("Got panic: ", e) + } + }() + + // this for loop blocks on p.sendRaw until that channel + // sees something come in + for data := range p.sendRaw { + + // Decode stuff + sDec, err := base64.StdEncoding.DecodeString(data) + if err != nil { + log.Println("Decoding error:", err) + } + log.Println(string(sDec)) + + // send to the non-buffered serial port writer + p.sendNoBuf <- sDec + + } + msgstr := "writerRaw just got closed. make sure you make a new one. port:" + p.portConf.Name + log.Println(msgstr) + h.broadcastSys <- []byte(msgstr) +} + +// This lock is used to prevent multiple threads from trying to open the same port at the same time. +// It presents issues with the serial port driver on some OS's: https://github.com/arduino/arduino-create-agent/issues/1031 +var spHandlerOpenLock sync.Mutex + func spHandlerOpen(portname string, baud int, buftype string) { + spHandlerOpenLock.Lock() + defer spHandlerOpenLock.Unlock() log.Print("Inside spHandler") @@ -309,60 +302,68 @@ func spHandlerOpen(portname string, baud int, buftype string) { sp, err := serial.Open(portname, mode) log.Print("Just tried to open port") if err != nil { - //log.Fatal(err) - log.Print("Error opening port " + err.Error()) - //h.broadcastSys <- []byte("Error opening port. " + err.Error()) - h.broadcastSys <- []byte("{\"Cmd\":\"OpenFail\",\"Desc\":\"Error opening port. " + err.Error() + "\",\"Port\":\"" + conf.Name + "\",\"Baud\":" + strconv.Itoa(conf.Baud) + "}") - + existingPort, ok := sh.FindPortByName(portname) + if ok && existingPort.portConf.Baud == baud && existingPort.BufferType == buftype { + log.Print("Port already opened") + h.broadcastSys <- []byte("{\"Cmd\":\"Open\",\"Desc\":\"Port already opened.\",\"Port\":\"" + existingPort.portConf.Name + "\",\"Baud\":" + strconv.Itoa(existingPort.portConf.Baud) + ",\"BufferType\":\"" + existingPort.BufferType + "\"}") + } else { + log.Print("Error opening port " + err.Error()) + h.broadcastSys <- []byte("{\"Cmd\":\"OpenFail\",\"Desc\":\"Error opening port. " + err.Error() + "\",\"Port\":\"" + conf.Name + "\",\"Baud\":" + strconv.Itoa(conf.Baud) + "}") + } return } log.Print("Opened port successfully") //p := &serport{send: make(chan []byte, 256), portConf: conf, portIo: sp} // we can go up to 256,000 lines of gcode in the buffer - p := &serport{sendBuffered: make(chan string, 256000), sendNoBuf: make(chan string), portConf: conf, portIo: sp, BufferType: buftype} + p := &serport{ + sendBuffered: make(chan string, 256000), + sendNoBuf: make(chan []byte), + sendRaw: make(chan string), + portConf: conf, + portIo: sp, + portName: portname, + BufferType: buftype} var bw Bufferflow - if buftype == "timed" { - bw = &BufferflowTimed{Name: "timed", Port: portname, Output: h.broadcastSys, Input: make(chan string)} - } else if buftype == "timedraw" { - bw = &BufferflowTimedRaw{Name: "timedraw", Port: portname, Output: h.broadcastSys, Input: make(chan string)} - } else { - bw = &BufferflowDefault{Port: portname} + switch buftype { + case "timed": + bw = NewBufferflowTimed(portname, h.broadcastSys) + case "timedraw": + bw = NewBufferflowTimedRaw(portname, h.broadcastSys) + case "default": + bw = NewBufferflowDefault(portname, h.broadcastSys) + default: + log.Panicf("unknown buffer type: %s", buftype) } bw.Init() p.bufferwatcher = bw - sh.register <- p - defer func() { sh.unregister <- p }() + sh.Register(p) - spListDual(false) - spList(false) + serialPorts.MarkPortAsOpened(portname) + serialPorts.List() // this is internally buffered thread to not send to serial port if blocked go p.writerBuffered() // this is thread to send to serial port regardless of block go p.writerNoBuf() - p.reader() - - spListDual(false) - spList(false) - - //go p.reader() - //p.done = make(chan bool) - //<-p.done + // this is thread to send to serial port but with base64 decoding + go p.writerRaw() + // this is the thread that reads from the serial port + go func() { + p.reader(buftype) + serialPorts.List() + sh.Unregister(p) + }() } -func spHandlerClose(p *serport) { - p.isClosing = true - h.broadcastSys <- []byte("Closing serial port " + p.portConf.Name) - spCloseReal(p) -} +func (p *serport) Close() { + p.isClosing.Store(true) -func spCloseReal(p *serport) { p.bufferwatcher.Close() p.portIo.Close() - spListDual(false) - spList(false) + serialPorts.MarkPortAsClosed(p.portName) + serialPorts.List() } diff --git a/systray/exec_darwin.go b/systray/exec_darwin.go new file mode 100644 index 000000000..912a736e3 --- /dev/null +++ b/systray/exec_darwin.go @@ -0,0 +1,77 @@ +package systray + +/* +#cgo CFLAGS: -x objective-c +#cgo LDFLAGS: -framework Cocoa +#import + +char **makeCharArray(int size) { + return calloc(sizeof(char*), size); +} + +void setCharArray(char **a, int n, char *s) { + a[n] = s; +} + +void freeCharArray(char **a, int size) { + int i; + for (i = 0; i < size; i++) { + free(a[i]); + } + free(a); +} + +void runApplication(const char *path, const char **argv, int argc) { + NSMutableArray *stringArray = [NSMutableArray array]; + for (int i=0; i *arguments = [NSArray arrayWithArray:stringArray]; + + NSWorkspace *ws = [NSWorkspace sharedWorkspace]; + NSURL *url = [NSURL fileURLWithPath:@(path) isDirectory:NO]; + + NSWorkspaceOpenConfiguration* configuration = [NSWorkspaceOpenConfiguration new]; + //[configuration setEnvironment:env]; + [configuration setPromptsUserIfNeeded:YES]; + [configuration setCreatesNewApplicationInstance:YES]; + [configuration setArguments:arguments]; + dispatch_semaphore_t semaphore = dispatch_semaphore_create(0); + [ws openApplicationAtURL:url configuration:configuration completionHandler:^(NSRunningApplication* app, NSError* error) { + dispatch_semaphore_signal(semaphore); + }]; + dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER); +} +*/ +import "C" +import ( + "os/exec" + "path/filepath" + "unsafe" + + "github.com/sirupsen/logrus" +) + +func execApp(path string, args ...string) error { + if filepath.Ext(path) != ".app" { + // If not .app, fallback to standard process execution + logrus.WithField("path", path).WithField("args", args).Info("Running new app with os/exec.Exec") + cmd := exec.Command(path, args...) + return cmd.Start() + } + + logrus.WithField("path", path).WithField("args", args).Info("Running new app with openApplicationAtURL") + argc := C.int(len(args)) + argv := C.makeCharArray(argc) + for i, arg := range args { + C.setCharArray(argv, C.int(i), C.CString(arg)) + } + + cpath := C.CString(path) + defer C.free(unsafe.Pointer(cpath)) + C.runApplication(cpath, argv, argc) + + C.freeCharArray(argv, argc) + return nil +} diff --git a/systray/exec_default.go b/systray/exec_default.go new file mode 100644 index 000000000..ea28618b5 --- /dev/null +++ b/systray/exec_default.go @@ -0,0 +1,26 @@ +// Copyright 2022 Arduino SA +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published +// by the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +//go:build !darwin + +package systray + +import "os/exec" + +// default execApp from golang +func execApp(path string, args ...string) error { + cmd := exec.Command(path, args...) + return cmd.Start() +} diff --git a/systray/systray.go b/systray/systray.go index 7b3f9f5db..4df4fadbc 100644 --- a/systray/systray.go +++ b/systray/systray.go @@ -1,13 +1,27 @@ +// Copyright 2022 Arduino SA +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published +// by the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + package systray import ( "fmt" - "os/exec" + "os" "strings" + "github.com/arduino/go-paths-helper" log "github.com/sirupsen/logrus" - - "github.com/kardianos/osext" ) // Systray manages the systray icon with its menu and actions. It also handles the pause/resume behaviour of the agent @@ -20,8 +34,12 @@ type Systray struct { DebugURL func() string // The active configuration file AdditionalConfig string + // The path to the directory containing the configuration files + ConfigDir *paths.Path // The path of the exe (only used in update) path string + // The path of the configuration file + currentConfigFilePath *paths.Path } // Restart restarts the program @@ -31,9 +49,9 @@ func (s *Systray) Restart() { if s.path == "" { log.Println("Update binary path not set") var err error - s.path, err = osext.Executable() + s.path, err = os.Executable() if err != nil { - log.Printf("Error getting exe path using osext lib. err: %v\n", err) + log.Printf("Error getting exe path using os lib. err: %v\n", err) } } else { log.Println("Starting updated binary: ", s.path) @@ -50,8 +68,7 @@ func (s *Systray) Restart() { } // Launch executable - cmd := exec.Command(s.path, args...) - err := cmd.Start() + err := execApp(s.path, args...) if err != nil { log.Printf("Error restarting process: %v\n", err) return @@ -73,8 +90,14 @@ func (s *Systray) Resume() { s.Restart() } -// Update restarts the program with the given path -func (s *Systray) Update(path string) { +// RestartWith restarts the program with the given path +func (s *Systray) RestartWith(path string) { s.path = path s.Restart() } + +// SetCurrentConfigFile allows to specify the path of the configuration file the agent +// is using. The tray menu with this info can display an "open config file" option. +func (s *Systray) SetCurrentConfigFile(configPath *paths.Path) { + s.currentConfigFilePath = configPath +} diff --git a/systray/systray_fake.go b/systray/systray_fake.go index 59a85b490..8f8e858a3 100644 --- a/systray/systray_fake.go +++ b/systray/systray_fake.go @@ -1,14 +1,32 @@ -// +build cli +// Copyright 2022 Arduino SA +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published +// by the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +//go:build cli // Systray_fake gets compiled when the tag 'cli' is present. This is useful to build an agent without trayicon functionalities + package systray import "os" +// Start is a dummy function func (s *Systray) Start() { select {} } +// Quit is a dummy function func (s *Systray) Quit() { os.Exit(0) } diff --git a/systray/systray_real.go b/systray/systray_real.go index 9c7d5d4bc..b070f22af 100644 --- a/systray/systray_real.go +++ b/systray/systray_real.go @@ -1,19 +1,36 @@ -// +build !cli +// Copyright 2022 Arduino SA +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published +// by the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +//go:build !cli // Systray_real gets compiled when the tag 'cli' is missing. This is the default case + package systray import ( - "fmt" "os" - "path/filepath" - - log "github.com/sirupsen/logrus" + "runtime" + "time" + "fyne.io/systray" + cert "github.com/arduino/arduino-create-agent/certificates" + "github.com/arduino/arduino-create-agent/config" "github.com/arduino/arduino-create-agent/icon" - "github.com/getlantern/systray" + "github.com/arduino/arduino-create-agent/utilities" "github.com/go-ini/ini" - "github.com/kardianos/osext" + log "github.com/sirupsen/logrus" "github.com/skratchdot/open-golang/open" ) @@ -33,19 +50,27 @@ func (s *Systray) Quit() { // start creates a systray icon with menu options to go to arduino create, open debug, pause/quit the agent func (s *Systray) start() { - systray.SetIcon(icon.GetIcon()) + systray.SetTemplateIcon(icon.GetIcon(), icon.GetIcon()) // Add version menuVer := systray.AddMenuItem("Agent version "+s.Version, "") menuVer.Disable() // Add links - mUrl := systray.AddMenuItem("Go to Arduino Create", "Arduino Create") + mURL := systray.AddMenuItem("Go to Arduino Cloud", "Arduino Cloud") mDebug := systray.AddMenuItem("Open Debug Console", "Debug console") + mConfig := systray.AddMenuItem("Open Configuration", "Config File") // Remove crash-reports mRmCrashes := systray.AddMenuItem("Remove crash reports", "") - s.updateMenuItem(mRmCrashes, s.CrashesIsEmpty()) + s.updateMenuItem(mRmCrashes, config.LogsIsEmpty()) + + mManageCerts := systray.AddMenuItem("Manage HTTPS certificate", "HTTPS Certs") + // On linux/windows chrome/firefox/edge(chromium) the agent works without problems on plain HTTP, + // so we disable the menuItem to generate/install the certificates + if runtime.GOOS != "darwin" { + s.updateMenuItem(mManageCerts, true) + } // Add pause/quit mPause := systray.AddMenuItem("Pause Agent", "") @@ -59,13 +84,55 @@ func (s *Systray) start() { go func() { for { select { - case <-mUrl.ClickedCh: - _ = open.Start("https://create.arduino.cc") + case <-mURL.ClickedCh: + _ = open.Start("https://app.arduino.cc") case <-mDebug.ClickedCh: _ = open.Start(s.DebugURL()) + case <-mConfig.ClickedCh: + _ = open.Start(s.currentConfigFilePath.String()) case <-mRmCrashes.ClickedCh: - s.RemoveCrashes() - s.updateMenuItem(mRmCrashes, s.CrashesIsEmpty()) + RemoveCrashes() + s.updateMenuItem(mRmCrashes, config.LogsIsEmpty()) + case <-mManageCerts.ClickedCh: + infoMsg := "The Arduino Agent needs a local HTTPS certificate to work correctly with Safari.\n\nYour HTTPS certificate status:\n" + buttons := "{\"Install the certificate for Safari\", \"OK\"}" + toPress := "Install the certificate for Safari" + certDir := config.GetCertificatesDir() + if cert.CertInKeychain() || config.CertsExist() { + expDate, err := cert.GetExpirationDate() + if err != nil { + log.Errorf("cannot get certificates expiration date, something went wrong: %s", err) + } + infoMsg = infoMsg + "- Certificate installed:\t\tYes\n- Certificate trusted:\t\tYes\n- Certificate expiration:\t" + expDate.Format(time.DateTime) + buttons = "{\"Uninstall the certificate for Safari\", \"OK\"}" + toPress = "Uninstall the certificate for Safari" + pressedButton := utilities.UserPrompt(infoMsg, buttons, "OK", toPress, "Arduino Agent: Manage HTTPS certificate") + if pressedButton { + err := cert.UninstallCertificates() + if err != nil { + log.Errorf("cannot uninstall certificates something went wrong: %s", err) + } else { + cert.DeleteCertificates(certDir) + err = config.SetInstallCertsIni(s.currentConfigFilePath.String(), "false") + if err != nil { + log.Errorf("cannot set installCerts value in config.ini: %s", err) + } + utilities.UserPrompt("The HTTPS certificate has been uninstalled.", "{\"OK\"}", "OK", "OK", "Arduino Agent: HTTPS certificate installation") + } + s.Restart() + } + } else { + infoMsg = infoMsg + "- Certificate installed:\t\tNo\n- Certificate trusted:\t\tN/A\n- Certificate expiration:\tN/A" + pressedButton := utilities.UserPrompt(infoMsg, buttons, "OK", toPress, "Arduino Agent: Manage HTTPS certificate") + if pressedButton { + cert.GenerateAndInstallCertificates(certDir) + err := config.SetInstallCertsIni(s.currentConfigFilePath.String(), "true") + if err != nil { + log.Errorf("cannot set installCerts value in config.ini: %s", err) + } + s.Restart() + } + } case <-mPause.ClickedCh: s.Pause() case <-mQuit.ClickedCh: @@ -84,37 +151,20 @@ func (s *Systray) updateMenuItem(item *systray.MenuItem, disable bool) { } } -// CrashesIsEmpty checks if the folder containing crash-reports is empty -func (s *Systray) CrashesIsEmpty() bool { - currDir, err := osext.ExecutableFolder() - if err != nil { - log.Error("Cannot determine executable path: ", err) - } - logsDir := filepath.Join(currDir, "logs") - if _, err := os.Stat(string(logsDir)); os.IsNotExist(err) { - return true - } - return false -} - // RemoveCrashes removes the crash-reports from `logs` folder -func (s *Systray) RemoveCrashes() { - currDir, err := osext.ExecutableFolder() - if err != nil { - log.Error("Cannot determine executable path: ", err) - } - logsDir := filepath.Join(currDir, "logs") - pathErr := os.RemoveAll(logsDir) +func RemoveCrashes() { + logsDir := config.GetLogsDir() + pathErr := logsDir.RemoveAll() if pathErr != nil { - log.Error("Cannot remove crashreports: ", pathErr) + log.Errorf("Cannot remove crashreports: %s", pathErr) } else { - log.Info("Removed crashreports inside: ", logsDir) + log.Infof("Removed crashreports inside: %s", logsDir) } } // starthibernate creates a systray icon with menu options to resume/quit the agent func (s *Systray) startHibernate() { - systray.SetIcon(icon.GetIconHiber()) + systray.SetTemplateIcon(icon.GetIconHiber(), icon.GetIconHiber()) mResume := systray.AddMenuItem("Resume Agent", "") systray.AddSeparator() @@ -141,7 +191,7 @@ func (s *Systray) end() { func (s *Systray) addConfigs() { var mConfigCheckbox []*systray.MenuItem - configs := getConfigs() + configs := s.getConfigs() if len(configs) > 1 { for _, config := range configs { entry := systray.AddMenuItem(config.Name, "") @@ -171,35 +221,30 @@ type configIni struct { Location string } -// getconfigs parses all config files in the executable folder -func getConfigs() []configIni { - // config.ini must be there, so call it Default - src, _ := osext.Executable() - dest := filepath.Dir(src) - +// getConfigs parses all config files in the .arduino-create folder +func (s *Systray) getConfigs() []configIni { var configs []configIni - err := filepath.Walk(dest, func(path string, f os.FileInfo, _ error) error { - if !f.IsDir() { - if filepath.Ext(path) == ".ini" { - cfg, err := ini.LoadSources(ini.LoadOptions{IgnoreInlineComment: true}, filepath.Join(dest, f.Name())) - if err != nil { - return err - } - defaultSection, err := cfg.GetSection("") - name := defaultSection.Key("name").String() - if name == "" || err != nil { - name = "Default config" - } - conf := configIni{Name: name, Location: f.Name()} - configs = append(configs, conf) + files, err := s.ConfigDir.ReadDir() + if err != nil { + log.Errorf("cannot read the content of %s", s.ConfigDir) + return nil + } + files.FilterOutDirs() + files.FilterSuffix(".ini") + for _, file := range files { + cfg, err := ini.LoadSources(ini.LoadOptions{IgnoreInlineComment: true, AllowPythonMultilineValues: true}, file.String()) + if err != nil { + log.Errorf("error walking through executable configuration: %s", err) + } else { + defaultSection, err := cfg.GetSection("") + name := defaultSection.Key("name").String() + if name == "" || err != nil { + name = "Default config" } + conf := configIni{Name: name, Location: file.String()} + configs = append(configs, conf) } - return nil - }) - - if err != nil { - fmt.Println("error walking through executable configuration: %w", err) } return configs diff --git a/test/conftest.py b/test/conftest.py deleted file mode 100644 index fd50856ec..000000000 --- a/test/conftest.py +++ /dev/null @@ -1,45 +0,0 @@ -import os -import platform -import signal -import time -from pathlib import Path - -import pytest -from invoke import Local -from invoke.context import Context - - -@pytest.fixture(scope="function") -def agent(pytestconfig): - - agent_cli = str(Path(pytestconfig.rootdir) / "arduino-create-agent") - env = { - # "ARDUINO_DATA_DIR": data_dir, - # "ARDUINO_DOWNLOADS_DIR": downloads_dir, - # "ARDUINO_SKETCHBOOK_DIR": data_dir, - } - run_context = Context() - - runner = Local(run_context) # execute a command on the local filesystem - - cd_command = "cd" - with run_context.prefix(f'{cd_command} ..'): - runner.run(agent_cli, echo=True, hide=True, warn=True, env=env, asynchronous=True) - - # we give some time to the agent to start and listen to - # incoming requests - time.sleep(.5) - - # we block here until the test function using this fixture has returned - yield runner - - # Kill the runner's process as we finished our test (platform dependent) - os_signal = signal.SIGTERM - if platform.system() != "Windows": - os_signal = signal.SIGKILL - os.kill(runner.process.pid, os_signal) - - -@pytest.fixture(scope="session") -def base_url(): - return "http://127.0.0.1:8991" diff --git a/test/test_certs.py b/test/test_certs.py deleted file mode 100644 index 513208da3..000000000 --- a/test/test_certs.py +++ /dev/null @@ -1,18 +0,0 @@ -import requests - - -def test_get_cert(base_url, agent): - - resp = requests.get(f"{base_url}/certificate.crt") - assert resp.status_code == 200 - - cert = resp.text - assert "" in cert - - -def test_del_cert(base_url, agent): - - resp = requests.delete(f"{base_url}/certificate.crt") - assert resp.status_code == 200 - - # Should rm "ca.cert.pem", "ca.cert.cer", "ca.key.pem" diff --git a/test/test_info.py b/test/test_info.py deleted file mode 100644 index 7e79b7a07..000000000 --- a/test/test_info.py +++ /dev/null @@ -1,11 +0,0 @@ -import re -import requests - - -def test_version(base_url, agent): - - resp = requests.get(f"{base_url}/info") - assert resp.status_code == 200 - - info = resp.json() - assert re.match("[0-9]+.[0-9]+.[0-9]+", info["version"]) is not None diff --git a/test/test_update.py b/test/test_update.py deleted file mode 100644 index 481cb655e..000000000 --- a/test/test_update.py +++ /dev/null @@ -1,33 +0,0 @@ -# import json -import psutil -import requests -import pytest - -# test if the update process succeeds in terminating the binary -@pytest.mark.skip(reason="no way of currently testing this") -def test_update_shutdown(base_url, agent): - - procs=[] - for p in psutil.process_iter(): - if p.name() == "arduino-create-agent": - procs.append(p) - - resp = requests.post(f"{base_url}/update") - # assert resp.status_code == 200 - # assert "Please wait a moment while the agent reboots itself" in info['success'] # failing on macos see https://github.com/arduino/arduino-create-agent/issues/608 - gone, alive = psutil.wait_procs(procs, timeout=3, callback=on_terminate) # wait for "arduino-create-agent" to terminate - -def on_terminate(proc): - print("process {} terminated with exit code {}".format(proc, proc.returncode)) - assert True - -# the version currently running is the latest available -@pytest.mark.skip(reason="no way of currently testing this") -def test_latest_version(base_url, agent): - resp = requests.get(f"{base_url}/info") - assert resp.status_code == 200 - latest_version = requests.get("https://s3.amazonaws.com/arduino-create-static/agent-metadata/agent-version.json") # get the latest version available - - version = latest_version.json() - info = resp.json() - assert info["version"] == version["Version"] diff --git a/test/test_v2.py b/test/test_v2.py deleted file mode 100644 index 9815571cb..000000000 --- a/test/test_v2.py +++ /dev/null @@ -1,9 +0,0 @@ -import requests - - -def test_get_tools(base_url, agent): - - resp = requests.get(f"{base_url}/v2/pkgs/tools/installed") - assert resp.status_code == 200 - - tools = resp.json() \ No newline at end of file diff --git a/tests/common.py b/tests/common.py new file mode 100644 index 000000000..34e16b523 --- /dev/null +++ b/tests/common.py @@ -0,0 +1,7 @@ +import os + +def running_on_ci(): + """ + Returns whether the program is running on a CI environment + """ + return 'GITHUB_WORKFLOW' in os.environ diff --git a/tests/conftest.py b/tests/conftest.py new file mode 100644 index 000000000..0e81d76f0 --- /dev/null +++ b/tests/conftest.py @@ -0,0 +1,101 @@ +# Copyright 2022 Arduino SA +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . + +import os +import platform +import signal +import time +from pathlib import Path + +import pytest +from invoke import Local +from invoke.context import Context +import socketio as io + +@pytest.fixture(scope="function") +def agent(pytestconfig): + if platform.system() == "Windows": + agent = str(Path(pytestconfig.rootdir) / "arduino-cloud-agent_cli.exe") + else: + agent = str(Path(pytestconfig.rootdir) / "arduino-cloud-agent") + env = { + # "ARDUINO_DATA_DIR": data_dir, + # "ARDUINO_DOWNLOADS_DIR": downloads_dir, + # "ARDUINO_SKETCHBOOK_DIR": data_dir, + } + run_context = Context() + + runner = Local(run_context) # execute a command on the local filesystem + + cd_command = "cd" + with run_context.prefix(f'{cd_command} ..'): + runner.run(agent, echo=True, hide=True, warn=True, env=env, asynchronous=True) + + # we give some time to the agent to start and listen to + # incoming requests + time.sleep(1) + + # we block here until the test function using this fixture has returned + yield runner + + # Kill the runner's process as we finished our test (platform dependent) + os_signal = signal.SIGTERM + if platform.system() != "Windows": + os_signal = signal.SIGKILL + os.kill(runner.process.pid, os_signal) + + +@pytest.fixture(scope="session") +def base_url(): + return "http://127.0.0.1:8991" + +@pytest.fixture(scope="function") +def socketio(base_url, agent): + sio = io.Client() + sio.connect(base_url) + yield sio + sio.disconnect() + +@pytest.fixture(scope="session") +def serial_port(): + return "/dev/ttyACM0" # maybe this could be enhanced by calling arduino-cli + +@pytest.fixture(scope="session") +def baudrate(): + return "9600" + +# open_port cannot be coced as a fixture because of the buffertype parameter + +# at the end of the test closes the serial port +@pytest.fixture(scope="function") +def close_port(socketio, serial_port): + yield socketio + socketio.emit('command', 'close ' + serial_port) + time.sleep(.5) + + +@pytest.fixture(scope="function") +def message(socketio): + global message + message = [] + #in message var we will find the "response" + socketio.on('message', message_handler) + return message + +# callback called by socketio when a message is received +def message_handler(msg): + # print('Received message: ', msg) + global message + message.append(msg) \ No newline at end of file diff --git a/tests/test_info.py b/tests/test_info.py new file mode 100644 index 000000000..efda3bce8 --- /dev/null +++ b/tests/test_info.py @@ -0,0 +1,32 @@ +# Copyright 2022 Arduino SA +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . + +import re +import requests +import pytest +from sys import platform + + +@pytest.mark.skipif( + platform == "darwin", + reason="on macOS the user is prompted to install certificates", +) +def test_version(base_url, agent): + + resp = requests.get(f"{base_url}/info") + assert resp.status_code == 200 + + info = resp.json() + assert re.match("[0-9]+.[0-9]+.[0-9]+", info["version"]) is not None diff --git a/tests/test_v2.py b/tests/test_v2.py new file mode 100644 index 000000000..5fa44034e --- /dev/null +++ b/tests/test_v2.py @@ -0,0 +1,30 @@ +# Copyright 2022 Arduino SA +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . + +import requests +import pytest +from sys import platform + + +@pytest.mark.skipif( + platform == "darwin", + reason="on macOS the user is prompted to install certificates", +) +def test_get_tools(base_url, agent): + + resp = requests.get(f"{base_url}/v2/pkgs/tools/installed") + assert resp.status_code == 200 + + tools = resp.json() \ No newline at end of file diff --git a/tests/test_ws.py b/tests/test_ws.py new file mode 100644 index 000000000..b8004649d --- /dev/null +++ b/tests/test_ws.py @@ -0,0 +1,210 @@ +# Copyright 2022 Arduino SA +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . + +import time +import json +import base64 +import pytest +from sys import platform + +from common import running_on_ci +message = [] + + +@pytest.mark.skipif( + platform == "darwin", + reason="on macOS the user is prompted to install certificates", +) +def test_ws_connection(socketio): + print('my sid is', socketio.sid) + assert socketio.sid is not None + + +@pytest.mark.skipif( + platform == "darwin", + reason="on macOS the user is prompted to install certificates", +) +def test_list(socketio, message): + socketio.emit('command', 'list') + time.sleep(.2) + print (message) + assert any("list" in i for i in message) + assert any("Ports" in i for i in message) + + +# NOTE run the following tests with a board connected to the PC +@pytest.mark.skipif( + running_on_ci(), + reason="VMs have no serial ports", +) +def test_open_serial_default(socketio, serial_port, baudrate, message): + general_open_serial(socketio, serial_port, baudrate, message, "default") + + +@pytest.mark.skipif( + running_on_ci(), + reason="VMs have no serial ports", +) +def test_open_serial_timed(socketio, serial_port, baudrate, message): + general_open_serial(socketio, serial_port, baudrate, message, "timed") + + +@pytest.mark.skipif( + running_on_ci(), + reason="VMs have no serial ports", +) +def test_open_serial_timedraw(socketio, serial_port, baudrate, message): + general_open_serial(socketio, serial_port, baudrate, message, "timedraw") + + +# NOTE run the following tests with a board connected to the PC and with the sketch found in tests/testdata/SerialEcho.ino on it be sure to change serial_address in conftest.py +@pytest.mark.skipif( + running_on_ci(), + reason="VMs have no serial ports", +) +def test_send_serial_default(socketio, close_port, serial_port, baudrate, message): + general_send_serial(socketio, close_port, serial_port, baudrate, message, "default") + + +@pytest.mark.skipif( + running_on_ci(), + reason="VMs have no serial ports", +) +def test_send_serial_timed(socketio, close_port, serial_port, baudrate, message): + general_send_serial(socketio, close_port, serial_port, baudrate, message, "timed") + + +@pytest.mark.skipif( + running_on_ci(), + reason="VMs have no serial ports", +) +def test_send_serial_timedraw(socketio, close_port, serial_port, baudrate, message): + general_send_serial(socketio, close_port, serial_port, baudrate, message, "timedraw") + + +@pytest.mark.skipif( + running_on_ci(), + reason="VMs have no serial ports", +) +def test_send_emoji_serial_default(socketio, close_port, serial_port, baudrate, message): + general_send_emoji_serial(socketio, close_port, serial_port, baudrate, message, "default") + + +@pytest.mark.skipif( + running_on_ci(), + reason="VMs have no serial ports", +) +def test_send_emoji_serial_timed(socketio, close_port, serial_port, baudrate, message): + general_send_emoji_serial(socketio, close_port, serial_port, baudrate, message, "timed") + + +@pytest.mark.skipif( + running_on_ci(), + reason="VMs have no serial ports", +) +def test_send_emoji_serial_timedraw(socketio, close_port, serial_port, baudrate, message): + general_send_emoji_serial(socketio, close_port, serial_port, baudrate, message, "timedraw") + + +def general_open_serial(socketio, serial_port, baudrate, message, buffertype): + open_serial_port(socketio, serial_port, baudrate, message, buffertype) + # test the closing of the serial port, we are gonna use close_port for the other tests + socketio.emit('command', 'close ' + serial_port) + time.sleep(.2) + print (message) + #check if port has been closed + assert any("\"IsOpen\": false," in i for i in message) + + +def general_send_serial(socketio, close_port, serial_port, baudrate, message, buffertype): + open_serial_port(socketio, serial_port, baudrate, message, buffertype) + # send the string "ciao" using the serial connection + socketio.emit('command', 'send ' + serial_port + ' ciao') + time.sleep(1) + print(message) + # check if the send command has been registered + assert any("send " + serial_port + " ciao" in i for i in message) + #check if message has been sent back by the connected board + if buffertype == "timedraw": + output = decode_output(extract_serial_data(message)) + elif buffertype in ("default", "timed"): + output = extract_serial_data(message) + assert "ciao" in output + # the serial connection is closed by close_port() fixture: even if in case of test failure + + +def general_send_emoji_serial(socketio, close_port, serial_port, baudrate, message, buffertype): + open_serial_port(socketio, serial_port, baudrate, message, buffertype) + # send a lot of emoji: they can be messed up + socketio.emit('command', 'send ' + serial_port + ' /"🧀🧀🧀🧀🧀🧀🧀🧀🧀🧀/"') + time.sleep(1) + print(message) + # check if the send command has been registered + assert any("send " + serial_port + " /\"🧀🧀🧀🧀🧀🧀🧀🧀🧀🧀/\"" in i for i in message) + if buffertype == "timedraw": + output = decode_output(extract_serial_data(message)) + elif buffertype in ("default", "timed"): + output = extract_serial_data(message) + assert "/\"🧀🧀🧀🧀🧀🧀🧀🧀🧀🧀/\"" in output + # the serial connection is closed by close_port() fixture: even if in case of test failure + + +def open_serial_port(socketio, serial_port, baudrate, message, buffertype): + #open a new serial connection with the specified buffertype + socketio.emit('command', 'open ' + serial_port + ' ' + baudrate + ' ' + buffertype) + # give time to the message var to be filled + time.sleep(.5) + print(message) + # the serial connection should be open now + assert any("\"IsOpen\": true" in i for i in message) + + +@pytest.mark.skipif( + running_on_ci(), + reason="VMs have no serial ports", +) +def test_sendraw_serial(socketio, close_port, serial_port, baudrate, message): + open_serial_port(socketio, serial_port, baudrate, message, "timedraw") + #test with bytes + integers = [1, 2, 3, 4, 5] + bytes_array=bytearray(integers) + encoded_integers = base64.b64encode(bytes_array).decode('ascii') + socketio.emit('command', 'sendraw ' + serial_port + ' ' + encoded_integers) + time.sleep(1) + print(message) + # check if the send command has been registered + assert any(("sendraw " + serial_port + ' ' + encoded_integers) in i for i in message) + #check if message has been sent back by the connected board + output = extract_serial_data(message) # TODO use decode_output() + print (output) + assert encoded_integers in output + + +# helper function used to extract serial data from its JSON representation +# NOTE make sure to pass a clean message (maybe reinitialize the message global var before populating it) +def extract_serial_data(msg): + serial_data = "" + for i in msg: + if "{\"P\"" in i: + print (json.loads(i)["D"]) + serial_data+=json.loads(i)["D"] + print("serialdata:"+serial_data) + return serial_data + +def decode_output(raw_output): + # print(raw_output) + base64_bytes = raw_output.encode('ascii') #encode rawoutput message into a bytes-like object + output_bytes = base64.b64decode(base64_bytes) + return output_bytes.decode('utf-8') diff --git a/tests/testdata/SerialEcho/SerialEcho.ino b/tests/testdata/SerialEcho/SerialEcho.ino new file mode 100644 index 000000000..efb7c59b7 --- /dev/null +++ b/tests/testdata/SerialEcho/SerialEcho.ino @@ -0,0 +1,18 @@ +int incomingByte = 0; // for incoming serial data + +void setup() { + Serial.begin(9600); // opens serial port, sets data rate to 9600 bps +} + +void loop() { + // send data only when you receive data: + if (Serial.available() > 0) { + + // read the incoming byte: + incomingByte = Serial.read(); + + // say what you got: + Serial.print((char)incomingByte); + } + +} diff --git a/tests/testdata/test.ini b/tests/testdata/test.ini new file mode 100644 index 000000000..c9629a110 --- /dev/null +++ b/tests/testdata/test.ini @@ -0,0 +1,9 @@ +signatureKey = -----BEGIN PUBLIC KEY----- + MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvc0yZr1yUSen7qmE3cxF + IE12rCksDnqR+Hp7o0nGi9123eCSFcJ7CkIRC8F+8JMhgI3zNqn4cUEn47I3RKD1 + ZChPUCMiJCvbLbloxfdJrUi7gcSgUXrlKQStOKF5Iz7xv1M4XOP3JtjXLGo3EnJ1 + pFgdWTOyoSrA8/w1rck4c/ISXZSinVAggPxmLwVEAAln6Itj6giIZHKvA2fL2o8z + CeK057Lu8X6u2CG8tRWSQzVoKIQw/PKK6CNXCAy8vo4EkXudRutnEYHEJlPkVgPn + 2qP06GI+I+9zKE37iqj0k1/wFaCVXHXIvn06YrmjQw6I0dDj/60Wvi500FuRVpn9 + twIDAQAB + -----END PUBLIC KEY----- diff --git a/tools/download.go b/tools/download.go index 6c9ced87b..8c4a37a6c 100644 --- a/tools/download.go +++ b/tools/download.go @@ -1,145 +1,32 @@ +// Copyright 2022 Arduino SA +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published +// by the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + package tools import ( - "archive/tar" - "archive/zip" - "bytes" - "compress/bzip2" - "compress/gzip" - "crypto/sha256" - "encoding/hex" - "encoding/json" + "context" "errors" - "fmt" - "io" - "io/ioutil" - "net/http" "os" "os/exec" - "path" "path/filepath" "runtime" - "strings" - "time" - - "golang.org/x/crypto/openpgp" + "github.com/arduino/arduino-create-agent/gen/tools" "github.com/arduino/arduino-create-agent/utilities" - "github.com/blang/semver" - "github.com/xrash/smetrics" ) -type system struct { - Host string `json:"host"` - URL string `json:"url"` - Name string `json:"archiveFileName"` - CheckSum string `json:"checksum"` -} - -type tool struct { - Name string `json:"name"` - Version string `json:"version"` - Systems []system `json:"systems"` - url string - destination string -} - -type index struct { - Packages []struct { - Name string `json:"name"` - Tools []tool `json:"tools"` - } `json:"packages"` -} - -var systems = map[string]string{ - "linuxamd64": "x86_64-linux-gnu", - "linux386": "i686-linux-gnu", - "darwinamd64": "apple-darwin", - "windows386": "i686-mingw32", - "windowsamd64": "i686-mingw32", - "linuxarm": "arm-linux-gnueabihf", -} - -func mimeType(data []byte) (string, error) { - return http.DetectContentType(data[0:512]), nil -} - -// gpg --export YOURKEYID --export-options export-minimal,no-export-attributes | hexdump /dev/stdin -v -e '/1 "%02X"' -var publicKeyHex string = "99020D0452FAA2FA011000D0C5604932111750628F171E4E612D599ABEA8E4309888B9B9E87CCBD3AAD014B27454B0AF08E7CDD019DA72D492B6CF882AD7FA8571E985C538582DA096C371E7FCD95B71BC00C0E92BDDC26801F1B11C86814E0EA849E5973F630FC426E6A5F262C22986CB489B5304005202BA729D519725E3E6042C9199C8ECE734052B7376CF40A864679C3594C93203EBFB3F82CD42CD956F961792233B4C7C1A28252360F48F1D6D8662F2CF93F87DB40A99304F61828AF8A3EB07239E984629DC0B1D5C6494C9AFB5C8F8B9A53F1324C254A1AEA4CD9219AB4DF8667653AC9A6E76C3DB37CE8F60B546F78ECA43A90CB82A2278A291D2E98D66753B56F0595280C6E33B274F631846806D97447DD5C9438E7EC85779D9FA2173E088CE6FA156E291FAFD432C4FC2B1EB251DAFD13C721FF6618F696B77C122FB75E3CBCB446FAAA7FFFDD071C81C6C3D2360D495964C623617352915BBB30FA7C903EA096BF01E77FC84C8B51C02EB11BC9F03F19C7E81254F1F786E64A7A9F7F438873583CFA40F49C0F041432EAECCEC7EE9BA465A30320306F0E2E65EBE01E533CBBD8B1C1C04222213D5D05F4B689193DB60A68A6F1FC8B2ADD9E58A104E482AAD3869CCC42236EDC9CBE8561E105837AB6F7A764DCE5D8CB62608E8133F0FDD5F8FAFBE3BC57EE551ADC7386AADD443B331716EC032ACF9C639BF9DFE62301D4F197221F10DEF0011010001B42041726475696E6F204C4C43203C737570706F72744061726475696E6F2E63633E890238041301020022050252FAA2FA021B03060B090807030206150802090A0B0416020301021E01021780000A09107BAF404C2DFAB4AEF8090FFE20C3B36BF786D692969DA2ECFD7BCA3961E735D3CBB5585D7AB04BB8A0B64B64528ED76DB4752FA24523AA1E07B69A6A66CDDAE074A6A572800228194DD5916A956BF22606D866C7FD81F32878E06FEC200DDB0703D805E1A61006EB0B5BDB3AA89C095BB259BD93C7AAE8BDB18468A6DBE30F85BD6A3271F5456EB22BC2BCE99DB3A054D9BCA8F562C01B99E6BF4C2136B62771EEF54CB2AE95F8E2FE543284C37EB77E5104D49939ABAEF323CA5F1A66CA48ED423DBB3A2CFF12792CCA71ACD1E3032186CC7D05A13E0D66A3258E443527AAF921B7EA70C6CC10E2A51FCAB4DD130A10D3D29B1B01FB4207EF6501D3A9186BDB652ECCC9F354599A114DD3F80F9ED3493AC51A5C4F1F3BB59049EE7EC61411E90E02F27789E87B18A860551DFDFFA870E8542F6128E167CE1875C5C5B1128259347B85265487006B173AA631F1CDA1EDC68C54978E1D0FE3B310CC0F49F9AE84F37B1472437B69DA125BAFDC99AE57C2245F70747E1EFD52849C40469247CF13CB679A31AF4700468E09ED1ECFE5A53F67C80C48A0B0C1334FAE9650584DFD406ADA30FFBEED659256D40924432B029BBB24CEF22195D389381F0B1EB964C6494942335E74A373D869D1FB0C7967F30F79D71AB06929CEBB660514C2567284BD9EC32470B263539B3AFF5D3FBA9A275D4665E6B502B4031B63F511C1DFDD16B617A6FB046FCEB018A7A01CEFB9020D0452FAA2FA011000D6DE1747395EB3836103D30FA5CF555F6FBC982FB8B0FD72389CD6E99A88ACA1BCBD8BAD35211929AB5AB7F656BA1AFFA8C9A5AF83436FC8FE36AB403453E3E6EC679371AD81657FA1506956B1165D8887E3FB7EF366EFCCA82EE543E0B22170D0164A6702EF5280398A901CB6262E63C0AE378FD8CA1957EEED9CE48AA3D481BD117A2CA0341C3E16FE20CB6A5C3130A19B364F656CDC45E2216DE7ACFAD429967D71D101CADE10BA64F4075801ED2E9E3A3293114543456A26236CCA459DC7700D2E9C692BADCA9BA0CDE7189CD594B20CA4D1F20A70B02B9B50F70CFC6F7697B1D500702CE29492C7CD28C5D555475788DDE57482BC39E8465A720E25866AC931D5D7030AB61136BF702B25BC850A5089D1E6F0F68B8AE894ADFC3C92BB836888E3DB5A940426DBE7BBC5BDD3DDD6F5123627D1CE6FD1845CC66A920094391BE783069CB05746C0A55DAFC869FDAF0A08F81099E4F4CD07D05C7269C538C341CF1EDB94114B8CD97B44214EA58EEDB93FAB772013A1D77A08B9208082F9617A6CFE39B56F0078406C6267ABF5CF1078C49B1AB9B60EA1451351CF889EF72D7D696B23B22F753B28979AF10237B579A350FA5596A3B22244FA91402562AE530E814EF19A9E3448F465F78C16220DE0663F7B97C7F0EF1629E2F64A76B21BB695A3DE505B22B09B3459A3CE2180424BD67C8482EBD5EBC8128F98634EEE8707001101000189021F041801020009050252FAA2FA021B0C000A09107BAF404C2DFAB4AE050B1000C1434E8CC0D6F8E60E2FB091AA5EA04E7612B29D3823E09914F704DE1835A7B202D3F619183BD3A16439BFA31A6AF342672E8F59184333C4F56D18AF3B7CE8326F655F7C8DD1D4B38A1964E6A4D7550D159CE1B5EC44BC2091B1097CABE724C0E8C4942C2CF82672E3F209322270D133313CF601E07756B705946A45235DAF7294BCD34292D989EFDFDA2F46AF0AEAEC72F55DC6B2940C7C6A409B7FAD3354D5CA30C3E4EE29F9218A56EF8D7FBA2A7BB8E6304110A21DF0C847C4B761CDE408CE156D53091535A800C1C522CA33C71105B11550A145FD0E41B464146B46D46F08DFAEF9B03D313D54A1E4A82E8749895AB78521DAA8E66EEF6F7B17A0CA4B4CBFCB937713B9806269556EBD88AE87996EFAC0846ACBA0D3412FC0A5E90923C261CD443E4D6C1AE93D83166937C5F606A14FD73DB4919A0ED416D4B3163420F57FACCE9C9347BD5501BE3FC830472B64068E5FF5B09E7425030625246720D21608DEE829F84E8365527F764C91DA93372C72AA4054B458104CAFC2BDCED63DC80F36E7BD4BE0D3A19E20E3FED90F80F9E1584853B971B8E847C27027123B9AA19C3E90B41B3A643D3D5BE2FC134ADA8396D072D37E7101B64CE83E1802D0D5DDA9150B6C21564987950C9601FC2147F139C7A9906640A0883981B452F25AF7A0F32FAA2148ECDD9B04B93AFCED00F11AA0E6695C2F92676B8DB9E93172FD7779B9020D04530B05A7011000CAA1A8FF4BF9D0F0AC9EDBCA3B4D26E3E569DFEA04341F3E6ACE23AE5D87D62C2600DFF10B106144A1B52FF8B695A590D65C681F69DEE454800C235160EBE3FC1436193E1278D56C86E2BBB2187BEAAC1E1D04D40A392B1457471D10A2B6BF39CDF35D1A090A9406BCB06BDEF83A12A490C5E17D68884AD2686042669E2B458AD3CC0377DDA9C58D7070CE29A53E0E7C876D61B29A2DE2A9D73F914D0FF3B0E35E2ED361B60A8C3C3D4C7E77E17A939283BFDA2EC5725A2BFAAC18C6A64ACBEC776760D7086EA42BD93031E8B59FB8DFEFF77E5F80DBEB84ADE74B3A6F9E4D0F3140A8D0F576ED00548883C85271AA7F2450D1061F56CB839786038861D5A2473B7F58EBC00D2BB9EFEB1A2DF612A7B9087C326FBB08F2879102253316784272967A886089D61D5AB0FDB33737D35F27C2886ABB4D4E88F541D0BBAD04AEF7BD3ED66A1282B762BD6F8EEDC3760773B157C1A2D4E4586E43B28879C54E7599F9A34E1524E6E7F9B8EA13CC5A2DF5C1920AF74833EDDEC8EB9A8BE33196702DFD656D81ACBBFE3A10DA882EAA3065D9C9476C0A7B66C15D0063CB7AD1A2EB31537CB443F21B81642436943FE6C45E6AF9C2B595D4DFCB64B83F2CA6B4DD536726C6EC4761A340C18E32B2D7210640B9AB1D8E2165C0DD38BC9FD9DB6A30B380DF08C3F10002A6636FDC79CD2312B606F5F116AC665618A56BBE46C494FC7E23C7001101000189043E0418010200090502530B05A7021B02022909107BAF404C2DFAB4AEC15D200419010200060502530B05A7000A091024A26BAD7F29429187700FFE30ED1B7C96B3846AC7B363F9602D2886F7913A9C451C31E043AD75597024D460B59E6A60A6EE3D58E656901237A2465F8402169A816B38170AF550284EB420B7E827386D66852D68125A27FA6770F139EE7FCAEF43000673B7C7D168614877603C875AD593E333AE9237DB77065FB8375CE98FA1BF7FB1733034AAC61F1D23A3EFF8665702C10968C7991458F88D151B3448C7D9334059431A63D30A9C8E636A99D88DA8DB04CB8C64F1183AC873FF0942EF9555B6B3F192AD5F221AC9737F875CCAE21E88EC45CB35E40C0FF1AAF0A8FE44876D93A930A03CC4846A29102C956F39F2AC5808CCBCD7F4868A8E8E8B9A66EA18C275CEF9C371AB0592796ED57D757A3BAB31FF8E3887F6041E61BDA433E7D68CB2D5F28E81F57843D5032D73BF67119C137FC4CE8BEF4F705D690E47A530B1A85B8B6A09A4AE16A2973C11D69031B89BE92B0751DB7FE74F6F1C219C8B93E5C68EC1403856DF28E96E27737A7FB9C80F6EE9EC485A0609DC4EB8DF444F61C76A97F32ADFA2D8B4784DF3ABA4DE1B57894B9CF89934A143451308D73CF79ECC8BF382B8A34F24DC335238D8353767B363F5432D9A81C84F7D2FAB6E36E7188FA911120A905C67342A996251EBECAC13BD543A9B3C2C063AE294FDD15C66D5DD9224F3E936325F525700F2129D0B31CE8CCD4EBA5DEDB89F0A2BFC0C43E732F695161E4F33CE5DED14B1E98654547B110FFF7CBC2BA513721A96DD18964635069343FA8EEF4D492BFA55C930F9C78DF1F7454F1BDD40F4B04BDE9F9B9A9923A303D96D0CBFA361921AFEF13AED098D0CF70E84C0DDB20C58821351D2359B131671AAF5D2484717A4CAF385DB0CC19FBC37A3FC04F4F387D6934C1E84B9C1291231A14F69A1BF6708875C7DE00E3EFE3C7855A2459C96245C5F0D21FC00E87A0C18F80A3B79C0E28EA27493309C535254421BE7CDFBEFB5B44DAEA56B6859430FCCBEE766048F891AD5CB503866B98E521ED69B37E4165012A45E29836E2A0380728C1108E4C8A32EA186E1A855F78DA5506B6CF86DB888A87FAB6E15A90E3416469522DF5BD8872D729B35E6D82C974CD80076C26008015AB216C83FAF64E488F07D2BD01F51B0963F87BE0AB8392B442227BF7215148038B0C55189024D7C1B032DB1B3C56C66953E530C5B323634FC584A476CAD285EF1108011D14D9D180A75A9DFC936AFC7EF9E6C3F3CFEDD894894CE60358E7156B3A65ED7644DEA343A133F5D4DE4D33B74281086A0C20515AC4151CFED93C56DD574E578FDEE72C4115C25CAEC5EAD97C147F27F4EAE67FEFFEA0DC1CDF5D636AC331CB74DF477C9C3B3706F9DAF50C2E13AC8DE8CC9DD3C79E59EC779EE489D915CF22FDC53E3B3C7710FE8368DF11B9ACDF5F3CAE1F43CB7312E5E9F57F248692B3681CBA3E49207878FD33ED2A47CE9CE9B4E4A6EFD8F0AD2CD" - -func checkGPGSig(fileName string, sigFileName string) error { - - // Get a Reader for the signature file - sigFile, err := os.Open(sigFileName) - if err != nil { - return err - } - defer sigFile.Close() - - // Get a Reader for the signature file - file, err := os.Open(fileName) - if err != nil { - return err - } - defer file.Close() - - publicKeyBin, err := hex.DecodeString(publicKeyHex) - if err != nil { - return err - } - - keyring, _ := openpgp.ReadKeyRing(bytes.NewReader(publicKeyBin)) - - _, err = openpgp.CheckDetachedSignature(keyring, file, sigFile) - - return err -} - -func (t *Tools) DownloadPackageIndex(index_file, signature_file string) error { - // Fetch the index - resp, err := http.Get(t.IndexURL) - if err != nil { - return err - } - defer resp.Body.Close() - - // Read the body - body, err := ioutil.ReadAll(resp.Body) - if err != nil { - return err - } - - // Fetch the signature - signature, err := http.Get(t.IndexURL + ".sig") - if err != nil { - return err - } - defer signature.Body.Close() - - // Read the body - signature_body, err := ioutil.ReadAll(signature.Body) - if err != nil { - return err - } - ioutil.WriteFile(index_file, body, 0644) - ioutil.WriteFile(signature_file, signature_body, 0644) - - t.LastRefresh = time.Now() - - return nil -} - -func pathExists(path string) bool { - _, err := os.Stat(path) - if err == nil { - return true - } - if os.IsNotExist(err) { - return false - } - return true -} - // Download will parse the index at the indexURL for the tool to download. // It will extract it in a folder in .arduino-create, and it will update the // Installed map. @@ -157,442 +44,53 @@ func pathExists(path string) bool { // if it already exists. func (t *Tools) Download(pack, name, version, behaviour string) error { - index_file := path.Join(t.Directory, "package_index.json") - signature_file := path.Join(t.Directory, "package_index.json.sig") - - if _, err := os.Stat(path.Join(t.Directory, "package_index.json")); err != nil || time.Since(t.LastRefresh) > 1*time.Hour { - // Download the file again and save it - err = t.DownloadPackageIndex(index_file, signature_file) - if err != nil { - return err - } - } - - err := checkGPGSig(index_file, signature_file) - if err != nil { - return err - } - - body, err := ioutil.ReadFile(index_file) - if err != nil { - return err - } - - var data index - json.Unmarshal(body, &data) - - // Find the tool by name - correctTool, correctSystem := findTool(pack, name, version, data) - - if correctTool.Name == "" || correctSystem.URL == "" { - t.Logger("We couldn't find a tool with the name " + name + " and version " + version + " packaged by " + pack) - return nil - } - - key := correctTool.Name + "-" + correctTool.Version - - // Check if it already exists - if behaviour == "keep" { - t.mutex.RLock() - location, ok := t.installed[key] - t.mutex.RUnlock() - if ok && pathExists(location) { - // overwrite the default tool with this one - t.mutex.Lock() - t.installed[correctTool.Name] = location - t.mutex.Unlock() - t.Logger("The tool is already present on the system") - return t.writeMap() - } - } - - // Download the tool - t.Logger("Downloading tool " + name + " from " + correctSystem.URL) - resp, err := http.Get(correctSystem.URL) - if err != nil { - return err - } - defer resp.Body.Close() - - // Read the body - body, err = ioutil.ReadAll(resp.Body) - if err != nil { - return err - } - - // Checksum - checksum := sha256.Sum256(body) - checkSumString := "SHA-256:" + hex.EncodeToString(checksum[:sha256.Size]) - - if checkSumString != correctSystem.CheckSum { - return errors.New("Checksum doesn't match") - } - - // Decompress - t.Logger("Unpacking tool " + name) - - location := path.Join(dir(), pack, correctTool.Name, correctTool.Version) - err = os.RemoveAll(location) - - if err != nil { - return err - } - - srcType, err := mimeType(body) + t.tools.SetBehaviour(behaviour) + _, err := t.tools.Install(context.Background(), &tools.ToolPayload{Name: name, Version: version, Packager: pack}) if err != nil { return err } - switch srcType { - case "application/zip": - location, err = extractZip(t.Logger, body, location) - case "application/x-bz2": - case "application/octet-stream": - location, err = extractBz2(t.Logger, body, location) - case "application/x-gzip": - location, err = extractTarGz(t.Logger, body, location) - default: - return errors.New("Unknown extension for file " + correctSystem.URL) - } - + path := filepath.Join(pack, name, version) + safePath, err := utilities.SafeJoin(t.directory.String(), path) if err != nil { - t.Logger("Error extracting the archive: " + err.Error()) return err } - err = t.installDrivers(location) + // if the tool contains a post_install script, run it: it means it is a tool that needs to install drivers + // AFAIK this is only the case for the windows-driver tool + err = t.installDrivers(safePath) if err != nil { return err } // Ensure that the files are executable - t.Logger("Ensure that the files are executable") + t.logger("Ensure that the files are executable") // Update the tool map - t.Logger("Updating map with location " + location) - - t.mutex.Lock() - t.installed[name] = location - t.installed[name+"-"+correctTool.Version] = location - t.mutex.Unlock() - return t.writeMap() -} - -func findTool(pack, name, version string, data index) (tool, system) { - var correctTool tool - correctTool.Version = "0.0" - - for _, p := range data.Packages { - if p.Name != pack { - continue - } - for _, t := range p.Tools { - if version != "latest" { - if t.Name == name && t.Version == version { - correctTool = t - } - } else { - // Find latest - v1, _ := semver.Make(t.Version) - v2, _ := semver.Make(correctTool.Version) - if t.Name == name && v1.Compare(v2) > 0 { - correctTool = t - } - } - } - } + t.logger("Updating map with location " + safePath) - // Find the url based on system - var correctSystem system - max_similarity := 0.7 + t.setMapValue(name, safePath) + t.setMapValue(name+"-"+version, safePath) - for _, s := range correctTool.Systems { - similarity := smetrics.Jaro(s.Host, systems[runtime.GOOS+runtime.GOARCH]) - if similarity > max_similarity { - correctSystem = s - max_similarity = similarity - } - } - - return correctTool, correctSystem -} - -func stringInSlice(str string, list []string) bool { - for _, v := range list { - if v == str { - return true - } - } - return false -} - -func commonPrefix(sep byte, paths []string) string { - // Handle special cases. - switch len(paths) { - case 0: - return "" - case 1: - return path.Clean(paths[0]) - } - - c := []byte(path.Clean(paths[0])) - - // We add a trailing sep to handle: common prefix directory is included in the path list - // (e.g. /home/user1, /home/user1/foo, /home/user1/bar). - // path.Clean will have cleaned off trailing / separators with - // the exception of the root directory, "/" making it "//" - // but this will get fixed up to "/" below). - c = append(c, sep) - - // Ignore the first path since it's already in c - for _, v := range paths[1:] { - // Clean up each path before testing it - v = path.Clean(v) + string(sep) - - // Find the first non-common byte and truncate c - if len(v) < len(c) { - c = c[:len(v)] - } - for i := 0; i < len(c); i++ { - if v[i] != c[i] { - c = c[:i] - break - } - } - } - - // Remove trailing non-separator characters and the final separator - for i := len(c) - 1; i >= 0; i-- { - if c[i] == sep { - c = c[:i] - break - } - } - - return string(c) -} - -func removeStringFromSlice(s []string, r string) []string { - for i, v := range s { - if v == r { - return append(s[:i], s[i+1:]...) - } - } - return s -} - -func findBaseDir(dirList []string) string { - if len(dirList) == 1 { - return path.Dir(dirList[0]) + "/" - } - - // https://github.com/backdrop-ops/contrib/issues/55#issuecomment-73814500 - dontdiff := []string{"pax_global_header"} - for _, v := range dontdiff { - dirList = removeStringFromSlice(dirList, v) - } - - commonBaseDir := commonPrefix('/', dirList) - if commonBaseDir != "" { - commonBaseDir = commonBaseDir + "/" - } - return commonBaseDir -} - -func extractZip(log func(msg string), body []byte, location string) (string, error) { - path, err := utilities.SaveFileonTempDir("tooldownloaded.zip", bytes.NewReader(body)) - r, err := zip.OpenReader(path) - if err != nil { - return location, err - } - - var dirList []string - - for _, f := range r.File { - dirList = append(dirList, f.Name) - } - - basedir := findBaseDir(dirList) - log(fmt.Sprintf("selected baseDir %s from Zip Archive Content: %v", basedir, dirList)) - - for _, f := range r.File { - fullname := filepath.Join(location, strings.Replace(f.Name, basedir, "", -1)) - log(fmt.Sprintf("generated fullname %s removing %s from %s", fullname, basedir, f.Name)) - if f.FileInfo().IsDir() { - os.MkdirAll(fullname, f.FileInfo().Mode().Perm()) - } else { - os.MkdirAll(filepath.Dir(fullname), 0755) - perms := f.FileInfo().Mode().Perm() - out, err := os.OpenFile(fullname, os.O_CREATE|os.O_RDWR, perms) - if err != nil { - return location, err - } - rc, err := f.Open() - if err != nil { - return location, err - } - _, err = io.CopyN(out, rc, f.FileInfo().Size()) - if err != nil { - return location, err - } - rc.Close() - out.Close() - - mtime := f.FileInfo().ModTime() - err = os.Chtimes(fullname, mtime, mtime) - if err != nil { - return location, err - } - } - } - return location, nil -} - -func extractTarGz(log func(msg string), body []byte, location string) (string, error) { - bodyCopy := make([]byte, len(body)) - copy(bodyCopy, body) - tarFile, _ := gzip.NewReader(bytes.NewReader(body)) - tarReader := tar.NewReader(tarFile) - - var dirList []string - - for { - header, err := tarReader.Next() - if err == io.EOF { - break - } - dirList = append(dirList, header.Name) - } - - basedir := findBaseDir(dirList) - log(fmt.Sprintf("selected baseDir %s from TarGz Archive Content: %v", basedir, dirList)) - - tarFile, _ = gzip.NewReader(bytes.NewReader(bodyCopy)) - tarReader = tar.NewReader(tarFile) - - for { - header, err := tarReader.Next() - if err == io.EOF { - break - } else if err != nil { - //return location, err - } - - path := filepath.Join(location, strings.Replace(header.Name, basedir, "", -1)) - info := header.FileInfo() - - // Create parent folder - dirmode := info.Mode() | os.ModeDir | 0700 - if err = os.MkdirAll(filepath.Dir(path), dirmode); err != nil { - return location, err - } - - if info.IsDir() { - if err = os.MkdirAll(path, info.Mode()); err != nil { - return location, err - } - continue - } - - if header.Typeflag == tar.TypeSymlink { - err = os.Symlink(header.Linkname, path) - continue - } - - file, err := os.OpenFile(path, os.O_CREATE|os.O_TRUNC|os.O_WRONLY, info.Mode()) - if err != nil { - continue - } - _, err = io.Copy(file, tarReader) - if err != nil { - //return location, err - } - file.Close() - } - return location, nil -} - -func extractBz2(log func(msg string), body []byte, location string) (string, error) { - bodyCopy := make([]byte, len(body)) - copy(bodyCopy, body) - tarFile := bzip2.NewReader(bytes.NewReader(body)) - tarReader := tar.NewReader(tarFile) - - var dirList []string - - for { - header, err := tarReader.Next() - if err == io.EOF { - break - } - dirList = append(dirList, header.Name) - } - - basedir := findBaseDir(dirList) - log(fmt.Sprintf("selected baseDir %s from Bz2 Archive Content: %v", basedir, dirList)) - - tarFile = bzip2.NewReader(bytes.NewReader(bodyCopy)) - tarReader = tar.NewReader(tarFile) - - for { - header, err := tarReader.Next() - if err == io.EOF { - break - } else if err != nil { - continue - //return location, err - } - - path := filepath.Join(location, strings.Replace(header.Name, basedir, "", -1)) - info := header.FileInfo() - - // Create parent folder - dirmode := info.Mode() | os.ModeDir | 0700 - if err = os.MkdirAll(filepath.Dir(path), dirmode); err != nil { - return location, err - } - - if info.IsDir() { - if err = os.MkdirAll(path, info.Mode()); err != nil { - return location, err - } - continue - } - - if header.Typeflag == tar.TypeSymlink { - err = os.Symlink(header.Linkname, path) - continue - } - - file, err := os.OpenFile(path, os.O_CREATE|os.O_TRUNC|os.O_WRONLY, info.Mode()) - if err != nil { - continue - //return location, err - } - _, err = io.Copy(file, tarReader) - if err != nil { - //return location, err - } - file.Close() - } - return location, nil + return nil } func (t *Tools) installDrivers(location string) error { - OK_PRESSED := 6 + OkPressed := 6 extension := ".bat" - preamble := "" + // add .\ to force locality + preamble := ".\\" if runtime.GOOS != "windows" { extension = ".sh" // add ./ to force locality preamble = "./" } if _, err := os.Stat(filepath.Join(location, "post_install"+extension)); err == nil { - t.Logger("Installing drivers") + t.logger("Installing drivers") ok := MessageBox("Installing drivers", "We are about to install some drivers needed to use Arduino/Genuino boards\nDo you want to continue?") - if ok == OK_PRESSED { + if ok == OkPressed { os.Chdir(location) - t.Logger(preamble + "post_install" + extension) + t.logger(preamble + "post_install" + extension) oscmd := exec.Command(preamble + "post_install" + extension) if runtime.GOOS != "linux" { // spawning a shell could be the only way to let the user type his password @@ -600,25 +98,8 @@ func (t *Tools) installDrivers(location string) error { } err = oscmd.Run() return err - } else { - return errors.New("Could not install drivers") - } - } - return nil -} - -func makeExecutable(location string) error { - location = path.Join(location, "bin") - files, err := ioutil.ReadDir(location) - if err != nil { - return err - } - - for _, file := range files { - err = os.Chmod(path.Join(location, file.Name()), 0755) - if err != nil { - return err } + return errors.New("could not install drivers") } return nil } diff --git a/tools/download_test.go b/tools/download_test.go index d13ef9bb7..96a105fd7 100644 --- a/tools/download_test.go +++ b/tools/download_test.go @@ -1,109 +1,184 @@ +// Copyright 2022 Arduino SA +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published +// by the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + package tools import ( - "fmt" - "io/ioutil" - "net/http" - "os" - "path" + "encoding/json" + "runtime" "testing" + "time" - "github.com/stretchr/testify/assert" + "github.com/arduino/arduino-create-agent/globals" + "github.com/arduino/arduino-create-agent/index" + "github.com/arduino/arduino-create-agent/utilities" + "github.com/arduino/arduino-create-agent/v2/pkgs" + "github.com/arduino/go-paths-helper" + "github.com/stretchr/testify/require" ) -func Test_findBaseDir(t *testing.T) { - cases := []struct { - dirList []string - want string +func TestDownloadCorrectPlatform(t *testing.T) { + testCases := []struct { + hostOS string + hostArch string + correctOSArch string }{ - {[]string{"bin/bossac"}, "bin/"}, - {[]string{"bin/", "bin/bossac"}, "bin/"}, - {[]string{"bin/", "bin/bossac", "example"}, ""}, - {[]string{"avrdude/bin/", - "avrdude/bin/avrdude.exe", - "avrdude/bin/remove_giveio.bat", - "avrdude/bin/status_giveio.bat", - "avrdude/bin/giveio.sys", - "avrdude/bin/loaddrv.exe", - "avrdude/bin/libusb0.dll", - "avrdude/bin/install_giveio.bat", - "avrdude/etc/avrdude.conf"}, "avrdude/"}, - {[]string{"pax_global_header", "bin/", "bin/bossac"}, "bin/"}, + {"linux", "amd64", "x86_64-linux-gnu"}, + {"linux", "386", "i686-linux-gnu"}, + {"darwin", "amd64", "x86_64-apple-darwin"}, + {"darwin", "arm64", "arm64-apple-darwin"}, + {"windows", "386", "i686-mingw32"}, + {"windows", "amd64", "x86_64-mingw32"}, + {"linux", "arm", "arm-linux-gnueabihf"}, } - for _, tt := range cases { - t.Run(fmt.Sprintln(tt.dirList), func(t *testing.T) { - if got := findBaseDir(tt.dirList); got != tt.want { - t.Errorf("findBaseDir() = got %v, want %v", got, tt.want) - } + defer func() { + pkgs.OS = runtime.GOOS // restore `runtime.OS` + pkgs.Arch = runtime.GOARCH // restore `runtime.ARCH` + }() + testIndex := paths.New("testdata", "test_tool_index.json") + buf, err := testIndex.ReadFile() + require.NoError(t, err) + + var data pkgs.Index + err = json.Unmarshal(buf, &data) + require.NoError(t, err) + for _, tc := range testCases { + t.Run(tc.hostOS+tc.hostArch, func(t *testing.T) { + pkgs.OS = tc.hostOS // override `runtime.OS` for testing purposes + pkgs.Arch = tc.hostArch // override `runtime.ARCH` for testing purposes + // Find the tool by name + correctTool, correctSystem, found := pkgs.FindTool("arduino-test", "arduino-fwuploader", "2.2.2", data) + require.True(t, found) + require.NotNil(t, correctTool) + require.NotNil(t, correctSystem) + require.Equal(t, correctTool.Name, "arduino-fwuploader") + require.Equal(t, correctTool.Version, "2.2.2") + require.Equal(t, correctSystem.Host, tc.correctOSArch) }) } } -func TestTools_DownloadAndUnpackBehaviour(t *testing.T) { - urls := []string{ - "https://downloads.arduino.cc/tools/avrdude-6.3.0-arduino14-armhf-pc-linux-gnu.tar.bz2", - "https://downloads.arduino.cc/tools/avrdude-6.3.0-arduino14-aarch64-pc-linux-gnu.tar.bz2", - "https://downloads.arduino.cc/tools/avrdude-6.3.0-arduino14-i386-apple-darwin11.tar.bz2", - "https://downloads.arduino.cc/tools/avrdude-6.3.0-arduino14-x86_64-pc-linux-gnu.tar.bz2", - "https://downloads.arduino.cc/tools/avrdude-6.3.0-arduino14-i686-pc-linux-gnu.tar.bz2", - "https://downloads.arduino.cc/tools/avrdude-6.3.0-arduino14-i686-w64-mingw32.zip", +func TestDownloadFallbackPlatform(t *testing.T) { + testCases := []struct { + hostOS string + hostArch string + correctOSArch string + }{ + {"darwin", "amd64", "i386-apple-darwin11"}, + {"darwin", "arm64", "i386-apple-darwin11"}, + {"windows", "amd64", "i686-mingw32"}, } - expectedDirList := []string{"bin", "etc"} + defer func() { + pkgs.OS = runtime.GOOS // restore `runtime.OS` + pkgs.Arch = runtime.GOARCH // restore `runtime.ARCH` + }() + testIndex := paths.New("testdata", "test_tool_index.json") + buf, err := testIndex.ReadFile() + require.NoError(t, err) - tmpDir, err := ioutil.TempDir("", "download_test") - if err != nil { - t.Fatal(err) + var data pkgs.Index + err = json.Unmarshal(buf, &data) + require.NoError(t, err) + for _, tc := range testCases { + t.Run(tc.hostOS+tc.hostArch, func(t *testing.T) { + pkgs.OS = tc.hostOS // override `runtime.OS` for testing purposes + pkgs.Arch = tc.hostArch // override `runtime.ARCH` for testing purposes + // Find the tool by name + correctTool, correctSystem, found := pkgs.FindTool("arduino-test", "arduino-fwuploader", "2.2.0", data) + require.True(t, found) + require.NotNil(t, correctTool) + require.NotNil(t, correctSystem) + require.Equal(t, correctTool.Name, "arduino-fwuploader") + require.Equal(t, correctTool.Version, "2.2.0") + require.Equal(t, correctSystem.Host, tc.correctOSArch) + }) } - defer os.RemoveAll(tmpDir) - - for _, url := range urls { - t.Log("Downloading tool from " + url) - resp, err := http.Get(url) - if err != nil { - t.Errorf("%v", err) - } - defer resp.Body.Close() - - // Read the body - body, err := ioutil.ReadAll(resp.Body) - if err != nil { - t.Errorf("%v", err) - } +} - location := path.Join(tmpDir, "username", "arduino", "avrdude", "6.3.0-arduino14") - os.MkdirAll(location, os.ModePerm) - err = os.RemoveAll(location) +func TestDownload(t *testing.T) { + testCases := []struct { + name string + version string + filesCreated []string + }{ + {"avrdude", "6.3.0-arduino17", []string{"bin", "etc"}}, + {"bossac", "1.6.1-arduino", []string{"bossac"}}, + {"bossac", "1.7.0-arduino3", []string{"bossac"}}, + {"bossac", "1.9.1-arduino2", []string{"bossac"}}, + {"openocd", "0.11.0-arduino2", []string{"bin", "share"}}, + {"dfu-util", "0.10.0-arduino1", []string{"dfu-prefix", "dfu-suffix", "dfu-util"}}, + {"rp2040tools", "1.0.6", []string{"elf2uf2", "picotool", "pioasm", "rp2040load"}}, + {"esptool_py", "4.5.1", []string{"esptool"}}, + {"arduino-fwuploader", "2.2.2", []string{"arduino-fwuploader"}}, + } + // prepare the test environment + tempDir := t.TempDir() + tempDirPath := paths.New(tempDir) + testIndex := index.Resource{ + IndexFile: *paths.New("testdata", "test_tool_index.json"), + LastRefresh: time.Now(), + } + testTools := New(tempDirPath, &testIndex, func(msg string) { t.Log(msg) }, utilities.MustParseRsaPublicKey([]byte(globals.ArduinoSignaturePubKey))) - if err != nil { - t.Errorf("%v", err) - } + for _, tc := range testCases { + t.Run(tc.name+"-"+tc.version, func(t *testing.T) { + // Download the tool + err := testTools.Download("arduino-test", tc.name, tc.version, "replace") + require.NoError(t, err) - srcType, err := mimeType(body) - if err != nil { - t.Errorf("%v", err) - } + // Check that the tool has been downloaded + toolDir := tempDirPath.Join("arduino-test", tc.name, tc.version) + require.DirExists(t, toolDir.String()) - switch srcType { - case "application/zip": - location, err = extractZip(func(msg string) { t.Log(msg) }, body, location) - case "application/x-bz2": - case "application/octet-stream": - location, err = extractBz2(func(msg string) { t.Log(msg) }, body, location) - case "application/x-gzip": - location, err = extractTarGz(func(msg string) { t.Log(msg) }, body, location) - default: - t.Errorf("no suitable type found") - } - files, err := ioutil.ReadDir(location) - if err != nil { - t.Errorf("%v", err) - } - dirList := []string{} - for _, f := range files { - dirList = append(dirList, f.Name()) - } + // Check that the files have been created + for _, file := range tc.filesCreated { + filePath := toolDir.Join(file) + if filePath.IsDir() { + require.DirExists(t, filePath.String()) + } else { + if runtime.GOOS == "windows" { + require.FileExists(t, filePath.String()+".exe") + } else { + require.FileExists(t, filePath.String()) + } + } + } - assert.ElementsMatchf(t, dirList, expectedDirList, "error message %s", "formatted") + // Check that the tool has been installed + _, ok := testTools.getMapValue(tc.name + "-" + tc.version) + require.True(t, ok) + }) } +} +func TestCorruptedInstalled(t *testing.T) { + // prepare the test environment + tempDir := t.TempDir() + tempDirPath := paths.New(tempDir) + testIndex := index.Resource{ + IndexFile: *paths.New("testdata", "test_tool_index.json"), + LastRefresh: time.Now(), + } + corruptedJSON := tempDirPath.Join("installed.json") + fileJSON, err := corruptedJSON.Create() + require.NoError(t, err) + defer fileJSON.Close() + _, err = fileJSON.Write([]byte("Hello")) + require.NoError(t, err) + testTools := New(tempDirPath, &testIndex, func(msg string) { t.Log(msg) }, utilities.MustParseRsaPublicKey([]byte(globals.ArduinoSignaturePubKey))) + // Download the tool + err = testTools.Download("arduino-test", "avrdude", "6.3.0-arduino17", "keep") + require.NoError(t, err) } diff --git a/tools/hidefile_darwin.go b/tools/hidefile_darwin.go deleted file mode 100644 index 8b031dd00..000000000 --- a/tools/hidefile_darwin.go +++ /dev/null @@ -1,16 +0,0 @@ -package tools - -import ( - "os/exec" -) - -func hideFile(path string) { - -} - -func TellCommandNotToSpawnShell(_ *exec.Cmd) { -} - -func MessageBox(title, text string) int { - return 6 -} diff --git a/tools/hidefile_linux.go b/tools/hidefile_linux.go deleted file mode 100644 index 8b031dd00..000000000 --- a/tools/hidefile_linux.go +++ /dev/null @@ -1,16 +0,0 @@ -package tools - -import ( - "os/exec" -) - -func hideFile(path string) { - -} - -func TellCommandNotToSpawnShell(_ *exec.Cmd) { -} - -func MessageBox(title, text string) int { - return 6 -} diff --git a/tools/hidefile_windows.go b/tools/hidefile_windows.go deleted file mode 100644 index 657de9ae8..000000000 --- a/tools/hidefile_windows.go +++ /dev/null @@ -1,30 +0,0 @@ -package tools - -import ( - "os/exec" - "syscall" - "unsafe" -) - -func hideFile(path string) { - cpath, cpathErr := syscall.UTF16PtrFromString(path) - if cpathErr != nil { - } - syscall.SetFileAttributes(cpath, syscall.FILE_ATTRIBUTE_HIDDEN) -} - -func TellCommandNotToSpawnShell(oscmd *exec.Cmd) { - oscmd.SysProcAttr = &syscall.SysProcAttr{HideWindow: true} -} - -func MessageBox(title, text string) int { - var mod = syscall.NewLazyDLL("user32.dll") - var proc = mod.NewProc("MessageBoxW") - var MB_YESNO = 0x00000004 - - ret, _, _ := proc.Call(0, - uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(text))), - uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(title))), - uintptr(MB_YESNO)) - return int(ret) -} diff --git a/tools/shell_default.go b/tools/shell_default.go new file mode 100644 index 000000000..24a607a5d --- /dev/null +++ b/tools/shell_default.go @@ -0,0 +1,31 @@ +// Copyright 2022 Arduino SA +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published +// by the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +//go:build !windows + +package tools + +import ( + "os/exec" +) + +// TellCommandNotToSpawnShell will now spawn a shell +func TellCommandNotToSpawnShell(_ *exec.Cmd) { +} + +// MessageBox will open a dialog +func MessageBox(title, text string) int { + return 6 +} diff --git a/tools/shell_windows.go b/tools/shell_windows.go new file mode 100644 index 000000000..55f665dea --- /dev/null +++ b/tools/shell_windows.go @@ -0,0 +1,40 @@ +// Copyright 2022 Arduino SA +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published +// by the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +package tools + +import ( + "os/exec" + "syscall" + "unsafe" +) + +// TellCommandNotToSpawnShell will now spawn a shell +func TellCommandNotToSpawnShell(oscmd *exec.Cmd) { + oscmd.SysProcAttr = &syscall.SysProcAttr{HideWindow: true} +} + +// MessageBox will open a dialog +func MessageBox(title, text string) int { + var mod = syscall.NewLazyDLL("user32.dll") + var proc = mod.NewProc("MessageBoxW") + var MB_YESNO = 0x00000004 + + ret, _, _ := proc.Call(0, + uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(text))), + uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(title))), + uintptr(MB_YESNO)) + return int(ret) +} diff --git a/tools/testdata/test_tool_index.json b/tools/testdata/test_tool_index.json new file mode 100644 index 000000000..b7f8b87d2 --- /dev/null +++ b/tools/testdata/test_tool_index.json @@ -0,0 +1,521 @@ +{ + "packages": [ + { + "name": "arduino-test", + "maintainer": "Arduino", + "websiteURL": "http://www.arduino.cc/", + "email": "packages@arduino.cc", + "help": { + "online": "http://www.arduino.cc/en/Reference/HomePage" + }, + "platforms": [ + { + "name": "Arduino megaAVR Boards - Pre-release", + "architecture": "megaavr", + "version": "1.8.102", + "category": "Arduino", + "url": "http://downloads.arduino.cc/cores/staging/core-megaavr-1.8.102.tar.bz2", + "archiveFileName": "core-megaavr-1.8.102.tar.bz2", + "checksum": "SHA-256:ad5e60b828678d9ccff957032524a4c4d68b218737e7df24b905769a04dc2a6a", + "size": "858620", + "help": { + "online": "https://github.com/arduino/ArduinoCore-megaavr/issues" + }, + "boards": [ + { + "name": "Arduino Uno WiFi Rev2" + }, + { + "name": "Arduino Nano Every" + } + ], + "toolsDependencies": [ + { + "packager": "arduino", + "name": "avr-gcc", + "version": "7.3.0-atmel3.6.1-arduino5" + }, + { + "packager": "arduino", + "name": "avrdude", + "version": "7.0-arduino.3" + }, + { + "packager": "arduino", + "name": "arduinoOTA", + "version": "1.3.0" + } + ] + } + ], + "tools": [ + { + "name": "avrdude", + "version": "6.3.0-arduino17", + "systems": [ + { + "size": "219631", + "checksum": "SHA-256:2a8e68c5d803aa6f902ef219f177ec3a4c28275d85cbe272962ad2cd374f50d1", + "host": "arm-linux-gnueabihf", + "archiveFileName": "avrdude-6.3.0-arduino17-armhf-pc-linux-gnu.tar.bz2", + "url": "http://downloads.arduino.cc/tools/avrdude-6.3.0-arduino17-armhf-pc-linux-gnu.tar.bz2" + }, + { + "size": "229852", + "checksum": "SHA-256:6cf948f751acfe7b96684537f2291c766ec8b54b4f7dc95539864821456fa9fc", + "host": "aarch64-linux-gnu", + "archiveFileName": "avrdude-6.3.0-arduino17-aarch64-pc-linux-gnu.tar.bz2", + "url": "http://downloads.arduino.cc/tools/avrdude-6.3.0-arduino17-aarch64-pc-linux-gnu.tar.bz2" + }, + { + "size": "279045", + "checksum": "SHA-256:120cc9edaae699e7e9ac50b1b8eb0e7d51fdfa555bac54233c2511e6ee5418c9", + "host": "x86_64-apple-darwin12", + "archiveFileName": "avrdude-6.3.0-arduino17-x86_64-apple-darwin12.tar.bz2", + "url": "http://downloads.arduino.cc/tools/avrdude-6.3.0-arduino17-x86_64-apple-darwin12.tar.bz2" + }, + { + "size": "254271", + "checksum": "SHA-256:accdfb920af2aabf4f7461d2ac73c0751760f525216dc4e7657427a78c60d13d", + "host": "x86_64-linux-gnu", + "archiveFileName": "avrdude-6.3.0-arduino17-x86_64-pc-linux-gnu.tar.bz2", + "url": "http://downloads.arduino.cc/tools/avrdude-6.3.0-arduino17-x86_64-pc-linux-gnu.tar.bz2" + }, + { + "size": "244550", + "checksum": "SHA-256:5c8cc6c17db9300e1451fe41cd7178b0442b4490ee6fdbc0aed9811aef96c05f", + "host": "i686-linux-gnu", + "archiveFileName": "avrdude-6.3.0-arduino17-i686-pc-linux-gnu.tar.bz2", + "url": "http://downloads.arduino.cc/tools/avrdude-6.3.0-arduino17-i686-pc-linux-gnu.tar.bz2" + }, + { + "size": "328460", + "checksum": "SHA-256:e99188873c7c5ad8f8f906f068c33600e758b2e36cce3adbd518a21bd266749d", + "host": "i686-mingw32", + "archiveFileName": "avrdude-6.3.0-arduino17-i686-w64-mingw32.zip", + "url": "http://downloads.arduino.cc/tools/avrdude-6.3.0-arduino17-i686-w64-mingw32.zip" + } + ] + }, + { + "name": "bossac", + "version": "1.6.1-arduino", + "systems": [ + { + "host": "arm-linux-gnueabihf", + "url": "http://downloads.arduino.cc/bossac-1.6.1-arduino-arm-linux-gnueabihf.tar.bz2", + "archiveFileName": "bossac-1.6.1-arduino-arm-linux-gnueabihf.tar.bz2", + "checksum": "SHA-256:8c4e63db982178919c824e7a35580dffc95c3426afa7285de3eb583982d4d391", + "size": "201341" + }, + { + "host": "i686-mingw32", + "url": "http://downloads.arduino.cc/bossac-1.6.1-arduino-mingw32.tar.gz", + "archiveFileName": "bossac-1.6.1-arduino-mingw32.tar.gz", + "checksum": "SHA-256:d59f43e2e83a337d04c4ae88b195a4ee175b8d87fff4c43144d23412a4a9513b", + "size": "222918" + }, + { + "host": "x86_64-apple-darwin", + "url": "http://downloads.arduino.cc/bossac-1.6.1-arduino-i386-apple-darwin14.5.0.tar.gz", + "archiveFileName": "bossac-1.6.1-arduino-i386-apple-darwin14.5.0.tar.gz", + "checksum": "SHA-256:2f80ef569a3fb19da60ab3489e49d8fe7d4699876acf30ff4938c632230a09aa", + "size": "64587" + }, + { + "host": "x86_64-pc-linux-gnu", + "url": "http://downloads.arduino.cc/bossac-1.6.1-arduino-x86_64-linux-gnu.tar.gz", + "archiveFileName": "bossac-1.6.1-arduino-x86_64-linux-gnu.tar.gz", + "checksum": "SHA-256:b78afc66c00ccfdd69a08bd3959c260a0c64ccce78a71d5a1135ae4437ff40db", + "size": "30869" + }, + { + "host": "i686-pc-linux-gnu", + "url": "http://downloads.arduino.cc/bossac-1.6.1-arduino-i486-linux-gnu.tar.gz", + "archiveFileName": "bossac-1.6.1-arduino-i486-linux-gnu.tar.gz", + "checksum": "SHA-256:1e211347569d75193b337296a10dd25b0ce04419e3d7dc644355178b6b514f92", + "size": "30320" + } + ] + }, + { + "name": "bossac", + "version": "1.7.0-arduino3", + "systems": [ + { + "host": "i686-mingw32", + "url": "http://downloads.arduino.cc/tools/bossac-1.7.0-arduino3-windows.tar.gz", + "archiveFileName": "bossac-1.7.0-arduino3-windows.tar.gz", + "checksum": "SHA-256:62745cc5a98c26949ec9041ef20420643c561ec43e99dae659debf44e6836526", + "size": "3607421" + }, + { + "host": "x86_64-apple-darwin", + "url": "http://downloads.arduino.cc/tools/bossac-1.7.0-arduino3-osx.tar.gz", + "archiveFileName": "bossac-1.7.0-arduino3-osx.tar.gz", + "checksum": "SHA-256:adb3c14debd397d8135e9e970215c6972f0e592c7af7532fa15f9ce5e64b991f", + "size": "75510" + }, + { + "host": "x86_64-pc-linux-gnu", + "url": "http://downloads.arduino.cc/tools/bossac-1.7.0-arduino3-linux64.tar.gz", + "archiveFileName": "bossac-1.7.0-arduino3-linux64.tar.gz", + "checksum": "SHA-256:1ae54999c1f97234a5c603eb99ad39313b11746a4ca517269a9285afa05f9100", + "size": "207271" + }, + { + "host": "i686-pc-linux-gnu", + "url": "http://downloads.arduino.cc/tools/bossac-1.7.0-arduino3-linux32.tar.gz", + "archiveFileName": "bossac-1.7.0-arduino3-linux32.tar.gz", + "checksum": "SHA-256:4ac4354746d1a09258f49a43ef4d1baf030d81c022f8434774268b00f55d3ec3", + "size": "193577" + }, + { + "host": "arm-linux-gnueabihf", + "url": "http://downloads.arduino.cc/tools/bossac-1.7.0-arduino3-linuxarm.tar.gz", + "archiveFileName": "bossac-1.7.0-arduino3-linuxarm.tar.gz", + "checksum": "SHA-256:626c6cc548046901143037b782bf019af1663bae0d78cf19181a876fb9abbb90", + "size": "193941" + }, + { + "host": "aarch64-linux-gnu", + "url": "http://downloads.arduino.cc/tools/bossac-1.7.0-arduino3-linuxaarch64.tar.gz", + "archiveFileName": "bossac-1.7.0-arduino3-linuxaarch64.tar.gz", + "checksum": "SHA-256:a098b2cc23e29f0dc468416210d097c4a808752cd5da1a7b9b8b7b931a04180b", + "size": "268365" + } + ] + }, + { + "name": "bossac", + "version": "1.9.1-arduino2", + "systems": [ + { + "host": "i686-mingw32", + "url": "http://downloads.arduino.cc/tools/bossac-1.9.1-arduino2-windows.tar.gz", + "archiveFileName": "bossac-1.9.1-arduino2-windows.tar.gz", + "checksum": "SHA-256:5c994d04354f0db8e4bea136f49866d2ba537f0af74b2e78026f2d4fc75e3e39", + "size": "1260628" + }, + { + "host": "x86_64-apple-darwin", + "url": "http://downloads.arduino.cc/tools/bossac-1.9.1-arduino2-osx.tar.gz", + "archiveFileName": "bossac-1.9.1-arduino2-osx.tar.gz", + "checksum": "SHA-256:b7732129364a378676604db6579c9b8dab50dd965fb50d7a3afff1839c97ff80", + "size": "47870" + }, + { + "host": "x86_64-pc-linux-gnu", + "url": "http://downloads.arduino.cc/tools/bossac-1.9.1-arduino2-linux64.tar.gz", + "archiveFileName": "bossac-1.9.1-arduino2-linux64.tar.gz", + "checksum": "SHA-256:9eb549874391521999cee13dc823a2cfc8866b8246945339a281808d99c72d2c", + "size": "399532" + }, + { + "host": "i686-pc-linux-gnu", + "url": "http://downloads.arduino.cc/tools/bossac-1.9.1-arduino2-linux32.tar.gz", + "archiveFileName": "bossac-1.9.1-arduino2-linux32.tar.gz", + "checksum": "SHA-256:10d69f53f169f25afee2dd583dfd9dc803c10543e6c5260d106725cb0d174900", + "size": "384951" + }, + { + "host": "arm-linux-gnueabihf", + "url": "http://downloads.arduino.cc/tools/bossac-1.9.1-arduino2-linuxarm.tar.gz", + "archiveFileName": "bossac-1.9.1-arduino2-linuxarm.tar.gz", + "checksum": "SHA-256:c9539d161d23231b5beb1d09a71829744216c7f5bc2857a491999c3e567f5b19", + "size": "361915" + }, + { + "host": "aarch64-linux-gnu", + "url": "http://downloads.arduino.cc/tools/bossac-1.9.1-arduino2-linuxaarch64.tar.gz", + "archiveFileName": "bossac-1.9.1-arduino2-linuxaarch64.tar.gz", + "checksum": "SHA-256:c167fa0ea223966f4d21f5592da3888bcbfbae385be6c5c4e41f8abff35f5cb1", + "size": "442853" + } + ] + }, + { + "name": "openocd", + "version": "0.11.0-arduino2", + "systems": [ + { + "size": "1902818", + "checksum": "SHA-256:a1aa7f1435a61eafb72ee90722f2496d6a34a7a0f085d0315c2613e4a548b824", + "host": "aarch64-linux-gnu", + "archiveFileName": "openocd-0.11.0-arduino2-static-aarch64-linux-gnu.tar.bz2", + "url": "http://downloads.arduino.cc/tools/openocd-0.11.0-arduino2-static-aarch64-linux-gnu.tar.bz2" + }, + { + "size": "1986716", + "checksum": "SHA-256:57041130160be086e69387cceb4616eefc9819a0ef75de1f7c11aea57fb92699", + "host": "arm-linux-gnueabihf", + "archiveFileName": "openocd-0.11.0-arduino2-static-arm-linux-gnueabihf.tar.bz2", + "url": "http://downloads.arduino.cc/tools/openocd-0.11.0-arduino2-static-arm-linux-gnueabihf.tar.bz2" + }, + { + "size": "1971364", + "checksum": "SHA-256:6f4a8b77c8076aa18afb8438472526dff8c0d161a3ca68d0326163b59fcab663", + "host": "i686-linux-gnu", + "archiveFileName": "openocd-0.11.0-arduino2-static-i686-ubuntu12.04-linux-gnu.tar.bz2", + "url": "http://downloads.arduino.cc/tools/openocd-0.11.0-arduino2-static-i686-ubuntu12.04-linux-gnu.tar.bz2" + }, + { + "size": "2460087", + "checksum": "SHA-256:631010980f12b1e750c4c67ce012b31c5953caabf4d30607d806e3d2b717d4b8", + "host": "i686-mingw32", + "archiveFileName": "openocd-0.11.0-arduino2-static-i686-w64-mingw32.zip", + "url": "http://downloads.arduino.cc/tools/openocd-0.11.0-arduino2-static-i686-w64-mingw32.zip" + }, + { + "size": "1893150", + "checksum": "SHA-256:280e7234eba84e830e92d791ebc685286f71d2bc1d3347f93605ef170d54fef4", + "host": "i386-apple-darwin11", + "archiveFileName": "openocd-0.11.0-arduino2-static-x86_64-apple-darwin13.tar.bz2", + "url": "http://downloads.arduino.cc/tools/openocd-0.11.0-arduino2-static-x86_64-apple-darwin13.tar.bz2" + }, + { + "size": "2052080", + "checksum": "SHA-256:4d19b6e3906de1434ec86841e0e3138235714c655d45f037c0fabfa5e5c0681b", + "host": "x86_64-linux-gnu", + "archiveFileName": "openocd-0.11.0-arduino2-static-x86_64-ubuntu12.04-linux-gnu.tar.bz2", + "url": "http://downloads.arduino.cc/tools/openocd-0.11.0-arduino2-static-x86_64-ubuntu12.04-linux-gnu.tar.bz2" + } + ] + }, + { + "name": "dfu-util", + "version": "0.10.0-arduino1", + "systems": [ + { + "host": "i386-apple-darwin11", + "url": "http://downloads.arduino.cc/tools/dfu-util-0.10.0-arduino1-osx.tar.bz2", + "archiveFileName": "dfu-util-0.10.0-arduino1-osx.tar.bz2", + "size": "73921", + "checksum": "SHA-256:7562d128036759605828d64b8d672d42445a8d95555c4b9ba339f73a1711a640" + }, + { + "host": "arm-linux-gnueabihf", + "url": "http://downloads.arduino.cc/tools/dfu-util-0.10.0-arduino1-arm.tar.bz2", + "archiveFileName": "dfu-util-0.10.0-arduino1-arm.tar.bz2", + "size": "272153", + "checksum": "SHA-256:f1e550f40c235356b7fde1c59447bfbab28f768915d3c14bd858fe0576bfc5a9" + }, + { + "host": "aarch64-linux-gnu", + "url": "http://downloads.arduino.cc/tools/dfu-util-0.10.0-arduino1-arm64.tar.bz2", + "archiveFileName": "dfu-util-0.10.0-arduino1-arm64.tar.bz2", + "size": "277886", + "checksum": "SHA-256:ebfbd21d3030c500da1f83b9aae5b8c597bee04c3bde1ce0a51b41abeafc9614" + }, + { + "host": "x86_64-linux-gnu", + "url": "http://downloads.arduino.cc/tools/dfu-util-0.10.0-arduino1-linux64.tar.bz2", + "archiveFileName": "dfu-util-0.10.0-arduino1-linux64.tar.bz2", + "size": "77184", + "checksum": "SHA-256:13ef2ec591c1e8b0b7eb0a05da972ecd6695016e7a9607e332c7553899af9b4a" + }, + { + "host": "i686-linux-gnu", + "url": "http://downloads.arduino.cc/tools/dfu-util-0.10.0-arduino1-linux32.tar.bz2", + "archiveFileName": "dfu-util-0.10.0-arduino1-linux32.tar.bz2", + "size": "81826", + "checksum": "SHA-256:43599ec60c000e9ef016970a496d6ab2cbbe5a8b7df9d06ef3114ecf83f9d123" + }, + { + "host": "i686-mingw32", + "url": "http://downloads.arduino.cc/tools/dfu-util-0.10.0-arduino1-windows.tar.bz2", + "archiveFileName": "dfu-util-0.10.0-arduino1-windows.tar.bz2", + "size": "464314", + "checksum": "SHA-256:90816b669273ae796d734a2459c46bb340d4790783fd7aa01eb40c0443f1a9b1" + } + ] + }, + { + "name": "rp2040tools", + "version": "1.0.6", + "systems": [ + { + "host": "i386-apple-darwin11", + "url": "http://downloads.arduino.cc/tools/rp2040tools-1.0.6-darwin_amd64.tar.bz2", + "archiveFileName": "rp2040tools-1.0.6-darwin_amd64.tar.bz2", + "size": "1717967", + "checksum": "SHA-256:4e32aa4b8f36db40a17bfbdfd34d80da91710e30c3887732bf0c0bf0b02840a7" + }, + { + "host": "arm-linux-gnueabihf", + "url": "http://downloads.arduino.cc/tools/rp2040tools-1.0.6-linux_arm.tar.bz2", + "archiveFileName": "rp2040tools-1.0.6-linux_arm.tar.bz2", + "size": "8702508", + "checksum": "SHA-256:084a29accf0014bc79723fbb40057b95299c7ae63876f74494a077c987014cc3" + }, + { + "host": "aarch64-linux-gnu", + "url": "http://downloads.arduino.cc/tools/rp2040tools-1.0.6-linux_arm64.tar.bz2", + "archiveFileName": "rp2040tools-1.0.6-linux_arm64.tar.bz2", + "size": "9037783", + "checksum": "SHA-256:1a2a6cb1abf1f7b8198d494c8d8e838700297d748877be8232e02aaa5ca8d0df" + }, + { + "host": "x86_64-linux-gnu", + "url": "http://downloads.arduino.cc/tools/rp2040tools-1.0.6-linux_amd64.tar.bz2", + "archiveFileName": "rp2040tools-1.0.6-linux_amd64.tar.bz2", + "size": "6108121", + "checksum": "SHA-256:6e2ea818db1ff57f2d8e1e3010fbc5bdb5f28ff44f5a68900cae41d7d709f738" + }, + { + "host": "i686-linux-gnu", + "url": "http://downloads.arduino.cc/tools/rp2040tools-1.0.6-linux_386.tar.bz2", + "archiveFileName": "rp2040tools-1.0.6-linux_386.tar.bz2", + "size": "6604083", + "checksum": "SHA-256:ef339e2e0f5c7d5464b9911b612c634767daba39a6be977a1ffa41c95b9827a1" + }, + { + "host": "i686-mingw32", + "url": "http://downloads.arduino.cc/tools/rp2040tools-1.0.6-windows_386.tar.bz2", + "archiveFileName": "rp2040tools-1.0.6-windows_386.tar.bz2", + "size": "3145329", + "checksum": "SHA-256:26a5daebba68c2348dade33716a6e379ded89895ef0e49df1332964a724f6170" + } + ] + }, + { + "name": "esptool_py", + "version": "4.5.1", + "systems": [ + { + "host": "x86_64-pc-linux-gnu", + "url": "https://github.com/espressif/arduino-esp32/releases/download/2.0.7/esptool-v4.5.1-src.tar.gz", + "archiveFileName": "esptool-v4.5.1-src.tar.gz", + "checksum": "SHA-256:aa06831a7d88d8ccde4ea21241e983a08dbdae967290e181658b0d18bffc8f86", + "size": "96922" + }, + { + "host": "i686-pc-linux-gnu", + "url": "https://github.com/espressif/arduino-esp32/releases/download/2.0.7/esptool-v4.5.1-src.tar.gz", + "archiveFileName": "esptool-v4.5.1-src.tar.gz", + "checksum": "SHA-256:aa06831a7d88d8ccde4ea21241e983a08dbdae967290e181658b0d18bffc8f86", + "size": "96922" + }, + { + "host": "aarch64-linux-gnu", + "url": "https://github.com/espressif/arduino-esp32/releases/download/2.0.7/esptool-v4.5.1-src.tar.gz", + "archiveFileName": "esptool-v4.5.1-src.tar.gz", + "checksum": "SHA-256:aa06831a7d88d8ccde4ea21241e983a08dbdae967290e181658b0d18bffc8f86", + "size": "96922" + }, + { + "host": "arm-linux-gnueabihf", + "url": "https://github.com/espressif/arduino-esp32/releases/download/2.0.7/esptool-v4.5.1-src.tar.gz", + "archiveFileName": "esptool-v4.5.1-src.tar.gz", + "checksum": "SHA-256:aa06831a7d88d8ccde4ea21241e983a08dbdae967290e181658b0d18bffc8f86", + "size": "96922" + }, + { + "host": "x86_64-apple-darwin", + "url": "https://github.com/espressif/arduino-esp32/releases/download/2.0.7/esptool-v4.5.1-macos.tar.gz", + "archiveFileName": "esptool-v4.5.1-macos.tar.gz", + "checksum": "SHA-256:78b52acfd51541ceb97cee893b7d4d49b8ddc284602be8c73ea47e3d849e0956", + "size": "5850888" + }, + { + "host": "x86_64-mingw32", + "url": "https://github.com/espressif/arduino-esp32/releases/download/2.0.7/esptool-v4.5.1-win64.zip", + "archiveFileName": "esptool-v4.5.1-win64.zip", + "checksum": "SHA-256:64d0c24499d46b80d6bd7a05c98bdacc3455ab6d503cc2a99e35711310216045", + "size": "6638448" + }, + { + "host": "i686-mingw32", + "url": "https://github.com/espressif/arduino-esp32/releases/download/2.0.7/esptool-v4.5.1-win64.zip", + "archiveFileName": "esptool-v4.5.1-win64.zip", + "checksum": "SHA-256:64d0c24499d46b80d6bd7a05c98bdacc3455ab6d503cc2a99e35711310216045", + "size": "6638448" + } + ] + }, + { + "name": "arduino-fwuploader", + "version": "2.2.0", + "systems": [ + { + "host": "i686-mingw32", + "url": "http://downloads.arduino.cc/arduino-fwuploader/arduino-fwuploader_2.2.0_Windows_32bit.zip", + "archiveFileName": "arduino-fwuploader_2.2.0_Windows_32bit.zip", + "checksum": "SHA-256:c0ff772702460fb5cbd8593f8ce731145d21fbf550342da556e45ef946c7d2f5", + "size": "7442444" + }, + { + "host": "i386-apple-darwin11", + "url": "http://downloads.arduino.cc/arduino-fwuploader/arduino-fwuploader_2.2.0_macOS_64bit.tar.gz", + "archiveFileName": "arduino-fwuploader_2.2.0_macOS_64bit.tar.gz", + "checksum": "SHA-256:ce4444e92ba88c6b24736adb4b0b2b6c4241e4fb916945acbc7de6391d5bfe8c", + "size": "7301372" + } + ] + }, + { + "name": "arduino-fwuploader", + "version": "2.2.2", + "systems": [ + { + "host": "i686-linux-gnu", + "url": "http://downloads.arduino.cc/arduino-fwuploader/arduino-fwuploader_2.2.2_Linux_32bit.tar.gz", + "archiveFileName": "arduino-fwuploader_2.2.2_Linux_32bit.tar.gz", + "checksum": "SHA-256:503b9f8b24c6e396d09eb64f0e1f625c6f9aa5a90b01a50d7dec6477f4a866f0", + "size": "7262873" + }, + { + "host": "x86_64-linux-gnu", + "url": "http://downloads.arduino.cc/arduino-fwuploader/arduino-fwuploader_2.2.2_Linux_64bit.tar.gz", + "archiveFileName": "arduino-fwuploader_2.2.2_Linux_64bit.tar.gz", + "checksum": "SHA-256:8d77d0b33c8b0787fe3b80191709b69d638ef2a447d9853536cda35bfafd274b", + "size": "7306763" + }, + { + "host": "i686-mingw32", + "url": "http://downloads.arduino.cc/arduino-fwuploader/arduino-fwuploader_2.2.2_Windows_32bit.zip", + "archiveFileName": "arduino-fwuploader_2.2.2_Windows_32bit.zip", + "checksum": "SHA-256:74ad9a5d369204b51be288c98d74f949ceb7a0c227ee64eb65ae179ec884c84c", + "size": "7450717" + }, + { + "host": "x86_64-mingw32", + "url": "http://downloads.arduino.cc/arduino-fwuploader/arduino-fwuploader_2.2.2_Windows_64bit.zip", + "archiveFileName": "arduino-fwuploader_2.2.2_Windows_64bit.zip", + "checksum": "SHA-256:b25ac549cb0645166613c96cf899aebc541e482fe196aada6408bd7cff2c7d02", + "size": "7390999" + }, + { + "host": "x86_64-apple-darwin", + "url": "http://downloads.arduino.cc/arduino-fwuploader/arduino-fwuploader_2.2.2_macOS_64bit.tar.gz", + "archiveFileName": "arduino-fwuploader_2.2.2_macOS_64bit.tar.gz", + "checksum": "SHA-256:2cd6168ff470457b5124ba0faf118f315be2d1b9fb4fef43eb74370cd83620a2", + "size": "7306576" + }, + { + "host": "arm64-apple-darwin", + "url": "http://downloads.arduino.cc/arduino-fwuploader/arduino-fwuploader_2.2.2_macOS_ARM64.tar.gz", + "archiveFileName": "arduino-fwuploader_2.2.2_macOS_ARM64.tar.gz", + "checksum": "SHA-256:10ae5614af4d82096b6ba0e1e07aab667fa140d2bf1d5e3407dd8ad4c6748195", + "size": "6878214" + }, + { + "host": "arm-linux-gnueabihf", + "url": "http://downloads.arduino.cc/arduino-fwuploader/arduino-fwuploader_2.2.2_Linux_ARMv6.tar.gz", + "archiveFileName": "arduino-fwuploader_2.2.2_Linux_ARMv6.tar.gz", + "checksum": "SHA-256:5aadf6e50ffe620635faf941fdf82c0765c8cba4830951bb53267ad125fc5af8", + "size": "6940393" + }, + { + "host": "aarch64-linux-gnu", + "url": "http://downloads.arduino.cc/arduino-fwuploader/arduino-fwuploader_2.2.2_Linux_ARM64.tar.gz", + "archiveFileName": "arduino-fwuploader_2.2.2_Linux_ARM64.tar.gz", + "checksum": "SHA-256:6d11a4f4aa5a81de865f3d18ca395a2780fdbb1e1597a2b11b2b5329e09f30fd", + "size": "6829396" + } + ] + } + ] + } + ] +} diff --git a/tools/tools.go b/tools/tools.go index 53892b22a..f371126b5 100644 --- a/tools/tools.go +++ b/tools/tools.go @@ -1,66 +1,97 @@ +// Copyright 2022 Arduino SA +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published +// by the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + package tools import ( + "crypto/rsa" "encoding/json" - "fmt" - "io/ioutil" - "os" - "os/user" - "path" "path/filepath" "strings" "sync" - "time" + "github.com/arduino/arduino-create-agent/index" + "github.com/arduino/arduino-create-agent/v2/pkgs" + "github.com/arduino/go-paths-helper" "github.com/xrash/smetrics" ) // Tools handle the tools necessary for an upload on a board. // It provides a means to download a tool from the arduino servers. // -// - *Directory* contains the location where the tools are downloaded. -// - *IndexURL* contains the url where the tools description is contained. -// - *Logger* is a StdLogger used for reporting debug and info messages -// - *installed* contains a map of the tools and their exact location +// - *directory* contains the location where the tools are downloaded. +// - *indexURL* contains the url where the tools description is contained. +// - *logger* is a StdLogger used for reporting debug and info messages +// - *installed* contains a map[string]string of the tools installed and their exact location // // Usage: -// You have to instantiate the struct by passing it the required parameters: -// _tools := tools.Tools{ -// Directory: "/home/user/.arduino-create", -// IndexURL: "https://downloads.arduino.cc/packages/package_index.json" -// Logger: log.Logger -// } +// You have to call the New() function passing it the required parameters: +// +// index = index.Init("https://downloads.arduino.cc/packages/package_index.json", dataDir) +// tools := tools.New(dataDir, index, logger) + +// Tools will represent the installed tools type Tools struct { - Directory string - IndexURL string - LastRefresh time.Time - Logger func(msg string) - installed map[string]string - mutex sync.RWMutex + directory *paths.Path + index *index.Resource + logger func(msg string) + installed map[string]string + mutex sync.RWMutex + tools *pkgs.Tools } -// Init creates the Installed map and populates it from a file in .arduino-create -func (t *Tools) Init(APIlevel string) { - createDir(t.Directory) +// New will return a Tool object, allowing the caller to execute operations on it. +// The New functions accept the directory to use to host the tools, +// an index (used to download the tools), +// and a logger to log the operations +func New(directory *paths.Path, index *index.Resource, logger func(msg string), signPubKey *rsa.PublicKey) *Tools { + t := &Tools{ + directory: directory, + index: index, + logger: logger, + installed: map[string]string{}, + mutex: sync.RWMutex{}, + tools: pkgs.New(index, directory.String(), "replace", signPubKey), + } + _ = t.readMap() + return t +} + +func (t *Tools) setMapValue(key, value string) { t.mutex.Lock() - t.installed = make(map[string]string) + t.installed[key] = value t.mutex.Unlock() - t.readMap() +} + +func (t *Tools) getMapValue(key string) (string, bool) { t.mutex.RLock() - if t.installed["apilevel"] != APIlevel { - t.mutex.RUnlock() - // wipe the folder and reinitialize the data - os.RemoveAll(t.Directory) - createDir(t.Directory) - t.mutex.Lock() - t.installed = make(map[string]string) - t.installed["apilevel"] = APIlevel - t.mutex.Unlock() - t.writeMap() - t.readMap() - } else { - t.mutex.RUnlock() + defer t.mutex.RUnlock() + value, ok := t.installed[key] + return value, ok +} + +// readMap() reads the installed map from json file "installed.json" +func (t *Tools) readMap() error { + t.mutex.Lock() + defer t.mutex.Unlock() + filePath := t.directory.Join("installed.json") + b, err := filePath.ReadFile() + if err != nil { + return err } + return json.Unmarshal(b, &t.installed) } // GetLocation extracts the toolname from a command like @@ -72,22 +103,16 @@ func (t *Tools) GetLocation(command string) (string, error) { var ok bool // Load installed - t.mutex.RLock() - fmt.Println(t.installed) - t.mutex.RUnlock() - err := t.readMap() if err != nil { return "", err } - t.mutex.RLock() - defer t.mutex.RUnlock() - fmt.Println(t.installed) - // use string similarity to resolve a runtime var with a "similar" map element - if location, ok = t.installed[command]; !ok { + if location, ok = t.getMapValue(command); !ok { maxSimilarity := 0.0 + t.mutex.RLock() + defer t.mutex.RUnlock() for i, candidate := range t.installed { similarity := smetrics.Jaro(command, i) if similarity > 0.8 && similarity > maxSimilarity { @@ -98,38 +123,3 @@ func (t *Tools) GetLocation(command string) (string, error) { } return filepath.ToSlash(location), nil } - -// writeMap() writes installed map to the json file "installed.json" -func (t *Tools) writeMap() error { - t.mutex.Lock() - b, err := json.Marshal(t.installed) - defer t.mutex.Unlock() - if err != nil { - return err - } - filePath := path.Join(dir(), "installed.json") - return ioutil.WriteFile(filePath, b, 0644) -} - -// readMap() reads the installed map from json file "installed.json" -func (t *Tools) readMap() error { - t.mutex.Lock() - defer t.mutex.Unlock() - filePath := path.Join(dir(), "installed.json") - b, err := ioutil.ReadFile(filePath) - if err != nil { - return err - } - return json.Unmarshal(b, &t.installed) -} - -func dir() string { - usr, _ := user.Current() - return path.Join(usr.HomeDir, ".arduino-create") -} - -// createDir creates the directory where the tools will be stored -func createDir(directory string) { - os.Mkdir(directory, 0777) - hideFile(directory) -} diff --git a/update.go b/update.go index 6a81190d4..33c028bce 100644 --- a/update.go +++ b/update.go @@ -32,36 +32,18 @@ package main import ( "github.com/arduino/arduino-create-agent/updater" "github.com/gin-gonic/gin" - "github.com/kardianos/osext" ) func updateHandler(c *gin.Context) { - - path, err := osext.Executable() - + restartPath, err := updater.CheckForUpdates(version, *updateURL, *appName) if err != nil { c.JSON(500, gin.H{"error": err.Error()}) return } - - var up = &updater.Updater{ - CurrentVersion: version, - APIURL: *updateUrl, - BinURL: *updateUrl, - DiffURL: "", - Dir: "update/", - CmdName: *appName, - } - - err = up.BackgroundRun() - - if err != nil { - c.JSON(500, gin.H{"error": err.Error()}) - return - } - - path = updater.TempPath(path) - c.JSON(200, gin.H{"success": "Please wait a moment while the agent reboots itself"}) - Systray.Update(path) + if restartPath == "quit" { + Systray.Quit() + } else { + Systray.RestartWith(restartPath) + } } diff --git a/updater/updater.go b/updater/updater.go index 0d339bf59..db4e5454f 100644 --- a/updater/updater.go +++ b/updater/updater.go @@ -1,8 +1,21 @@ +// Copyright 2022 Arduino SA +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published +// by the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + package updater import ( - "bytes" - "compress/gzip" "crypto/sha256" "encoding/json" "errors" @@ -13,114 +26,47 @@ import ( "path/filepath" "runtime" "strings" - "time" - "github.com/kr/binarydist" log "github.com/sirupsen/logrus" - "gopkg.in/inconshreveable/go-update.v0" - - "github.com/kardianos/osext" ) -// Update protocol: -// -// GET hk.heroku.com/hk/linux-amd64.json -// -// 200 ok -// { -// "Version": "2", -// "Sha256": "..." // base64 -// } -// -// then -// -// GET hkpatch.s3.amazonaws.com/hk/1/2/linux-amd64 -// -// 200 ok -// [bsdiff data] -// -// or -// -// GET hkdist.s3.amazonaws.com/hk/2/linux-amd64.gz -// -// 200 ok -// [gzipped executable data] -// -// +// Start checks if an update has been downloaded and if so returns the path to the +// binary to be executed to perform the update. If no update has been downloaded +// it returns an empty string. +func Start(src string) string { + return start(src) +} + +// CheckForUpdates checks if there is a new version of the binary available and +// if so downloads it. +func CheckForUpdates(currentVersion string, updateURL string, cmdName string) (string, error) { + return checkForUpdates(currentVersion, updateURL, cmdName) +} const ( plat = runtime.GOOS + "-" + runtime.GOARCH ) -const devValidTime = 7 * 24 * time.Hour - -var errHashMismatch = errors.New("new file hash mismatch after patch") -var errDiffUrlUndefined = errors.New("DiffURL is not defined, I cannot fetch and apply patch, reverting to full bin") -var up = update.New() - -// TempPath generates a temporary path for the executable (adding "-temp") -func TempPath(path string) string { - if filepath.Ext(path) == "exe" { - path = strings.Replace(path, ".exe", "-temp.exe", -1) - } else { - path = path + "-temp" +func fetchInfo(updateAPIURL string) (*availableUpdateInfo, error) { + r, err := fetch(updateAPIURL) + if err != nil { + return nil, err } + defer r.Close() - return path -} - -// BinPath generates the proper path for a temporary executable (removing "-temp") -func BinPath(path string) string { - return strings.Replace(path, "-temp", "", -1) -} - -// Updater is the configuration and runtime data for doing an update. -// -// Note that ApiURL, BinURL and DiffURL should have the same value if all files are available at the same location. -// -// Example: -// -// updater := &selfupdate.Updater{ -// CurrentVersion: version, -// ApiURL: "http://updates.yourdomain.com/", -// BinURL: "http://updates.yourdownmain.com/", -// DiffURL: "http://updates.yourdomain.com/", -// Dir: "update/", -// CmdName: "myapp", // app name -// } -// if updater != nil { -// go updater.BackgroundRun() -// } -type Updater struct { - CurrentVersion string // Currently running version. - APIURL string // Base URL for API requests (json files). - CmdName string // Command name is appended to the ApiURL like http://apiurl/CmdName/. This represents one binary. - BinURL string // Base URL for full binary downloads. - DiffURL string // Base URL for diff downloads. - Dir string // Directory to store selfupdate state. - Info struct { - Version string - Sha256 []byte + var res availableUpdateInfo + if err := json.NewDecoder(r).Decode(&res); err != nil { + return nil, err + } + if len(res.Sha256) != sha256.Size { + return nil, errors.New("bad cmd hash in info") } + return &res, nil } -// BackgroundRun starts the update check and apply cycle. -func (u *Updater) BackgroundRun() error { - os.MkdirAll(u.getExecRelativeDir(u.Dir), 0777) - if err := up.CanUpdate(); err != nil { - log.Println(err) - return err - } - //self, err := osext.Executable() - //if err != nil { - // fail update, couldn't figure out path to self - //return - //} - // TODO(bgentry): logger isn't on Windows. Replace w/ proper error reports. - if err := u.update(); err != nil { - return err - } - return nil +type availableUpdateInfo struct { + Version string + Sha256 []byte } func fetch(url string) (io.ReadCloser, error) { @@ -135,146 +81,32 @@ func fetch(url string) (io.ReadCloser, error) { return resp.Body, nil } -func verifySha(bin []byte, sha []byte) bool { - h := sha256.New() - h.Write(bin) - return bytes.Equal(h.Sum(nil), sha) -} - -func (u *Updater) fetchAndApplyPatch(old io.Reader) ([]byte, error) { - if u.DiffURL == "" { - return nil, errDiffUrlUndefined - } - r, err := fetch(u.DiffURL + u.CmdName + "/" + u.CurrentVersion + "/" + u.Info.Version + "/" + plat) - if err != nil { - return nil, err - } - defer r.Close() - var buf bytes.Buffer - err = binarydist.Patch(old, &buf, r) - return buf.Bytes(), err -} - -func (u *Updater) fetchAndVerifyPatch(old io.Reader) ([]byte, error) { - bin, err := u.fetchAndApplyPatch(old) - if err != nil { - return nil, err - } - if !verifySha(bin, u.Info.Sha256) { - return nil, errHashMismatch - } - return bin, nil -} - -func (u *Updater) fetchAndVerifyFullBin() ([]byte, error) { - bin, err := u.fetchBin() - if err != nil { - return nil, err - } - verified := verifySha(bin, u.Info.Sha256) - if !verified { - return nil, errHashMismatch - } - return bin, nil -} - -func (u *Updater) fetchBin() ([]byte, error) { - r, err := fetch(u.BinURL + u.CmdName + "/" + u.Info.Version + "/" + plat + ".gz") - if err != nil { - return nil, err - } - defer r.Close() - buf := new(bytes.Buffer) - gz, err := gzip.NewReader(r) - if err != nil { - return nil, err - } - if _, err = io.Copy(buf, gz); err != nil { - return nil, err - } - - return buf.Bytes(), nil -} - -func (u *Updater) fetchInfo() error { - r, err := fetch(u.APIURL + u.CmdName + "/" + plat + ".json") - if err != nil { - return err - } - defer r.Close() - err = json.NewDecoder(r).Decode(&u.Info) - if err != nil { - return err - } - if len(u.Info.Sha256) != sha256.Size { - return errors.New("bad cmd hash in info") +// addTempSuffixToPath adds the "-temp" suffix to the path to an executable file (a ".exe" extension is replaced with "-temp.exe") +func addTempSuffixToPath(path string) string { + if filepath.Ext(path) == "exe" { + path = strings.Replace(path, ".exe", "-temp.exe", -1) + } else { + path = path + "-temp" } - return nil -} -func (u *Updater) getExecRelativeDir(dir string) string { - filename, _ := osext.Executable() - path := filepath.Join(filepath.Dir(filename), dir) return path } -func (u *Updater) update() error { - path, err := osext.Executable() - if err != nil { - return err - } - - path = TempPath(path) - - old, err := os.Open(path) - if err != nil { - return err - } - defer old.Close() +// removeTempSuffixFromPath removes "-temp" suffix from the path to an executable file (a "-temp.exe" extension is replaced with ".exe") +func removeTempSuffixFromPath(path string) string { + return strings.Replace(path, "-temp", "", -1) +} - err = u.fetchInfo() +func copyExe(from, to string) error { + data, err := os.ReadFile(from) if err != nil { - log.Println(err) + log.Println("Cannot read file: ", from) return err } - if u.Info.Version == u.CurrentVersion { - return nil - } - bin, err := u.fetchAndVerifyPatch(old) - if err != nil { - switch err { - case errHashMismatch: - log.Println("update: hash mismatch from patched binary") - case errDiffUrlUndefined: - log.Println("update: ", err) - default: - log.Println("update: patching binary, ", err) - } - - bin, err = u.fetchAndVerifyFullBin() - if err != nil { - if err == errHashMismatch { - log.Println("update: hash mismatch from full binary") - } else { - log.Println("update: fetching full binary,", err) - } - return err - } - } - - // close the old binary before installing because on windows - // it can't be renamed if a handle to the file is still open - old.Close() - - up.TargetPath = path - err, errRecover := up.FromStream(bytes.NewBuffer(bin)) - if errRecover != nil { - log.Errorf("update and recovery errors: %q %q", err, errRecover) - return fmt.Errorf("update and recovery errors: %q %q", err, errRecover) - } + err = os.WriteFile(to, data, 0755) if err != nil { + log.Println("Cannot write file: ", to) return err } - return nil } diff --git a/updater/updater_darwin.go b/updater/updater_darwin.go new file mode 100644 index 000000000..829466352 --- /dev/null +++ b/updater/updater_darwin.go @@ -0,0 +1,164 @@ +// Copyright 2022 Arduino SA +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published +// by the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +package updater + +import ( + "bytes" + "context" + "crypto/sha256" + "fmt" + "io" + "os" + "runtime" + "strings" + + "github.com/arduino/go-paths-helper" + "github.com/codeclysm/extract/v4" + "github.com/sirupsen/logrus" + log "github.com/sirupsen/logrus" +) + +func start(src string) string { + if strings.Contains(src, "-temp") { + // This is required to transition from the previous auto-update system to the new one. + // Updating from version <=1.2.7 will produce the `ArduinoCreateAgent-temp` file and we should + // complete the upgrade by copying the `ArduinoCreateAgent-temp` executable back to the original. + // + // This procedure will be automatically skipped starting from version >1.2.7. + + newPath := removeTempSuffixFromPath(src) + if err := copyExe(src, newPath); err != nil { + log.Println("Copy error: ", err) + panic(err) + } + return newPath + } + + return "" +} + +func checkForUpdates(currentVersion string, updateURL string, cmdName string) (string, error) { + executablePath, err := os.Executable() + if err != nil { + return "", fmt.Errorf("could not app path: %w", err) + } + currentAppPath := paths.New(executablePath).Parent().Parent().Parent() + if currentAppPath.Ext() != ".app" { + return "", fmt.Errorf("could not find app root in %s", executablePath) + } + oldAppPath := currentAppPath.Parent().Join("ArduinoCreateAgent.old.app") + if oldAppPath.Exist() { + return "", fmt.Errorf("temp app already exists: %s, cannot update", oldAppPath) + } + + // Fetch information about updates + + // updateURL: "https://downloads.arduino.cc/" + // cmdName: "CreateAgent/Stable" + // plat: "darwin-amd64" + // info URL: "https://downloads.arduino.cc/CreateAgent/Stable/darwin-amd64-bundle.json" + infoURL := updateURL + cmdName + "/" + plat + "-bundle.json" + info, err := fetchInfo(infoURL) + if err != nil { + return "", err + } + if info.Version == currentVersion { + // No updates available, bye bye + return "", nil + } + + tmp := paths.TempDir().Join("arduino-create-agent") + if err := tmp.MkdirAll(); err != nil { + return "", err + } + tmpZip := tmp.Join("update.zip") + tmpAppPath := tmp.Join("ArduinoCreateAgent-update.app") + defer tmp.RemoveAll() + + // Download the update. + + // updateURL: "https://downloads.arduino.cc/" + // cmdName == "CreateAgent/Stable" + // info.Version == "1.2.8" + // runtime.GOARCH: "amd64" + // downloadURL: "https://downloads.arduino.cc/CreateAgent/Stable/1.2.8/ArduinoCreateAgent.app_arm64_notarized.zip" + downloadURL := updateURL + cmdName + "/" + info.Version + "/ArduinoCreateAgent.app_" + runtime.GOARCH + "_notarized.zip" + logrus.WithField("url", downloadURL).Info("Downloading update") + download, err := fetch(downloadURL) + if err != nil { + return "", err + } + defer download.Close() + + f, err := tmpZip.Create() + if err != nil { + return "", err + } + defer f.Close() + + sha := sha256.New() + if _, err := io.Copy(io.MultiWriter(sha, f), download); err != nil { + return "", err + } + f.Close() + + // Check the hash + if s := sha.Sum(nil); !bytes.Equal(s, info.Sha256) { + return "", fmt.Errorf("bad hash: %s (expected %s)", s, info.Sha256) + } + + // Unzip the update + logrus.WithField("tmpDir", tmpAppPath).Info("Unzipping update") + if err := tmpAppPath.MkdirAll(); err != nil { + return "", fmt.Errorf("could not create tmp dir to unzip update: %w", err) + } + + f, err = tmpZip.Open() + if err != nil { + return "", fmt.Errorf("could not open archive for unzip: %w", err) + } + defer f.Close() + if err := extract.Archive(context.Background(), f, tmpAppPath.String(), nil); err != nil { + return "", fmt.Errorf("extracting archive: %w", err) + } + + // Rename current app as .old + logrus.WithField("from", currentAppPath).WithField("to", oldAppPath).Info("Renaming old app") + if err := currentAppPath.Rename(oldAppPath); err != nil { + return "", fmt.Errorf("could not rename old app as .old: %w", err) + } + + // Install new app + logrus.WithField("from", tmpAppPath).WithField("to", currentAppPath).Info("Copying updated app") + createPath := currentAppPath.Join("Contents", "MacOS", "Arduino_Create_Agent") + cloudPath := currentAppPath.Join("Contents", "MacOS", "Arduino_Cloud_Agent") + if err := tmpAppPath.CopyDirTo(currentAppPath); err != nil || (!createPath.Exist() && !cloudPath.Exist()) { + // Try rollback changes + _ = currentAppPath.RemoveAll() + _ = oldAppPath.Rename(currentAppPath) + return "", fmt.Errorf("could not install app: %w", err) + } + + // Remove old app + logrus.WithField("to", oldAppPath).Info("Removing old app") + _ = oldAppPath.RemoveAll() + + // Restart agent + logrus.WithField("path", currentAppPath).Info("Running new app") + + // Close old agent + return currentAppPath.String(), nil +} diff --git a/updater/updater_default.go b/updater/updater_default.go new file mode 100644 index 000000000..2cf01b8ad --- /dev/null +++ b/updater/updater_default.go @@ -0,0 +1,234 @@ +// Copyright 2022 Arduino SA +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published +// by the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +//go:build !darwin + +package updater + +import ( + "bytes" + "compress/gzip" + "crypto/sha256" + "errors" + "fmt" + "io" + "os" + "path/filepath" + "strings" + + log "github.com/sirupsen/logrus" + "gopkg.in/inconshreveable/go-update.v0" +) + +// Update protocol: +// +// GET hk.heroku.com/hk/linux-amd64.json +// +// 200 ok +// { +// "Version": "2", +// "Sha256": "..." // base64 +// } +// +// then +// +// GET hkpatch.s3.amazonaws.com/hk/1/2/linux-amd64 +// +// 200 ok +// [bsdiff data] +// +// or +// +// GET hkdist.s3.amazonaws.com/hk/2/linux-amd64.gz +// +// 200 ok +// [gzipped executable data] +// +// + +var errHashMismatch = errors.New("new file hash mismatch after patch") +var up = update.New() + +func start(src string) string { + // If the executable is temporary, copy it to the full path, then restart + if strings.Contains(src, "-temp") { + newPath := removeTempSuffixFromPath(src) + if err := copyExe(src, newPath); err != nil { + log.Println("Copy error: ", err) + panic(err) + } + return newPath + } + + // Otherwise copy to a path with -temp suffix + if err := copyExe(src, addTempSuffixToPath(src)); err != nil { + panic(err) + } + return "" +} + +func checkForUpdates(currentVersion string, updateURL string, cmdName string) (string, error) { + path, err := os.Executable() + if err != nil { + return "", err + } + var up = &Updater{ + CurrentVersion: currentVersion, + UpdateURL: updateURL, + Dir: "update/", + CmdName: cmdName, + } + + if err := up.BackgroundRun(); err != nil { + return "", err + } + return addTempSuffixToPath(path), nil +} + +// Updater is the configuration and runtime data for doing an update. +// +// Note that ApiURL, BinURL and DiffURL should have the same value if all files are available at the same location. +// +// Example: +// +// updater := &selfupdate.Updater{ +// CurrentVersion: version, +// UpdateURL: "http://updates.yourdomain.com/", +// Dir: "update/", +// CmdName: "myapp", // app name +// } +// if updater != nil { +// go updater.BackgroundRun() +// } +type Updater struct { + CurrentVersion string // Currently running version. + UpdateURL string // Base URL for API requests (json files). + CmdName string // Command name is appended to the ApiURL like http://apiurl/CmdName/. This represents one binary. + Dir string // Directory to store selfupdate state. + Info *availableUpdateInfo // Information about the available update. +} + +// BackgroundRun starts the update check and apply cycle. +func (u *Updater) BackgroundRun() error { + os.MkdirAll(u.getExecRelativeDir(u.Dir), 0777) + if err := up.CanUpdate(); err != nil { + log.Println(err) + return err + } + //self, err := os.Executable() + //if err != nil { + // fail update, couldn't figure out path to self + //return + //} + // TODO(bgentry): logger isn't on Windows. Replace w/ proper error reports. + if err := u.update(); err != nil { + return err + } + return nil +} + +func verifySha(bin []byte, sha []byte) bool { + h := sha256.New() + h.Write(bin) + return bytes.Equal(h.Sum(nil), sha) +} + +func (u *Updater) fetchAndVerifyFullBin() ([]byte, error) { + bin, err := u.fetchBin() + if err != nil { + return nil, err + } + verified := verifySha(bin, u.Info.Sha256) + if !verified { + return nil, errHashMismatch + } + return bin, nil +} + +func (u *Updater) fetchBin() ([]byte, error) { + r, err := fetch(u.UpdateURL + u.CmdName + "/" + u.Info.Version + "/" + plat + ".gz") + if err != nil { + return nil, err + } + defer r.Close() + buf := new(bytes.Buffer) + gz, err := gzip.NewReader(r) + if err != nil { + return nil, err + } + if _, err = io.Copy(buf, gz); err != nil { + return nil, err + } + + return buf.Bytes(), nil +} + +func (u *Updater) getExecRelativeDir(dir string) string { + filename, _ := os.Executable() + path := filepath.Join(filepath.Dir(filename), dir) + return path +} + +func (u *Updater) update() error { + path, err := os.Executable() + if err != nil { + return err + } + + path = addTempSuffixToPath(path) + + old, err := os.Open(path) + if err != nil { + return err + } + defer old.Close() + + infoURL := u.UpdateURL + u.CmdName + "/" + plat + ".json" + info, err := fetchInfo(infoURL) + if err != nil { + log.Println(err) + return err + } + u.Info = info + if u.Info.Version == u.CurrentVersion { + return nil + } + + bin, err := u.fetchAndVerifyFullBin() + if err != nil { + if err == errHashMismatch { + log.Println("update: hash mismatch from full binary") + } else { + log.Println("update: fetching full binary,", err) + } + return err + } + + // close the old binary before installing because on windows + // it can't be renamed if a handle to the file is still open + old.Close() + + up.TargetPath = path + err, errRecover := up.FromStream(bytes.NewBuffer(bin)) + if errRecover != nil { + log.Errorf("update and recovery errors: %q %q", err, errRecover) + return fmt.Errorf("update and recovery errors: %q %q", err, errRecover) + } + if err != nil { + return err + } + + return nil +} diff --git a/upload/README.md b/upload/README.md index a958e9352..57717cdf0 100644 --- a/upload/README.md +++ b/upload/README.md @@ -1,12 +1,10 @@ -use 'godoc cmd/github.com/arduino/arduino-create-agent/upload' for documentation on the github.com/arduino/arduino-create-agent/upload command - Package upload ===================== import "github.com/arduino/arduino-create-agent/upload" Package upload allows to upload sketches into a board connected to the -computer It can do it via serial port or via network +computer It can do it via serial port **Usage for a serial upload** @@ -19,17 +17,6 @@ err := upload.Serial("/dev/ttyACM0", commandline, upload.Extra{}, nil) note that the commandline contains the path of the sketch (sketch.hex) -**Usage for a network upload** - -Make sure that you have a compiled sketch somewhere on your disk - -```go - err := upload.Network("127.0.10.120", "arduino:avr:yun, "./sketch.hex", "", upload.Auth{}, nil) -``` - -The commandline can be empty or it can contain instructions (depends on the -board) - **Resolving commandlines** If you happen to have an unresolved commandline (full of {} parameters) you can @@ -73,13 +60,6 @@ func Kill() Kill stops any upload process as soon as possible -```go -func Network(port, board, file, commandline string, auth Auth, l Logger) error -``` - -Network performs a network upload - - ```go func Resolve(port, board, file, commandline string, extra Extra, t Locater) (string, error) ``` @@ -98,21 +78,11 @@ Types ----- -```go -type Auth struct { - Username string `json:"username"` - Password string `json:"password"` -} -``` -Auth contains username and password used for a network upload - - ```go type Extra struct { Use1200bpsTouch bool `json:"use_1200bps_touch"` WaitForUploadPort bool `json:"wait_for_upload_port"` Network bool `json:"network"` - Auth Auth `json:"auth"` } ``` Extra contains some options used during the upload @@ -133,5 +103,3 @@ type Logger interface { } ``` Logger is an interface implemented by most loggers (like logrus) - - diff --git a/upload/doc.go b/upload/doc.go deleted file mode 100644 index db6963d28..000000000 --- a/upload/doc.go +++ /dev/null @@ -1,44 +0,0 @@ -// Package upload allows to upload sketches into a board connected to the computer -// It can do it via serial port or via network -// -// **Usage for a serial upload** -// -// Make sure that you have a compiled sketch somewhere on your disk -// -// ```go -// commandline = ``"/usr/bin/avrdude" "-C/usr/bin/avrdude.conf" -v -patmega32u4 -cavr109 -P/dev/ttyACM0 -b57600 -D "-Uflash:w:./sketch.hex:i"`` -// err := upload.Serial("/dev/ttyACM0", commandline, upload.Extra{}, nil) -// ``` -// -// note that the commandline contains the path of the sketch (sketch.hex) -// -// **Usage for a network upload** -// -// Make sure that you have a compiled sketch somewhere on your disk -// -// ```go -// err := upload.Network("127.0.10.120", "arduino:avr:yun, "./sketch.hex", "", upload.Auth{}, nil) -// ``` -// -// The commandline can be empty or it can contain instructions (depends on the board) -// -// **Resolving commandlines** -// -// If you happen to have an unresolved commandline (full of {} parameters) you can resolve it -// -// ```go -// t := tools.Tools{} -// commandline = upload.Resolve("/dev/ttyACM0", "arduino:avr:leonardo", "./sketch.hex", commandline, upload.Extra{}, t) -// ``` -// -// 't' must implement the locater interface (the Tools package does!) -// -// **Logging** -// If you're interested in the output of the commands, you can implement the logger interface. Here's an example: -// -// ```go -// logger := logrus.New() -// logger.Level = logrus.DebugLevel -// upload.Serial("/dev/ttyACM0", commandline, upload.Extra{}, logger) -// ``` -package upload diff --git a/upload/upload.go b/upload/upload.go index ffc2631b6..613d72957 100644 --- a/upload/upload.go +++ b/upload/upload.go @@ -1,48 +1,40 @@ +// Copyright 2022 Arduino SA +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published +// by the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + package upload import ( "bufio" - "bytes" - "fmt" - "io" - "io/ioutil" - "log" - "mime/multipart" - "net/http" - "os" "os/exec" "path/filepath" "regexp" "runtime" - "strconv" "strings" - "github.com/arduino/arduino-cli/arduino/serialutils" "github.com/arduino/arduino-create-agent/utilities" + serialutils "github.com/arduino/go-serial-utils" shellwords "github.com/mattn/go-shellwords" "github.com/pkg/errors" - "github.com/sfreiberg/simplessh" "go.bug.st/serial/enumerator" ) -// Busy tells wether the programmer is doing something -var Busy = false - -// Auth contains username and password used for a network upload -type Auth struct { - Username string `json:"username"` - Password string `json:"password"` - PrivateKey string `json:"private_key"` - Port int `json:"port"` -} - // Extra contains some options used during the upload type Extra struct { Use1200bpsTouch bool `json:"use_1200bps_touch"` WaitForUploadPort bool `json:"wait_for_upload_port"` Network bool `json:"network"` - Auth Auth `json:"auth"` - SSH bool `json:"ssh,omitempty"` } // PartiallyResolve replaces some symbols in the commandline with the appropriate values @@ -50,11 +42,11 @@ type Extra struct { func PartiallyResolve(board, file, platformPath, commandline string, extra Extra, t Locater) (string, error) { commandline = strings.Replace(commandline, "{build.path}", filepath.ToSlash(filepath.Dir(file)), -1) commandline = strings.Replace(commandline, "{build.project_name}", strings.TrimSuffix(filepath.Base(file), filepath.Ext(filepath.Base(file))), -1) - commandline = strings.Replace(commandline, "{network.password}", extra.Auth.Password, -1) commandline = strings.Replace(commandline, "{runtime.platform.path}", filepath.ToSlash(platformPath), -1) + commandline = strings.Replace(commandline, "{fqbn}", board, -1) // search for runtime variables and replace with values from Locater - var runtimeRe = regexp.MustCompile("\\{(.*?)\\}") + var runtimeRe = regexp.MustCompile(`\{(.*?)\}`) runtimeVars := runtimeRe.FindAllString(commandline, -1) for _, element := range runtimeVars { @@ -85,36 +77,8 @@ func fixupPort(port, commandline string) string { return commandline } -// Network performs a network upload -func Network(port, board string, files []string, commandline string, auth Auth, l Logger, SSH bool) error { - Busy = true - - // Defaults - if auth.Username == "" { - auth.Username = "root" - } - if auth.Password == "" { - auth.Password = "arduino" - } - - commandline = fixupPort(port, commandline) - - // try with ssh - err := ssh(port, files, commandline, auth, l, SSH) - if err != nil && !SSH { - // fallback on form - err = form(port, board, files[0], auth, l) - } - - Busy = false - return err -} - // Serial performs a serial upload func Serial(port, commandline string, extra Extra, l Logger) error { - Busy = true - defer func() { Busy = false }() - // some boards needs to be resetted if extra.Use1200bpsTouch { var err error @@ -150,7 +114,7 @@ func Kill() { // sometimes) and an error (usually because the port listing failed) func reset(port string, wait bool, l Logger) (string, error) { info(l, "Restarting in bootloader mode") - newPort, err := serialutils.Reset(port, wait, nil) // TODO use callbacks to print as the cli does + newPort, err := serialutils.Reset(port, wait, false, nil, nil) // TODO use callbacks to print reset progress if err != nil { info(l, err) return "", err @@ -228,161 +192,3 @@ func program(binary string, args []string, l Logger) error { } return nil } - -func form(port, board, file string, auth Auth, l Logger) error { - // Prepare a form that you will submit to that URL. - _url := "http://" + port + "/data/upload_sketch_silent" - var b bytes.Buffer - w := multipart.NewWriter(&b) - - // Add your image file - file = strings.Trim(file, "\n") - f, err := os.Open(file) - if err != nil { - return errors.Wrapf(err, "Open file %s", file) - } - fw, err := w.CreateFormFile("sketch_hex", file) - if err != nil { - return errors.Wrapf(err, "Create form file") - } - if _, err = io.Copy(fw, f); err != nil { - return errors.Wrapf(err, "Copy form file") - } - - // Add the other fields - board = strings.Replace(board, ":", "_", -1) - if fw, err = w.CreateFormField("board"); err != nil { - return errors.Wrapf(err, "Create board field") - } - if _, err = fw.Write([]byte(board)); err != nil { - return errors.Wrapf(err, "") - } - - // Don't forget to close the multipart writer. - // If you don't close it, your request will be missing the terminating boundary. - w.Close() - - // Now that you have a form, you can submit it to your handler. - req, err := http.NewRequest("POST", _url, &b) - if err != nil { - return errors.Wrapf(err, "Create POST req") - } - - // Don't forget to set the content type, this will contain the boundary. - req.Header.Set("Content-Type", w.FormDataContentType()) - if auth.Username != "" { - req.SetBasicAuth(auth.Username, auth.Password) - } - - info(l, "Network upload on ", port) - - // Submit the request - client := &http.Client{} - res, err := client.Do(req) - if err != nil { - log.Println("Error during post request") - return errors.Wrapf(err, "") - } - - // Check the response - if res.StatusCode != http.StatusOK { - body, _ := ioutil.ReadAll(res.Body) - return errors.New("Request error:" + string(body)) - } - return nil -} - -func ssh(port string, files []string, commandline string, auth Auth, l Logger, SSH bool) error { - debug(l, "Connect via ssh ", files, commandline) - - if auth.Port == 0 { - auth.Port = 22 - } - - // Connect via ssh - var client *simplessh.Client - var err error - if auth.PrivateKey != "" { - client, err = simplessh.ConnectWithKeyFile(port+":"+strconv.Itoa(auth.Port), auth.Username, auth.PrivateKey) - } else { - client, err = simplessh.ConnectWithPassword(port+":"+strconv.Itoa(auth.Port), auth.Username, auth.Password) - } - - if err != nil { - return errors.Wrapf(err, "Connect via ssh") - } - defer client.Close() - - // Copy the sketch - for _, file := range files { - fileName := "/tmp/sketch" + filepath.Ext(file) - if SSH { - // don't rename files - fileName = "/tmp/" + filepath.Base(file) - } - err = scp(client, file, fileName) - debug(l, "Copy "+file+" to "+fileName+" ", err) - if err != nil { - return errors.Wrapf(err, "Copy sketch") - } - } - - // very special case for Yun (remove once AVR boards.txt is fixed) - if commandline == "" { - commandline = "merge-sketch-with-bootloader.lua /tmp/sketch.hex && /usr/bin/run-avrdude /tmp/sketch.hex" - } - - // Execute commandline - output, err := client.Exec(commandline) - info(l, string(output)) - debug(l, "Execute commandline ", commandline, string(output), err) - if err != nil { - return errors.Wrapf(err, "Execute commandline") - } - return nil -} - -// scp uploads sourceFile to remote machine like native scp console app. -func scp(client *simplessh.Client, sourceFile, targetFile string) error { - // open ssh session - session, err := client.SSHClient.NewSession() - if err != nil { - return errors.Wrapf(err, "open ssh session") - } - defer session.Close() - - // open file - src, err := os.Open(sourceFile) - if err != nil { - return errors.Wrapf(err, "open file %s", sourceFile) - } - - // stat file - srcStat, err := src.Stat() - if err != nil { - return errors.Wrapf(err, "stat file %s", sourceFile) - } - - // Copy over ssh - go func() { - w, _ := session.StdinPipe() - - fmt.Fprintln(w, "C0644", srcStat.Size(), filepath.Base(targetFile)) - - if srcStat.Size() > 0 { - io.Copy(w, src) - fmt.Fprint(w, "\x00") - w.Close() - } else { - fmt.Fprint(w, "\x00") - w.Close() - } - - }() - - if err := session.Run("scp -t " + targetFile); err != nil { - return errors.Wrapf(err, "Execute %s", "scp -t "+targetFile) - } - - return nil -} diff --git a/upload/upload_test.go b/upload/upload_test.go index 3289e2ca4..1e030b602 100644 --- a/upload/upload_test.go +++ b/upload/upload_test.go @@ -1,11 +1,25 @@ -package upload_test +// Copyright 2022 Arduino SA +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published +// by the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +package upload import ( "log" "strings" "testing" - "github.com/arduino/arduino-create-agent/upload" homedir "github.com/mitchellh/go-homedir" "github.com/sirupsen/logrus" ) @@ -21,11 +35,11 @@ var TestSerialData = []struct { Name string Port string Commandline string - Extra upload.Extra + Extra Extra }{ { "leonardo", "/dev/ttyACM0", - `"$HOME/.arduino-create/avrdude/6.3.0-arduino6/bin/avrdude" "-C$HOME/.arduino-create/avrdude/6.3.0-arduino6/etc/avrdude.conf" -v -patmega32u4 -cavr109 -P/dev/ttyACM0 -b57600 -D "-Uflash:w:./upload_test.hex:i"`, upload.Extra{Use1200bpsTouch: true, WaitForUploadPort: true}}, + `"$HOME/.arduino-create/avrdude/6.3.0-arduino6/bin/avrdude" "-C$HOME/.arduino-create/avrdude/6.3.0-arduino6/etc/avrdude.conf" -v -patmega32u4 -cavr109 -P/dev/ttyACM0 -b57600 -D "-Uflash:w:./upload_test.hex:i"`, Extra{Use1200bpsTouch: true, WaitForUploadPort: true}}, } func TestSerial(t *testing.T) { @@ -36,63 +50,67 @@ func TestSerial(t *testing.T) { for _, test := range TestSerialData { commandline := strings.Replace(test.Commandline, "$HOME", home, -1) - err := upload.Serial(test.Port, commandline, test.Extra, logger) + err := Serial(test.Port, commandline, test.Extra, logger) log.Println(err) } } -var TestNetworkData = []struct { - Name string - Port string - Board string - Files []string - Commandline string - Extra upload.Extra +var TestResolveData = []struct { + Board string + File string + PlatformPath string + CommandLine string + Extra Extra + Result string }{ { - "yun", - "", - "", - []string{"filename"}, - "", - upload.Extra{ - Use1200bpsTouch: true, - WaitForUploadPort: true, - Network: true, - Auth: upload.Auth{}, - }, + Board: "arduino:avr:leonardo", + File: "./upload_test.hex", + PlatformPath: "", + CommandLine: `{runtime.tools.avrdude.path}/bin/avrdude -C{runtime.tools.avrdude.path}/etc/avrdude.conf -v {upload.verify} -patmega32u4 -cavr109 -P{serial.port} -b57600 -D "-Uflash:w:{build.path}/{build.project_name}.hex:i"`, + Extra: Extra{Use1200bpsTouch: true, WaitForUploadPort: true}, + Result: `$loc$loc{runtime.tools.avrdude.path}/bin/avrdude -C{runtime.tools.avrdude.path}/etc/avrdude.conf -v $loc{upload.verify} -patmega32u4 -cavr109 -P$loc{serial.port} -b57600 -D "-Uflash:w:./upload_test.hex:i"`, + }, + { + Board: "arduino:renesas_uno:unor4wifi", + File: "UpdateFirmware.bin", + PlatformPath: "", + CommandLine: `{runtime.tools.arduino-fwuploader.path}/arduino-fwuploader firmware flash -a {serial.port} -b {fqbn} -v --retries 5"`, + Extra: Extra{Use1200bpsTouch: true, WaitForUploadPort: true}, + Result: `$loc{runtime.tools.arduino-fwuploader.path}/arduino-fwuploader firmware flash -a $loc{serial.port} -b arduino:renesas_uno:unor4wifi -v --retries 5"`, }, } -func TestNetwork(t *testing.T) { - logger := logrus.New() - logger.Level = logrus.DebugLevel - - home, _ := homedir.Dir() - - for _, test := range TestNetworkData { - commandline := strings.Replace(test.Commandline, "$HOME", home, -1) - err := upload.Network(test.Port, test.Board, test.Files, commandline, test.Extra.Auth, logger, test.Extra.SSH) - log.Println(err) +func TestResolve(t *testing.T) { + for _, test := range TestResolveData { + result, _ := PartiallyResolve(test.Board, test.File, test.PlatformPath, test.CommandLine, test.Extra, mockTools{}) + if result != test.Result { + t.Error("expected " + test.Result + ", got " + result) + continue + } } } -var TestResolveData = []struct { - Board string - File string - PlatformPath string - Commandline string - Extra upload.Extra - Result string +var TestFixupData = []struct { + Port string + CommandLine string + Result string }{ - {"arduino:avr:leonardo", "./upload_test.hex", "", - `"{runtime.tools.avrdude.path}/bin/avrdude" "-C{runtime.tools.avrdude.path}/etc/avrdude.conf" -v {upload.verify} -patmega32u4 -cavr109 -P/dev/ttyACM0 -b57600 -D "-Uflash:w:{build.path}/{build.project_name}.hex:i"`, upload.Extra{Use1200bpsTouch: true, WaitForUploadPort: true}, - `"$loc$loc{runtime.tools.avrdude.path}/bin/avrdude" "-C{runtime.tools.avrdude.path}/etc/avrdude.conf" -v $loc{upload.verify} -patmega32u4 -cavr109 -P/dev/ttyACM0 -b57600 -D "-Uflash:w:./upload_test.hex:i"`}, + { + Port: "/dev/ttyACM0", + CommandLine: `{runtime.tools.avrdude.path}/bin/avrdude -C{runtime.tools.avrdude.path}/etc/avrdude.conf -v {upload.verify} -patmega32u4 -cavr109 -P{serial.port} -b57600 -D "-Uflash:w:{build.path}/{build.project_name}.hex:i"`, + Result: `{runtime.tools.avrdude.path}/bin/avrdude -C{runtime.tools.avrdude.path}/etc/avrdude.conf -v {upload.verify} -patmega32u4 -cavr109 -P/dev/ttyACM0 -b57600 -D "-Uflash:w:{build.path}/{build.project_name}.hex:i"`, + }, + { + Port: "/dev/cu.usbmodemDC5475C5557C2", + CommandLine: `{runtime.tools.arduino-fwuploader.path}/arduino-fwuploader firmware flash -a {serial.port} -b arduino:renesas_uno:unor4wifi -v --retries 5"`, + Result: `{runtime.tools.arduino-fwuploader.path}/arduino-fwuploader firmware flash -a /dev/cu.usbmodemDC5475C5557C2 -b arduino:renesas_uno:unor4wifi -v --retries 5"`, + }, } -func TestResolve(t *testing.T) { - for _, test := range TestResolveData { - result, _ := upload.PartiallyResolve(test.Board, test.File, test.PlatformPath, test.Commandline, test.Extra, mockTools{}) +func TestFixupPort(t *testing.T) { + for _, test := range TestFixupData { + result := fixupPort(test.Port, test.CommandLine) if result != test.Result { t.Error("expected " + test.Result + ", got " + result) continue diff --git a/upload/utils.go b/upload/utils.go index 910a37324..984a951d8 100644 --- a/upload/utils.go +++ b/upload/utils.go @@ -1,3 +1,18 @@ +// Copyright 2022 Arduino SA +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published +// by the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + package upload // Logger is an interface implemented by most loggers (like logrus) diff --git a/upload/utils_test.go b/upload/utils_test.go index 335ab498f..c92d0a151 100644 --- a/upload/utils_test.go +++ b/upload/utils_test.go @@ -1,3 +1,18 @@ +// Copyright 2022 Arduino SA +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published +// by the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + package upload import "testing" diff --git a/utilities/utilities.go b/utilities/utilities.go index 617d4fafa..662672da7 100644 --- a/utilities/utilities.go +++ b/utilities/utilities.go @@ -1,15 +1,35 @@ +// Copyright 2022 Arduino SA +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published +// by the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + package utilities import ( - "archive/zip" "bytes" + "crypto" + "crypto/rsa" + "crypto/sha256" + "crypto/x509" + "encoding/hex" + "encoding/pem" "errors" + "fmt" "io" - "io/ioutil" "os" "os/exec" - "path" "path/filepath" + "strings" ) // SaveFileonTempDir creates a temp directory and saves the file data as the @@ -18,15 +38,21 @@ import ( // Returns an error if the filename doesn't form a valid path. // // Note that path could be defined and still there could be an error. -func SaveFileonTempDir(filename string, data io.Reader) (path string, err error) { - // Create Temp Directory - tmpdir, err := ioutil.TempDir("", "arduino-create-agent") +func SaveFileonTempDir(filename string, data io.Reader) (string, error) { + tmpdir, err := os.MkdirTemp("", "arduino-create-agent") if err != nil { return "", errors.New("Could not create temp directory to store downloaded file. Do you have permissions?") } + return saveFileonTempDir(tmpdir, filename, data) +} +func saveFileonTempDir(tmpDir, filename string, data io.Reader) (string, error) { + path, err := SafeJoin(tmpDir, filename) + if err != nil { + return "", err + } // Determine filename - filename, err = filepath.Abs(tmpdir + "/" + filename) + filename, err = filepath.Abs(path) if err != nil { return "", err } @@ -90,39 +116,62 @@ func call(stack []*exec.Cmd, pipes []*io.PipeWriter) (err error) { return stack[0].Wait() } -func Unzip(zippath string, destination string) (err error) { - r, err := zip.OpenReader(zippath) +// SafeJoin performs a filepath.Join of 'parent' and 'subdir' but returns an error +// if the resulting path points outside of 'parent'. +func SafeJoin(parent, subdir string) (string, error) { + res := filepath.Join(parent, subdir) + if !strings.HasSuffix(parent, string(os.PathSeparator)) { + parent += string(os.PathSeparator) + } + if !strings.HasPrefix(res, parent) { + return res, fmt.Errorf("unsafe path join: '%s' with '%s'", parent, subdir) + } + return res, nil +} + +// VerifyInput will verify an input against a signature using the public key. +// A valid signature is indicated by returning a nil error. +func VerifyInput(input string, signature string, pubKey *rsa.PublicKey) error { + sign, _ := hex.DecodeString(signature) + h := sha256.New() + h.Write([]byte(input)) + d := h.Sum(nil) + return rsa.VerifyPKCS1v15(pubKey, crypto.SHA256, d, sign) +} + +// ParseRsaPublicKey parses a public key in PEM format and returns the rsa.PublicKey object. +// Returns an error if the key is invalid. +func ParseRsaPublicKey(key []byte) (*rsa.PublicKey, error) { + block, _ := pem.Decode(key) + if block == nil { + return nil, errors.New("invalid key") + } + + parsedKey, err := x509.ParsePKIXPublicKey(block.Bytes) if err != nil { - return err + return nil, err } - for _, f := range r.File { - fullname := path.Join(destination, f.Name) - if f.FileInfo().IsDir() { - os.MkdirAll(fullname, f.FileInfo().Mode().Perm()) - } else { - os.MkdirAll(filepath.Dir(fullname), 0755) - perms := f.FileInfo().Mode().Perm() - out, err := os.OpenFile(fullname, os.O_CREATE|os.O_RDWR, perms) - if err != nil { - return err - } - rc, err := f.Open() - if err != nil { - return err - } - _, err = io.CopyN(out, rc, f.FileInfo().Size()) - if err != nil { - return err - } - rc.Close() - out.Close() - - mtime := f.FileInfo().ModTime() - err = os.Chtimes(fullname, mtime, mtime) - if err != nil { - return err - } - } + + publicKey, ok := parsedKey.(*rsa.PublicKey) + if !ok { + return nil, fmt.Errorf("not an rsa key") } - return + return publicKey, nil +} + +// MustParseRsaPublicKey parses a public key in PEM format and returns the rsa.PublicKey object. +// Panics if the key is invalid. +func MustParseRsaPublicKey(key []byte) *rsa.PublicKey { + parsedKey, err := ParseRsaPublicKey(key) + if err != nil { + panic(err) + } + return parsedKey +} + +// UserPrompt executes an osascript and returns the pressed button +func UserPrompt(dialog string, buttons string, defaultButton string, toPress string, title string) bool { + oscmd := exec.Command("osascript", "-e", "display dialog \""+dialog+"\" buttons "+buttons+" default button\""+defaultButton+"\" with title \""+title+"\"") + pressedButton, _ := oscmd.Output() + return strings.Contains(string(pressedButton), "button returned:"+toPress) } diff --git a/utilities/utilities_darwin.go b/utilities/utilities_darwin.go index e78badbed..ab567497a 100644 --- a/utilities/utilities_darwin.go +++ b/utilities/utilities_darwin.go @@ -1,6 +1,22 @@ +// Copyright 2022 Arduino SA +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published +// by the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + package utilities import "os/exec" +// TellCommandNotToSpawnShell will now spawn a shell func TellCommandNotToSpawnShell(_ *exec.Cmd) { } diff --git a/utilities/utilities_linux.go b/utilities/utilities_linux.go index e78badbed..ab567497a 100644 --- a/utilities/utilities_linux.go +++ b/utilities/utilities_linux.go @@ -1,6 +1,22 @@ +// Copyright 2022 Arduino SA +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published +// by the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + package utilities import "os/exec" +// TellCommandNotToSpawnShell will now spawn a shell func TellCommandNotToSpawnShell(_ *exec.Cmd) { } diff --git a/utilities/utilities_test.go b/utilities/utilities_test.go new file mode 100644 index 000000000..6511a1719 --- /dev/null +++ b/utilities/utilities_test.go @@ -0,0 +1,48 @@ +package utilities + +import ( + "bytes" + "fmt" + "path/filepath" + "runtime" + "testing" + + "github.com/stretchr/testify/require" +) + +func TestSaveFileonTemp(t *testing.T) { + filename := "file" + tmpDir := t.TempDir() + + path, err := saveFileonTempDir(tmpDir, filename, bytes.NewBufferString("TEST")) + require.NoError(t, err) + require.Equal(t, filepath.Join(tmpDir, filename), path) +} + +func TestSaveFileonTempDirWithEvilName(t *testing.T) { + evilFileNames := []string{ + "/", + "..", + "../", + "../evil.txt", + "../../../../../../../../../../../../../../../../../../../../tmp/evil.txt", + "some/path/../../../../../../../../../../../../../../../../../../../../tmp/evil.txt", + "/../../../../../../../../../../../../../../../../../../../../tmp/evil.txt", + "/some/path/../../../../../../../../../../../../../../../../../../../../tmp/evil.txt", + } + if runtime.GOOS == "windows" { + evilFileNames = []string{ + "..\\", + "..\\evil.txt", + "..\\..\\..\\..\\..\\..\\..\\..\\..\\..\\..\\..\\..\\..\\..\\..\\..\\..\\..\\..\\tmp\\evil.txt", + "some\\path\\..\\..\\..\\..\\..\\..\\..\\..\\..\\..\\..\\..\\..\\..\\..\\..\\..\\..\\..\\..\\tmp\\evil.txt", + "\\..\\..\\..\\..\\..\\..\\..\\..\\..\\..\\..\\..\\..\\..\\..\\..\\..\\..\\..\\..\\tmp\\evil.txt", + "\\some\\path\\..\\..\\..\\..\\..\\..\\..\\..\\..\\..\\..\\..\\..\\..\\..\\..\\..\\..\\..\\..\\tmp\\evil.txt", + } + } + for _, evilFileName := range evilFileNames { + _, err := saveFileonTempDir(t.TempDir(), evilFileName, bytes.NewBufferString("TEST")) + require.Error(t, err, fmt.Sprintf("with filename: '%s'", evilFileName)) + require.ErrorContains(t, err, "unsafe path join") + } +} diff --git a/utilities/utilities_windows.go b/utilities/utilities_windows.go index 9b25828ca..658aaec8c 100644 --- a/utilities/utilities_windows.go +++ b/utilities/utilities_windows.go @@ -1,3 +1,18 @@ +// Copyright 2022 Arduino SA +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published +// by the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + package utilities import ( @@ -5,6 +20,7 @@ import ( "syscall" ) +// TellCommandNotToSpawnShell will now spawn a shell func TellCommandNotToSpawnShell(oscmd *exec.Cmd) { oscmd.SysProcAttr = &syscall.SysProcAttr{HideWindow: true} } diff --git a/v2/http.go b/v2/http.go index 535faf72e..2b47b93a8 100644 --- a/v2/http.go +++ b/v2/http.go @@ -1,22 +1,38 @@ +// Copyright 2022 Arduino SA +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published +// by the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + package v2 import ( "context" + "crypto/rsa" + "encoding/json" "net/http" - "path/filepath" - docssvr "github.com/arduino/arduino-create-agent/gen/http/docs/server" - indexessvr "github.com/arduino/arduino-create-agent/gen/http/indexes/server" toolssvr "github.com/arduino/arduino-create-agent/gen/http/tools/server" - indexessvc "github.com/arduino/arduino-create-agent/gen/indexes" toolssvc "github.com/arduino/arduino-create-agent/gen/tools" + "github.com/arduino/arduino-create-agent/index" "github.com/arduino/arduino-create-agent/v2/pkgs" "github.com/sirupsen/logrus" - goahttp "goa.design/goa/http" - "goa.design/goa/http/middleware" + goahttp "goa.design/goa/v3/http" + "goa.design/goa/v3/http/middleware" + goamiddleware "goa.design/goa/v3/middleware" ) -func Server(home string) http.Handler { +// Server is the actual server +func Server(directory string, index *index.Resource, pubKey *rsa.PublicKey) http.Handler { mux := goahttp.NewMuxer() // Instantiate logger @@ -24,29 +40,12 @@ func Server(home string) http.Handler { logger.SetLevel(logrus.DebugLevel) logAdapter := LogAdapter{Logger: logger} - // Mount indexes - indexesSvc := pkgs.Indexes{ - Log: logger, - Folder: filepath.Join(home, "indexes"), - } - indexesEndpoints := indexessvc.NewEndpoints(&indexesSvc) - indexesServer := indexessvr.New(indexesEndpoints, mux, goahttp.RequestDecoder, - goahttp.ResponseEncoder, errorHandler(logger)) - indexessvr.Mount(mux, indexesServer) - // Mount tools - toolsSvc := pkgs.Tools{ - Folder: home, - Indexes: &indexesSvc, - } - toolsEndpoints := toolssvc.NewEndpoints(&toolsSvc) - toolsServer := toolssvr.New(toolsEndpoints, mux, goahttp.RequestDecoder, goahttp.ResponseEncoder, errorHandler(logger)) + toolsSvc := pkgs.New(index, directory, "replace", pubKey) + toolsEndpoints := toolssvc.NewEndpoints(toolsSvc) + toolsServer := toolssvr.New(toolsEndpoints, mux, CustomRequestDecoder, goahttp.ResponseEncoder, errorHandler(logger), nil) toolssvr.Mount(mux, toolsServer) - // Mount docs - docssvr.New(nil, mux, goahttp.RequestDecoder, goahttp.ResponseEncoder, errorHandler(logger)) - docssvr.Mount(mux) - // Mount middlewares handler := middleware.Log(logAdapter)(mux) handler = middleware.RequestID()(handler) @@ -59,8 +58,19 @@ func Server(home string) http.Handler { // to correlate. func errorHandler(logger *logrus.Logger) func(context.Context, http.ResponseWriter, error) { return func(ctx context.Context, w http.ResponseWriter, err error) { - id := ctx.Value(middleware.RequestIDKey).(string) + id := ctx.Value(goamiddleware.RequestIDKey).(string) w.Write([]byte("[" + id + "] encoding: " + err.Error())) logger.Printf("[%s] ERROR: %s", id, err.Error()) } } + +// CustomRequestDecoder overrides the RequestDecoder provided by goahttp package +// It returns always a json.NewDecoder for legacy reasons: +// The web editor sends always request to the agent setting "Content-Type: text/plain" +// even when it should set "Content-Type: application/json". This breaks the parsing with: +// "can't decode text/plain to *server.InstallRequestBody" error message. +// This was working before the bump to goa v3 only because a "text/plain" decoder was not implemented +// and it was fallbacking to the json decoder. (https://github.com/goadesign/goa/pull/2310) +func CustomRequestDecoder(r *http.Request) goahttp.Decoder { + return json.NewDecoder(r.Body) +} diff --git a/v2/log.go b/v2/log.go index 4f22b20e0..8d683ad18 100644 --- a/v2/log.go +++ b/v2/log.go @@ -1,3 +1,18 @@ +// Copyright 2022 Arduino SA +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published +// by the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + package v2 import ( @@ -7,10 +22,12 @@ import ( "github.com/sirupsen/logrus" ) +// LogAdapter is the adapter for the logger type LogAdapter struct { *logrus.Logger } +// Log is the log function func (a LogAdapter) Log(keyvals ...interface{}) error { n := (len(keyvals) + 1) / 2 if len(keyvals)%2 != 0 { diff --git a/v2/pkgs/indexes.go b/v2/pkgs/indexes.go deleted file mode 100644 index 9b9f5ee54..000000000 --- a/v2/pkgs/indexes.go +++ /dev/null @@ -1,109 +0,0 @@ -package pkgs - -import ( - "context" - b64 "encoding/base64" - "encoding/json" - "io/ioutil" - "net/url" - "os" - "path/filepath" - "strings" - - "github.com/arduino/arduino-create-agent/gen/indexes" - "github.com/sirupsen/logrus" - "go.bug.st/downloader" -) - -// Indexes is a client that implements github.com/arduino/arduino-create-agent/gen/indexes.Service interface -type Indexes struct { - Log *logrus.Logger - Folder string -} - -// Add downloads the index file found at the url contained in the payload, and saves it in the Indexes Folder. -// If called with an already existing index, it overwrites the file. -// It can fail if the payload is not defined, if it contains an invalid url. -func (c *Indexes) Add(ctx context.Context, payload *indexes.IndexPayload) (*indexes.Operation, error) { - // Parse url - indexURL, err := url.Parse(payload.URL) - if err != nil { - return nil, indexes.MakeInvalidURL(err) - } - - // Download tmp file - filename := b64.StdEncoding.EncodeToString([]byte(url.PathEscape(payload.URL))) - path := filepath.Join(c.Folder, filename+".tmp") - d, err := downloader.Download(path, indexURL.String()) - if err != nil { - return nil, err - } - err = d.Run() - if err != nil { - return nil, err - } - - // Move tmp file - err = os.Rename(path, filepath.Join(c.Folder, filename)) - if err != nil { - return nil, err - } - - return &indexes.Operation{Status: "ok"}, nil -} - -// Get reads the index file from the Indexes Folder, unmarshaling it -func (c *Indexes) Get(ctx context.Context, uri string) (index Index, err error) { - filename := b64.StdEncoding.EncodeToString([]byte(url.PathEscape(uri))) - path := filepath.Join(c.Folder, filename) - data, err := ioutil.ReadFile(path) - if err != nil { - return index, err - } - - err = json.Unmarshal(data, &index) - if err != nil { - return index, err - } - - return index, nil -} - -// List reads from the Indexes Folder and returns the indexes that have been downloaded -func (c *Indexes) List(context.Context) ([]string, error) { - // Create folder if it doesn't exist - _ = os.MkdirAll(c.Folder, 0755) - // Read files - files, err := ioutil.ReadDir(c.Folder) - - if err != nil { - return nil, err - } - - res := []string{} - for _, file := range files { - // Select only files that begin with http - decodedFileName, _ := b64.URLEncoding.DecodeString(file.Name()) - fileName := string(decodedFileName) - if !strings.HasPrefix(fileName, "http") { - continue - } - path, err := url.PathUnescape(fileName) - if err != nil { - c.Log.Warn(err) - } - res = append(res, path) - } - - return res, nil -} - -// Remove deletes the index file from the Indexes Folder -func (c *Indexes) Remove(ctx context.Context, payload *indexes.IndexPayload) (*indexes.Operation, error) { - filename := b64.StdEncoding.EncodeToString([]byte(url.PathEscape(payload.URL))) - err := os.RemoveAll(filepath.Join(c.Folder, filename)) - if err != nil { - return nil, err - } - return &indexes.Operation{Status: "ok"}, nil -} diff --git a/v2/pkgs/indexes_test.go b/v2/pkgs/indexes_test.go deleted file mode 100644 index 4d3b8dd78..000000000 --- a/v2/pkgs/indexes_test.go +++ /dev/null @@ -1,88 +0,0 @@ -package pkgs_test - -import ( - "context" - "io/ioutil" - "net/http" - "net/http/httptest" - "os" - "path/filepath" - "strings" - "testing" - - "github.com/arduino/arduino-create-agent/gen/indexes" - "github.com/arduino/arduino-create-agent/v2/pkgs" -) - -// TestIndexes performs a series of operations about indexes, ensuring it behaves as expected. -func TestIndexes(t *testing.T) { - // Use local file as index - ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - http.ServeFile(w, r, "testdata/package_index.json") - })) - defer ts.Close() - - // Initialize indexes with a temp folder - tmp, err := ioutil.TempDir("", "") - if err != nil { - t.Fatal(err) - } - defer os.RemoveAll(tmp) - - // Create extraneous folder in temp folder - os.MkdirAll(filepath.Join(tmp, "arduino"), 0755) - - service := pkgs.Indexes{ - Folder: tmp, - } - - ctx := context.Background() - - // List indexes, they should be 0 - list, err := service.List(ctx) - if err != nil { - t.Fatal(err) - } - if len(list) != 0 { - t.Fatalf("expected %d == %d (%s)", len(list), 0, "len(list)") - } - - // Add a faulty index - _, err = service.Add(ctx, &indexes.IndexPayload{URL: ":"}) - if err == nil || !strings.Contains(err.Error(), "missing protocol scheme") { - t.Fatalf("expected [%v] == [%v] (%s)", err, "missing protocol scheme", "err") - } - - // Add a new index - _, err = service.Add(ctx, &indexes.IndexPayload{URL: ts.URL}) - if err != nil { - t.Fatal(err) - } - - // List indexes, they should be 1 - list, err = service.List(ctx) - if err != nil { - t.Fatal(err) - } - if len(list) != 1 { - t.Fatalf("expected %d == %d (%s)", len(list), 1, "len(list)") - } - if list[0] != ts.URL { - t.Fatalf("expected %s == %s (%s)", list[0], "downloads.arduino.cc/packages/package_index.json", "list[0]") - } - - // Remove the index - _, err = service.Remove(ctx, &indexes.IndexPayload{URL: ts.URL}) - if err != nil { - t.Fatal(err) - } - - // List indexes, they should be 0 - list, err = service.List(ctx) - if err != nil { - t.Fatal(err) - } - if len(list) != 0 { - t.Fatalf("expected %d == %d (%s)", len(list), 0, "len(list)") - } -} diff --git a/v2/pkgs/pkgs.go b/v2/pkgs/pkgs.go index 271264bf8..07e392b2f 100644 --- a/v2/pkgs/pkgs.go +++ b/v2/pkgs/pkgs.go @@ -1,3 +1,18 @@ +// Copyright 2022 Arduino SA +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published +// by the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + // Package pkgs implements the functions from // github.com/arduino-create-agent/gen/indexes // and github.com/arduino-create-agent/gen/tools. @@ -6,6 +21,8 @@ // cores, and to download tools used for upload. package pkgs +import "regexp" + // Index is the go representation of a typical // package-index file, stripped from every non-used field. type Index struct { @@ -16,14 +33,109 @@ type Index struct { } // Tool is the go representation of the info about a -//tool contained in a package-index file, stripped from -//every non-used field. +// tool contained in a package-index file, stripped from +// every non-used field. type Tool struct { - Name string `json:"name"` - Version string `json:"version"` - Systems []struct { - Host string `json:"host"` - URL string `json:"url"` - Checksum string `json:"checksum"` - } `json:"systems"` + Name string `json:"name"` + Version string `json:"version"` + Systems []System `json:"systems"` +} + +// System is the go representation of the info needed to +// download a tool for a specific OS/Arch +type System struct { + Host string `json:"host"` + URL string `json:"url"` + Name string `json:"archiveFileName"` + Checksum string `json:"checksum"` +} + +// Source: https://github.com/arduino/arduino-cli/blob/master/internal/arduino/cores/tools.go#L129-L142 +var ( + regexpLinuxArm = regexp.MustCompile("arm.*-linux-gnueabihf") + regexpLinuxArm64 = regexp.MustCompile("(aarch64|arm64)-linux-gnu") + regexpLinux64 = regexp.MustCompile("x86_64-.*linux-gnu") + regexpLinux32 = regexp.MustCompile("i[3456]86-.*linux-gnu") + regexpWindows32 = regexp.MustCompile("i[3456]86-.*(mingw32|cygwin)") + regexpWindows64 = regexp.MustCompile("(amd64|x86_64)-.*(mingw32|cygwin)") + regexpMac64 = regexp.MustCompile("x86_64-apple-darwin.*") + regexpMac32 = regexp.MustCompile("i[3456]86-apple-darwin.*") + regexpMacArm64 = regexp.MustCompile("arm64-apple-darwin.*") + regexpFreeBSDArm = regexp.MustCompile("arm.*-freebsd[0-9]*") + regexpFreeBSD32 = regexp.MustCompile("i?[3456]86-freebsd[0-9]*") + regexpFreeBSD64 = regexp.MustCompile("amd64-freebsd[0-9]*") +) + +// Source: https://github.com/arduino/arduino-cli/blob/master/internal/arduino/cores/tools.go#L144-L176 +func (s *System) isExactMatchWith(osName, osArch string) bool { + if s.Host == "all" { + return true + } + + switch osName + "," + osArch { + case "linux,arm", "linux,armbe": + return regexpLinuxArm.MatchString(s.Host) + case "linux,arm64": + return regexpLinuxArm64.MatchString(s.Host) + case "linux,amd64": + return regexpLinux64.MatchString(s.Host) + case "linux,386": + return regexpLinux32.MatchString(s.Host) + case "windows,386": + return regexpWindows32.MatchString(s.Host) + case "windows,amd64": + return regexpWindows64.MatchString(s.Host) + case "darwin,arm64": + return regexpMacArm64.MatchString(s.Host) + case "darwin,amd64": + return regexpMac64.MatchString(s.Host) + case "darwin,386": + return regexpMac32.MatchString(s.Host) + case "freebsd,arm": + return regexpFreeBSDArm.MatchString(s.Host) + case "freebsd,386": + return regexpFreeBSD32.MatchString(s.Host) + case "freebsd,amd64": + return regexpFreeBSD64.MatchString(s.Host) + } + return false +} + +// Source: https://github.com/arduino/arduino-cli/blob/master/internal/arduino/cores/tools.go#L178-L198 +func (s *System) isCompatibleWith(osName, osArch string) (bool, int) { + if s.isExactMatchWith(osName, osArch) { + return true, 1000 + } + + switch osName + "," + osArch { + case "windows,amd64": + return regexpWindows32.MatchString(s.Host), 10 + case "darwin,amd64": + return regexpMac32.MatchString(s.Host), 10 + case "darwin,arm64": + // Compatibility guaranteed through Rosetta emulation + if regexpMac64.MatchString(s.Host) { + // Prefer amd64 version if available + return true, 20 + } + return regexpMac32.MatchString(s.Host), 10 + } + + return false, 0 +} + +// GetFlavourCompatibleWith returns the downloadable resource (System) compatible with the specified OS/Arch +// Source: https://github.com/arduino/arduino-cli/blob/master/internal/arduino/cores/tools.go#L206-L216 +func (t *Tool) GetFlavourCompatibleWith(osName, osArch string) System { + var correctSystem System + maxSimilarity := -1 + + for _, s := range t.Systems { + if comp, similarity := s.isCompatibleWith(osName, osArch); comp && similarity > maxSimilarity { + correctSystem = s + maxSimilarity = similarity + } + } + + return correctSystem } diff --git a/v2/pkgs/testdata/package_index.json b/v2/pkgs/testdata/package_index.json deleted file mode 100644 index d756ca513..000000000 --- a/v2/pkgs/testdata/package_index.json +++ /dev/null @@ -1,5910 +0,0 @@ -{ - "packages": [ - { - "name": "arduino", - "maintainer": "Arduino", - "websiteURL": "http://www.arduino.cc/", - "email": "packages@arduino.cc", - "help": { - "online": "http://www.arduino.cc/en/Reference/HomePage" - }, - "platforms": [ - { - "name": "Arduino AVR Boards", - "architecture": "avr", - "version": "1.6.2", - "category": "Arduino", - "url": "http://downloads.arduino.cc/cores/avr-1.6.2.tar.bz2", - "archiveFileName": "avr-1.6.2.tar.bz2", - "checksum": "SHA-256:2909a4c6dd6d7497e7e1b5fcaa2f66a100271417510f3a68593b65af8ff78c1c", - "size": "4877442", - "boards": [ - {"name": "Arduino Yún"}, - {"name": "Arduino Uno"}, - {"name": "Arduino Diecimila"}, - {"name": "Arduino Nano"}, - {"name": "Arduino Mega"}, - {"name": "Arduino MegaADK"}, - {"name": "Arduino Leonardo"}, - {"name": "Arduino Micro"}, - {"name": "Arduino Esplora"}, - {"name": "Arduino Mini"}, - {"name": "Arduino Ethernet"}, - {"name": "Arduino Fio"}, - {"name": "Arduino BT"}, - {"name": "Arduino LilyPadUSB"}, - {"name": "Arduino Lilypad"}, - {"name": "Arduino Pro"}, - {"name": "Arduino ATMegaNG"}, - {"name": "Arduino Robot Control"}, - {"name": "Arduino Robot Motor"} - ], - "toolsDependencies": [ - { - "packager": "arduino", - "name": "avr-gcc", - "version": "4.8.1-arduino2" - }, - { - "packager": "arduino", - "name": "avrdude", - "version": "6.0.1-arduino2" - } - ] - }, - { - "name": "Arduino AVR Boards", - "architecture": "avr", - "version": "1.6.3", - "category": "Arduino", - "help": { - "online": "http://www.arduino.cc/en/Reference/HomePage" - }, - "url": "http://downloads.arduino.cc/cores/avr-1.6.3.tar.bz2", - "archiveFileName": "avr-1.6.3.tar.bz2", - "checksum": "SHA-256:c30033ba70cbb2d46ee0901a331b0f83be082f9110eda0464b624fdbb51b3c7b", - "size": "4876816", - "boards": [ - {"name": "Arduino Yún"}, - {"name": "Arduino Uno"}, - {"name": "Arduino Diecimila"}, - {"name": "Arduino Nano"}, - {"name": "Arduino Mega"}, - {"name": "Arduino MegaADK"}, - {"name": "Arduino Leonardo"}, - {"name": "Arduino Micro"}, - {"name": "Arduino Esplora"}, - {"name": "Arduino Mini"}, - {"name": "Arduino Ethernet"}, - {"name": "Arduino Fio"}, - {"name": "Arduino BT"}, - {"name": "Arduino LilyPadUSB"}, - {"name": "Arduino Lilypad"}, - {"name": "Arduino Pro"}, - {"name": "Arduino ATMegaNG"}, - {"name": "Arduino Robot Control"}, - {"name": "Arduino Robot Motor"} - ], - "toolsDependencies": [ - { - "packager": "arduino", - "name": "avr-gcc", - "version": "4.8.1-arduino3" - }, - { - "packager": "arduino", - "name": "avrdude", - "version": "6.0.1-arduino3" - } - ] - }, - { - "name": "Arduino AVR Boards", - "architecture": "avr", - "version": "1.6.4", - "category": "Arduino", - "help": { - "online": "http://www.arduino.cc/en/Reference/HomePage" - }, - "url": "http://downloads.arduino.cc/cores/avr-1.6.4.tar.bz2", - "archiveFileName": "avr-1.6.4.tar.bz2", - "checksum": "SHA-256:8a243410aeded6dbcbc4b134ba10be5c2562d137bfcf3ac97abdc5844933b363", - "size": "4780884", - "boards": [ - {"name": "Arduino Yún"}, - {"name": "Arduino Uno"}, - {"name": "Arduino Diecimila"}, - {"name": "Arduino Nano"}, - {"name": "Arduino Mega"}, - {"name": "Arduino MegaADK"}, - {"name": "Arduino Leonardo"}, - {"name": "Arduino Micro"}, - {"name": "Arduino Esplora"}, - {"name": "Arduino Mini"}, - {"name": "Arduino Ethernet"}, - {"name": "Arduino Fio"}, - {"name": "Arduino BT"}, - {"name": "Arduino LilyPadUSB"}, - {"name": "Arduino Lilypad"}, - {"name": "Arduino Pro"}, - {"name": "Arduino ATMegaNG"}, - {"name": "Arduino Robot Control"}, - {"name": "Arduino Robot Motor"} - ], - "toolsDependencies": [ - { - "packager": "arduino", - "name": "avr-gcc", - "version": "4.8.1-arduino5" - }, - { - "packager": "arduino", - "name": "avrdude", - "version": "6.0.1-arduino5" - } - ] - }, - { - "name": "Arduino AVR Boards", - "architecture": "avr", - "version": "1.6.5", - "category": "Arduino", - "help": { - "online": "http://www.arduino.cc/en/Reference/HomePage" - }, - "url": "http://downloads.arduino.cc/cores/avr-1.6.5.tar.bz2", - "archiveFileName": "avr-1.6.5.tar.bz2", - "checksum": "SHA-256:c72d890aa605add677634c6b25ebc3b2ed9e44c38805b95c47eab17a1ca72db6", - "size": "4876957", - "boards": [ - {"name": "Arduino Yún"}, - {"name": "Arduino Uno"}, - {"name": "Arduino Diecimila"}, - {"name": "Arduino Nano"}, - {"name": "Arduino Mega"}, - {"name": "Arduino MegaADK"}, - {"name": "Arduino Leonardo"}, - {"name": "Arduino Micro"}, - {"name": "Arduino Esplora"}, - {"name": "Arduino Mini"}, - {"name": "Arduino Ethernet"}, - {"name": "Arduino Fio"}, - {"name": "Arduino BT"}, - {"name": "Arduino LilyPadUSB"}, - {"name": "Arduino Lilypad"}, - {"name": "Arduino Pro"}, - {"name": "Arduino ATMegaNG"}, - {"name": "Arduino Robot Control"}, - {"name": "Arduino Robot Motor"} - ], - "toolsDependencies": [ - { - "packager": "arduino", - "name": "avr-gcc", - "version": "4.8.1-arduino5" - }, - { - "packager": "arduino", - "name": "avrdude", - "version": "6.0.1-arduino5" - } - ] - }, - { - "name": "Arduino AVR Boards", - "architecture": "avr", - "version": "1.6.6", - "category": "Arduino", - "help": { - "online": "http://www.arduino.cc/en/Reference/HomePage" - }, - "url": "http://downloads.arduino.cc/cores/avr-1.6.6.tar.bz2", - "archiveFileName": "avr-1.6.6.tar.bz2", - "checksum": "SHA-256:08ad5db4978ebea22344edc5d77dce0923d8a644da7a14dc8072e883c76058d8", - "size": "4876916", - "boards": [ - {"name": "Arduino Yún"}, - {"name": "Arduino Uno"}, - {"name": "Arduino Diecimila"}, - {"name": "Arduino Nano"}, - {"name": "Arduino Mega"}, - {"name": "Arduino MegaADK"}, - {"name": "Arduino Leonardo"}, - {"name": "Arduino Micro"}, - {"name": "Arduino Esplora"}, - {"name": "Arduino Mini"}, - {"name": "Arduino Ethernet"}, - {"name": "Arduino Fio"}, - {"name": "Arduino BT"}, - {"name": "Arduino LilyPadUSB"}, - {"name": "Arduino Lilypad"}, - {"name": "Arduino Pro"}, - {"name": "Arduino ATMegaNG"}, - {"name": "Arduino Robot Control"}, - {"name": "Arduino Robot Motor"} - ], - "toolsDependencies": [ - { - "packager": "arduino", - "name": "avr-gcc", - "version": "4.8.1-arduino5" - }, - { - "packager": "arduino", - "name": "avrdude", - "version": "6.0.1-arduino5" - } - ] - }, - { - "name": "Arduino AVR Boards", - "architecture": "avr", - "version": "1.6.7", - "category": "Arduino", - "help": { - "online": "http://www.arduino.cc/en/Reference/HomePage" - }, - "url": "http://downloads.arduino.cc/cores/avr-1.6.7.tar.bz2", - "archiveFileName": "avr-1.6.7.tar.bz2", - "checksum": "SHA-256:e112992c59c0d826db9a63967679854a96b3c7b970f788a03834e211f6390caa", - "size": "4904283", - "boards": [ - {"name": "Arduino Yún"}, - {"name": "Arduino Uno"}, - {"name": "Arduino Diecimila"}, - {"name": "Arduino Nano"}, - {"name": "Arduino Mega"}, - {"name": "Arduino MegaADK"}, - {"name": "Arduino Leonardo"}, - {"name": "Arduino Micro"}, - {"name": "Arduino Esplora"}, - {"name": "Arduino Mini"}, - {"name": "Arduino Ethernet"}, - {"name": "Arduino Fio"}, - {"name": "Arduino BT"}, - {"name": "Arduino LilyPadUSB"}, - {"name": "Arduino Lilypad"}, - {"name": "Arduino Pro"}, - {"name": "Arduino ATMegaNG"}, - {"name": "Arduino Robot Control"}, - {"name": "Arduino Robot Motor"}, - {"name": "Arduino Gemma"} - ], - "toolsDependencies": [ - { - "packager": "arduino", - "name": "avr-gcc", - "version": "4.8.1-arduino5" - }, - { - "packager": "arduino", - "name": "avrdude", - "version": "6.0.1-arduino5" - } - ] - }, - { - "name": "Arduino AVR Boards", - "architecture": "avr", - "version": "1.6.8", - "category": "Arduino", - "help": { - "online": "http://www.arduino.cc/en/Reference/HomePage" - }, - "url": "http://downloads.arduino.cc/cores/avr-1.6.8.tar.bz2", - "archiveFileName": "avr-1.6.8.tar.bz2", - "checksum": "SHA-256:0e0775347baf0d93ef344bcd851e7d8d0af2bda7916c119fa3a4ff9b984c575b", - "size": "4885536", - "boards": [ - {"name": "Arduino Yún"}, - {"name": "Arduino/Genuino Uno"}, - {"name": "Arduino Diecimila"}, - {"name": "Arduino Nano"}, - {"name": "Arduino/Genuino Mega"}, - {"name": "Arduino MegaADK"}, - {"name": "Arduino Leonardo"}, - {"name": "Arduino/Genuino Micro"}, - {"name": "Arduino Esplora"}, - {"name": "Arduino Mini"}, - {"name": "Arduino Ethernet"}, - {"name": "Arduino Fio"}, - {"name": "Arduino BT"}, - {"name": "Arduino LilyPadUSB"}, - {"name": "Arduino Lilypad"}, - {"name": "Arduino Pro"}, - {"name": "Arduino ATMegaNG"}, - {"name": "Arduino Robot Control"}, - {"name": "Arduino Robot Motor"}, - {"name": "Arduino Gemma"} - ], - "toolsDependencies": [ - { - "packager": "arduino", - "name": "avr-gcc", - "version": "4.8.1-arduino5" - }, - { - "packager": "arduino", - "name": "avrdude", - "version": "6.0.1-arduino5" - } - ] - }, - { - "name": "Arduino AVR Boards", - "architecture": "avr", - "version": "1.6.9", - "category": "Arduino", - "help": { - "online": "http://www.arduino.cc/en/Reference/HomePage" - }, - "url": "http://downloads.arduino.cc/cores/avr-1.6.9.tar.bz2", - "archiveFileName": "avr-1.6.9.tar.bz2", - "checksum": "SHA-256:eb8bc661162bc689b3ed02c4d24f6ff964e91ace890b7d3db2e316c84ba235f0", - "size": "4890702", - "boards": [ - {"name": "Arduino Yún"}, - {"name": "Arduino/Genuino Uno"}, - {"name": "Arduino Diecimila"}, - {"name": "Arduino Nano"}, - {"name": "Arduino/Genuino Mega"}, - {"name": "Arduino MegaADK"}, - {"name": "Arduino Leonardo"}, - {"name": "Arduino/Genuino Micro"}, - {"name": "Arduino Esplora"}, - {"name": "Arduino Mini"}, - {"name": "Arduino Ethernet"}, - {"name": "Arduino Fio"}, - {"name": "Arduino BT"}, - {"name": "Arduino LilyPadUSB"}, - {"name": "Arduino Lilypad"}, - {"name": "Arduino Pro"}, - {"name": "Arduino ATMegaNG"}, - {"name": "Arduino Robot Control"}, - {"name": "Arduino Robot Motor"}, - {"name": "Arduino Gemma"} - ], - "toolsDependencies": [ - { - "packager": "arduino", - "name": "avr-gcc", - "version": "4.8.1-arduino5" - }, - { - "packager": "arduino", - "name": "avrdude", - "version": "6.0.1-arduino5" - } - ] - }, - { - "name": "Arduino AVR Boards", - "architecture": "avr", - "version": "1.6.10", - "category": "Arduino", - "help": { - "online": "http://www.arduino.cc/en/Reference/HomePage" - }, - "url": "http://downloads.arduino.cc/cores/avr-1.6.10.tar.bz2", - "archiveFileName": "avr-1.6.10.tar.bz2", - "checksum": "SHA-256:92cad999335198f875bdaec5de0169991bee19e0058c623d2cdd0835bb26eeaa", - "size": "4991331", - "boards": [ - {"name": "Arduino Yún"}, - {"name": "Arduino/Genuino Uno"}, - {"name": "Arduino Diecimila"}, - {"name": "Arduino Nano"}, - {"name": "Arduino/Genuino Mega"}, - {"name": "Arduino MegaADK"}, - {"name": "Arduino Leonardo"}, - {"name": "Arduino/Genuino Micro"}, - {"name": "Arduino Esplora"}, - {"name": "Arduino Mini"}, - {"name": "Arduino Ethernet"}, - {"name": "Arduino Fio"}, - {"name": "Arduino BT"}, - {"name": "Arduino LilyPadUSB"}, - {"name": "Arduino Lilypad"}, - {"name": "Arduino Pro"}, - {"name": "Arduino ATMegaNG"}, - {"name": "Arduino Robot Control"}, - {"name": "Arduino Robot Motor"}, - {"name": "Arduino Gemma"} - ], - "toolsDependencies": [ - { - "packager": "arduino", - "name": "avr-gcc", - "version": "4.8.1-arduino5" - }, - { - "packager": "arduino", - "name": "avrdude", - "version": "6.0.1-arduino5" - } - ] - }, - { - "name": "Arduino AVR Boards", - "architecture": "avr", - "version": "1.6.11", - "category": "Arduino", - "help": { - "online": "http://www.arduino.cc/en/Reference/HomePage" - }, - "url": "http://downloads.arduino.cc/cores/avr-1.6.11.tar.bz2", - "archiveFileName": "avr-1.6.11.tar.bz2", - "checksum": "SHA-256:5292d3559de74eb990ff570df43887b44d4e3c6b80ab4ab0f945e94dd68d8210", - "size": "4991634", - "boards": [ - {"name": "Arduino Yún"}, - {"name": "Arduino/Genuino Uno"}, - {"name": "Arduino Diecimila"}, - {"name": "Arduino Nano"}, - {"name": "Arduino/Genuino Mega"}, - {"name": "Arduino MegaADK"}, - {"name": "Arduino Leonardo"}, - {"name": "Arduino/Genuino Micro"}, - {"name": "Arduino Esplora"}, - {"name": "Arduino Mini"}, - {"name": "Arduino Ethernet"}, - {"name": "Arduino Fio"}, - {"name": "Arduino BT"}, - {"name": "Arduino LilyPadUSB"}, - {"name": "Arduino Lilypad"}, - {"name": "Arduino Pro"}, - {"name": "Arduino ATMegaNG"}, - {"name": "Arduino Robot Control"}, - {"name": "Arduino Robot Motor"}, - {"name": "Arduino Gemma"} - ], - "toolsDependencies": [ - { - "packager": "arduino", - "name": "avr-gcc", - "version": "4.8.1-arduino5" - }, - { - "packager": "arduino", - "name": "avrdude", - "version": "6.0.1-arduino5" - } - ] - }, - { - "name": "Arduino AVR Boards", - "architecture": "avr", - "version": "1.6.12", - "category": "Arduino", - "help": { - "online": "http://www.arduino.cc/en/Reference/HomePage" - }, - "url": "http://downloads.arduino.cc/cores/avr-1.6.12.tar.bz2", - "archiveFileName": "avr-1.6.12.tar.bz2", - "checksum": "SHA-256:4a296a3304a51d820e680e2022fb9b9f5706144abf1e5d60c7876a0f9fc7e6d9", - "size": "4993586", - "boards": [ - {"name": "Arduino Yún"}, - {"name": "Arduino/Genuino Uno"}, - {"name": "Arduino Diecimila"}, - {"name": "Arduino Nano"}, - {"name": "Arduino/Genuino Mega"}, - {"name": "Arduino MegaADK"}, - {"name": "Arduino Leonardo"}, - {"name": "Arduino/Genuino Micro"}, - {"name": "Arduino Esplora"}, - {"name": "Arduino Mini"}, - {"name": "Arduino Ethernet"}, - {"name": "Arduino Fio"}, - {"name": "Arduino BT"}, - {"name": "Arduino LilyPadUSB"}, - {"name": "Arduino Lilypad"}, - {"name": "Arduino Pro"}, - {"name": "Arduino ATMegaNG"}, - {"name": "Arduino Robot Control"}, - {"name": "Arduino Robot Motor"}, - {"name": "Arduino Gemma"} - ], - "toolsDependencies": [ - { - "packager": "arduino", - "name": "avr-gcc", - "version": "4.9.2-atmel3.5.3-arduino2" - }, - { - "packager": "arduino", - "name": "avrdude", - "version": "6.3.0-arduino2" - } - ] - }, - { - "name": "Arduino AVR Boards", - "architecture": "avr", - "version": "1.6.13", - "category": "Arduino", - "help": { - "online": "http://www.arduino.cc/en/Reference/HomePage" - }, - "url": "http://downloads.arduino.cc/cores/avr-1.6.13.tar.bz2", - "archiveFileName": "avr-1.6.13.tar.bz2", - "checksum": "SHA-256:617f458dd3507072b9a6f9fdc78888c66aa420a2fb081c4c1556598a2d69d643", - "size": "4993644", - "boards": [ - {"name": "Arduino Yún"}, - {"name": "Arduino/Genuino Uno"}, - {"name": "Arduino Diecimila"}, - {"name": "Arduino Nano"}, - {"name": "Arduino/Genuino Mega"}, - {"name": "Arduino MegaADK"}, - {"name": "Arduino Leonardo"}, - {"name": "Arduino/Genuino Micro"}, - {"name": "Arduino Esplora"}, - {"name": "Arduino Mini"}, - {"name": "Arduino Ethernet"}, - {"name": "Arduino Fio"}, - {"name": "Arduino BT"}, - {"name": "Arduino LilyPadUSB"}, - {"name": "Arduino Lilypad"}, - {"name": "Arduino Pro"}, - {"name": "Arduino ATMegaNG"}, - {"name": "Arduino Robot Control"}, - {"name": "Arduino Robot Motor"}, - {"name": "Arduino Gemma"} - ], - "toolsDependencies": [ - { - "packager": "arduino", - "name": "avr-gcc", - "version": "4.9.2-atmel3.5.3-arduino2" - }, - { - "packager": "arduino", - "name": "avrdude", - "version": "6.0.1-arduino5" - } - ] - }, - { - "name": "Arduino AVR Boards", - "architecture": "avr", - "version": "1.6.14", - "category": "Arduino", - "help": { - "online": "http://www.arduino.cc/en/Reference/HomePage" - }, - "url": "http://downloads.arduino.cc/cores/avr-1.6.14.tar.bz2", - "archiveFileName": "avr-1.6.14.tar.bz2", - "checksum": "SHA-256:a5f7d66c83e3d4722f4c8dab42bdbcf5af98c611ffca1802ef3d1957b894bd92", - "size": "4993455", - "boards": [ - {"name": "Arduino Yún"}, - {"name": "Arduino/Genuino Uno"}, - {"name": "Arduino Diecimila"}, - {"name": "Arduino Nano"}, - {"name": "Arduino/Genuino Mega"}, - {"name": "Arduino MegaADK"}, - {"name": "Arduino Leonardo"}, - {"name": "Arduino/Genuino Micro"}, - {"name": "Arduino Esplora"}, - {"name": "Arduino Mini"}, - {"name": "Arduino Ethernet"}, - {"name": "Arduino Fio"}, - {"name": "Arduino BT"}, - {"name": "Arduino LilyPadUSB"}, - {"name": "Arduino Lilypad"}, - {"name": "Arduino Pro"}, - {"name": "Arduino ATMegaNG"}, - {"name": "Arduino Robot Control"}, - {"name": "Arduino Robot Motor"}, - {"name": "Arduino Gemma"} - ], - "toolsDependencies": [ - { - "packager": "arduino", - "name": "avr-gcc", - "version": "4.9.2-atmel3.5.3-arduino2" - }, - { - "packager": "arduino", - "name": "avrdude", - "version": "6.3.0-arduino6" - } - ] - }, - { - "name": "Arduino AVR Boards", - "architecture": "avr", - "version": "1.6.15", - "category": "Arduino", - "help": { - "online": "http://www.arduino.cc/en/Reference/HomePage" - }, - "url": "http://downloads.arduino.cc/cores/avr-1.6.15.tar.bz2", - "archiveFileName": "avr-1.6.15.tar.bz2", - "checksum": "SHA-256:c222efcabbdf6fa63ba3d64afb8d149f83fa73693c413aa05a2ccd9f986ed2fa", - "size": "4993959", - "boards": [ - {"name": "Arduino Yún"}, - {"name": "Arduino/Genuino Uno"}, - {"name": "Arduino Diecimila"}, - {"name": "Arduino Nano"}, - {"name": "Arduino/Genuino Mega"}, - {"name": "Arduino MegaADK"}, - {"name": "Arduino Leonardo"}, - {"name": "Arduino/Genuino Micro"}, - {"name": "Arduino Esplora"}, - {"name": "Arduino Mini"}, - {"name": "Arduino Ethernet"}, - {"name": "Arduino Fio"}, - {"name": "Arduino BT"}, - {"name": "Arduino LilyPadUSB"}, - {"name": "Arduino Lilypad"}, - {"name": "Arduino Pro"}, - {"name": "Arduino ATMegaNG"}, - {"name": "Arduino Robot Control"}, - {"name": "Arduino Robot Motor"}, - {"name": "Arduino Gemma"} - ], - "toolsDependencies": [ - { - "packager": "arduino", - "name": "avr-gcc", - "version": "4.9.2-atmel3.5.3-arduino2" - }, - { - "packager": "arduino", - "name": "avrdude", - "version": "6.3.0-arduino6" - } - ] - }, - { - "name": "Arduino AVR Boards", - "architecture": "avr", - "version": "1.6.16", - "category": "Arduino", - "help": { - "online": "http://www.arduino.cc/en/Reference/HomePage" - }, - "url": "http://downloads.arduino.cc/cores/avr-1.6.16.tar.bz2", - "archiveFileName": "avr-1.6.16.tar.bz2", - "checksum": "SHA-256:2e2e7a7b8ec321b62c54237e8cb03384fc434f3692c47a524e23e61df868ed9a", - "size": "5011829", - "boards": [ - {"name": "Arduino Yún"}, - {"name": "Arduino/Genuino Uno"}, - {"name": "Arduino Uno WiFi"}, - {"name": "Arduino Diecimila"}, - {"name": "Arduino Nano"}, - {"name": "Arduino/Genuino Mega"}, - {"name": "Arduino MegaADK"}, - {"name": "Arduino Leonardo"}, - {"name": "Arduino Leonardo Ethernet"}, - {"name": "Arduino/Genuino Micro"}, - {"name": "Arduino Esplora"}, - {"name": "Arduino Mini"}, - {"name": "Arduino Ethernet"}, - {"name": "Arduino Fio"}, - {"name": "Arduino BT"}, - {"name": "Arduino LilyPadUSB"}, - {"name": "Arduino Lilypad"}, - {"name": "Arduino Pro"}, - {"name": "Arduino ATMegaNG"}, - {"name": "Arduino Robot Control"}, - {"name": "Arduino Robot Motor"}, - {"name": "Arduino Gemma"}, - {"name": "Adafruit Circuit Playground"}, - {"name": "Arduino Yún Mini"}, - {"name": "Arduino Industrial 101"}, - {"name": "Linino One"} - ], - "toolsDependencies": [ - { - "packager": "arduino", - "name": "avr-gcc", - "version": "4.9.2-atmel3.5.3-arduino2" - }, - { - "packager": "arduino", - "name": "avrdude", - "version": "6.3.0-arduino8" - }, - { - "packager": "arduino", - "name": "arduinoOTA", - "version": "1.0.0" - } - ] - }, - { - "name": "Arduino AVR Boards", - "architecture": "avr", - "version": "1.6.17", - "category": "Arduino", - "help": { - "online": "http://www.arduino.cc/en/Reference/HomePage" - }, - "url": "http://downloads.arduino.cc/cores/avr-1.6.17.tar.bz2", - "archiveFileName": "avr-1.6.17.tar.bz2", - "checksum": "SHA-256:ecf63bb02d8f647f720be64b4bf235e0ca37b3180b90d816cbff1886f6744833", - "size": "5011912", - "boards": [ - {"name": "Arduino Yún"}, - {"name": "Arduino/Genuino Uno"}, - {"name": "Arduino Uno WiFi"}, - {"name": "Arduino Diecimila"}, - {"name": "Arduino Nano"}, - {"name": "Arduino/Genuino Mega"}, - {"name": "Arduino MegaADK"}, - {"name": "Arduino Leonardo"}, - {"name": "Arduino Leonardo Ethernet"}, - {"name": "Arduino/Genuino Micro"}, - {"name": "Arduino Esplora"}, - {"name": "Arduino Mini"}, - {"name": "Arduino Ethernet"}, - {"name": "Arduino Fio"}, - {"name": "Arduino BT"}, - {"name": "Arduino LilyPadUSB"}, - {"name": "Arduino Lilypad"}, - {"name": "Arduino Pro"}, - {"name": "Arduino ATMegaNG"}, - {"name": "Arduino Robot Control"}, - {"name": "Arduino Robot Motor"}, - {"name": "Arduino Gemma"}, - {"name": "Adafruit Circuit Playground"}, - {"name": "Arduino Yún Mini"}, - {"name": "Arduino Industrial 101"}, - {"name": "Linino One"} - ], - "toolsDependencies": [ - { - "packager": "arduino", - "name": "avr-gcc", - "version": "4.9.2-atmel3.5.3-arduino2" - }, - { - "packager": "arduino", - "name": "avrdude", - "version": "6.3.0-arduino8" - }, - { - "packager": "arduino", - "name": "arduinoOTA", - "version": "1.0.0" - } - ] - }, - { - "name": "Arduino AVR Boards", - "architecture": "avr", - "version": "1.6.18", - "category": "Arduino", - "help": { - "online": "http://www.arduino.cc/en/Reference/HomePage" - }, - "url": "http://downloads.arduino.cc/cores/avr-1.6.18.tar.bz2", - "archiveFileName": "avr-1.6.18.tar.bz2", - "checksum": "SHA-256:7c56e381602b779e8e81ec46deb5c8b82e1c84c134c3c1b672d0b43f5e45ee13", - "size": "4897659", - "boards": [ - {"name": "Arduino Yún"}, - {"name": "Arduino/Genuino Uno"}, - {"name": "Arduino Uno WiFi"}, - {"name": "Arduino Diecimila"}, - {"name": "Arduino Nano"}, - {"name": "Arduino/Genuino Mega"}, - {"name": "Arduino MegaADK"}, - {"name": "Arduino Leonardo"}, - {"name": "Arduino Leonardo Ethernet"}, - {"name": "Arduino/Genuino Micro"}, - {"name": "Arduino Esplora"}, - {"name": "Arduino Mini"}, - {"name": "Arduino Ethernet"}, - {"name": "Arduino Fio"}, - {"name": "Arduino BT"}, - {"name": "Arduino LilyPadUSB"}, - {"name": "Arduino Lilypad"}, - {"name": "Arduino Pro"}, - {"name": "Arduino ATMegaNG"}, - {"name": "Arduino Robot Control"}, - {"name": "Arduino Robot Motor"}, - {"name": "Arduino Gemma"}, - {"name": "Adafruit Circuit Playground"}, - {"name": "Arduino Yún Mini"}, - {"name": "Arduino Industrial 101"}, - {"name": "Linino One"} - ], - "toolsDependencies": [ - { - "packager": "arduino", - "name": "avr-gcc", - "version": "4.9.2-atmel3.5.4-arduino2" - }, - { - "packager": "arduino", - "name": "avrdude", - "version": "6.3.0-arduino9" - }, - { - "packager": "arduino", - "name": "arduinoOTA", - "version": "1.1.1" - } - ] - }, - { - "name": "Arduino AVR Boards", - "architecture": "avr", - "version": "1.6.19", - "category": "Arduino", - "help": { - "online": "http://www.arduino.cc/en/Reference/HomePage" - }, - "url": "http://downloads.arduino.cc/cores/avr-1.6.19.tar.bz2", - "archiveFileName": "avr-1.6.19.tar.bz2", - "checksum": "SHA-256:1c544db39f36a8468f585d6338343718c2892526227fa04805339084dd0ab4ff", - "size": "4959420", - "boards": [ - {"name": "Arduino Yún"}, - {"name": "Arduino/Genuino Uno"}, - {"name": "Arduino Uno WiFi"}, - {"name": "Arduino Diecimila"}, - {"name": "Arduino Nano"}, - {"name": "Arduino/Genuino Mega"}, - {"name": "Arduino MegaADK"}, - {"name": "Arduino Leonardo"}, - {"name": "Arduino Leonardo Ethernet"}, - {"name": "Arduino/Genuino Micro"}, - {"name": "Arduino Esplora"}, - {"name": "Arduino Mini"}, - {"name": "Arduino Ethernet"}, - {"name": "Arduino Fio"}, - {"name": "Arduino BT"}, - {"name": "Arduino LilyPadUSB"}, - {"name": "Arduino Lilypad"}, - {"name": "Arduino Pro"}, - {"name": "Arduino ATMegaNG"}, - {"name": "Arduino Robot Control"}, - {"name": "Arduino Robot Motor"}, - {"name": "Arduino Gemma"}, - {"name": "Adafruit Circuit Playground"}, - {"name": "Arduino Yún Mini"}, - {"name": "Arduino Industrial 101"}, - {"name": "Linino One"} - ], - "toolsDependencies": [ - { - "packager": "arduino", - "name": "avr-gcc", - "version": "4.9.2-atmel3.5.4-arduino2" - }, - { - "packager": "arduino", - "name": "avrdude", - "version": "6.3.0-arduino9" - }, - { - "packager": "arduino", - "name": "arduinoOTA", - "version": "1.1.1" - } - ] - }, - { - "name": "Arduino AVR Boards", - "architecture": "avr", - "version": "1.6.20", - "category": "Arduino", - "help": { - "online": "http://www.arduino.cc/en/Reference/HomePage" - }, - "url": "http://downloads.arduino.cc/cores/avr-1.6.20.tar.bz2", - "archiveFileName": "avr-1.6.20.tar.bz2", - "checksum": "SHA-256:61f3d59a2ab2e9191230e91e79ee91c05f32b32c33129d34d76ef87e56d257e1", - "size": "4897949", - "boards": [ - {"name": "Arduino Yún"}, - {"name": "Arduino/Genuino Uno"}, - {"name": "Arduino Uno WiFi"}, - {"name": "Arduino Diecimila"}, - {"name": "Arduino Nano"}, - {"name": "Arduino/Genuino Mega"}, - {"name": "Arduino MegaADK"}, - {"name": "Arduino Leonardo"}, - {"name": "Arduino Leonardo Ethernet"}, - {"name": "Arduino/Genuino Micro"}, - {"name": "Arduino Esplora"}, - {"name": "Arduino Mini"}, - {"name": "Arduino Ethernet"}, - {"name": "Arduino Fio"}, - {"name": "Arduino BT"}, - {"name": "Arduino LilyPadUSB"}, - {"name": "Arduino Lilypad"}, - {"name": "Arduino Pro"}, - {"name": "Arduino ATMegaNG"}, - {"name": "Arduino Robot Control"}, - {"name": "Arduino Robot Motor"}, - {"name": "Arduino Gemma"}, - {"name": "Adafruit Circuit Playground"}, - {"name": "Arduino Yún Mini"}, - {"name": "Arduino Industrial 101"}, - {"name": "Linino One"} - ], - "toolsDependencies": [ - { - "packager": "arduino", - "name": "avr-gcc", - "version": "4.9.2-atmel3.5.4-arduino2" - }, - { - "packager": "arduino", - "name": "avrdude", - "version": "6.3.0-arduino9" - }, - { - "packager": "arduino", - "name": "arduinoOTA", - "version": "1.1.1" - } - ] - }, - { - "name": "Arduino AVR Boards", - "architecture": "avr", - "version": "1.6.21", - "category": "Arduino", - "help": { - "online": "http://www.arduino.cc/en/Reference/HomePage" - }, - "url": "http://downloads.arduino.cc/cores/avr-1.6.21.tar.bz2", - "archiveFileName": "avr-1.6.21.tar.bz2", - "checksum": "SHA-256:7e5440b0902733f82956c89e554106f25c2ad540ac36286ccba3ceac785bcbba", - "size": "4897460", - "boards": [ - {"name": "Arduino Yún"}, - {"name": "Arduino/Genuino Uno"}, - {"name": "Arduino Uno WiFi"}, - {"name": "Arduino Diecimila"}, - {"name": "Arduino Nano"}, - {"name": "Arduino/Genuino Mega"}, - {"name": "Arduino MegaADK"}, - {"name": "Arduino Leonardo"}, - {"name": "Arduino Leonardo Ethernet"}, - {"name": "Arduino/Genuino Micro"}, - {"name": "Arduino Esplora"}, - {"name": "Arduino Mini"}, - {"name": "Arduino Ethernet"}, - {"name": "Arduino Fio"}, - {"name": "Arduino BT"}, - {"name": "Arduino LilyPadUSB"}, - {"name": "Arduino Lilypad"}, - {"name": "Arduino Pro"}, - {"name": "Arduino ATMegaNG"}, - {"name": "Arduino Robot Control"}, - {"name": "Arduino Robot Motor"}, - {"name": "Arduino Gemma"}, - {"name": "Adafruit Circuit Playground"}, - {"name": "Arduino Yún Mini"}, - {"name": "Arduino Industrial 101"}, - {"name": "Linino One"} - ], - "toolsDependencies": [ - { - "packager": "arduino", - "name": "avr-gcc", - "version": "4.9.2-atmel3.5.4-arduino2" - }, - { - "packager": "arduino", - "name": "avrdude", - "version": "6.3.0-arduino9" - }, - { - "packager": "arduino", - "name": "arduinoOTA", - "version": "1.1.1" - } - ] - }, - { - "name": "Arduino AVR Boards", - "architecture": "avr", - "version": "1.6.22", - "category": "Arduino", - "help": { - "online": "http://www.arduino.cc/en/Reference/HomePage" - }, - "url": "http://downloads.arduino.cc/cores/avr-1.6.22.tar.bz2", - "archiveFileName": "avr-1.6.22.tar.bz2", - "checksum": "SHA-256:e6399b2a687dd8485cbbfcbfbbd4f8e2e15fe535bbcfd1d81bf93d01e31f7d76", - "size": "4907422", - "boards": [ - {"name": "Arduino Yún"}, - {"name": "Arduino/Genuino Uno"}, - {"name": "Arduino Uno WiFi"}, - {"name": "Arduino Diecimila"}, - {"name": "Arduino Nano"}, - {"name": "Arduino/Genuino Mega"}, - {"name": "Arduino MegaADK"}, - {"name": "Arduino Leonardo"}, - {"name": "Arduino Leonardo Ethernet"}, - {"name": "Arduino/Genuino Micro"}, - {"name": "Arduino Esplora"}, - {"name": "Arduino Mini"}, - {"name": "Arduino Ethernet"}, - {"name": "Arduino Fio"}, - {"name": "Arduino BT"}, - {"name": "Arduino LilyPadUSB"}, - {"name": "Arduino Lilypad"}, - {"name": "Arduino Pro"}, - {"name": "Arduino ATMegaNG"}, - {"name": "Arduino Robot Control"}, - {"name": "Arduino Robot Motor"}, - {"name": "Arduino Gemma"}, - {"name": "Adafruit Circuit Playground"}, - {"name": "Arduino Yún Mini"}, - {"name": "Arduino Industrial 101"}, - {"name": "Linino One"} - ], - "toolsDependencies": [ - { - "packager": "arduino", - "name": "avr-gcc", - "version": "5.4.0-atmel3.6.1-arduino2" - }, - { - "packager": "arduino", - "name": "avrdude", - "version": "6.3.0-arduino14" - }, - { - "packager": "arduino", - "name": "arduinoOTA", - "version": "1.2.1" - } - ] - }, - { - "name": "Arduino AVR Boards", - "architecture": "avr", - "version": "1.6.23", - "category": "Arduino", - "help": { - "online": "http://www.arduino.cc/en/Reference/HomePage" - }, - "url": "http://downloads.arduino.cc/cores/avr-1.6.23.tar.bz2", - "archiveFileName": "avr-1.6.23.tar.bz2", - "checksum": "SHA-256:18618d7f256f26cd77c35f4c888d5d1b2334f07925094fdc99ac3188722284aa", - "size": "5001988", - "boards": [ - {"name": "Arduino Yún"}, - {"name": "Arduino/Genuino Uno"}, - {"name": "Arduino Uno WiFi"}, - {"name": "Arduino Diecimila"}, - {"name": "Arduino Nano"}, - {"name": "Arduino/Genuino Mega"}, - {"name": "Arduino MegaADK"}, - {"name": "Arduino Leonardo"}, - {"name": "Arduino Leonardo Ethernet"}, - {"name": "Arduino/Genuino Micro"}, - {"name": "Arduino Esplora"}, - {"name": "Arduino Mini"}, - {"name": "Arduino Ethernet"}, - {"name": "Arduino Fio"}, - {"name": "Arduino BT"}, - {"name": "Arduino LilyPadUSB"}, - {"name": "Arduino Lilypad"}, - {"name": "Arduino Pro"}, - {"name": "Arduino ATMegaNG"}, - {"name": "Arduino Robot Control"}, - {"name": "Arduino Robot Motor"}, - {"name": "Arduino Gemma"}, - {"name": "Adafruit Circuit Playground"}, - {"name": "Arduino Yún Mini"}, - {"name": "Arduino Industrial 101"}, - {"name": "Linino One"} - ], - "toolsDependencies": [ - { - "packager": "arduino", - "name": "avr-gcc", - "version": "5.4.0-atmel3.6.1-arduino2" - }, - { - "packager": "arduino", - "name": "avrdude", - "version": "6.3.0-arduino14" - }, - { - "packager": "arduino", - "name": "arduinoOTA", - "version": "1.2.1" - } - ] - }, - { - "name": "Arduino megaAVR Boards", - "architecture": "megaavr", - "version": "1.6.23", - "category": "Arduino", - "help": { - "online": "http://www.arduino.cc/en/Reference/HomePage" - }, - "url": "http://downloads.arduino.cc/cores/megaavr-1.6.23.tar.bz2", - "archiveFileName": "megaavr-1.6.23.tar.bz2", - "checksum": "SHA-256:fd19ed3a52f6de289f46c9b5f65e19bc5c3df95358f18693cfaf25bdfb86f43c", - "size": "717681", - "boards": [ - { - "name": "Arduino Uno WiFi Rev2" - } - ], - "toolsDependencies": [ - { - "packager": "arduino", - "name": "avr-gcc", - "version": "5.4.0-atmel3.6.1-arduino2" - }, - { - "packager": "arduino", - "name": "avrdude", - "version": "6.3.0-arduino14" - }, - { - "packager": "arduino", - "name": "arduinoOTA", - "version": "1.2.1" - } - ] - }, - { - "name": "Arduino megaAVR Boards", - "architecture": "megaavr", - "version": "1.6.24", - "category": "Arduino", - "help": { - "online": "http://www.arduino.cc/en/Reference/HomePage" - }, - "url": "http://downloads.arduino.cc/cores/megaavr-1.6.24.tar.bz2", - "archiveFileName": "megaavr-1.6.24.tar.bz2", - "checksum": "SHA-256:0910af1d6eb44b65fee77c81a7a83ee420e6a7c1622f90754e91a5127d317a1d", - "size": "709516", - "boards": [ - { - "name": "Arduino Uno WiFi Rev2" - } - ], - "toolsDependencies": [ - { - "packager": "arduino", - "name": "avr-gcc", - "version": "5.4.0-atmel3.6.1-arduino2" - }, - { - "packager": "arduino", - "name": "avrdude", - "version": "6.3.0-arduino14" - }, - { - "packager": "arduino", - "name": "arduinoOTA", - "version": "1.2.1" - } - ] - }, - { - "name": "Arduino SAM Boards (32-bits ARM Cortex-M3)", - "architecture": "sam", - "version": "1.6.2", - "category": "Arduino", - "url": "http://downloads.arduino.cc/cores/sam-1.6.2.tar.bz2", - "archiveFileName": "sam-1.6.2.tar.bz2", - "checksum": "SHA-256:2d3c8a90bc214947cff1b816d0c2706441398efc78af7984d5250f2e50eddd5f", - "size": "16174730", - "boards": [ - {"name": "Arduino Due"} - ], - "toolsDependencies": [ - { - "packager": "arduino", - "name": "arm-none-eabi-gcc", - "version": "4.8.3-2014q1" - }, - { - "packager": "arduino", - "name": "bossac", - "version": "1.3-arduino" - } - ] - }, - { - "name": "Arduino SAM Boards (32-bits ARM Cortex-M3)", - "architecture": "sam", - "version": "1.6.3", - "category": "Arduino", - "url": "http://downloads.arduino.cc/cores/sam-1.6.3.tar.bz2", - "archiveFileName": "sam-1.6.3.tar.bz2", - "checksum": "SHA-256:0a6e1d5542790e38ba454c796aabbd0e48b07635a5b4d8adc044a4eba959ca27", - "size": "16174017", - "boards": [ - {"name": "Arduino Due"} - ], - "toolsDependencies": [ - { - "packager": "arduino", - "name": "arm-none-eabi-gcc", - "version": "4.8.3-2014q1" - }, - { - "packager": "arduino", - "name": "bossac", - "version": "1.3-arduino" - } - ] - }, - { - "name": "Arduino SAM Boards (32-bits ARM Cortex-M3)", - "architecture": "sam", - "version": "1.6.4", - "category": "Arduino", - "url": "http://downloads.arduino.cc/cores/sam-1.6.4.tar.bz2", - "archiveFileName": "sam-1.6.4.tar.bz2", - "checksum": "SHA-256:e0dc94d8ad0756b79838e99ad7409b08b07e40ed667ebe86eae11644ef7bec0d", - "size": "16174992", - "boards": [ - {"name": "Arduino Due"} - ], - "toolsDependencies": [ - { - "packager": "arduino", - "name": "arm-none-eabi-gcc", - "version": "4.8.3-2014q1" - }, - { - "packager": "arduino", - "name": "bossac", - "version": "1.3-arduino" - } - ] - }, - { - "name": "Arduino SAM Boards (32-bits ARM Cortex-M3)", - "architecture": "sam", - "version": "1.6.5", - "category": "Arduino", - "url": "http://downloads.arduino.cc/cores/sam-1.6.5.tar.bz2", - "archiveFileName": "sam-1.6.5.tar.bz2", - "checksum": "SHA-256:1bde19e3af3887dbc3afda46754e1136fb5a3bc535b8de9862ad7753d93902b7", - "size": "16529130", - "boards": [ - {"name": "Arduino Due"} - ], - "toolsDependencies": [ - { - "packager": "arduino", - "name": "arm-none-eabi-gcc", - "version": "4.8.3-2014q1" - }, - { - "packager": "arduino", - "name": "bossac", - "version": "1.6.1-arduino" - } - ] - }, - { - "name": "Arduino SAM Boards (32-bits ARM Cortex-M3)", - "architecture": "sam", - "version": "1.6.6", - "category": "Arduino", - "url": "http://downloads.arduino.cc/cores/sam-1.6.6.tar.bz2", - "archiveFileName": "sam-1.6.6.tar.bz2", - "checksum": "SHA-256:7694b698bb24cd87d7d0b2b4caa09dc6039591868e735b0bf385299aea24c3e4", - "size": "16528101", - "boards": [ - {"name": "Arduino Due"} - ], - "toolsDependencies": [ - { - "packager": "arduino", - "name": "arm-none-eabi-gcc", - "version": "4.8.3-2014q1" - }, - { - "packager": "arduino", - "name": "bossac", - "version": "1.6.1-arduino" - } - ] - }, - { - "name": "Arduino SAM Boards (32-bits ARM Cortex-M3)", - "architecture": "sam", - "version": "1.6.7", - "category": "Arduino", - "url": "http://downloads.arduino.cc/cores/sam-1.6.7.tar.bz2", - "archiveFileName": "sam-1.6.7.tar.bz2", - "checksum": "SHA-256:62d8bde9bf92502aeeaaf5031ed841e4e4c241fe66fc8cb23625349e6129a1ea", - "size": "16473479", - "boards": [ - {"name": "Arduino Due"} - ], - "toolsDependencies": [ - { - "packager": "arduino", - "name": "arm-none-eabi-gcc", - "version": "4.8.3-2014q1" - }, - { - "packager": "arduino", - "name": "bossac", - "version": "1.6.1-arduino" - } - ] - }, - { - "name": "Arduino SAM Boards (32-bits ARM Cortex-M3)", - "architecture": "sam", - "version": "1.6.8", - "category": "Arduino", - "url": "http://downloads.arduino.cc/cores/sam-1.6.8.tar.bz2", - "archiveFileName": "sam-1.6.8.tar.bz2", - "checksum": "SHA-256:cc95b49b7dfe4138687a559d963db09b9b85352051173d93ad8c272aa23c2337", - "size": "16471779", - "boards": [ - {"name": "Arduino Due"} - ], - "toolsDependencies": [ - { - "packager": "arduino", - "name": "arm-none-eabi-gcc", - "version": "4.8.3-2014q1" - }, - { - "packager": "arduino", - "name": "bossac", - "version": "1.6.1-arduino" - } - ] - }, - { - "name": "Arduino SAM Boards (32-bits ARM Cortex-M3)", - "architecture": "sam", - "version": "1.6.9", - "category": "Arduino", - "url": "http://downloads.arduino.cc/cores/sam-1.6.9.tar.bz2", - "archiveFileName": "sam-1.6.9.tar.bz2", - "checksum": "SHA-256:a5eaf60b5845599c24229456d6f5cd2254a275c8b34cac9d5330e4cfab6b0aa7", - "size": "16473503", - "boards": [ - {"name": "Arduino Due"} - ], - "toolsDependencies": [ - { - "packager": "arduino", - "name": "arm-none-eabi-gcc", - "version": "4.8.3-2014q1" - }, - { - "packager": "arduino", - "name": "bossac", - "version": "1.6.1-arduino" - } - ] - }, - { - "name": "Arduino SAM Boards (32-bits ARM Cortex-M3)", - "architecture": "sam", - "version": "1.6.10", - "category": "Arduino", - "url": "http://downloads.arduino.cc/cores/sam-1.6.10.tar.bz2", - "archiveFileName": "sam-1.6.10.tar.bz2", - "checksum": "SHA-256:c53afc342c4017a4f67b96826ace41653f795f4a82e648eb9a190ad995388906", - "size": "16474738", - "boards": [ - {"name": "Arduino Due"} - ], - "toolsDependencies": [ - { - "packager": "arduino", - "name": "arm-none-eabi-gcc", - "version": "4.8.3-2014q1" - }, - { - "packager": "arduino", - "name": "bossac", - "version": "1.6.1-arduino" - } - ] - }, - { - "name": "Arduino SAMD Boards (32-bits ARM Cortex-M0+)", - "architecture": "samd", - "version": "1.6.0", - "category": "Arduino", - "url": "http://downloads.arduino.cc/cores/samd-1.6.0.tar.bz2", - "archiveFileName": "samd-1.6.0.tar.bz2", - "checksum": "SHA-256:c1d5118ea1bf03c71203de4eafa90dedf265ceb44c0e3712f5a1eba1b12321b0", - "size": "177135", - "boards": [ - { - "name": "Arduino Zero" - } - ], - "toolsDependencies": [ - { - "packager": "arduino", - "name": "arm-none-eabi-gcc", - "version": "4.8.3-2014q1" - }, - { - "packager": "arduino", - "name": "bossac", - "version": "1.5-arduino" - }, - { - "packager": "arduino", - "name": "openocd", - "version": "0.9.0-arduino" - }, - { - "packager": "arduino", - "name": "CMSIS", - "version": "4.0.0-atmel" - } - ] - }, - { - "name": "Arduino SAM Boards (32-bits ARM Cortex-M3)", - "architecture": "sam", - "version": "1.6.11", - "category": "Arduino", - "url": "http://downloads.arduino.cc/cores/sam-1.6.11.tar.bz2", - "archiveFileName": "sam-1.6.11.tar.bz2", - "checksum": "SHA-256:fb8e275f39622a5574a11cef85be3ed36a6995c38a19b20de6fb48e9c7f88b70", - "size": "16474757", - "boards": [ - {"name": "Arduino Due"} - ], - "toolsDependencies": [ - { - "packager": "arduino", - "name": "arm-none-eabi-gcc", - "version": "4.8.3-2014q1" - }, - { - "packager": "arduino", - "name": "bossac", - "version": "1.6.1-arduino" - } - ] - }, - { - "name": "Arduino SAMD Boards (32-bits ARM Cortex-M0+)", - "architecture": "samd", - "version": "1.6.0", - "category": "Arduino", - "url": "http://downloads.arduino.cc/cores/samd-1.6.0.tar.bz2", - "archiveFileName": "samd-1.6.0.tar.bz2", - "checksum": "SHA-256:c1d5118ea1bf03c71203de4eafa90dedf265ceb44c0e3712f5a1eba1b12321b0", - "size": "177135", - "boards": [ - { - "name": "Arduino Zero" - } - ], - "toolsDependencies": [ - { - "packager": "arduino", - "name": "arm-none-eabi-gcc", - "version": "4.8.3-2014q1" - }, - { - "packager": "arduino", - "name": "bossac", - "version": "1.5-arduino" - }, - { - "packager": "arduino", - "name": "openocd", - "version": "0.9.0-arduino" - }, - { - "packager": "arduino", - "name": "CMSIS", - "version": "4.0.0-atmel" - } - ] - }, - { - "name": "Arduino SAMD Boards (32-bits ARM Cortex-M0+)", - "architecture": "samd", - "version": "1.6.1", - "category": "Arduino", - "url": "http://downloads.arduino.cc/cores/samd-1.6.1.tar.bz2", - "archiveFileName": "samd-1.6.1.tar.bz2", - "checksum": "SHA-256:dddd0f906a7c470a1dc7ef5b024e34c24b915020fabb5903b7313246955514a2", - "size": "178354", - "boards": [ - { - "name": "Arduino Zero" - } - ], - "toolsDependencies": [ - { - "packager": "arduino", - "name": "arm-none-eabi-gcc", - "version": "4.8.3-2014q1" - }, - { - "packager": "arduino", - "name": "bossac", - "version": "1.6-arduino" - }, - { - "packager": "arduino", - "name": "openocd", - "version": "0.9.0-arduino" - }, - { - "packager": "arduino", - "name": "CMSIS", - "version": "4.0.0-atmel" - } - ] - }, - { - "name": "Arduino SAMD Boards (32-bits ARM Cortex-M0+)", - "architecture": "samd", - "version": "1.6.2", - "category": "Arduino", - "url": "http://downloads.arduino.cc/cores/samd-1.6.2.tar.bz2", - "archiveFileName": "samd-1.6.2.tar.bz2", - "checksum": "SHA-256:fad804d8fbd2f2b5f0e876708f953b9afd28513d794c6a973825582f1d6bacde", - "size": "179578", - "boards": [ - { - "name": "Arduino/Genuino Zero" - } - ], - "toolsDependencies": [ - { - "packager": "arduino", - "name": "arm-none-eabi-gcc", - "version": "4.8.3-2014q1" - }, - { - "packager": "arduino", - "name": "bossac", - "version": "1.6.1-arduino" - }, - { - "packager": "arduino", - "name": "openocd", - "version": "0.9.0-arduino" - }, - { - "packager": "arduino", - "name": "CMSIS", - "version": "4.0.0-atmel" - } - ] - }, - { - "name": "Arduino SAMD Boards (32-bits ARM Cortex-M0+)", - "architecture": "samd", - "version": "1.6.3", - "category": "Arduino", - "url": "http://downloads.arduino.cc/cores/samd-1.6.3.tar.bz2", - "archiveFileName": "samd-1.6.3.tar.bz2", - "checksum": "SHA-256:f3fb17d593cdf5986c201fe3639d71cc1149b43e996a3afa5533c3b4b0c5a532", - "size": "978163", - "boards": [ - { "name": "Arduino/Genuino Zero" }, - { "name": "Arduino/Genuino MKR1000" } - ], - "toolsDependencies": [ - { - "packager": "arduino", - "name": "arm-none-eabi-gcc", - "version": "4.8.3-2014q1" - }, - { - "packager": "arduino", - "name": "bossac", - "version": "1.6.1-arduino" - }, - { - "packager": "arduino", - "name": "openocd", - "version": "0.9.0-arduino" - }, - { - "packager": "arduino", - "name": "CMSIS", - "version": "4.0.0-atmel" - } - ] - }, - { - "name": "Arduino SAMD Boards (32-bits ARM Cortex-M0+)", - "architecture": "samd", - "version": "1.6.4", - "category": "Arduino", - "url": "http://downloads.arduino.cc/cores/samd-1.6.4.tar.bz2", - "archiveFileName": "samd-1.6.4.tar.bz2", - "checksum": "SHA-256:02c788e0ae786cabf31c5c27b64d60906d4038f56ee2df689022e32525be7b70", - "size": "977481", - "boards": [ - { "name": "Arduino/Genuino Zero" } - ], - "toolsDependencies": [ - { - "packager": "arduino", - "name": "arm-none-eabi-gcc", - "version": "4.8.3-2014q1" - }, - { - "packager": "arduino", - "name": "bossac", - "version": "1.6.1-arduino" - }, - { - "packager": "arduino", - "name": "openocd", - "version": "0.9.0-arduino" - }, - { - "packager": "arduino", - "name": "CMSIS", - "version": "4.0.0-atmel" - } - ] - }, - { - "name": "Arduino SAMD Boards (32-bits ARM Cortex-M0+)", - "architecture": "samd", - "version": "1.6.5", - "category": "Arduino", - "url": "http://downloads.arduino.cc/cores/samd-1.6.5.tar.bz2", - "archiveFileName": "samd-1.6.5.tar.bz2", - "checksum": "SHA-256:3f3d70b4081b11ab07fc209702604f2ac3a52bb193b7f0d9fa5bb31071b2b34c", - "size": "979548", - "boards": [ - { "name": "Arduino/Genuino Zero" }, - { "name": "Arduino/Genuino MKR1000" } - ], - "toolsDependencies": [ - { - "packager": "arduino", - "name": "arm-none-eabi-gcc", - "version": "4.8.3-2014q1" - }, - { - "packager": "arduino", - "name": "bossac", - "version": "1.6.1-arduino" - }, - { - "packager": "arduino", - "name": "openocd", - "version": "0.9.0-arduino" - }, - { - "packager": "arduino", - "name": "CMSIS", - "version": "4.0.0-atmel" - } - ] - }, - { - "name": "Arduino SAMD Boards (32-bits ARM Cortex-M0+)", - "architecture": "samd", - "version": "1.6.6", - "category": "Arduino", - "url": "http://downloads.arduino.cc/cores/samd-1.6.6.tar.bz2", - "archiveFileName": "samd-1.6.6.tar.bz2", - "checksum": "SHA-256:08e97127acf41ac28c195803be1d22a5cbf720d4cff58db9458af9255d6ee7b3", - "size": "997331", - "boards": [ - { "name": "Arduino/Genuino Zero" }, - { "name": "Arduino/Genuino MKR1000" } - ], - "toolsDependencies": [ - { - "packager": "arduino", - "name": "arm-none-eabi-gcc", - "version": "4.8.3-2014q1" - }, - { - "packager": "arduino", - "name": "bossac", - "version": "1.6.1-arduino" - }, - { - "packager": "arduino", - "name": "openocd", - "version": "0.9.0-arduino" - }, - { - "packager": "arduino", - "name": "CMSIS", - "version": "4.0.0-atmel" - } - ] - }, - { - "name": "Arduino SAMD Boards (32-bits ARM Cortex-M0+)", - "architecture": "samd", - "version": "1.6.7", - "category": "Arduino", - "url": "http://downloads.arduino.cc/cores/samd-1.6.7.tar.bz2", - "archiveFileName": "samd-1.6.7.tar.bz2", - "checksum": "SHA-256:7342d0d127b1facdfbe8801759368bb0e6939b8e9a7db86eefb23135e3c701a8", - "size": "841503", - "boards": [ - { "name": "Arduino/Genuino Zero" }, - { "name": "Arduino/Genuino MKR1000" } - ], - "toolsDependencies": [ - { - "packager": "arduino", - "name": "arm-none-eabi-gcc", - "version": "4.8.3-2014q1" - }, - { - "packager": "arduino", - "name": "bossac", - "version": "1.7.0" - }, - { - "packager": "arduino", - "name": "openocd", - "version": "0.9.0-arduino" - }, - { - "packager": "arduino", - "name": "CMSIS", - "version": "4.0.0-atmel" - } - ] - }, - { - "name": "Arduino SAMD Boards (32-bits ARM Cortex-M0+)", - "architecture": "samd", - "version": "1.6.8", - "category": "Arduino", - "url": "http://downloads.arduino.cc/cores/samd-1.6.8.tar.bz2", - "archiveFileName": "samd-1.6.8.tar.bz2", - "checksum": "SHA-256:05bff70561e5f10e86d1d890f647614aac989c4b2c384fc1b568e7d8c96b8267", - "size": "841801", - "boards": [ - { "name": "Arduino/Genuino Zero" }, - { "name": "Arduino/Genuino MKR1000" } - ], - "toolsDependencies": [ - { - "packager": "arduino", - "name": "arm-none-eabi-gcc", - "version": "4.8.3-2014q1" - }, - { - "packager": "arduino", - "name": "bossac", - "version": "1.7.0" - }, - { - "packager": "arduino", - "name": "openocd", - "version": "0.9.0-arduino" - }, - { - "packager": "arduino", - "name": "CMSIS", - "version": "4.0.0-atmel" - } - ] - }, - { - "name": "Arduino SAMD Boards (32-bits ARM Cortex-M0+)", - "architecture": "samd", - "version": "1.6.9", - "category": "Arduino", - "url": "http://downloads.arduino.cc/cores/samd-1.6.9.tar.bz2", - "archiveFileName": "samd-1.6.9.tar.bz2", - "checksum": "SHA-256:404f64575182e3a21fbf38a729d56d50782754c1d0c5bfe17d4c9155dd84d3d2", - "size": "855221", - "boards": [ - { "name": "Arduino/Genuino Zero" }, - { "name": "Arduino/Genuino MKR1000" }, - { "name": "Arduino MKRZero" } - ], - "toolsDependencies": [ - { - "packager": "arduino", - "name": "arm-none-eabi-gcc", - "version": "4.8.3-2014q1" - }, - { - "packager": "arduino", - "name": "bossac", - "version": "1.7.0" - }, - { - "packager": "arduino", - "name": "openocd", - "version": "0.9.0-arduino" - }, - { - "packager": "arduino", - "name": "CMSIS", - "version": "4.5.0" - }, - { - "packager": "arduino", - "name": "CMSIS-Atmel", - "version": "1.0.0" - } - ] - }, - { - "name": "Arduino SAMD Boards (32-bits ARM Cortex-M0+)", - "architecture": "samd", - "version": "1.6.10", - "category": "Arduino", - "url": "http://downloads.arduino.cc/cores/samd-1.6.10.tar.bz2", - "archiveFileName": "samd-1.6.10.tar.bz2", - "checksum": "SHA-256:b2b47e12ae032e7929d33b13b42033fca15de7ef0d5ea90dab68ebf65e6b4f6b", - "size": "2765368", - "boards": [ - { "name": "Arduino/Genuino Zero" }, - { "name": "Arduino/Genuino MKR1000" }, - { "name": "Arduino MKRZero" }, - { "name": "Arduino M0" }, - { "name": "Arduino M0 Pro" }, - { "name": "Arduino Tian" }, - { "name": "Adafruit Circuit Playground Express" } - ], - "toolsDependencies": [ - { - "packager": "arduino", - "name": "arm-none-eabi-gcc", - "version": "4.8.3-2014q1" - }, - { - "packager": "arduino", - "name": "bossac", - "version": "1.7.0" - }, - { - "packager": "arduino", - "name": "openocd", - "version": "0.9.0-arduino" - }, - { - "packager": "arduino", - "name": "avrdude", - "version": "6.3.0-arduino8" - }, - { - "packager": "arduino", - "name": "CMSIS", - "version": "4.5.0" - }, - { - "packager": "arduino", - "name": "CMSIS-Atmel", - "version": "1.0.0" - } - ] - }, - { - "name": "Arduino SAMD Boards (32-bits ARM Cortex-M0+)", - "architecture": "samd", - "version": "1.6.11", - "category": "Arduino", - "url": "http://downloads.arduino.cc/cores/samd-1.6.11.tar.bz2", - "archiveFileName": "samd-1.6.11.tar.bz2", - "checksum": "SHA-256:3ace3a7850e9052f51b819dbf5c09ea487f8bbbdf3c28d5d4709137b18f12bb7", - "size": "2764312", - "boards": [ - { "name": "Arduino/Genuino Zero" }, - { "name": "Arduino/Genuino MKR1000" }, - { "name": "Arduino MKRZero" }, - { "name": "Arduino M0" }, - { "name": "Arduino M0 Pro" }, - { "name": "Adafruit Circuit Playground Express" } - ], - "toolsDependencies": [ - { - "packager": "arduino", - "name": "arm-none-eabi-gcc", - "version": "4.8.3-2014q1" - }, - { - "packager": "arduino", - "name": "bossac", - "version": "1.7.0" - }, - { - "packager": "arduino", - "name": "openocd", - "version": "0.9.0-arduino" - }, - { - "packager": "arduino", - "name": "avrdude", - "version": "6.3.0-arduino8" - }, - { - "packager": "arduino", - "name": "CMSIS", - "version": "4.5.0" - }, - { - "packager": "arduino", - "name": "CMSIS-Atmel", - "version": "1.0.0" - } - ] - }, - { - "name": "Arduino SAMD Boards (32-bits ARM Cortex-M0+)", - "architecture": "samd", - "version": "1.6.12", - "category": "Arduino", - "url": "http://downloads.arduino.cc/cores/samd-1.6.12.tar.bz2", - "archiveFileName": "samd-1.6.12.tar.bz2", - "checksum": "SHA-256:18803709c1024c2fb122430949df06ee316d7971552ef81c430cba14be673f24", - "size": "2754767", - "boards": [ - { "name": "Arduino/Genuino Zero" }, - { "name": "Arduino/Genuino MKR1000" }, - { "name": "Arduino MKRZero" }, - { "name": "Arduino M0 Pro" }, - { "name": "Arduino M0" }, - { "name": "Arduino Tian" }, - { "name": "Adafruti Circuit Playground Express" } - ], - "toolsDependencies": [ - { - "packager": "arduino", - "name": "arm-none-eabi-gcc", - "version": "4.8.3-2014q1" - }, - { - "packager": "arduino", - "name": "bossac", - "version": "1.7.0" - }, - { - "packager": "arduino", - "name": "openocd", - "version": "0.9.0-arduino5-static" - }, - { - "packager": "arduino", - "name": "CMSIS", - "version": "4.5.0" - }, - { - "packager": "arduino", - "name": "CMSIS-Atmel", - "version": "1.1.0" - } - ] - }, - { - "name": "Arduino SAMD Boards (32-bits ARM Cortex-M0+)", - "architecture": "samd", - "version": "1.6.13", - "category": "Arduino", - "url": "http://downloads.arduino.cc/cores/samd-1.6.13.tar.bz2", - "archiveFileName": "samd-1.6.13.tar.bz2", - "checksum": "SHA-256:217f4e0f3c5f2c1a0d74d1b78559aa6f598aeae33ad7fd06ec79eb7294552db2", - "size": "2777384", - "boards": [ - { "name": "Arduino/Genuino Zero" }, - { "name": "Arduino/Genuino MKR1000" }, - { "name": "Arduino MKRZero" }, - { "name": "Arduino MKRFox1200" }, - { "name": "Arduino M0 Pro" }, - { "name": "Arduino M0" }, - { "name": "Arduino Tian" }, - { "name": "Adafruit Circuit Playground Express" } - ], - "toolsDependencies": [ - { - "packager": "arduino", - "name": "arm-none-eabi-gcc", - "version": "4.8.3-2014q1" - }, - { - "packager": "arduino", - "name": "bossac", - "version": "1.7.0" - }, - { - "packager": "arduino", - "name": "openocd", - "version": "0.9.0-arduino6-static" - }, - { - "packager": "arduino", - "name": "CMSIS", - "version": "4.5.0" - }, - { - "packager": "arduino", - "name": "CMSIS-Atmel", - "version": "1.1.0" - }, - { - "packager": "arduino", - "name": "arduinoOTA", - "version": "1.2.0" - } - ] - }, - { - "name": "Arduino SAMD Boards (32-bits ARM Cortex-M0+)", - "architecture": "samd", - "version": "1.6.14", - "category": "Arduino", - "url": "http://downloads.arduino.cc/cores/samd-1.6.14.tar.bz2", - "archiveFileName": "samd-1.6.14.tar.bz2", - "checksum": "SHA-256:bb5f9c69530906cba51641a94e3e195deafafe9d6673c90eda544535f02bb7bf", - "size": "2746416", - "boards": [ - { "name": "Arduino/Genuino Zero" }, - { "name": "Arduino/Genuino MKR1000" }, - { "name": "Arduino MKRZero" }, - { "name": "Arduino MKRFox1200" }, - { "name": "Arduino M0 Pro" }, - { "name": "Arduino M0" }, - { "name": "Arduino Tian" }, - { "name": "Adafruit Circuit Playground Express" } - ], - "toolsDependencies": [ - { - "packager": "arduino", - "name": "arm-none-eabi-gcc", - "version": "4.8.3-2014q1" - }, - { - "packager": "arduino", - "name": "bossac", - "version": "1.7.0" - }, - { - "packager": "arduino", - "name": "openocd", - "version": "0.9.0-arduino6-static" - }, - { - "packager": "arduino", - "name": "CMSIS", - "version": "4.5.0" - }, - { - "packager": "arduino", - "name": "CMSIS-Atmel", - "version": "1.1.0" - }, - { - "packager": "arduino", - "name": "arduinoOTA", - "version": "1.2.0" - } - ] - }, - { - "name": "Arduino SAMD Boards (32-bits ARM Cortex-M0+)", - "architecture": "samd", - "version": "1.6.15", - "category": "Arduino", - "url": "http://downloads.arduino.cc/cores/samd-1.6.15.tar.bz2", - "archiveFileName": "samd-1.6.15.tar.bz2", - "checksum": "SHA-256:938b0528dddb66ebb3564dc0b6d01206498d2a1abea90a269ce59ee9dae2753d", - "size": "2795099", - "boards": [ - { "name": "Arduino/Genuino Zero" }, - { "name": "Arduino/Genuino MKR1000" }, - { "name": "Arduino MKRZero" }, - { "name": "Arduino MKRFox1200" }, - { "name": "Arduino M0 Pro" }, - { "name": "Arduino M0" }, - { "name": "Arduino Tian" }, - { "name": "Adafruit Circuit Playground Express" } - ], - "toolsDependencies": [ - { - "packager": "arduino", - "name": "arm-none-eabi-gcc", - "version": "4.8.3-2014q1" - }, - { - "packager": "arduino", - "name": "bossac", - "version": "1.7.0" - }, - { - "packager": "arduino", - "name": "openocd", - "version": "0.9.0-arduino6-static" - }, - { - "packager": "arduino", - "name": "CMSIS", - "version": "4.5.0" - }, - { - "packager": "arduino", - "name": "CMSIS-Atmel", - "version": "1.1.0" - }, - { - "packager": "arduino", - "name": "arduinoOTA", - "version": "1.2.0" - } - ] - }, - { - "name": "Arduino SAMD Boards (32-bits ARM Cortex-M0+)", - "architecture": "samd", - "version": "1.6.16", - "category": "Arduino", - "url": "http://downloads.arduino.cc/cores/samd-1.6.16.tar.bz2", - "archiveFileName": "samd-1.6.16.tar.bz2", - "checksum": "SHA-256:d44e32b07642f6dc5e480068f52966113baa912f3b5fa6d39cfa4112c4a25e53", - "size": "2796651", - "boards": [ - { "name": "Arduino/Genuino Zero" }, - { "name": "Arduino/Genuino MKR1000" }, - { "name": "Arduino MKRZero" }, - { "name": "Arduino MKRFox1200" }, - { "name": "Arduino M0 Pro" }, - { "name": "Arduino M0" }, - { "name": "Arduino Tian" }, - { "name": "Adafruit Circuit Playground Express" } - ], - "toolsDependencies": [ - { - "packager": "arduino", - "name": "arm-none-eabi-gcc", - "version": "4.8.3-2014q1" - }, - { - "packager": "arduino", - "name": "bossac", - "version": "1.7.0" - }, - { - "packager": "arduino", - "name": "openocd", - "version": "0.9.0-arduino6-static" - }, - { - "packager": "arduino", - "name": "CMSIS", - "version": "4.5.0" - }, - { - "packager": "arduino", - "name": "CMSIS-Atmel", - "version": "1.1.0" - }, - { - "packager": "arduino", - "name": "arduinoOTA", - "version": "1.2.0" - } - ] - }, - { - "name": "Arduino SAMD Boards (32-bits ARM Cortex-M0+)", - "architecture": "samd", - "version": "1.6.17", - "category": "Arduino", - "url": "http://downloads.arduino.cc/cores/samd-1.6.17.tar.bz2", - "archiveFileName": "samd-1.6.17.tar.bz2", - "checksum": "SHA-256:2c691c23cdf9974526ff33f19b7b060b5c03b7cb4708f61f8eb2629666c3c278", - "size": "2849852", - "boards": [ - { "name": "Arduino/Genuino Zero" }, - { "name": "Arduino/Genuino MKR1000" }, - { "name": "Arduino MKRZERO" }, - { "name": "Arduino MKR FOX 1200" }, - { "name": "Arduino MKR WAN 1300" }, - { "name": "Arduino MKR GSM 1400" }, - { "name": "Arduino M0 Pro" }, - { "name": "Arduino M0" }, - { "name": "Arduino Tian" }, - { "name": "Adafruit Circuit Playground Express" } - ], - "toolsDependencies": [ - { - "packager": "arduino", - "name": "arm-none-eabi-gcc", - "version": "4.8.3-2014q1" - }, - { - "packager": "arduino", - "name": "bossac", - "version": "1.7.0" - }, - { - "packager": "arduino", - "name": "openocd", - "version": "0.9.0-arduino6-static" - }, - { - "packager": "arduino", - "name": "CMSIS", - "version": "4.5.0" - }, - { - "packager": "arduino", - "name": "CMSIS-Atmel", - "version": "1.1.0" - }, - { - "packager": "arduino", - "name": "arduinoOTA", - "version": "1.2.0" - } - ] - }, - { - "name": "Arduino SAMD Boards (32-bits ARM Cortex-M0+)", - "architecture": "samd", - "version": "1.6.18", - "category": "Arduino", - "url": "http://downloads.arduino.cc/cores/samd-1.6.18.tar.bz2", - "archiveFileName": "samd-1.6.18.tar.bz2", - "checksum": "SHA-256:adbc464106abcfb031aeaa8c73ce09340f5aec8805e83bbe6f7a7da974321fa7", - "size": "2808624", - "boards": [ - { "name": "Arduino/Genuino Zero" }, - { "name": "Arduino/Genuino MKR1000" }, - { "name": "Arduino MKRZERO" }, - { "name": "Arduino MKR FOX 1200" }, - { "name": "Arduino MKR WAN 1300" }, - { "name": "Arduino MKR GSM 1400" }, - { "name": "Arduino M0 Pro" }, - { "name": "Arduino M0" }, - { "name": "Arduino Tian" }, - { "name": "Adafruit Circuit Playground Express" } - ], - "toolsDependencies": [ - { - "packager": "arduino", - "name": "arm-none-eabi-gcc", - "version": "4.8.3-2014q1" - }, - { - "packager": "arduino", - "name": "bossac", - "version": "1.7.0" - }, - { - "packager": "arduino", - "name": "openocd", - "version": "0.9.0-arduino6-static" - }, - { - "packager": "arduino", - "name": "CMSIS", - "version": "4.5.0" - }, - { - "packager": "arduino", - "name": "CMSIS-Atmel", - "version": "1.1.0" - }, - { - "packager": "arduino", - "name": "arduinoOTA", - "version": "1.2.0" - } - ] - }, - { - "name": "Arduino SAMD Boards (32-bits ARM Cortex-M0+)", - "architecture": "samd", - "version": "1.6.19", - "category": "Arduino", - "url": "http://downloads.arduino.cc/cores/samd-1.6.19.tar.bz2", - "archiveFileName": "samd-1.6.19.tar.bz2", - "checksum": "SHA-256:959c10af4413455edf914ad426e18d7f2fbf0a38ce5e9d44232cc95b3d0a8a02", - "size": "2844050", - "boards": [ - { "name": "Arduino MKR WiFi 1010" }, - { "name": "Arduino/Genuino Zero" }, - { "name": "Arduino/Genuino MKR1000" }, - { "name": "Arduino MKRZERO" }, - { "name": "Arduino MKR FOX 1200" }, - { "name": "Arduino MKR WAN 1300" }, - { "name": "Arduino MKR GSM 1400" }, - { "name": "Arduino M0 Pro" }, - { "name": "Arduino M0" }, - { "name": "Arduino Tian" }, - { "name": "Adafruit Circuit Playground Express" } - ], - "toolsDependencies": [ - { - "packager": "arduino", - "name": "arm-none-eabi-gcc", - "version": "4.8.3-2014q1" - }, - { - "packager": "arduino", - "name": "bossac", - "version": "1.7.0" - }, - { - "packager": "arduino", - "name": "openocd", - "version": "0.9.0-arduino6-static" - }, - { - "packager": "arduino", - "name": "CMSIS", - "version": "4.5.0" - }, - { - "packager": "arduino", - "name": "CMSIS-Atmel", - "version": "1.1.0" - }, - { - "packager": "arduino", - "name": "arduinoOTA", - "version": "1.2.0" - } - ] - }, - { - "name": "Arduino SAMD Boards (32-bits ARM Cortex-M0+)", - "architecture": "samd", - "version": "1.6.20", - "category": "Arduino", - "url": "http://downloads.arduino.cc/cores/samd-1.6.20.tar.bz2", - "archiveFileName": "samd-1.6.20.tar.bz2", - "checksum": "SHA-256:65a07751d858c7096d4ed9e842768530d41f84c30e26baa398c82e6ad92649bf", - "size": "2854887", - "boards": [ - { "name": "Arduino MKR WiFi 1010" }, - { "name": "Arduino/Genuino Zero" }, - { "name": "Arduino/Genuino MKR1000" }, - { "name": "Arduino MKRZERO" }, - { "name": "Arduino MKR FOX 1200" }, - { "name": "Arduino MKR WAN 1300" }, - { "name": "Arduino MKR GSM 1400" }, - { "name": "Arduino MKR NB 1500" }, - { "name": "Arduino M0 Pro" }, - { "name": "Arduino M0" }, - { "name": "Arduino Tian" }, - { "name": "Adafruit Circuit Playground Express" } - ], - "toolsDependencies": [ - { - "packager": "arduino", - "name": "arm-none-eabi-gcc", - "version": "4.8.3-2014q1" - }, - { - "packager": "arduino", - "name": "bossac", - "version": "1.7.0" - }, - { - "packager": "arduino", - "name": "openocd", - "version": "0.9.0-arduino6-static" - }, - { - "packager": "arduino", - "name": "CMSIS", - "version": "4.5.0" - }, - { - "packager": "arduino", - "name": "CMSIS-Atmel", - "version": "1.1.0" - }, - { - "packager": "arduino", - "name": "arduinoOTA", - "version": "1.2.0" - } - ] - }, - { - "name": "Arduino SAMD Beta Boards (32-bits ARM Cortex-M0+)", - "architecture": "samd_beta", - "version": "1.6.22", - "category": "Arduino", - "help": { - "online": "http://www.arduino.cc/en/Reference/HomePage" - }, - "url": "http://downloads.arduino.cc/cores/samd-beta-1.6.22.tar.bz2", - "archiveFileName": "samd-beta-1.6.22.tar.bz2", - "checksum": "SHA-256:f9be59deae12889c79900774b6b236da0aa3b8ecc615f91d1cf061b3c63c4531", - "size": "2880064", - "boards": [ - { - "name": "Arduino MKR Vidor 4000" - } - ], - "toolsDependencies": [ - { - "packager": "arduino", - "name": "arm-none-eabi-gcc", - "version": "7-2017q4" - }, - { - "packager": "arduino", - "name": "bossac", - "version": "1.7.0-arduino3" - }, - { - "packager": "arduino", - "name": "openocd", - "version": "0.10.0-arduino7" - }, - { - "packager": "arduino", - "name": "CMSIS", - "version": "4.5.0" - }, - { - "packager": "arduino", - "name": "CMSIS-Atmel", - "version": "1.2.0" - }, - { - "packager": "arduino", - "name": "arduinoOTA", - "version": "1.2.0" - } - ] - }, - { - "name": "Arduino SAMD Beta Boards (32-bits ARM Cortex-M0+)", - "architecture": "samd_beta", - "version": "1.6.23", - "category": "Arduino", - "help": { - "online": "http://www.arduino.cc/en/Reference/HomePage" - }, - "url": "http://downloads.arduino.cc/cores/samd-beta-1.6.23.tar.gz", - "archiveFileName": "samd-beta-1.6.23.tar.gz", - "checksum": "SHA-256:5ff9b77ef8044613604d5e915e8e2e69362241b489c1c2bf06f008a5150e1162", - "size": "3634633", - "boards": [ - { - "name": "Arduino MKR Vidor 4000" - } - ], - "toolsDependencies": [ - { - "packager": "arduino", - "name": "arm-none-eabi-gcc", - "version": "7-2017q4" - }, - { - "packager": "arduino", - "name": "bossac", - "version": "1.7.0-arduino3" - }, - { - "packager": "arduino", - "name": "openocd", - "version": "0.10.0-arduino7" - }, - { - "packager": "arduino", - "name": "CMSIS", - "version": "4.5.0" - }, - { - "packager": "arduino", - "name": "CMSIS-Atmel", - "version": "1.2.0" - }, - { - "packager": "arduino", - "name": "arduinoOTA", - "version": "1.2.0" - } - ] - }, - { - "name": "Arduino SAMD Beta Boards (32-bits ARM Cortex-M0+)", - "architecture": "samd_beta", - "version": "1.6.24", - "category": "Arduino", - "help": { - "online": "http://www.arduino.cc/en/Reference/HomePage" - }, - "url": "http://downloads.arduino.cc/cores/samd-beta-1.6.24.tar.bz2", - "archiveFileName": "samd-beta-1.6.24.tar.bz2", - "checksum": "SHA-256:922c42decf1088aaaef473f26b9630ebda63cf2ec4db52a39c3eadef45cb7e4a", - "size": "2885903", - "boards": [ - { - "name": "Arduino MKR Vidor 4000" - } - ], - "toolsDependencies": [ - { - "packager": "arduino", - "name": "arm-none-eabi-gcc", - "version": "7-2017q4" - }, - { - "packager": "arduino", - "name": "bossac", - "version": "1.7.0-arduino3" - }, - { - "packager": "arduino", - "name": "openocd", - "version": "0.10.0-arduino7" - }, - { - "packager": "arduino", - "name": "CMSIS", - "version": "4.5.0" - }, - { - "packager": "arduino", - "name": "CMSIS-Atmel", - "version": "1.2.0" - }, - { - "packager": "arduino", - "name": "arduinoOTA", - "version": "1.2.1" - } - ] - }, - { - "name": "Arduino SAMD Beta Boards (32-bits ARM Cortex-M0+)", - "architecture": "samd_beta", - "version": "1.6.25", - "category": "Arduino", - "help": { - "online": "http://www.arduino.cc/en/Reference/HomePage" - }, - "url": "http://downloads.arduino.cc/cores/samd-beta-1.6.25.tar.bz2", - "archiveFileName": "samd-beta-1.6.25.tar.bz2", - "checksum": "SHA-256:95e22b75d2ff1e3a1c9baabad205fbd48964b195390951943035bfbd88286961", - "size": "2890759", - "boards": [ - { - "name": "Arduino MKR Vidor 4000" - } - ], - "toolsDependencies": [ - { - "packager": "arduino", - "name": "arm-none-eabi-gcc", - "version": "7-2017q4" - }, - { - "packager": "arduino", - "name": "bossac", - "version": "1.7.0-arduino3" - }, - { - "packager": "arduino", - "name": "openocd", - "version": "0.10.0-arduino7" - }, - { - "packager": "arduino", - "name": "CMSIS", - "version": "4.5.0" - }, - { - "packager": "arduino", - "name": "CMSIS-Atmel", - "version": "1.2.0" - }, - { - "packager": "arduino", - "name": "arduinoOTA", - "version": "1.2.1" - } - ] - }, - { - "name": "Arduino STM32F4 Boards", - "architecture": "stm32f4", - "version": "1.0.0", - "category": "Arduino", - "url": "http://downloads.arduino.cc/arduino.org/package_arduino_stm32f4_1.0.0.tar.bz2", - "archiveFileName": "package_arduino_stm32f4_1.0.0.tar.bz2", - "size": "20499005", - "checksum": "SHA-256:79a67167bff45c34a4addf29a4c84904d0dc114c19220bfd204a65e51688b3d1", - "boards": [ - { - "name": "Arduino Star OTTO" - } - ], - "toolsDependencies": [ - { - "packager": "arduino", - "name": "arm-none-eabi-gcc", - "version": "4.8.3-2014q1" - }, - { - "packager": "arduino", - "version": "0.8.0-stm32-arduino1", - "name": "dfu-util" - } - ] - }, - { - "name": "Arduino STM32F4 Boards", - "architecture": "stm32f4", - "version": "1.0.1", - "category": "Arduino", - "url": "http://downloads.arduino.cc/arduino.org/package_arduino_stm32f4_1.0.1.tar.bz2", - "archiveFileName": "package_arduino_stm32f4_1.0.1.tar.bz2", - "checksum": "SHA-256:e66dd40f8b9faeb6c7400b48745c023aacb65a6d5c700395edc9dd89d2d150c0", - "size": "20495225", - "boards": [ - { - "name": "Arduino Star OTTO" - } - ], - "toolsDependencies": [ - { - "packager": "arduino", - "name": "arm-none-eabi-gcc", - "version": "4.8.3-2014q1" - }, - { - "packager": "arduino", - "name": "dfu-util", - "version": "0.9.0-arduino1" - }, - { - "packager": "arduino", - "name": "arduinoSTM32load", - "version": "2.0.0" - } - ] - }, - { - "name": "Arduino NRF52 Boards", - "architecture": "nrf52", - "version": "1.0.0", - "category": "Arduino", - "url": "http://downloads.arduino.cc/arduino.org/package_arduino_nrf52_1.0.0.tar.bz2", - "archiveFileName": "package_arduino_nrf52_1.0.0.tar.bz2", - "checksum": "SHA-256:d95cf5a1a3794512fd428f00f71c1e334d2fcf6e261bb22e4bbaa64143205de6", - "size": "2438905", - "boards": [ - { - "name": "Arduino Primo" - } - ], - "toolsDependencies": [ - { - "packager": "arduino", - "name": "arm-none-eabi-gcc", - "version": "4.8.3-2014q1" - }, - { - "packager": "arduino", - "name": "CMSIS", - "version": "4.5.0" - }, - { - "packager": "arduino", - "name": "openocd", - "version": "0.10.0-arduino1-static" - }, - { - "packager": "arduino", - "name": "nrf5x-cl-tools", - "version": "9.3.1" - } - ] - }, - { - "name": "Arduino nRF52 Boards", - "architecture": "nrf52", - "version": "1.0.1", - "category": "Arduino", - "url": "http://downloads.arduino.cc/arduino.org/package_arduino_nrf52_1.0.1.tar.bz2", - "archiveFileName": "package_arduino_nrf52_1.0.1.tar.bz2", - "checksum": "SHA-256:f6c5b66a1257188a2e6cab3df8ec373777f62c3abb29f7196d571d221a5c75ff", - "size": "2262233", - "boards": [ - { - "name": "Arduino Primo" - } - ], - "toolsDependencies": [ - { - "packager": "arduino", - "name": "arm-none-eabi-gcc", - "version": "4.8.3-2014q1" - }, - { - "packager": "arduino", - "name": "CMSIS", - "version": "4.5.0" - }, - { - "packager": "arduino", - "name": "openocd", - "version": "0.10.0-arduino1-static" - }, - { - "packager": "arduino", - "name": "nrf5x-cl-tools", - "version": "9.3.1" - } - ] - }, - { - "name": "Arduino nRF52 Boards", - "architecture": "nrf52", - "version": "1.0.2", - "category": "Arduino", - "url": "http://downloads.arduino.cc/arduino.org/package_arduino_nrf52_1.0.2.tar.bz2", - "archiveFileName": "package_arduino_nrf52_1.0.2.tar.bz2", - "checksum": "SHA-256:3a96c9476e567b7bca6f0201fcd6a4dbc97bddfbce70bc2d96f5f33a59265163", - "size": "2308695", - "boards": [ - { "name": "Arduino Primo" }, - { "name": "Arduino Primo Core" } - ], - "toolsDependencies": [ - { - "packager": "arduino", - "name": "arm-none-eabi-gcc", - "version": "4.8.3-2014q1" - }, - { - "packager": "arduino", - "name": "CMSIS", - "version": "4.5.0" - }, - { - "packager": "arduino", - "name": "openocd", - "version": "0.10.0-arduino1-static" - }, - { - "packager": "arduino", - "name": "nrf5x-cl-tools", - "version": "9.3.1" - } - ] - } - ], - "tools": [ - { - "name": "arm-none-eabi-gcc", - "version": "4.8.3-2014q1", - "systems": [ - { - "host": "arm-linux-gnueabihf", - "url": "http://downloads.arduino.cc/gcc-arm-none-eabi-4.8.3-2014q1-arm.tar.bz2", - "archiveFileName": "gcc-arm-none-eabi-4.8.3-2014q1-arm.tar.bz2", - "checksum": "SHA-256:ebe96b34c4f434667cab0187b881ed585e7c7eb990fe6b69be3c81ec7e11e845", - "size": "44423906" - }, - { - "host": "i686-mingw32", - "archiveFileName": "gcc-arm-none-eabi-4.8.3-2014q1-windows.tar.gz", - "url": "http://downloads.arduino.cc/gcc-arm-none-eabi-4.8.3-2014q1-windows.tar.gz", - "checksum": "SHA-256:fd8c111c861144f932728e00abd3f7d1107e186eb9cd6083a54c7236ea78b7c2", - "size": "84537449" - }, - { - "host": "x86_64-apple-darwin", - "url": "http://downloads.arduino.cc/gcc-arm-none-eabi-4.8.3-2014q1-mac.tar.gz", - "archiveFileName": "gcc-arm-none-eabi-4.8.3-2014q1-mac.tar.gz", - "checksum": "SHA-256:3598acf21600f17a8e4a4e8e193dc422b894dc09384759b270b2ece5facb59c2", - "size": "52518522" - }, - { - "host": "x86_64-pc-linux-gnu", - "url": "http://downloads.arduino.cc/gcc-arm-none-eabi-4.8.3-2014q1-linux64.tar.gz", - "archiveFileName": "gcc-arm-none-eabi-4.8.3-2014q1-linux64.tar.gz", - "checksum": "SHA-256:d23f6626148396d6ec42a5b4d928955a703e0757829195fa71a939e5b86eecf6", - "size": "51395093" - }, - { - "host": "i686-pc-linux-gnu", - "url": "http://downloads.arduino.cc/gcc-arm-none-eabi-4.8.3-2014q1-linux32.tar.gz", - "archiveFileName": "gcc-arm-none-eabi-4.8.3-2014q1-linux32.tar.gz", - "checksum": "SHA-256:ba1994235f69c526c564f65343f22ddbc9822b2ea8c5ee07dd79d89f6ace2498", - "size": "51029223" - } - ] - }, - { - "name": "arm-none-eabi-gcc", - "version": "7-2017q4", - "systems": [ - { - "host": "arm-linux-gnueabihf", - "url": "http://downloads.arduino.cc/tools/gcc-arm-none-eabi-4.8.3-2014q1-arm.tar.bz2", - "archiveFileName": "gcc-arm-none-eabi-4.8.3-2014q1-arm.tar.bz2", - "checksum": "SHA-256:ebe96b34c4f434667cab0187b881ed585e7c7eb990fe6b69be3c81ec7e11e845", - "size": "44423906" - }, - { - "host": "aarch64-linux-gnu", - "url": "http://downloads.arduino.cc/tools/gcc-arm-none-eabi-7-2018-q2-update-linuxarm64.tar.bz2", - "archiveFileName": "gcc-arm-none-eabi-7-2018-q2-update-linuxarm64.tar.bz2", - "checksum": "SHA-256:6fb5752fb4d11012bd0a1ceb93a19d0641ff7cf29d289b3e6b86b99768e66f76", - "size": "99558726" - }, - { - "host": "i686-mingw32", - "url": "http://downloads.arduino.cc/tools/gcc-arm-none-eabi-7-2017-q4-major-win32-arduino1.zip", - "archiveFileName": "gcc-arm-none-eabi-7-2017-q4-major-win32-arduino1.zip", - "checksum": "SHA-256:96dd0091856f4d2eb21046eba571321feecf7d50b9c156f708b2a8b683903382", - "size": "131761924" - }, - { - "host": "x86_64-apple-darwin", - "url": "http://downloads.arduino.cc/tools/gcc-arm-none-eabi-7-2017-q4-major-mac.tar.bz2", - "archiveFileName": "gcc-arm-none-eabi-7-2017-q4-major-mac.tar.bz2", - "checksum": "SHA-256:89b776c7cf0591c810b5b60067e4dc113b5b71bc50084a536e71b894a97fdccb", - "size": "104550003" - }, - { - "host": "x86_64-pc-linux-gnu", - "url": "http://downloads.arduino.cc/tools/gcc-arm-none-eabi-7-2017-q4-major-linux64.tar.bz2", - "archiveFileName": "gcc-arm-none-eabi-7-2017-q4-major-linux64.tar.bz2", - "checksum": "SHA-256:96a029e2ae130a1210eaa69e309ea40463028eab18ba19c1086e4c2dafe69a6a", - "size": "99857645" - }, - { - "host": "i686-pc-linux-gnu", - "url": "http://downloads.arduino.cc/tools/gcc-arm-none-eabi-7-2018-q2-update-linux32.tar.bz2", - "archiveFileName": "gcc-arm-none-eabi-7-2018-q2-update-linux32.tar.bz2", - "checksum": "SHA-256:090a0bc2b1956bc49392dff924a6c30fa57c88130097b1972204d67a45ce3cf3", - "size": "97427309" - } - ] - }, - { - "name": "bossac", - "version": "1.3-arduino", - "systems": [ - { - "host": "i686-linux-gnu", - "url": "http://downloads.arduino.cc/tools/bossac-1.3a-arduino-i686-linux-gnu.tar.bz2", - "archiveFileName": "bossac-1.3a-arduino-i686-linux-gnu.tar.bz2", - "checksum": "SHA-256:d6d10362f40729a7877e43474fcf02ad82cf83321cc64ca931f5c82b2d25d24f", - "size": "147359" - }, - { - "host": "x86_64-pc-linux-gnu", - "url": "http://downloads.arduino.cc/tools/bossac-1.3a-arduino-x86_64-pc-linux-gnu.tar.bz2", - "archiveFileName": "bossac-1.3a-arduino-x86_64-pc-linux-gnu.tar.bz2", - "checksum": "SHA-256:c1daed033251296768fa8b63ad283e053da93427c0f3cd476a71a9188e18442c", - "size": "26179" - }, - { - "host": "i686-mingw32", - "url": "http://downloads.arduino.cc/tools/bossac-1.3a-arduino-i686-mingw32.tar.bz2", - "archiveFileName": "bossac-1.3a-arduino-i686-mingw32.tar.bz2", - "checksum": "SHA-256:a37727622e0f86cb4f2856ad0209568a5d804234dba3dc0778829730d61a5ec7", - "size": "265647" - }, - { - "host": "i386-apple-darwin11", - "url": "http://downloads.arduino.cc/tools/bossac-1.3a-arduino-i386-apple-darwin11.tar.bz2", - "archiveFileName": "bossac-1.3a-arduino-i386-apple-darwin11.tar.bz2", - "checksum": "SHA-256:40770b225753e7a52bb165e8f37e6b760364f5c5e96048168d0178945bd96ad6", - "size": "39475" - } - ] - }, - { - "name": "avr-gcc", - "version": "4.8.1-arduino2", - "systems": [ - { - "size": "24443285", - "checksum": "SHA-256:c19a7526235c364d7f62ec1a993d9b495973ba1813869ccf0241c65905896852", - "host": "i386-apple-darwin11", - "archiveFileName": "avr-gcc-4.8.1-arduino2-i386-apple-darwin11.tar.bz2", - "url": "http://downloads.arduino.cc/tools/avr-gcc-4.8.1-arduino2-i386-apple-darwin11.tar.bz2" - }, - { - "size": "27152002", - "checksum": "SHA-256:24a931877bee5f36dc00a88877219a6d2f6a1fb7abb989fd04556b8432d2e14e", - "host": "x86_64-linux-gnu", - "archiveFileName": "avr-gcc-4.8.1-arduino2-x86_64-pc-linux-gnu.tar.bz2", - "url": "http://downloads.arduino.cc/tools/avr-gcc-4.8.1-arduino2-x86_64-pc-linux-gnu.tar.bz2" - }, - { - "size": "25876628", - "checksum": "SHA-256:2d701b4efbc8cec62dc299cde01730c5eebcf23d7e4393db8cf7744a9bf1d3de", - "host": "i686-linux-gnu", - "archiveFileName": "avr-gcc-4.8.1-arduino2-i686-pc-linux-gnu.tar.bz2", - "url": "http://downloads.arduino.cc/tools/avr-gcc-4.8.1-arduino2-i686-pc-linux-gnu.tar.bz2" - }, - { - "size": "46046691", - "checksum": "SHA-256:2eafb49fb803fa4d2c32d35e24c0b372fcd520ca0a790fa537a847179e382000", - "host": "i686-mingw32", - "archiveFileName": "avr-gcc-4.8.1-arduino2-i686-mingw32.zip", - "url": "http://downloads.arduino.cc/tools/avr-gcc-4.8.1-arduino2-i686-mingw32.zip" - } - ] - }, - { - "name": "avrdude", - "version": "6.0.1-arduino2", - "systems": [ - { - "size": "264965", - "checksum": "SHA-256:71117cce0096dad6c091e2c34eb0b9a3386d3aec7d863d2da733d9e5eac3a6b1", - "host": "i386-apple-darwin11", - "archiveFileName": "avrdude-6.0.1-arduino2-i386-apple-darwin11.tar.bz2", - "url": "http://downloads.arduino.cc/tools/avrdude-6.0.1-arduino2-i386-apple-darwin11.tar.bz2" - }, - { - "size": "292541", - "checksum": "SHA-256:2489004d1d98177eaf69796760451f89224007c98b39ebb5577a9a34f51425f1", - "host": "x86_64-linux-gnu", - "archiveFileName": "avrdude-6.0.1-arduino2-x86_64-pc-linux-gnu.tar.bz2", - "url": "http://downloads.arduino.cc/tools/avrdude-6.0.1-arduino2-x86_64-pc-linux-gnu.tar.bz2" - }, - { - "size": "283209", - "checksum": "SHA-256:6f633dd6270ad0d9ef19507bcbf8697b414a15208e4c0f71deec25ef89cdef3f", - "host": "i686-linux-gnu", - "archiveFileName": "avrdude-6.0.1-arduino2-i686-pc-linux-gnu.tar.bz2", - "url": "http://downloads.arduino.cc/tools/avrdude-6.0.1-arduino2-i686-pc-linux-gnu.tar.bz2" - }, - { - "size": "241618", - "checksum": "SHA-256:6c5483800ba753c80893607e30cade8ab77b182808fcc5ea15fa3019c63d76ae", - "host": "i686-mingw32", - "archiveFileName": "avrdude-6.0.1-arduino2-i686-mingw32.zip", - "url": "http://downloads.arduino.cc/tools/avrdude-6.0.1-arduino2-i686-mingw32.zip" - } - ] - }, - { - "name": "avr-gcc", - "version": "4.8.1-arduino3", - "systems": [ - { - "size": "24447175", - "checksum": "SHA-256:28e207c66b3dc405367d0c5e68ce3c278e5ec3abb0e4974e7927fe0f9a532c40", - "host": "i386-apple-darwin11", - "archiveFileName": "avr-gcc-4.8.1-arduino3-i386-apple-darwin11.tar.bz2", - "url": "http://downloads.arduino.cc/tools/avr-gcc-4.8.1-arduino3-i386-apple-darwin11.tar.bz2" - }, - { - "size": "30556996", - "checksum": "SHA-256:028340abec6eb3085b82404dfc7ed143e1bb05b2da961b539ddcdba4a6f65533", - "host": "x86_64-linux-gnu", - "archiveFileName": "avr-gcc-4.8.1-arduino3-x86_64-pc-linux-gnu.tar.bz2", - "url": "http://downloads.arduino.cc/tools/avr-gcc-4.8.1-arduino3-x86_64-pc-linux-gnu.tar.bz2" - }, - { - "size": "28768022", - "checksum": "SHA-256:37796548ba9653267568f959cd8c7ebfe5b4bce4599898cf9f876d64e616cb87", - "host": "i686-linux-gnu", - "archiveFileName": "avr-gcc-4.8.1-arduino3-i686-pc-linux-gnu.tar.bz2", - "url": "http://downloads.arduino.cc/tools/avr-gcc-4.8.1-arduino3-i686-pc-linux-gnu.tar.bz2" - }, - { - "size": "46046917", - "checksum": "SHA-256:d6f0527793f9800f060408392a99eb290ed205730edbae43a1a25cbf6b6b588f", - "host": "i686-mingw32", - "archiveFileName": "avr-gcc-4.8.1-arduino3-i686-mingw32.zip", - "url": "http://downloads.arduino.cc/tools/avr-gcc-4.8.1-arduino3-i686-mingw32.zip" - } - ] - }, - { - "name": "avrdude", - "version": "6.0.1-arduino3", - "systems": [ - { - "size": "264682", - "checksum": "SHA-256:df7cd4a76e45ab3767eb964f845f4d5e9d643df950ec32812923da1e9843d072", - "host": "i386-apple-darwin11", - "archiveFileName": "avrdude-6.0.1-arduino3-i386-apple-darwin11.tar.bz2", - "url": "http://downloads.arduino.cc/tools/avrdude-6.0.1-arduino3-i386-apple-darwin11.tar.bz2" - }, - { - "size": "748634", - "checksum": "SHA-256:bb7bff48f20a68e1fe559c3f3f644574df12ab5c98eb6a1491079f3c760434ad", - "host": "x86_64-linux-gnu", - "archiveFileName": "avrdude-6.0.1-arduino3-x86_64-pc-linux-gnu.tar.bz2", - "url": "http://downloads.arduino.cc/tools/avrdude-6.0.1-arduino3-x86_64-pc-linux-gnu.tar.bz2" - }, - { - "size": "495482", - "checksum": "SHA-256:96a0cfb83fe0452366159e3bf4e19ff10906a8957d1feafd3d98b49ab4b14405", - "host": "i686-linux-gnu", - "archiveFileName": "avrdude-6.0.1-arduino3-i686-pc-linux-gnu.tar.bz2", - "url": "http://downloads.arduino.cc/tools/avrdude-6.0.1-arduino3-i686-pc-linux-gnu.tar.bz2" - }, - { - "size": "241619", - "checksum": "SHA-256:ea59bfc2ee85039c85318b2ba52c47ef0573513444a785b72f59b22586a950f9", - "host": "i686-mingw32", - "archiveFileName": "avrdude-6.0.1-arduino3-i686-mingw32.zip", - "url": "http://downloads.arduino.cc/tools/avrdude-6.0.1-arduino3-i686-mingw32.zip" - } - ] - }, - { - "name": "avr-gcc", - "version": "4.8.1-arduino5", - "systems": [ - { - "size": "24403768", - "checksum": "SHA-256:c8ffcd2db7a651b48ab4ea19db4b34fbae3e7f0210a0f294592af2bdabf2154b", - "host": "arm-linux-gnueabihf", - "archiveFileName": "avr-gcc-4.8.1-arduino5-armhf-pc-linux-gnu.tar.bz2", - "url": "http://downloads.arduino.cc/tools/avr-gcc-4.8.1-arduino5-armhf-pc-linux-gnu.tar.bz2" - }, - { - "size": "24437400", - "checksum": "SHA-256:111b3ef00d737d069eb237a8933406cbb928e4698689e24663cffef07688a901", - "host": "i386-apple-darwin11", - "archiveFileName": "avr-gcc-4.8.1-arduino5-i386-apple-darwin11.tar.bz2", - "url": "http://downloads.arduino.cc/tools/avr-gcc-4.8.1-arduino5-i386-apple-darwin11.tar.bz2" - }, - { - "size": "27093036", - "checksum": "SHA-256:9054fcc174397a419ba56c4ce1bfcbcad275a6a080cc144905acc9b0351ee9cc", - "host": "x86_64-linux-gnu", - "archiveFileName": "avr-gcc-4.8.1-arduino5-x86_64-pc-linux-gnu.tar.bz2", - "url": "http://downloads.arduino.cc/tools/avr-gcc-4.8.1-arduino5-x86_64-pc-linux-gnu.tar.bz2" - }, - { - "size": "25882375", - "checksum": "SHA-256:7648b7f549b37191da0b0be53bae791b652f82ac3cb4e7877f85075aaf32141f", - "host": "i686-linux-gnu", - "archiveFileName": "avr-gcc-4.8.1-arduino5-i686-pc-linux-gnu.tar.bz2", - "url": "http://downloads.arduino.cc/tools/avr-gcc-4.8.1-arduino5-i686-pc-linux-gnu.tar.bz2" - }, - { - "size": "46044779", - "checksum": "SHA-256:d4303226a7b41d3c445d901b5aa5903458def3fc7b7ff4ffef37cabeb37d424d", - "host": "i686-mingw32", - "archiveFileName": "avr-gcc-4.8.1-arduino5-i686-mingw32.zip", - "url": "http://downloads.arduino.cc/tools/avr-gcc-4.8.1-arduino5-i686-mingw32.zip" - } - ] - }, - { - "name": "avrdude", - "version": "6.0.1-arduino5", - "systems": [ - { - "size": "267095", - "checksum": "SHA-256:23ea1341dbc117ec067f2eb1a498ad2bdd7d11fff0143c00b2e018c39804f6b4", - "host": "arm-linux-gnueabihf", - "archiveFileName": "avrdude-6.0.1-arduino5-armhf-pc-linux-gnu.tar.bz2", - "url": "http://downloads.arduino.cc/tools/avrdude-6.0.1-arduino5-armhf-pc-linux-gnu.tar.bz2" - }, - { - "size": "264894", - "checksum": "SHA-256:41af8d3b0a586853c8317b4fb5163ca0db594a1870ddf680fd988c42166fc3e5", - "host": "i386-apple-darwin11", - "archiveFileName": "avrdude-6.0.1-arduino5-i386-apple-darwin11.tar.bz2", - "url": "http://downloads.arduino.cc/tools/avrdude-6.0.1-arduino5-i386-apple-darwin11.tar.bz2" - }, - { - "size": "292629", - "checksum": "SHA-256:d826cca7383461f7e8adde686372cf900e9cb3afd639555cf2d6c645b283a476", - "host": "x86_64-linux-gnu", - "archiveFileName": "avrdude-6.0.1-arduino5-x86_64-pc-linux-gnu.tar.bz2", - "url": "http://downloads.arduino.cc/tools/avrdude-6.0.1-arduino5-x86_64-pc-linux-gnu.tar.bz2" - }, - { - "size": "283121", - "checksum": "SHA-256:5933d66927bce46ababa9b68a8b7f1d53f68c4f3ff7a5ce4b85d7cf4e6c6bfee", - "host": "i686-linux-gnu", - "archiveFileName": "avrdude-6.0.1-arduino5-i686-pc-linux-gnu.tar.bz2", - "url": "http://downloads.arduino.cc/tools/avrdude-6.0.1-arduino5-i686-pc-linux-gnu.tar.bz2" - }, - { - "size": "241634", - "checksum": "SHA-256:41f667f1f6a0ab8df46b4ffacd023176dcdef331d6db3b74bddd37d18cca0a44", - "host": "i686-mingw32", - "archiveFileName": "avrdude-6.0.1-arduino5-i686-mingw32.zip", - "url": "http://downloads.arduino.cc/tools/avrdude-6.0.1-arduino5-i686-mingw32.zip" - } - ] - }, - { - "name": "avr-gcc", - "version": "4.9.2-atmel3.5.3-arduino", - "systems": [ - { - "size": "27046965", - "checksum": "SHA-256:adeee70be27cc3ee0e4b9e844610d9c534c7b21dae24ec3fa49808c2f04958de", - "host": "i386-apple-darwin11", - "archiveFileName": "avr-gcc-4.9.2-atmel3.5.3-arduino-i386-apple-darwin11.tar.bz2", - "url": "http://downloads.arduino.cc/tools/avr-gcc-4.9.2-atmel3.5.3-arduino-i386-apple-darwin11.tar.bz2" - }, - { - "size": "27400001", - "checksum": "SHA-256:02dba9ee77694c23a4c304416a3808949c8faedf07f25a225a4189d850615ec6", - "host": "arm-linux-gnueabihf", - "archiveFileName": "avr-gcc-4.9.2-atmel3.5.3-arduino-armhf-pc-linux-gnu.tar.bz2", - "url": "http://downloads.arduino.cc/tools/avr-gcc-4.9.2-atmel3.5.3-arduino-armhf-pc-linux-gnu.tar.bz2" - }, - { - "size": "29904544", - "checksum": "SHA-256:0711e885c0430859e7fea3831af8c69a0c25f92a90ecfda9281799a0acec7455", - "host": "x86_64-linux-gnu", - "archiveFileName": "avr-gcc-4.9.2-atmel3.5.3-arduino-x86_64-pc-linux-gnu.tar.bz2", - "url": "http://downloads.arduino.cc/tools/avr-gcc-4.9.2-atmel3.5.3-arduino-x86_64-pc-linux-gnu.tar.bz2" - }, - { - "size": "29077606", - "checksum": "SHA-256:fe0bb1d6369694779ceb671d457ccadbeafe855a11f6746b7db20055cea4df33", - "host": "i686-linux-gnu", - "archiveFileName": "avr-gcc-4.9.2-atmel3.5.3-arduino-i686-pc-linux-gnu.tar.bz2", - "url": "http://downloads.arduino.cc/tools/avr-gcc-4.9.2-atmel3.5.3-arduino-i686-pc-linux-gnu.tar.bz2" - }, - { - "size": "43847566", - "checksum": "SHA-256:445ce3117e87be7e196809fbbea373976160689b6d4b43dbf185eb4c914d1469", - "host": "i686-mingw32", - "archiveFileName": "avr-gcc-4.9.2-atmel3.5.3-arduino-i686-mingw32.zip", - "url": "http://downloads.arduino.cc/tools/avr-gcc-4.9.2-atmel3.5.3-arduino-i686-mingw32.zip" - } - ] - }, - { - "name": "avr-gcc", - "version": "4.9.2-atmel3.5.3-arduino2", - "systems": [ - { - "size": "27400889", - "checksum": "SHA-256:77f300d519bc6b9a25df17b36cb303218e9a258c059b2f6bff8f71a0d8f96821", - "host": "arm-linux-gnueabihf", - "archiveFileName": "avr-gcc-4.9.2-atmel3.5.3-arduino2-armhf-pc-linux-gnu.tar.bz2", - "url": "http://downloads.arduino.cc/tools/avr-gcc-4.9.2-atmel3.5.3-arduino2-armhf-pc-linux-gnu.tar.bz2" - }, - { - "size": "27048070", - "checksum": "SHA-256:311258af188defe24a4b341e4e1f4dc93ca6c80516d3e3b55a2fc07a7050248b", - "host": "i386-apple-darwin11", - "archiveFileName": "avr-gcc-4.9.2-atmel3.5.3-arduino2-i386-apple-darwin11.tar.bz2", - "url": "http://downloads.arduino.cc/tools/avr-gcc-4.9.2-atmel3.5.3-arduino2-i386-apple-darwin11.tar.bz2" - }, - { - "size": "43847945", - "checksum": "SHA-256:f8e6ede8746c70be01ec79a30803277cd94360cc5b2e104762da0fbcf536fcc6", - "host": "i686-mingw32", - "archiveFileName": "avr-gcc-4.9.2-atmel3.5.3-arduino2-i686-mingw32.zip", - "url": "http://downloads.arduino.cc/tools/avr-gcc-4.9.2-atmel3.5.3-arduino2-i686-mingw32.zip" - }, - { - "size": "29292729", - "checksum": "SHA-256:f108951e7c4dc90926d1fc76cc27549f6ea63c702a2bb7ff39647a19ae86ec68", - "host": "i686-linux-gnu", - "archiveFileName": "avr-gcc-4.9.2-atmel3.5.3-arduino2-i686-pc-linux-gnu.tar.bz2", - "url": "http://downloads.arduino.cc/tools/avr-gcc-4.9.2-atmel3.5.3-arduino2-i686-pc-linux-gnu.tar.bz2" - }, - { - "size": "29882960", - "checksum": "SHA-256:3903a6d1bb9fdd91727e504b5993d5501f119bcb7f99f7aee98a2101e5629188", - "host": "x86_64-linux-gnu", - "archiveFileName": "avr-gcc-4.9.2-atmel3.5.3-arduino2-x86_64-pc-linux-gnu.tar.bz2", - "url": "http://downloads.arduino.cc/tools/avr-gcc-4.9.2-atmel3.5.3-arduino2-x86_64-pc-linux-gnu.tar.bz2" - } - ] - }, - { - "name": "avr-gcc", - "version": "4.9.2-atmel3.5.4-arduino2", - "systems": [ - { - "size": "27764772", - "checksum": "SHA-256:ee36009e19bd238d1f6351cbc9aa5db69714761f67dec4c1d69d5d5d7758720c", - "host": "arm-linux-gnueabihf", - "archiveFileName": "avr-gcc-4.9.2-atmel3.5.4-arduino2-armhf-pc-linux-gnu.tar.bz2", - "url": "http://downloads.arduino.cc/tools/avr-gcc-4.9.2-atmel3.5.4-arduino2-armhf-pc-linux-gnu.tar.bz2" - }, - { - "size": "28574644", - "checksum": "SHA-256:67b3ed3555eacf0b4fc6f62240773b9f0220171fe4de26bb8d711547fc884730", - "host": "i386-apple-darwin11", - "archiveFileName": "avr-gcc-4.9.2-atmel3.5.4-arduino2-i386-apple-darwin11.tar.bz2", - "url": "http://downloads.arduino.cc/tools/avr-gcc-4.9.2-atmel3.5.4-arduino2-i386-apple-darwin11.tar.bz2" - }, - { - "size": "44386446", - "checksum": "SHA-256:6044551cd729d88ea6ffcccf10aad1934c5b164d61f4f5890b0e78524ffff853", - "host": "i686-mingw32", - "archiveFileName": "avr-gcc-4.9.2-atmel3.5.4-arduino2-i686-mingw32.zip", - "url": "http://downloads.arduino.cc/tools/avr-gcc-4.9.2-atmel3.5.4-arduino2-i686-mingw32.zip" - }, - { - "size": "29723974", - "checksum": "SHA-256:63a9d4cebbac06fd5fa8f48a2e2ba7d513837dcddc97f560129b4e466af901b5", - "host": "i686-linux-gnu", - "archiveFileName": "avr-gcc-4.9.2-atmel3.5.4-arduino2-i686-pc-linux-gnu.tar.bz2", - "url": "http://downloads.arduino.cc/tools/avr-gcc-4.9.2-atmel3.5.4-arduino2-i686-pc-linux-gnu.tar.bz2" - }, - { - "size": "30374404", - "checksum": "SHA-256:19480217f1524d78467b83cd742f503182bbcc76b5440093261f146828aa588c", - "host": "x86_64-linux-gnu", - "archiveFileName": "avr-gcc-4.9.2-atmel3.5.4-arduino2-x86_64-pc-linux-gnu.tar.bz2", - "url": "http://downloads.arduino.cc/tools/avr-gcc-4.9.2-atmel3.5.4-arduino2-x86_64-pc-linux-gnu.tar.bz2" - } - ] - }, - { - "name": "avr-gcc", - "version": "5.4.0-atmel3.6.1-arduino2", - "systems": [ - { - "size": "31449123", - "checksum": "SHA-256:6741f95cc3182a8729cf9670eb13d8dc5a19e881639ca61e53a2d78346a4e99f", - "host": "arm-linux-gnueabihf", - "archiveFileName": "avr-gcc-5.4.0-atmel3.6.1-arduino2-armhf-pc-linux-gnu.tar.bz2", - "url": "http://downloads.arduino.cc/tools/avr-gcc-5.4.0-atmel3.6.1-arduino2-armhf-pc-linux-gnu.tar.bz2" - }, - { - "size": "33141295", - "checksum": "SHA-256:0fa9e4f2d6d09782dbc84dd91a302849cde2f192163cb9f29484c5f32785269a", - "host": "aarch64-linux-gnu", - "archiveFileName": "avr-gcc-5.4.0-atmel3.6.1-arduino2-aarch64-pc-linux-gnu.tar.bz2", - "url": "http://downloads.arduino.cc/tools/avr-gcc-5.4.0-atmel3.6.1-arduino2-aarch64-pc-linux-gnu.tar.bz2" - }, - { - "size": "31894498", - "checksum": "SHA-256:abc50137543ba73e227b4d1b8510fff50a474bacd24f2c794f852904963849f8", - "host": "i386-apple-darwin11", - "archiveFileName": "avr-gcc-5.4.0-atmel3.6.1-arduino2-i386-apple-darwin11.tar.bz2", - "url": "http://downloads.arduino.cc/tools/avr-gcc-5.4.0-atmel3.6.1-arduino2-i386-apple-darwin11.tar.bz2" - }, - { - "size": "45923772", - "checksum": "SHA-256:7eb5691a379b547798fae535b05d68bc02d3969f12d051b8a5a5f2f350ab0a7f", - "host": "i686-mingw32", - "archiveFileName": "avr-gcc-5.4.0-atmel3.6.1-arduino2-i686-w64-mingw32.zip", - "url": "http://downloads.arduino.cc/tools/avr-gcc-5.4.0-atmel3.6.1-arduino2-i686-w64-mingw32.zip" - }, - { - "size": "33022916", - "checksum": "SHA-256:51f87e04f3cdaa73565c751051ac118e02904ad8478f1475b300e1bffcd5538f", - "host": "i686-linux-gnu", - "archiveFileName": "avr-gcc-5.4.0-atmel3.6.1-arduino2-i686-pc-linux-gnu.tar.bz2", - "url": "http://downloads.arduino.cc/tools/avr-gcc-5.4.0-atmel3.6.1-arduino2-i686-pc-linux-gnu.tar.bz2" - }, - { - "size": "33522375", - "checksum": "SHA-256:05422b0d73b10357c12ea938f02cf50529422b89a4722756e70024aed3e69185", - "host": "x86_64-linux-gnu", - "archiveFileName": "avr-gcc-5.4.0-atmel3.6.1-arduino2-x86_64-pc-linux-gnu.tar.bz2", - "url": "http://downloads.arduino.cc/tools/avr-gcc-5.4.0-atmel3.6.1-arduino2-x86_64-pc-linux-gnu.tar.bz2" - } - ] - }, - { - "name": "avrdude", - "version": "6.3.0-arduino2", - "systems": [ - { - "size": "643484", - "checksum": "SHA-256:26af86137d8a872f64d217cb262734860b36fe26d6d34faf72e951042f187885", - "host": "arm-linux-gnueabihf", - "archiveFileName": "avrdude-6.3.0-arduino2-armhf-pc-linux-gnu.tar.bz2", - "url": "http://downloads.arduino.cc/tools/avrdude-6.3.0-arduino2-armhf-pc-linux-gnu.tar.bz2" - }, - { - "size": "653968", - "checksum": "SHA-256:32525ea3696c861030e1a6006a5f11971d1dad331e45bfa68dac35126476b04f", - "host": "i386-apple-darwin11", - "archiveFileName": "avrdude-6.3.0-arduino2-i386-apple-darwin11.tar.bz2", - "url": "http://downloads.arduino.cc/tools/avrdude-6.3.0-arduino2-i386-apple-darwin11.tar.bz2" - }, - { - "size": "745081", - "checksum": "SHA-256:9635af5a35bdca11804c07582d7beec458140fb6e3308168c3deda18dc6790fa", - "host": "x86_64-linux-gnu", - "archiveFileName": "avrdude-6.3.0-arduino2-x86_64-pc-linux-gnu.tar.bz2", - "url": "http://downloads.arduino.cc/tools/avrdude-6.3.0-arduino2-x86_64-pc-linux-gnu.tar.bz2" - }, - { - "size": "731802", - "checksum": "SHA-256:790b6cb610c48e73a2a0f65dcee9903d2fd7f1b0a1f75008a9a21f50a60c7251", - "host": "i686-linux-gnu", - "archiveFileName": "avrdude-6.3.0-arduino2-i686-pc-linux-gnu.tar.bz2", - "url": "http://downloads.arduino.cc/tools/avrdude-6.3.0-arduino2-i686-pc-linux-gnu.tar.bz2" - }, - { - "size": "608496", - "checksum": "SHA-256:8eaf98ea41fbd4450483488ef31710cbcc43c0412dbc8e1e1b582feaab6eca30", - "host": "i686-mingw32", - "archiveFileName": "avrdude-6.3.0-arduino2-i686-w64-mingw32.zip", - "url": "http://downloads.arduino.cc/tools/avrdude-6.3.0-arduino2-i686-w64-mingw32.zip" - } - ] - }, - { - "name": "avrdude", - "version": "6.3.0-arduino6", - "systems": [ - { - "size": "644600", - "checksum": "SHA-256:2426207423d58eb0e5fc4df9493418f1cb54ba3f328fdc7c3bb582f920b9cbe7", - "host": "arm-linux-gnueabihf", - "archiveFileName": "avrdude-6.3.0-arduino6-armhf-pc-linux-gnu.tar.bz2", - "url": "http://downloads.arduino.cc/tools/avrdude-6.3.0-arduino6-armhf-pc-linux-gnu.tar.bz2" - }, - { - "size": "696273", - "checksum": "SHA-256:d9a039c9e92d3dbb2011e75e6c044a1a4a2789e2fbf8386b1d580994811be084", - "host": "i386-apple-darwin11", - "archiveFileName": "avrdude-6.3.0-arduino6-i386-apple-darwin11.tar.bz2", - "url": "http://downloads.arduino.cc/tools/avrdude-6.3.0-arduino6-i386-apple-darwin11.tar.bz2" - }, - { - "size": "746653", - "checksum": "SHA-256:97b4875cad6110c70101bb776f3ac37b64a2e73f036cd0b10afb6f4be96a6621", - "host": "x86_64-linux-gnu", - "archiveFileName": "avrdude-6.3.0-arduino6-x86_64-pc-linux-gnu.tar.bz2", - "url": "http://downloads.arduino.cc/tools/avrdude-6.3.0-arduino6-x86_64-pc-linux-gnu.tar.bz2" - }, - { - "size": "733127", - "checksum": "SHA-256:5f4bc4b0957b1d34cec9908b7f84a7c297b894b39fe16a4992c284b24c00d6fb", - "host": "i686-linux-gnu", - "archiveFileName": "avrdude-6.3.0-arduino6-i686-pc-linux-gnu.tar.bz2", - "url": "http://downloads.arduino.cc/tools/avrdude-6.3.0-arduino6-i686-pc-linux-gnu.tar.bz2" - }, - { - "size": "645859", - "checksum": "SHA-256:7468a1bcdfa459d175a095b102c0de28efc466accfb104305fbcad7832659ddc", - "host": "i686-mingw32", - "archiveFileName": "avrdude-6.3.0-arduino6-i686-w64-mingw32.zip", - "url": "http://downloads.arduino.cc/tools/avrdude-6.3.0-arduino6-i686-w64-mingw32.zip" - } - ] - }, - { - "name": "avrdude", - "version": "6.3.0-arduino8", - "systems": [ - { - "size": "644550", - "checksum": "SHA-256:25a6834ae48019fccf37024236a1f79fe21760414292a4f3fa058d937ceee1ce", - "host": "arm-linux-gnueabihf", - "archiveFileName": "avrdude-6.3.0-arduino8-armhf-pc-linux-gnu.tar.bz2", - "url": "http://downloads.arduino.cc/tools/avrdude-6.3.0-arduino8-armhf-pc-linux-gnu.tar.bz2" - }, - { - "size": "697268", - "checksum": "SHA-256:be8a33a7ec01bb7123279466ffa31371e0aa4fccefffcc23ce71810b59531947", - "host": "i386-apple-darwin11", - "archiveFileName": "avrdude-6.3.0-arduino8-i386-apple-darwin11.tar.bz2", - "url": "http://downloads.arduino.cc/tools/avrdude-6.3.0-arduino8-i386-apple-darwin11.tar.bz2" - }, - { - "size": "711544", - "checksum": "SHA-256:85f38d02e2398d3b7f93da2ca8b830ee65bb73f66cc7a7b30c466d3cebf2da6e", - "host": "x86_64-linux-gnu", - "archiveFileName": "avrdude-6.3.0-arduino8-x86_64-pc-linux-gnu.tar.bz2", - "url": "http://downloads.arduino.cc/tools/avrdude-6.3.0-arduino8-x86_64-pc-linux-gnu.tar.bz2" - }, - { - "size": "701718", - "checksum": "SHA-256:8e2e4bc71d22e9d11ed143763b97f3aa2d164cdeee678a9deaf5b36e245b2d20", - "host": "i686-linux-gnu", - "archiveFileName": "avrdude-6.3.0-arduino8-i686-pc-linux-gnu.tar.bz2", - "url": "http://downloads.arduino.cc/tools/avrdude-6.3.0-arduino8-i686-pc-linux-gnu.tar.bz2" - }, - { - "size": "645996", - "checksum": "SHA-256:3a7592f6c33efd658b820c73d1058d3c868a297cbddb37da5644973c3b516d5e", - "host": "i686-mingw32", - "archiveFileName": "avrdude-6.3.0-arduino8-i686-w64-mingw32.zip", - "url": "http://downloads.arduino.cc/tools/avrdude-6.3.0-arduino8-i686-w64-mingw32.zip" - } - ] - }, - { - "name": "avrdude", - "version": "6.3.0-arduino9", - "systems": [ - { - "size": "644550", - "checksum": "SHA-256:25a6834ae48019fccf37024236a1f79fe21760414292a4f3fa058d937ceee1ce", - "host": "arm-linux-gnueabihf", - "archiveFileName": "avrdude-6.3.0-arduino9-armhf-pc-linux-gnu.tar.bz2", - "url": "http://downloads.arduino.cc/tools/avrdude-6.3.0-arduino9-armhf-pc-linux-gnu.tar.bz2" - }, - { - "size": "697309", - "checksum": "SHA-256:bfa06bc042dff252d3a8eded98da159484e75b46d2697da4d9446dcd2aea8465", - "host": "i386-apple-darwin11", - "archiveFileName": "avrdude-6.3.0-arduino9-i386-apple-darwin11.tar.bz2", - "url": "http://downloads.arduino.cc/tools/avrdude-6.3.0-arduino9-i386-apple-darwin11.tar.bz2" - }, - { - "size": "711229", - "checksum": "SHA-256:c8cccb84e2fe49ee837b24f0a60a99e9c371dae26e84c5b0b22b6b6aab2f1f6a", - "host": "x86_64-linux-gnu", - "archiveFileName": "avrdude-6.3.0-arduino9-x86_64-pc-linux-gnu.tar.bz2", - "url": "http://downloads.arduino.cc/tools/avrdude-6.3.0-arduino9-x86_64-pc-linux-gnu.tar.bz2" - }, - { - "size": "701590", - "checksum": "SHA-256:4235a2d58e3c3224c603d6c5f0610507ed6c48ebf4051fdcce9f77a7646e218b", - "host": "i686-linux-gnu", - "archiveFileName": "avrdude-6.3.0-arduino9-i686-pc-linux-gnu.tar.bz2", - "url": "http://downloads.arduino.cc/tools/avrdude-6.3.0-arduino9-i686-pc-linux-gnu.tar.bz2" - }, - { - "size": "645974", - "checksum": "SHA-256:f3c5cfa8d0b3b0caee81c5b35fb6acff89c342ef609bf4266734c6266a256d4f", - "host": "i686-mingw32", - "archiveFileName": "avrdude-6.3.0-arduino9-i686-w64-mingw32.zip", - "url": "http://downloads.arduino.cc/tools/avrdude-6.3.0-arduino9-i686-w64-mingw32.zip" - } - ] - }, - { - "name": "avrdude", - "version": "6.3.0-arduino14", - "systems": [ - { - "size": "219616", - "checksum": "SHA-256:d1a06275490d59a431c419788bbc53ffd5a79510dac1a35e63cf488621ba5589", - "host": "arm-linux-gnueabihf", - "archiveFileName": "avrdude-6.3.0-arduino14-armhf-pc-linux-gnu.tar.bz2", - "url": "http://downloads.arduino.cc/tools/avrdude-6.3.0-arduino14-armhf-pc-linux-gnu.tar.bz2" - }, - { - "size": "229688", - "checksum": "SHA-256:439f5de150695e3732dd598bb182dae6ec1e3a5cdb580f855d9b58e485e84e66", - "host": "aarch64-linux-gnu", - "archiveFileName": "avrdude-6.3.0-arduino14-aarch64-pc-linux-gnu.tar.bz2", - "url": "http://downloads.arduino.cc/tools/avrdude-6.3.0-arduino14-aarch64-pc-linux-gnu.tar.bz2" - }, - { - "size": "256917", - "checksum": "SHA-256:47d03991522722ce92120c60c4118685b7861909d895f34575001137961e4a63", - "host": "i386-apple-darwin11", - "archiveFileName": "avrdude-6.3.0-arduino14-i386-apple-darwin12.tar.bz2", - "url": "http://downloads.arduino.cc/tools/avrdude-6.3.0-arduino14-i386-apple-darwin11.tar.bz2" - }, - { - "size": "253366", - "checksum": "SHA-256:7986e8f3059353dc08f9234f7dbc98d9b2fa2242f046f02a8243a060f7358bfc", - "host": "x86_64-linux-gnu", - "archiveFileName": "avrdude-6.3.0-arduino14-x86_64-pc-linux-gnu.tar.bz2", - "url": "http://downloads.arduino.cc/tools/avrdude-6.3.0-arduino14-x86_64-pc-linux-gnu.tar.bz2" - }, - { - "size": "244293", - "checksum": "SHA-256:4f100e3843c635064997df91d2a079ab15cd30d1d7fa227280abe6a7c3bc74ca", - "host": "i686-linux-gnu", - "archiveFileName": "avrdude-6.3.0-arduino14-i686-pc-linux-gnu.tar.bz2", - "url": "http://downloads.arduino.cc/tools/avrdude-6.3.0-arduino14-i686-pc-linux-gnu.tar.bz2" - }, - { - "size": "328363", - "checksum": "SHA-256:69293e0de2eff8de89f553477795c25005f674a320bbba4b0222beb0194aa297", - "host": "i686-mingw32", - "archiveFileName": "avrdude-6.3.0-arduino14-i686-w64-mingw32.zip", - "url": "http://downloads.arduino.cc/tools/avrdude-6.3.0-arduino14-i686-w64-mingw32.zip" - } - ] - }, - { - "name": "arduinoOTA", - "version": "1.0.0", - "systems": [ - { - "size": "2044124", - "checksum": "SHA-256:850a86876403cb45c944590a8cc7f9d8ef6d53ed853f7a9593ec395c4c1c6b2d", - "host": "i686-linux-gnu", - "archiveFileName": "arduinoOTA-1.0.0-linux32.tar.bz2", - "url": "http://downloads.arduino.cc/tools/arduinoOTA-1.0.0-linux32.tar.bz2" - }, - { - "size": "2178772", - "checksum": "SHA-256:f01f25e02787492a8a30414230635adae76ed85228045437433892d185991f9e", - "host": "x86_64-linux-gnu", - "archiveFileName": "arduinoOTA-1.0.0-linux64.tar.bz2", - "url": "http://downloads.arduino.cc/tools/arduinoOTA-1.0.0-linux64.tar.bz2" - }, - { - "size": "1961623", - "checksum": "SHA-256:0ca6c0a93bfad50be0b6e62dc51ba6c3267b809bab4ec91ef9606ab7d838e46b", - "host": "arm-linux-gnueabihf", - "archiveFileName": "arduinoOTA-1.0.0-linuxarm.tar.bz2", - "url": "http://downloads.arduino.cc/tools/arduinoOTA-1.0.0-linuxarm.tar.bz2" - }, - { - "size": "2180617", - "checksum": "SHA-256:e63c6034da2c1a7fe453eaa29c22df88627cc0aa3c5cbab7635c19367b74ee59", - "host": "i386-apple-darwin11", - "archiveFileName": "arduinoOTA-1.0.0-osx.tar.bz2", - "url": "http://downloads.arduino.cc/tools/arduinoOTA-1.0.0-osx.tar.bz2" - }, - { - "size": "2247970", - "checksum": "SHA-256:7bced1489217e07661ea1e75702a10a874b54f6146e2414ee47684c7eac014d1", - "host": "i686-mingw32", - "archiveFileName": "arduinoOTA-1.0.0-windows.zip", - "url": "http://downloads.arduino.cc/tools/arduinoOTA-1.0.0-windows.zip" - } - ] - }, - { - "name": "arduinoOTA", - "version": "1.1.1", - "systems": [ - { - "size": "2045036", - "checksum": "SHA-256:7ac91ef1d5b357c0ceb790be02ef54986db598ba5a42fffbd6c8ecbdd6a271ef", - "host": "i686-linux-gnu", - "archiveFileName": "arduinoOTA-1.1.1-linux_386.tar.bz2", - "url": "http://downloads.arduino.cc/tools/arduinoOTA-1.1.1-linux_386.tar.bz2" - }, - { - "size": "2178288", - "checksum": "SHA-256:eb5ad0a457dd7f610f7f9b85454399c36755673d61a16f9d07cdfcbbb32ec277", - "host": "x86_64-linux-gnu", - "archiveFileName": "arduinoOTA-1.1.1-linux_amd64.tar.bz2", - "url": "http://downloads.arduino.cc/tools/arduinoOTA-1.1.1-linux_amd64.tar.bz2" - }, - { - "size": "1962115", - "checksum": "SHA-256:e4880d83df3d3f6f4b7b7bcde161e80a0556877468803a3c6066ee4ad18a374c", - "host": "arm-linux-gnueabihf", - "archiveFileName": "arduinoOTA-1.1.1-linux_arm.tar.bz2", - "url": "http://downloads.arduino.cc/tools/arduinoOTA-1.1.1-linux_arm.tar.bz2" - }, - { - "size": "2181376", - "checksum": "SHA-256:a1ce7cf578982f3af5e4fab6b5839e44830d7a41cb093faba5c4b45952a6fa55", - "host": "i386-apple-darwin11", - "archiveFileName": "arduinoOTA-1.1.1-darwin_amd64.tar.bz2", - "url": "http://downloads.arduino.cc/tools/arduinoOTA-1.1.1-darwin_amd64.tar.bz2" - }, - { - "size": "2248431", - "checksum": "SHA-256:b2d3610c77f969a68cd75b6ea66bf63ec10c263937009d99147fbcd975c90006", - "host": "i686-mingw32", - "archiveFileName": "arduinoOTA-1.1.1-windows_386.zip", - "url": "http://downloads.arduino.cc/tools/arduinoOTA-1.1.1-windows_386.zip" - } - ] - }, - { - "name": "arduinoOTA", - "version": "1.2.0", - "systems": [ - { - "size": "1839854", - "checksum": "SHA-256:7157a0b56620fb43b8dfb4afd958f8b294476a5ce4322c212167ca5d4092f2d9", - "host": "i686-linux-gnu", - "archiveFileName": "arduinoOTA-1.2.0-linux_386.tar.bz2", - "url": "http://downloads.arduino.cc/tools/arduinoOTA-1.2.0-linux_386.tar.bz2" - }, - { - "size": "1974030", - "checksum": "SHA-256:f672c1c407c4cb10729a1d891bdb8b010e2043e5415e1c2559bf39cdeaede78c", - "host": "x86_64-linux-gnu", - "archiveFileName": "arduinoOTA-1.2.0-linux_amd64.tar.bz2", - "url": "http://downloads.arduino.cc/tools/arduinoOTA-1.2.0-linux_amd64.tar.bz2" - }, - { - "size": "1787138", - "checksum": "SHA-256:ac49ffcd3239a6a52215f89dbda012d28f1296e6d79fc0efc3df06f919105744", - "host": "arm-linux-gnueabihf", - "archiveFileName": "arduinoOTA-1.2.0-linux_arm.tar.bz2", - "url": "http://downloads.arduino.cc/tools/arduinoOTA-1.2.0-linux_arm.tar.bz2" - }, - { - "size": "1992476", - "checksum": "SHA-256:160e83e77d7a60514ca40fedf34f539124aac4b9ae0e2bfdf8fda11d958de38f", - "host": "i386-apple-darwin11", - "archiveFileName": "arduinoOTA-1.2.0-darwin_amd64.tar.bz2", - "url": "http://downloads.arduino.cc/tools/arduinoOTA-1.2.0-darwin_amd64.tar.bz2" - }, - { - "size": "2003964", - "checksum": "SHA-256:9d26747093ab7966bfeffced9dbd7def0e164bba0db89f5efb3f7f8011496c8f", - "host": "i686-mingw32", - "archiveFileName": "arduinoOTA-1.2.0-windows_386.zip", - "url": "http://downloads.arduino.cc/tools/arduinoOTA-1.2.0-windows_386.zip" - } - ] - }, - { - "name": "arduinoOTA", - "version": "1.2.1", - "systems": [ - { - "size": "2133779", - "checksum": "SHA-256:2ffdf64b78486c1d0bf28dc23d0ca36ab75ca92e84b9487246da01888abea6d4", - "host": "i686-linux-gnu", - "archiveFileName": "arduinoOTA-1.2.1-linux_386.tar.bz2", - "url": "http://downloads.arduino.cc/tools/arduinoOTA-1.2.1-linux_386.tar.bz2" - }, - { - "size": "2257689", - "checksum": "SHA-256:5b82310d53688480f34a916aac31cd8f2dd2be65dd8fa6c2445262262e1948f9", - "host": "x86_64-linux-gnu", - "archiveFileName": "arduinoOTA-1.2.1-linux_amd64.tar.bz2", - "url": "http://downloads.arduino.cc/tools/arduinoOTA-1.2.1-linux_amd64.tar.bz2" - }, - { - "size": "2093132", - "checksum": "SHA-256:ad54b3dcd586212941fd992bab573b53d13207a419a3f2981c970a085ae0e9e0", - "host": "arm-linux-gnueabihf", - "archiveFileName": "arduinoOTA-1.2.1-linux_arm.tar.bz2", - "url": "http://downloads.arduino.cc/tools/arduinoOTA-1.2.1-linux_arm.tar.bz2" - }, - { - "size": "2093132", - "checksum": "SHA-256:ad54b3dcd586212941fd992bab573b53d13207a419a3f2981c970a085ae0e9e0", - "host": "aarch64-linux-gnu", - "archiveFileName": "arduinoOTA-1.2.1-linux_arm.tar.bz2", - "url": "http://downloads.arduino.cc/tools/arduinoOTA-1.2.1-linux_arm.tar.bz2" - }, - { - "size": "2244088", - "checksum": "SHA-256:93a6d9f9c0c765d237be1665bf7a0a8e2b0b6d2a8531eae92db807f5515088a7", - "host": "i386-apple-darwin11", - "archiveFileName": "arduinoOTA-1.2.1-darwin_amd64.tar.bz2", - "url": "http://downloads.arduino.cc/tools/arduinoOTA-1.2.1-darwin_amd64.tar.bz2" - }, - { - "size": "2237511", - "checksum": "SHA-256:e1ebf21f2c073fce25c09548c656da90d4ef6c078401ec6f323e0c58335115e5", - "host": "i686-mingw32", - "archiveFileName": "arduinoOTA-1.2.1-windows_386.zip", - "url": "http://downloads.arduino.cc/tools/arduinoOTA-1.2.1-windows_386.zip" - } - ] - }, - { - "name": "bossac", - "version": "1.5-arduino", - "systems": [ - { - "host": "arm-linux-gnueabihf", - "url": "http://downloads.arduino.cc/bossac-1.5-arduino2-arm-linux-gnueabihf.tar.bz2", - "archiveFileName": "bossac-1.5-arduino2-arm-linux-gnueabihf.tar.bz2", - "checksum": "SHA-256:7b61b7814e5b57bcbd853439fc9cd3e98af4abfdd369bf039c6917f9599e44b9", - "size": "199550" - }, - { - "host": "i686-mingw32", - "url": "http://downloads.arduino.cc/bossac-1.5-arduino2-mingw32.tar.gz", - "archiveFileName": "bossac-1.5-arduino2-mingw32.tar.gz", - "checksum": "SHA-256:9d849a34f0b26c25c6a8c4d741cd749dea238cade73b57a3048f248c431d9cc9", - "size": "222283" - }, - { - "host": "x86_64-apple-darwin", - "url": "http://downloads.arduino.cc/bossac-1.5-arduino2-i386-apple-darwin14.3.0.tar.gz", - "archiveFileName": "bossac-1.5-arduino2-i386-apple-darwin14.3.0.tar.gz", - "checksum": "SHA-256:8f07e50a1f887cb254092034c6a4482d73209568cd83cb624d6625d66794f607", - "size": "64120" - }, - { - "host": "x86_64-pc-linux-gnu", - "url": "http://downloads.arduino.cc/bossac-1.5-arduino2-x86_64-linux-gnu.tar.gz", - "archiveFileName": "bossac-1.5-arduino2-x86_64-linux-gnu.tar.gz", - "checksum": "SHA-256:42785329155dcb39872d4d30a2a9d31e0f0ce3ae7e34a3ed3d840cbc909c4657", - "size": "30431" - }, - { - "host": "i686-pc-linux-gnu", - "url": "http://downloads.arduino.cc/bossac-1.5-arduino2-i486-linux-gnu.tar.gz", - "archiveFileName": "bossac-1.5-arduino2-i486-linux-gnu.tar.gz", - "checksum": "SHA-256:ac56e553bbd6d992fa5592ace90996806230ab582f2bf9f8590836fec9dabef6", - "size": "29783" - } - ] - }, - { - "name": "bossac", - "version": "1.6-arduino", - "systems": [ - { - "host": "i686-mingw32", - "url": "http://downloads.arduino.cc/tools/bossac-1.6-arduino-mingw32.tar.gz", - "archiveFileName": "bossac-1.6-arduino-mingw32.tar.gz", - "checksum": "SHA-256:b59d64d3f7a43c894d0fba2dd1241bbaeefedf8c902130a24d8ec63b08f9ff6a", - "size": "222517" - }, - { - "host": "x86_64-apple-darwin", - "url": "http://downloads.arduino.cc/tools/bossac-1.6-arduino-i386-apple-darwin14.4.0.tar.gz", - "archiveFileName": "bossac-1.6-arduino-i386-apple-darwin14.4.0.tar.gz", - "checksum": "SHA-256:6b3b686a782b6587c64c85db80085c9089c5ea1b051e49e5af17b3c6109c8efa", - "size": "64538" - }, - { - "host": "x86_64-pc-linux-gnu", - "url": "http://downloads.arduino.cc/tools/bossac-1.6-arduino-x86_64-linux-gnu.tar.gz", - "archiveFileName": "bossac-1.6-arduino-x86_64-linux-gnu.tar.gz", - "checksum": "SHA-256:2ce7a54d609b4ce3b678147202b2556dd1ce5b318de48a018c676521b994c7a7", - "size": "30649" - }, - { - "host": "i686-pc-linux-gnu", - "url": "http://downloads.arduino.cc/tools/bossac-1.6-arduino-i486-linux-gnu.tar.gz", - "archiveFileName": "bossac-1.6-arduino-i486-linux-gnu.tar.gz", - "checksum": "SHA-256:5c320bf5cfdbf03e3f648642e6de325e459a061fcf96b2215cb955263f7467b2", - "size": "30072" - } - ] - }, - { - "name": "bossac", - "version": "1.6.1-arduino", - "systems": [ - { - "host": "arm-linux-gnueabihf", - "url": "http://downloads.arduino.cc/bossac-1.6.1-arduino-arm-linux-gnueabihf.tar.bz2", - "archiveFileName": "bossac-1.6.1-arduino-arm-linux-gnueabihf.tar.bz2", - "checksum": "SHA-256:8c4e63db982178919c824e7a35580dffc95c3426afa7285de3eb583982d4d391", - "size": "201341" - }, - { - "host": "i686-mingw32", - "url": "http://downloads.arduino.cc/bossac-1.6.1-arduino-mingw32.tar.gz", - "archiveFileName": "bossac-1.6.1-arduino-mingw32.tar.gz", - "checksum": "SHA-256:d59f43e2e83a337d04c4ae88b195a4ee175b8d87fff4c43144d23412a4a9513b", - "size": "222918" - }, - { - "host": "x86_64-apple-darwin", - "url": "http://downloads.arduino.cc/bossac-1.6.1-arduino-i386-apple-darwin14.5.0.tar.gz", - "archiveFileName": "bossac-1.6.1-arduino-i386-apple-darwin14.5.0.tar.gz", - "checksum": "SHA-256:2f80ef569a3fb19da60ab3489e49d8fe7d4699876acf30ff4938c632230a09aa", - "size": "64587" - }, - { - "host": "x86_64-pc-linux-gnu", - "url": "http://downloads.arduino.cc/bossac-1.6.1-arduino-x86_64-linux-gnu.tar.gz", - "archiveFileName": "bossac-1.6.1-arduino-x86_64-linux-gnu.tar.gz", - "checksum": "SHA-256:b78afc66c00ccfdd69a08bd3959c260a0c64ccce78a71d5a1135ae4437ff40db", - "size": "30869" - }, - { - "host": "i686-pc-linux-gnu", - "url": "http://downloads.arduino.cc/bossac-1.6.1-arduino-i486-linux-gnu.tar.gz", - "archiveFileName": "bossac-1.6.1-arduino-i486-linux-gnu.tar.gz", - "checksum": "SHA-256:1e211347569d75193b337296a10dd25b0ce04419e3d7dc644355178b6b514f92", - "size": "30320" - } - ] - }, - { - "name": "bossac", - "version": "1.7.0", - "systems": [ - { - "host": "i686-mingw32", - "url": "http://downloads.arduino.cc/tools/bossac-1.7.0-mingw32.tar.gz", - "archiveFileName": "bossac-1.7.0-mingw32.tar.gz", - "checksum": "SHA-256:9ef7d11b4fabca0adc17102a0290957d5cc26ce46b422c3a5344722c80acc7b2", - "size": "243066" - }, - { - "host": "x86_64-apple-darwin", - "url": "http://downloads.arduino.cc/tools/bossac-1.7.0-i386-apple-darwin15.6.0.tar.gz", - "archiveFileName": "bossac-1.7.0-i386-apple-darwin15.6.0.tar.gz", - "checksum": "SHA-256:feac36ab38876c163dcf51bdbcfbed01554eede3d41c59a0e152e170fe5164d2", - "size": "63822" - }, - { - "host": "x86_64-pc-linux-gnu", - "url": "http://downloads.arduino.cc/tools/bossac-1.7.0-x86_64-linux-gnu.tar.gz", - "archiveFileName": "bossac-1.7.0-x86_64-linux-gnu.tar.gz", - "checksum": "SHA-256:9475c0c8596c1ba12dcbce60e48fef7559087fa8eccbea7bab732113f3c181ee", - "size": "31373" - }, - { - "host": "i686-pc-linux-gnu", - "url": "http://downloads.arduino.cc/tools/bossac-1.7.0-i686-linux-gnu.tar.gz", - "archiveFileName": "bossac-1.7.0-i686-linux-gnu.tar.gz", - "checksum": "SHA-256:17003b0bdc698d52eeb91b09c34aec501c6e0285b4aa88659ab7cc407a451a4d", - "size": "31086" - }, - { - "host": "arm-linux-gnueabihf", - "url": "http://downloads.arduino.cc/tools/bossac-1.7.0-arm-linux-gnueabihf.tar.gz", - "archiveFileName": "bossac-1.7.0-arm-linux-gnueabihf.tar.gz", - "checksum": "SHA-256:09e46d0af61b2189caaac0bc6d4dd15cb22c167fdedc56ec98602dd5f10e68e0", - "size": "27382" - } - ] - }, - { - "name": "bossac", - "version": "1.7.0-arduino3", - "systems": [ - { - "host": "i686-mingw32", - "url": "http://downloads.arduino.cc/tools/bossac-1.7.0-arduino3-windows.tar.gz", - "archiveFileName": "bossac-1.7.0-arduino3-windows.tar.gz", - "checksum": "SHA-256:62745cc5a98c26949ec9041ef20420643c561ec43e99dae659debf44e6836526", - "size": "3607421" - }, - { - "host": "x86_64-apple-darwin", - "url": "http://downloads.arduino.cc/tools/bossac-1.7.0-arduino3-osx.tar.gz", - "archiveFileName": "bossac-1.7.0-arduino3-osx.tar.gz", - "checksum": "SHA-256:adb3c14debd397d8135e9e970215c6972f0e592c7af7532fa15f9ce5e64b991f", - "size": "75510" - }, - { - "host": "x86_64-pc-linux-gnu", - "url": "http://downloads.arduino.cc/tools/bossac-1.7.0-arduino3-linux64.tar.gz", - "archiveFileName": "bossac-1.7.0-arduino3-linux64.tar.gz", - "checksum": "SHA-256:1ae54999c1f97234a5c603eb99ad39313b11746a4ca517269a9285afa05f9100", - "size": "207271" - }, - { - "host": "i686-pc-linux-gnu", - "url": "http://downloads.arduino.cc/tools/bossac-1.7.0-arduino3-linux32.tar.gz", - "archiveFileName": "bossac-1.7.0-arduino3-linux32.tar.gz", - "checksum": "SHA-256:4ac4354746d1a09258f49a43ef4d1baf030d81c022f8434774268b00f55d3ec3", - "size": "193577" - }, - { - "host": "arm-linux-gnueabihf", - "url": "http://downloads.arduino.cc/tools/bossac-1.7.0-arduino3-linuxarm.tar.gz", - "archiveFileName": "bossac-1.7.0-arduino3-linuxarm.tar.gz", - "checksum": "SHA-256:626c6cc548046901143037b782bf019af1663bae0d78cf19181a876fb9abbb90", - "size": "193941" - }, - { - "host": "aarch64-linux-gnu", - "url": "http://downloads.arduino.cc/tools/bossac-1.7.0-arduino3-linuxaarch64.tar.gz", - "archiveFileName": "bossac-1.7.0-arduino3-linuxaarch64.tar.gz", - "checksum": "SHA-256:a098b2cc23e29f0dc468416210d097c4a808752cd5da1a7b9b8b7b931a04180b", - "size": "268365" - } - ] - }, - { - "name": "bossac", - "version": "1.8.0-48-gb176eee", - "systems": [ - { - "host": "i686-mingw32", - "url": "http://downloads.arduino.cc/tools/bossac-1.8-48-gb176eee-i686-w64-mingw32.tar.gz", - "archiveFileName": "bossac-1.8-48-gb176eee-i686-w64-mingw32.tar.gz", - "checksum": "SHA-256:4523a6897f3dfd673fe821c5cfbac8d6a12782e7a36b312b9ee7d41deec2a10a", - "size": "91219" - }, - { - "host": "x86_64-apple-darwin", - "url": "http://downloads.arduino.cc/tools/bossac-1.8-48-gb176eee-i386-apple-darwin16.1.0.tar.gz", - "archiveFileName": "bossac-1.8-48-gb176eee-i386-apple-darwin16.1.0.tar.gz", - "checksum": "SHA-256:581ecc16021de36638ae14e9e064ffb4a1d532a11502f4252da8bcdf5ce1d649", - "size": "39150" - }, - { - "host": "x86_64-pc-linux-gnu", - "url": "http://downloads.arduino.cc/tools/bossac-1.8-48-gb176eee-x86_64-linux-gnu.tar.gz", - "archiveFileName": "bossac-1.8-48-gb176eee-x86_64-linux-gnu.tar.gz", - "checksum": "SHA-256:1347eec67f5b90b785abdf6c8a8aa59129d0c016de7ff9b5ac1690378eacca3c", - "size": "37798" - }, - { - "host": "i686-pc-linux-gnu", - "url": "http://downloads.arduino.cc/tools/bossac-1.8-48-gb176eee-i486-linux-gnu.tar.gz", - "archiveFileName": "bossac-1.8-48-gb176eee-i486-linux-gnu.tar.gz", - "checksum": "SHA-256:4c7492f876b8269aa9d8bcaad3aeda31acf1a0292383093b6d9f5f1d23fdafc3", - "size": "37374" - }, - { - "host": "arm-linux-gnueabihf", - "url": "http://downloads.arduino.cc/tools/bossac-1.8-48-gb176eee-arm-linux-gnueabihf.tar.gz", - "archiveFileName": "bossac-1.8-48-gb176eee-arm-linux-gnueabihf.tar.gz", - "checksum": "SHA-256:2001e4a592f3aefd22f213b1ddd6f5d8d5e74bd04080cf1b97c24cbaa81b10ed", - "size": "34825" - } - ] - }, - { - "name": "openocd", - "version": "0.9.0-arduino", - "systems": [ - { - "host": "arm-linux-gnueabihf", - "url": "http://downloads.arduino.cc/tools/OpenOCD-0.9.0-arduino-arm-linux-gnueabihf.tar.bz2", - "archiveFileName": "OpenOCD-0.9.0-dev-arduino-arm-linux-gnueabihf.tar.bz2", - "checksum": "SHA-256:a84e7c4cba853f2c937d77286f8a0ca317447d3873e51cbd2a2d41424e044a18", - "size": "1402283" - }, - { - "host": "i686-mingw32", - "url": "http://downloads.arduino.cc/tools/OpenOCD-0.9.0-arduino-i686-pc-cygwin.tar.bz2", - "archiveFileName": "OpenOCD-0.9.0-arduino-i686-pc-cygwin.tar.bz2", - "checksum": "SHA-256:5310bdd3730168a33b09b68558e908ca8b2fec25620c488f50a5fb35d0d1effd", - "size": "2360705" - }, - { - "host": "x86_64-apple-darwin", - "url": "http://downloads.arduino.cc/tools/OpenOCD-0.9.0-arduino-x86_64-apple-darwin14.3.0.tar.bz2", - "archiveFileName": "OpenOCD-0.9.0-arduino-x86_64-apple-darwin14.3.0.tar.bz2", - "checksum": "SHA-256:ef90769c07b8018cec3a5054e690ac6c196e03720e102ac5038c3f9da4e44782", - "size": "2275101" - }, - { - "host": "x86_64-pc-linux-gnu", - "url": "http://downloads.arduino.cc/tools/OpenOCD-0.9.0-arduino-x86_64-linux-gnu.tar.bz2", - "archiveFileName": "OpenOCD-0.9.0-arduino-x86_64-linux-gnu.tar.bz2", - "checksum": "SHA-256:c350409f7badf213dfcc516ea34289461ad92d87806e8e33945508a2c6b2c0b3", - "size": "1210796" - }, - { - "host": "i686-pc-linux-gnu", - "url": "http://downloads.arduino.cc/tools/OpenOCD-0.9.0-arduino-i486-linux-gnu.tar.bz2", - "archiveFileName": "OpenOCD-0.9.0-arduino-i486-linux-gnu.tar.bz2", - "checksum": "SHA-256:4c9793dfd7822b0fc959d039e5ecabfa89092ee2911abfdc7b5905deb171499a", - "size": "1129654" - } - ] - }, - { - "name": "openocd", - "version": "0.9.0-arduino5-static", - "systems": [ - { - "host": "arm-linux-gnueabihf", - "url": "http://downloads.arduino.cc/tools/openocd-0.9.0-arduino5-static-arm-linux-gnueabihf.tar.bz2", - "archiveFileName": "openocd-0.9.0-arduino5-static-arm-linux-gnueabihf.tar.bz2", - "checksum": "SHA-256:cef48c1448664612dd25168f0a56962aec4ce2f1d7c06dafd86a1b606dc8ae20", - "size": "1319000" - }, - { - "host": "i686-mingw32", - "url": "http://downloads.arduino.cc/tools/openocd-0.9.0-arduino5-static-i686-w64-mingw32.zip", - "archiveFileName": "openocd-0.9.0-arduino5-static-i686-w64-mingw32.zip", - "checksum": "SHA-256:54c70a0bfa1b0a3a592d6ee9ab532f9715e1dede2e7d46a3232abd72de274c5a", - "size": "1641209" - }, - { - "host": "x86_64-apple-darwin", - "url": "http://downloads.arduino.cc/tools/openocd-0.9.0-arduino5-static-x86_64-apple-darwin15.6.0.tar.bz2", - "archiveFileName": "openocd-0.9.0-arduino5-static-x86_64-apple-darwin15.6.0.tar.bz2", - "checksum": "SHA-256:14be5c5400e1a32c3d6a15f9c8d2f438634974ab263ff437b91b527e5b5d53a4", - "size": "1235752" - }, - { - "host": "x86_64-pc-linux-gnu", - "url": "http://downloads.arduino.cc/tools/openocd-0.9.0-arduino5-static-x86_64-linux-gnu.tar.bz2", - "archiveFileName": "openocd-0.9.0-arduino5-static-x86_64-linux-gnu.tar.bz2", - "checksum": "SHA-256:8e378bdcd71c93a39818c16b49b91128c8028e3d9675551ba7eff39462391ba2", - "size": "1393855" - }, - { - "host": "i686-pc-linux-gnu", - "url": "http://downloads.arduino.cc/tools/openocd-0.9.0-arduino5-static-i686-linux-gnu.tar.bz2", - "archiveFileName": "openocd-0.9.0-arduino5-static-i686-linux-gnu.tar.bz2", - "checksum": "SHA-256:8e0787f54e204fe6e9071b2b7edf8a5e695492696f1182d447647fe5c0bd55bd", - "size": "1341739" - } - ] - }, - { - "name": "openocd", - "version": "0.9.0-arduino6-static", - "systems": [ - { - "host": "arm-linux-gnueabihf", - "url": "http://downloads.arduino.cc/tools/openocd-0.9.0-arduino6-static-arm-linux-gnueabihf.tar.bz2", - "archiveFileName": "openocd-0.9.0-arduino6-static-arm-linux-gnueabihf.tar.bz2", - "checksum": "SHA-256:5d596c90510f80d66f64a3615d74063a6a61f07b79be475592a3c76bf0deb3ca", - "size": "1319020" - }, - { - "host": "i686-mingw32", - "url": "http://downloads.arduino.cc/tools/openocd-0.9.0-arduino6-static-i686-w64-mingw32.zip", - "archiveFileName": "openocd-0.9.0-arduino6-static-i686-w64-mingw32.zip", - "checksum": "SHA-256:dde6c8cd42c179e819eeebee1d09829b0768ecb89b75fb10e1f053c1c65f9cf1", - "size": "1641514" - }, - { - "host": "x86_64-apple-darwin", - "url": "http://downloads.arduino.cc/tools/openocd-0.9.0-arduino6-static-x86_64-apple-darwin15.6.0.tar.bz2", - "archiveFileName": "openocd-0.9.0-arduino6-static-x86_64-apple-darwin15.6.0.tar.bz2", - "checksum": "SHA-256:00cd65339bc981ff0d4ab4876df8f89b1e60e476441fabca31d5fc2968bad9be", - "size": "1222523" - }, - { - "host": "x86_64-pc-linux-gnu", - "url": "http://downloads.arduino.cc/tools/openocd-0.9.0-arduino6-static-x86_64-linux-gnu.tar.bz2", - "archiveFileName": "openocd-0.9.0-arduino6-static-x86_64-linux-gnu.tar.bz2", - "checksum": "SHA-256:d2f58bbd0661b755fdb8a307d197f119d838b066f5510b25ee766e47d1774543", - "size": "1394293" - }, - { - "host": "i686-pc-linux-gnu", - "url": "http://downloads.arduino.cc/tools/openocd-0.9.0-arduino6-static-i686-linux-gnu.tar.bz2", - "archiveFileName": "openocd-0.9.0-arduino6-static-i686-linux-gnu.tar.bz2", - "checksum": "SHA-256:88d948c2062c73c0c93e649e099aaac4b009018cff365f44cfc5b47907043dc9", - "size": "1340444" - } - ] - }, - { - "name": "openocd", - "version": "0.10.0-arduino7", - "systems": [ - { - "size": "1638575", - "checksum": "SHA-256:f8e0d783e80a3d5f75ee82e9542315871d46e1e283a97447735f1cbcd8986b06", - "host": "arm-linux-gnueabihf", - "archiveFileName": "openocd-0.10.0-arduino7-static-arm-linux-gnueabihf.tar.bz2", - "url": "http://downloads.arduino.cc/tools/openocd-0.10.0-arduino7-static-arm-linux-gnueabihf.tar.bz2" - }, - { - "size": "1580739", - "checksum": "SHA-256:d47d728a9a8d98f28dc22e31d7127ced9de0d5e268292bf935e050ef1d2bdfd0", - "host": "aarch64-linux-gnu", - "archiveFileName": "openocd-0.10.0-arduino7-static-aarch64-linux-gnu.tar.bz2", - "url": "http://downloads.arduino.cc/tools/openocd-0.10.0-arduino7-static-aarch64-linux-gnu.tar.bz2" - }, - { - "size": "1498970", - "checksum": "SHA-256:1e539a587a0c54a551ce0dc542af10a2520b1c93bbfe2ca4ebaef4c83411df1a", - "host": "i386-apple-darwin11", - "archiveFileName": "openocd-0.10.0-arduino7-static-x86_64-apple-darwin13.tar.bz2", - "url": "http://downloads.arduino.cc/tools/openocd-0.10.0-arduino7-static-x86_64-apple-darwin13.tar.bz2" - }, - { - "size": "1701581", - "checksum": "SHA-256:91d418bd309ec1e98795c622cd25c936aa537c0b3828fa5bcb191389378a1b27", - "host": "x86_64-linux-gnu", - "archiveFileName": "openocd-0.10.0-arduino7-static-x86_64-ubuntu12.04-linux-gnu.tar.bz2", - "url": "http://downloads.arduino.cc/tools/openocd-0.10.0-arduino7-static-x86_64-ubuntu12.04-linux-gnu.tar.bz2" - }, - { - "size": "1626347", - "checksum": "SHA-256:08a18f39d72a5626383503053a30a5da89eed7fdccb6f514b20b77403eb1b2b4", - "host": "i686-linux-gnu", - "archiveFileName": "openocd-0.10.0-arduino7-static-i686-ubuntu12.04-linux-gnu.tar.bz2", - "url": "http://downloads.arduino.cc/tools/openocd-0.10.0-arduino7-static-i686-ubuntu12.04-linux-gnu.tar.bz2" - }, - { - "size": "2016965", - "checksum": "SHA-256:f251aec5471296e18aa540c3078d66475357a76a77c16c06a2d9345f4e12b3d5", - "host": "i686-mingw32", - "archiveFileName": "openocd-0.10.0-arduino7-static-i686-w64-mingw32.zip", - "url": "http://downloads.arduino.cc/tools/openocd-0.10.0-arduino7-static-i686-w64-mingw32.zip" - } - ] - }, - { - "name": "CMSIS", - "version": "4.0.0-atmel", - "systems": [ - { - "host": "arm-linux-gnueabihf", - "url": "http://downloads.arduino.cc/CMSIS-4.0.0.tar.bz2", - "archiveFileName": "CMSIS-4.0.0.tar.bz2", - "checksum": "SHA-256:7d637d2d7a0c6bacc22065848a201db2fff124268e4a56868260d0f472b4bbb7", - "size": "17642623" - }, - { - "host": "i686-mingw32", - "url": "http://downloads.arduino.cc/CMSIS-4.0.0.tar.bz2", - "archiveFileName": "CMSIS-4.0.0.tar.bz2", - "checksum": "SHA-256:7d637d2d7a0c6bacc22065848a201db2fff124268e4a56868260d0f472b4bbb7", - "size": "17642623" - }, - { - "host": "x86_64-apple-darwin", - "url": "http://downloads.arduino.cc/CMSIS-4.0.0.tar.bz2", - "archiveFileName": "CMSIS-4.0.0.tar.bz2", - "checksum": "SHA-256:7d637d2d7a0c6bacc22065848a201db2fff124268e4a56868260d0f472b4bbb7", - "size": "17642623" - }, - { - "host": "x86_64-pc-linux-gnu", - "url": "http://downloads.arduino.cc/CMSIS-4.0.0.tar.bz2", - "archiveFileName": "CMSIS-4.0.0.tar.bz2", - "checksum": "SHA-256:7d637d2d7a0c6bacc22065848a201db2fff124268e4a56868260d0f472b4bbb7", - "size": "17642623" - }, - { - "host": "i686-pc-linux-gnu", - "url": "http://downloads.arduino.cc/CMSIS-4.0.0.tar.bz2", - "archiveFileName": "CMSIS-4.0.0.tar.bz2", - "checksum": "SHA-256:7d637d2d7a0c6bacc22065848a201db2fff124268e4a56868260d0f472b4bbb7", - "size": "17642623" - } - ] - }, - { - "name": "CMSIS", - "version": "4.5.0", - "systems": - [ - { - "host": "i686-mingw32", - "url": "http://downloads.arduino.cc/CMSIS-4.5.0.tar.bz2", - "archiveFileName": "CMSIS-4.5.0.tar.bz2", - "checksum": "SHA-256:cd8f7eae9fc7c8b4a1b5e40b89b9666d33953b47d3d2eb81844f5af729fa224d", - "size": "31525196" - }, - { - "host": "x86_64-apple-darwin", - "url": "http://downloads.arduino.cc/CMSIS-4.5.0.tar.bz2", - "archiveFileName": "CMSIS-4.5.0.tar.bz2", - "checksum": "SHA-256:cd8f7eae9fc7c8b4a1b5e40b89b9666d33953b47d3d2eb81844f5af729fa224d", - "size": "31525196" - }, - { - "host": "x86_64-pc-linux-gnu", - "url": "http://downloads.arduino.cc/CMSIS-4.5.0.tar.bz2", - "archiveFileName": "CMSIS-4.5.0.tar.bz2", - "checksum": "SHA-256:cd8f7eae9fc7c8b4a1b5e40b89b9666d33953b47d3d2eb81844f5af729fa224d", - "size": "31525196" - }, - { - "host": "i686-pc-linux-gnu", - "url": "http://downloads.arduino.cc/CMSIS-4.5.0.tar.bz2", - "archiveFileName": "CMSIS-4.5.0.tar.bz2", - "checksum": "SHA-256:cd8f7eae9fc7c8b4a1b5e40b89b9666d33953b47d3d2eb81844f5af729fa224d", - "size": "31525196" - }, - { - "host": "arm-linux-gnueabihf", - "url": "http://downloads.arduino.cc/CMSIS-4.5.0.tar.bz2", - "archiveFileName": "CMSIS-4.5.0.tar.bz2", - "checksum": "SHA-256:cd8f7eae9fc7c8b4a1b5e40b89b9666d33953b47d3d2eb81844f5af729fa224d", - "size": "31525196" - }, - { - "host": "aarch64-linux-gnu", - "url": "http://downloads.arduino.cc/CMSIS-4.5.0.tar.bz2", - "archiveFileName": "CMSIS-4.5.0.tar.bz2", - "checksum": "SHA-256:cd8f7eae9fc7c8b4a1b5e40b89b9666d33953b47d3d2eb81844f5af729fa224d", - "size": "31525196" - }, - { - "host": "all", - "url": "http://downloads.arduino.cc/CMSIS-4.5.0.tar.bz2", - "archiveFileName": "CMSIS-4.5.0.tar.bz2", - "checksum": "SHA-256:cd8f7eae9fc7c8b4a1b5e40b89b9666d33953b47d3d2eb81844f5af729fa224d", - "size": "31525196" - } - ] - }, - { - "name": "CMSIS-Atmel", - "version": "1.0.0", - "systems": - [ - { - "host": "i686-mingw32", - "url": "http://downloads.arduino.cc/CMSIS-Atmel-1.0.0.tar.bz2", - "archiveFileName": "CMSIS-Atmel-1.0.0.tar.bz2", - "checksum": "SHA-256:b3c954570a2f8d9821c372e0864f5f0b86cfbeab8114ce95821f5c49758c7256", - "size": "1281654" - }, - { - "host": "x86_64-apple-darwin", - "url": "http://downloads.arduino.cc/CMSIS-Atmel-1.0.0.tar.bz2", - "archiveFileName": "CMSIS-Atmel-1.0.0.tar.bz2", - "checksum": "SHA-256:b3c954570a2f8d9821c372e0864f5f0b86cfbeab8114ce95821f5c49758c7256", - "size": "1281654" - }, - { - "host": "x86_64-pc-linux-gnu", - "url": "http://downloads.arduino.cc/CMSIS-Atmel-1.0.0.tar.bz2", - "archiveFileName": "CMSIS-Atmel-1.0.0.tar.bz2", - "checksum": "SHA-256:b3c954570a2f8d9821c372e0864f5f0b86cfbeab8114ce95821f5c49758c7256", - "size": "1281654" - }, - { - "host": "i686-pc-linux-gnu", - "url": "http://downloads.arduino.cc/CMSIS-Atmel-1.0.0.tar.bz2", - "archiveFileName": "CMSIS-Atmel-1.0.0.tar.bz2", - "checksum": "SHA-256:b3c954570a2f8d9821c372e0864f5f0b86cfbeab8114ce95821f5c49758c7256", - "size": "1281654" - }, - { - "host": "arm-linux-gnueabihf", - "url": "http://downloads.arduino.cc/CMSIS-Atmel-1.0.0.tar.bz2", - "archiveFileName": "CMSIS-Atmel-1.0.0.tar.bz2", - "checksum": "SHA-256:b3c954570a2f8d9821c372e0864f5f0b86cfbeab8114ce95821f5c49758c7256", - "size": "1281654" - }, - { - "host": "all", - "url": "http://downloads.arduino.cc/CMSIS-Atmel-1.0.0.tar.bz2", - "archiveFileName": "CMSIS-Atmel-1.0.0.tar.bz2", - "checksum": "SHA-256:b3c954570a2f8d9821c372e0864f5f0b86cfbeab8114ce95821f5c49758c7256", - "size": "1281654" - } - ] - }, - { - "name": "CMSIS-Atmel", - "version": "1.1.0", - "systems": - [ - { - "host": "i686-mingw32", - "url": "http://downloads.arduino.cc/CMSIS-Atmel-1.1.0.tar.bz2", - "archiveFileName": "CMSIS-Atmel-1.1.0.tar.bz2", - "checksum": "SHA-256:3ea5ec0451f42dc2b97f869b027a9cf696241cfc927cfc48d74ccc7b396ba41b", - "size": "1659108" - }, - { - "host": "x86_64-apple-darwin", - "url": "http://downloads.arduino.cc/CMSIS-Atmel-1.1.0.tar.bz2", - "archiveFileName": "CMSIS-Atmel-1.1.0.tar.bz2", - "checksum": "SHA-256:3ea5ec0451f42dc2b97f869b027a9cf696241cfc927cfc48d74ccc7b396ba41b", - "size": "1659108" - }, - { - "host": "x86_64-pc-linux-gnu", - "url": "http://downloads.arduino.cc/CMSIS-Atmel-1.1.0.tar.bz2", - "archiveFileName": "CMSIS-Atmel-1.1.0.tar.bz2", - "checksum": "SHA-256:3ea5ec0451f42dc2b97f869b027a9cf696241cfc927cfc48d74ccc7b396ba41b", - "size": "1659108" - }, - { - "host": "i686-pc-linux-gnu", - "url": "http://downloads.arduino.cc/CMSIS-Atmel-1.1.0.tar.bz2", - "archiveFileName": "CMSIS-Atmel-1.1.0.tar.bz2", - "checksum": "SHA-256:3ea5ec0451f42dc2b97f869b027a9cf696241cfc927cfc48d74ccc7b396ba41b", - "size": "1659108" - }, - { - "host": "arm-linux-gnueabihf", - "url": "http://downloads.arduino.cc/CMSIS-Atmel-1.1.0.tar.bz2", - "archiveFileName": "CMSIS-Atmel-1.1.0.tar.bz2", - "checksum": "SHA-256:3ea5ec0451f42dc2b97f869b027a9cf696241cfc927cfc48d74ccc7b396ba41b", - "size": "1659108" - }, - { - "host": "all", - "url": "http://downloads.arduino.cc/CMSIS-Atmel-1.1.0.tar.bz2", - "archiveFileName": "CMSIS-Atmel-1.1.0.tar.bz2", - "checksum": "SHA-256:3ea5ec0451f42dc2b97f869b027a9cf696241cfc927cfc48d74ccc7b396ba41b", - "size": "1659108" - } - ] - }, - { - "name": "CMSIS-Atmel", - "version": "1.2.0", - "systems": - [ - { - "host": "i686-mingw32", - "url": "http://downloads.arduino.cc/CMSIS-Atmel-1.2.0.tar.bz2", - "archiveFileName": "CMSIS-Atmel-1.2.0.tar.bz2", - "checksum": "SHA-256:5e02670be7e36be9691d059bee0b04ee8b249404687531f33893922d116b19a5", - "size": "2221805" - }, - { - "host": "x86_64-apple-darwin", - "url": "http://downloads.arduino.cc/CMSIS-Atmel-1.2.0.tar.bz2", - "archiveFileName": "CMSIS-Atmel-1.2.0.tar.bz2", - "checksum": "SHA-256:5e02670be7e36be9691d059bee0b04ee8b249404687531f33893922d116b19a5", - "size": "2221805" - }, - { - "host": "x86_64-pc-linux-gnu", - "url": "https://downloads.arduino.cc/CMSIS-Atmel-1.2.0.tar.bz2", - "archiveFileName": "CMSIS-Atmel-1.2.0.tar.bz2", - "checksum": "SHA-256:5e02670be7e36be9691d059bee0b04ee8b249404687531f33893922d116b19a5", - "size": "2221805" - }, - { - "host": "i686-pc-linux-gnu", - "url": "https://downloads.arduino.cc/CMSIS-Atmel-1.2.0.tar.bz2", - "archiveFileName": "CMSIS-Atmel-1.2.0.tar.bz2", - "checksum": "SHA-256:5e02670be7e36be9691d059bee0b04ee8b249404687531f33893922d116b19a5", - "size": "2221805" - }, - { - "host": "arm-linux-gnueabihf", - "url": "https://downloads.arduino.cc/CMSIS-Atmel-1.2.0.tar.bz2", - "archiveFileName": "CMSIS-Atmel-1.2.0.tar.bz2", - "checksum": "SHA-256:5e02670be7e36be9691d059bee0b04ee8b249404687531f33893922d116b19a5", - "size": "2221805" - }, - { - "host": "aarch64-linux-gnu", - "url": "https://downloads.arduino.cc/CMSIS-Atmel-1.2.0.tar.bz2", - "archiveFileName": "CMSIS-Atmel-1.2.0.tar.bz2", - "checksum": "SHA-256:5e02670be7e36be9691d059bee0b04ee8b249404687531f33893922d116b19a5", - "size": "2221805" - }, - { - "host": "all", - "url": "https://downloads.arduino.cc/CMSIS-Atmel-1.2.0.tar.bz2", - "archiveFileName": "CMSIS-Atmel-1.2.0.tar.bz2", - "checksum": "SHA-256:5e02670be7e36be9691d059bee0b04ee8b249404687531f33893922d116b19a5", - "size": "2221805" - } - ] - }, - { - "name": "dfu-util", - "version": "0.9.0-arduino1", - "systems": [ - { - "host": "i386-apple-darwin11", - "url": "http://downloads.arduino.cc/tools/dfu-util-0.9.0-arduino1-osx.tar.bz2", - "archiveFileName": "dfu-util-0.9.0-arduino1-osx.tar.bz2", - "size": "68361", - "checksum": "SHA-256:ea9216c627b7aa2d3a9bffab97df937e3c580cce66753c428dc697c854a35271" - }, - { - "host": "arm-linux-gnueabihf", - "url": "http://downloads.arduino.cc/tools/dfu-util-0.9.0-arduino1-arm.tar.bz2", - "archiveFileName": "dfu-util-0.9.0-arduino1-arm.tar.bz2", - "size": "194826", - "checksum": "SHA-256:480637bf578e74b19753666a049f267d8ebcd9dfc8660d48f246bb76d5b806f9" - }, - { - "host": "x86_64-linux-gnu", - "url": "http://downloads.arduino.cc/tools/dfu-util-0.9.0-arduino1-linux64.tar.bz2", - "archiveFileName": "dfu-util-0.9.0-arduino1-linux64.tar.bz2", - "size": "66230", - "checksum": "SHA-256:e8a4d5477ab8c44d8528f35bc7dfafa5f3f04dace513906514aea31adc6fd3ba" - }, - { - "host": "i686-linux-gnu", - "url": "http://downloads.arduino.cc/tools/dfu-util-0.9.0-arduino1-linux32.tar.bz2", - "archiveFileName": "dfu-util-0.9.0-arduino1-linux32.tar.bz2", - "size": "62608", - "checksum": "SHA-256:17d69213914da04dadd6464d8adbcd3581dd930eb666b8f3336ab5383ce2127f" - }, - { - "host": "i686-mingw32", - "url": "http://downloads.arduino.cc/tools/dfu-util-0.9.0-arduino1-windows.tar.bz2", - "archiveFileName": "dfu-util-0.9.0-arduino1-windows.tar.bz2", - "size": "377537", - "checksum": "SHA-256:29be01b298348be8b822391be7147b71a969d47bd5457d5b24cfa5981dbce78e" - } - ] - }, - { - "name": "windows-drivers", - "version": "1.6.9", - "systems": [ - { - "host": "i686-mingw32", - "url": "http://downloads.arduino.cc/tools/drivers-arduino-windows-1.6.9.zip", - "archiveFileName": "drivers-arduino-windows-1.6.9.zip", - "checksum": "SHA-256:10d456ab18d164d42545255db8bef4ac9e1bf660cc89acb7a0980b5a486654ac", - "size": "7071714" - } - ] - }, - { - "name": "windows-drivers", - "version": "1.8.0", - "systems": [ - { - "host": "i686-mingw32", - "url": "http://downloads.arduino.cc/tools/drivers-arduino-windows-1.8.0.zip", - "archiveFileName": "drivers-arduino-windows-1.8.0.zip", - "checksum": "SHA-256:60614b326ad6860ed0cb99eb4cb2cb69f9ba6ba3784396d5441fe3f99004f8ec", - "size": "16302148" - } - ] - }, - { - "name": "dfu-util", - "version": "0.8.0-stm32-arduino1", - "systems": [ - { - "archiveFileName": "dfu-util-0.8.0-stm32-arduino1-darwin_amd64.tar.bz2", - "checksum": "SHA-256:bb146803a4152ce2647d72b2cde68ff95eb3017c2460f24c4db922adac1fbd12", - "host": "i386-apple-darwin11", - "size": "68381", - "url": "http://downloads.arduino.cc/arduino.org/dfu-util-0.8.0-stm32-arduino1-darwin_amd64.tar.bz2" - }, - { - "archiveFileName": "dfu-util-0.8.0-stm32-arduino1-linux_arm.tar.bz2", - "checksum": "SHA-256:607e6b0f2d2787ed7837f26da30b100131e3db207f84b8aca94a377db6e9ae50", - "host": "arm-linux-gnueabihf", - "size": "213760", - "url": "http://downloads.arduino.cc/arduino.org/dfu-util-0.8.0-stm32-arduino1-linux_arm.tar.bz2" - }, - { - "archiveFileName": "dfu-util-0.8.0-stm32-arduino1-stm32-linux_amd64.tar.bz2", - "checksum": "SHA-256:e44287494ebd22f59fc79766a94e20306e59c6c799f5bb1cddeed80db95000d9", - "host": "x86_64-linux-gnu", - "size": "68575", - "url": "http://downloads.arduino.cc/arduino.org/dfu-util-0.8.0-stm32-arduino1-linux_amd64.tar.bz2" - }, - { - "archiveFileName": "dfu-util-0.8.0-stm32-arduino1-linux_386.tar.bz2", - "checksum": "SHA-256:58131e35ad5d7053b281bc6176face7b117c5ad63331e43c6801f8ccd57f59a4", - "host": "i686-linux-gnu", - "size": "69097", - "url": "http://downloads.arduino.cc/arduino.org/dfu-util-0.8.0-stm32-arduino1-linux_386.tar.bz2" - }, - { - "archiveFileName": "dfu-util-0.8.0-stm32-arduino1-windows_386.tar.bz2", - "checksum": "SHA-256:25c2f84e1acf1f10fd2aa1afced441366d4545fd41eae56e64f0b990b4ce9f55", - "host": "i686-mingw32", - "size": "159753", - "url": "http://downloads.arduino.cc/arduino.org/dfu-util-0.8.0-stm32-arduino1-windows_386.tar.bz2" - } - ] - }, - { - "name": "arduinoSTM32load", - "version": "2.0.0", - "systems": [ - { - "archiveFileName": "arduinoSTM32load-2.0.0-darwin_amd64.tar.bz2", - "checksum": "SHA-256:92fb9714091850febaa9d159501cbca5ba68d03020e5e2d4eff596154040bfaa", - "host": "i386-apple-darwin11", - "size": "807514", - "url": "http://downloads.arduino.cc/arduino.org/arduinoSTM32load-2.0.0-darwin_amd64.tar.bz2" - }, - { - "archiveFileName": "arduinoSTM32load-2.0.0-linux_arm.tar.bz2", - "checksum": "SHA-256:fc0d8058b57bda849e1ffc849f83f54b0b85f97954176db317da1c745c174e08", - "host": "arm-linux-gnueabihf", - "size": "809480", - "url": "http://downloads.arduino.cc/arduino.org/arduinoSTM32load-2.0.0-linux_arm.tar.bz2" - }, - { - "archiveFileName": "arduinoSTM32load-2.0.0-linux_amd64.tar.bz2", - "checksum": "SHA-256:0ed5cf1ea05fe6c33567817c54daf9c296d058a3607c428e0b0bd9aad89b9809", - "host": "x86_64-linux-gnu", - "size": "818885", - "url": "http://downloads.arduino.cc/arduino.org/arduinoSTM32load-2.0.0-linux_amd64.tar.bz2" - }, - { - "archiveFileName": "arduinoSTM32load-2.0.0-linux_386.tar.bz2", - "checksum": "SHA-256:fad50abaaca034e6d647d09b042291b761982aabfd42b6156411c86e4f873ca7", - "host": "i686-linux-gnu", - "size": "814283", - "url": "http://downloads.arduino.cc/arduino.org/arduinoSTM32load-2.0.0-linux_386.tar.bz2" - }, - { - "archiveFileName": "arduinoSTM32load-2.0.0-windows_386.tar.bz2", - "checksum": "SHA-256:79467c0cde4b88c4884acb09445a2186af4e41f901eee56e99b5d89b7065d085", - "host": "i686-mingw32", - "size": "786335", - "url": "http://downloads.arduino.cc/arduino.org/arduinoSTM32load-2.0.0-windows_386.tar.bz2" - } - ] - }, - { - "name": "openocd", - "version": "0.10.0-arduino1-static", - "systems": [ - { - "host": "i386-apple-darwin11", - "url": "http://downloads.arduino.cc/arduino.org/OpenOCD-0.10.0-nrf52-osx-static.tar.gz", - "archiveFileName": "OpenOCD-0.10.0-nrf52-osx-static.tar.gz", - "size": "1529841", - "checksum": "SHA-256:46bd02c1d42c5d94c4936e4d4a0ff29697b621840be9a6f882e316203122049d" - }, - { - "host": "x86_64-linux-gnu", - "url": "http://downloads.arduino.cc/arduino.org/OpenOCD-0.10.0-nrf52-linux64-static.tar.gz", - "archiveFileName": "OpenOCD-0.10.0-nrf52-linux64-static.tar.gz", - "size": "1777984", - "checksum": "SHA-256:1c9ae77930dd7377d8c13f84abe7307b67fdcd6da74cc1ce269a79e138e7a00a" - }, - { - "host": "i686-linux-gnu", - "url": "http://downloads.arduino.cc/arduino.org/OpenOCD-0.10.0-nrf52-linux32-static.tar.gz", - "archiveFileName": "OpenOCD-0.10.0-nrf52-linux32-static.tar.gz", - "size": "1713236", - "checksum": "SHA-256:777371df34828810e1bea623b0f7c98f28fedf30fd3bc8e7d8f0a5745fb4e258" - }, - { - "host": "i686-mingw32", - "url": "http://downloads.arduino.cc/arduino.org/OpenOCD-0.10.0-nrf52-win32-static.zip", - "archiveFileName": "OpenOCD-0.10.0-nrf52-win32-static.zip", - "size": "1773642", - "checksum": "SHA-256:9371b25d000bd589c058a5bf10720617adb91fd8b8a21d2e887cf45eaa2df93c" - }, - { - "host": "arm-linux-gnueabihf", - "url": "http://downloads.arduino.cc/arduino.org/OpenOCD-0.10.0-nrf52-arm-static.tar.gz", - "archiveFileName": "OpenOCD-0.10.0-nrf52-arm-static.tar.gz", - "size": "1526863", - "checksum": "SHA-256:b5172422077f87ff05b76ff40034979678c9c640e9d08cee15ce55e40dd8c929" - } - ] - }, - { - "name": "nrf5x-cl-tools", - "version": "9.3.1", - "systems": [ - { - "host": "i386-apple-darwin11", - "url": "http://downloads.arduino.cc/arduino.org/nRF5x-Command-Line-Tools_9_3_1_OSX.tar.bz2", - "archiveFileName": "nRF5x-Command-Line-Tools_9_3_1_OSX.tar.bz2", - "size": "341674", - "checksum": "SHA-256:41e4580271b39459a7ef1b078d11ee08d8f4f23fab7ff03f3fe8c3bc986a0ed4" - }, - { - "host": "x86_64-linux-gnu", - "url": "http://downloads.arduino.cc/arduino.org/nRF5x-Command-Line-Tools_9_3_1_Linux-x86_64.tar.bz2", - "archiveFileName": "nRF5x-Command-Line-Tools_9_3_1_Linux-x86_64.tar.bz2", - "size": "167414", - "checksum": "SHA-256:4074fffe678d60968006a72edd182c6506b264472c9957bc3eaa39336bfcf972" - }, - { - "host": "i686-linux-gnu", - "url": "http://downloads.arduino.cc/arduino.org/nRF5x-Command-Line-Tools_9_3_1_Linux-i386.tar.bz2", - "archiveFileName": "nRF5x-Command-Line-Tools_9_3_1_Linux-i386.tar.bz2", - "size": "155680", - "checksum": "SHA-256:e880059b303e5aad3a8b34c83dfd8c22beee77ae2074fbd37511e3baa91464a5" - }, - { - "host": "i686-mingw32", - "url": "http://downloads.arduino.cc/arduino.org/nRF5x-Command-Line-Tools_9_3_1_Win32.tar.bz2", - "archiveFileName": "nRF5x-Command-Line-Tools_9_3_1_Win32.tar.bz2", - "size": "812257", - "checksum": "SHA-256:a4467350e39314690cec2e96b80e7e3cab463c84eff9b81593ad57754d76ee00" - } - ] - } - ] - }, - { - "email": "support@intel.com", - "maintainer": "Intel", - "websiteURL": "http://maker.intel.com/", - "name": "Intel", - "platforms": [ - { - "name": "Intel i586 Boards", - "version": "1.6.2+1.0", - "category": "Arduino Certified", - "architecture": "i586", - "url": "https://github.com/01org/corelibs-galileo/archive/1.6.2+1.0.tar.gz", - "archiveFileName": "corelibs-galileo-1.6.2.tar.gz", - "checksum": "SHA-256:e20d62b0dccf0d68dbb61d70b866d77134b770b226d6046a61c7e8d55e64e53a", - "size": "272961", - "boards": [ - { - "name": "Galileo" - } - ], - "toolsDependencies": [ - { - "packager": "Intel", - "name": "i586-poky-linux-uclibc", - "version": "1.6.2+1.0" - }, - { - "packager": "Intel", - "name": "sketchUploader", - "version": "1.6.2+1.0" - } - ] - }, - { - "name": "Intel i686 Boards", - "version": "1.6.2+1.0", - "category": "Arduino Certified", - "architecture": "i686", - "url": "https://github.com/01org/corelibs-edison/archive/1.6.2+1.0.tar.gz", - "archiveFileName": "corelibs-edison-1.6.2.tar.gz", - "checksum": "SHA-256:538ab8553f832f56b04df80d44992ecc994b9c296f3fce6902832d97f99811a8", - "size": "271420", - "boards": [ - { - "name": "Edison" - } - ], - "toolsDependencies": [ - { - "packager": "Intel", - "name": "core2-32-poky-linux", - "version": "1.6.2+1.0" - }, - { - "packager": "Intel", - "name": "sketchUploader", - "version": "1.6.2+1.0" - } - ] - }, - { - "name": "Intel i586 Boards", - "version": "1.6.7+1.0", - "category": "Arduino Certified", - "architecture": "i586", - "url": "https://github.com/01org/corelibs-galileo/archive/1.6.7+1.0.tar.gz", - "archiveFileName": "corelibs-galileo-1.6.7.tar.gz", - "checksum": "SHA-256:4d161dde4c95ef8ebc264ca444ee6d1baaee70f9fd416e5f234f3f5cdd4ee028", - "size": "273392", - "boards": [ - { - "name": "Galileo" - } - ], - "toolsDependencies": [ - { - "packager": "Intel", - "name": "i586-poky-linux-uclibc", - "version": "1.6.2+1.0" - }, - { - "packager": "Intel", - "name": "sketchUploader", - "version": "1.6.2+1.0" - } - ] - }, - { - "name": "Intel i686 Boards", - "version": "1.6.7+1.0", - "category": "Arduino Certified", - "architecture": "i686", - "url": "https://github.com/01org/corelibs-edison/archive/1.6.7+1.0.tar.gz", - "archiveFileName": "corelibs-edison-1.6.7.tar.gz", - "checksum": "SHA-256:2b630b4986c4c7543946eef339ab8d08ed23d28aa6428d27f5b464ad2331a3f1", - "size": "272002", - "boards": [ - { - "name": "Edison" - } - ], - "toolsDependencies": [ - { - "packager": "Intel", - "name": "core2-32-poky-linux", - "version": "1.6.2+1.0" - }, - { - "packager": "Intel", - "name": "sketchUploader", - "version": "1.6.2+1.0" - } - ] - }, - { - "name": "Intel Curie Boards", - "version": "1.0.4", - "category": "Arduino Certified", - "architecture": "arc32", - "url": "https://github.com/arduino/ArduinoCore-arc32/archive/1.6.4+1.59.zip", - "archiveFileName": "arduino101-1.0.4.zip", - "checksum": "SHA-256:f440078eaf664d171180dda4264e8f2cf7b840e251c48f80e1ea9cfca6074fb1", - "size": "806100", - "boards": [ - { - "name": "Arduino 101" - } - ], - "toolsDependencies": [ - { - "packager": "Intel", - "version": "1.6.4+1.0", - "name": "arc-elf32" - }, - { - "packager": "Intel", - "version": "1.6.4+1.14", - "name": "sketchUploader" - } - ] - }, - { - "name": "Intel Curie Boards", - "version": "1.0.5", - "category": "Arduino Certified", - "architecture": "arc32", - "url": "https://github.com/arduino/ArduinoCore-arc32/archive/1.6.4+1.68.zip", - "archiveFileName": "arduino101-1.0.5.zip", - "checksum": "SHA-256:8c26b92491b12a9498453ed90a1178f47e9a7229fbfe129737f02ed24f55b542", - "size": "776592", - "boards": [ - { - "name": "Arduino/Genuino 101" - } - ], - "toolsDependencies": [ - { - "packager": "Intel", - "version": "1.6.4+1.0", - "name": "arc-elf32" - }, - { - "packager": "Intel", - "version": "1.6.4+1.18", - "name": "arduino101load" - } - ] - }, - { - "name": "Intel Curie Boards", - "version": "1.0.6", - "category": "Arduino Certified", - "archiveFileName": "arduino101-1.0.6.zip", - "architecture": "arc32", - "url": "https://github.com/arduino/ArduinoCore-arc32/archive/1.6.9+1.74.zip", - "checksum": "SHA-256:166c5d0f3c60c77495a08fe7d2debffb52195139854b3a42cfb6ae23b2fa2023", - "size": "672314", - "boards": [ - { - "name": "Arduino/Genuino 101" - } - ], - "toolsDependencies": [ - { - "packager": "Intel", - "version": "1.6.9+1.0.1", - "name": "arc-elf32" - }, - { - "packager": "Intel", - "version": "1.6.9+1.24", - "name": "arduino101load" - } - ] - }, - { - "name": "Intel Curie Boards", - "version": "1.0.7", - "category": "Arduino Certified", - "archiveFileName": "arduino101-1.0.7.zip", - "architecture": "arc32", - "url": "https://github.com/arduino/ArduinoCore-arc32/archive/1.6.11+1.83.zip", - "checksum": "SHA-256:e0fcc5175f00c521b5ed1fd3c78198bdb5fc43b8306247c62c83183572e1af8e", - "size": "729297", - "boards": [ - { - "name": "Arduino/Genuino 101" - } - ], - "toolsDependencies": [ - { - "packager": "Intel", - "version": "1.6.9+1.0.1", - "name": "arc-elf32" - }, - { - "packager": "Intel", - "version": "1.6.9+1.28", - "name": "arduino101load" - }, - { - "packager": "Intel", - "version": "0.9.0+0.1", - "name": "openocd" - }, - { - "packager": "Intel", - "version": "1.0.0", - "name": "flashpack" - } - ] - }, - { - "name": "Intel Curie Boards", - "version": "2.0.2", - "category": "Arduino Certified", - "archiveFileName": "corelibs-arduino101-2.0.2.zip", - "architecture": "arc32", - "url": "https://github.com/arduino/ArduinoCore-arc32/archive/2.0.2.zip", - "checksum": "SHA-256:2cea02dee6959f784c6bb6bdb2dc0eafa4c4d0ce5539da9cfa64dd6ce50939fe", - "size": "6242776", - "boards": [ - { - "name": "Arduino/Genuino 101" - } - ], - "toolsDependencies": [ - { - "packager": "Intel", - "version": "2.0.1", - "name": "arduino101load" - }, - { - "packager": "arduino", - "version": "0.9.0-arduino1", - "name": "dfu-util" - }, - { - "packager": "Intel", - "version": "1.6.9+1.0.1", - "name": "arc-elf32" - }, - { - "packager": "Intel", - "version": "0.9.0+0.1", - "name": "openocd" - }, - { - "packager": "Intel", - "version": "2.0.0", - "name": "flashpack" - } - ] - } - ], - "tools": [ - { - "name": "i586-poky-linux-uclibc", - "version": "1.6.2+1.0", - "systems": [ - { - "size": "30587705", - "checksum": "SHA-256:5b705d26dc1d8ca8953df6e0c08dcc8584d5be77b584d561f631360fd166677c", - "host": "i386-apple-darwin11", - "archiveFileName": "galileo-toolchain-20150323-osx.tar.bz2", - "url": "http://downloadmirror.intel.com/24806/eng/galileo-toolchain-osx-1.6.2-1.0.tar.bz2" - }, - { - "size": "45948648", - "checksum": "SHA-256:821eb290d7c668c1caa74da30903c13843edc746d41508b35161622ae6279b56", - "host": "i686-mingw32", - "archiveFileName": "galileo-toolchain-20150323-windows.zip", - "url": "http://downloadmirror.intel.com/24806/eng/galileo-toolchain-windows-1.6.2-1.0.zip" - }, - { - "size": "56227185", - "checksum": "SHA-256:935ccad3eaaec34f5de76eceb0f0ecd1372bdab0b7dc8f4241e8260c6f827b72", - "host": "x86_64-linux-gnu", - "archiveFileName": "galileo-toolchain-20150316-linux64.tar.bz2", - "url": "http://downloadmirror.intel.com/24806/eng/galileo-toolchain-linux64-1.6.2-1.0.tar.bz2" - }, - { - "size": "55098166", - "checksum": "SHA-256:1dab7f21e10d0208a6dd2897c36c6f5f55f9372b947225d2b59c3c4ab4777d03", - "host": "i686-linux-gnu", - "archiveFileName": "galileo-toolchain-20150316-linux32.tar.bz2", - "url": "http://downloadmirror.intel.com/24806/eng/galileo-toolchain-linux32-1.6.2-1.0.tar.bz2" - } - ] - }, - { - "name": "core2-32-poky-linux", - "version": "1.6.2+1.0", - "systems": [ - { - "size": "42720934", - "checksum": "SHA-256:fac0b3f00a33ee0531ea0da6d517c170409e25bd5e59f6f3db9506974336375d", - "host": "i386-apple-darwin11", - "archiveFileName": "edison-toolchain-20150323-osx.tar.bz2", - "url": "http://downloadmirror.intel.com/24806/eng/edison-toolchain-osx-1.6.2-1.0.tar.bz2" - }, - { - "size": "56683094", - "checksum": "SHA-256:5a9a1b51f0fa18bf21e1dcf1332d34331dd435c5ca0d1fe008e68e13cb3255e5", - "host": "i686-mingw32", - "archiveFileName": "edison-toolchain-20150323-windows.zip", - "url": "http://downloadmirror.intel.com/24806/eng/edison-toolchain-windows-1.6.2-1.0.zip" - }, - { - "size": "78998436", - "checksum": "SHA-256:e3443e7832732f2189fd424e4868d2ebb563e823addb2321a6e8a86a9fced193", - "host": "x86_64-linux-gnu", - "archiveFileName": "edison-toolchain-20150316-linux64.tar.bz2", - "url": "http://downloadmirror.intel.com/24806/eng/edison-toolchain-linux64-1.6.2-1.0.tar.bz2" - }, - { - "size": "76488215", - "checksum": "SHA-256:014d1bdc40bb080987c736d04ffd42cdc0d2c3cad001891fb01555dac04296f7", - "host": "i686-linux-gnu", - "archiveFileName": "edison-toolchain-20150316-linux32.tar.bz2", - "url": "http://downloadmirror.intel.com/24806/eng/edison-toolchain-linux32-1.6.2-1.0.tar.bz2" - } - ] - }, - { - "name": "arc-elf32", - "version": "1.6.4+1.0", - "systems": [ - { - "url": "https://downloadmirror.intel.com/25470/eng/arc-toolchain-windows-arcem.zip", - "checksum": "SHA-256:d7a3700e8762c656da66b1f85967ef1992c2473cee5bfc06b23aacfef7867435", - "host": "i686-mingw32", - "archiveFileName": "arc-toolchain-windows-arcem.zip", - "size": "218816528" - }, - { - "url": "https://downloadmirror.intel.com/25470/eng/arc-toolchain-osx-arcem.tar.bz2", - "checksum": "SHA-256:3818fbc4cfbb8bc826ae33f6869413463849a889e53b4e27da365f2489699ec1", - "host": "i386-apple-darwin11", - "archiveFileName": "arc-toolchain-osx-arcem.tar.bz2", - "size": "78371400" - }, - { - "url": "https://downloadmirror.intel.com/25470/eng/arc-toolchain-linux32-arcem.tar.bz2", - "checksum": "SHA-256:cb49a8b6a2d55712a0750813d56f8271d712252907fcd82b0cf690321be0d663", - "host": "i686-linux-gnu", - "archiveFileName": "arc-toolchain-linux32-arcem.tar.bz2", - "size": "182899676" - }, - { - "url": "https://downloadmirror.intel.com/25470/eng/arc-toolchain-linux64-arcem.tar.bz2", - "checksum": "SHA-256:0b538ae361b02a6329e00a009962c3bad91c48b07c78bb6343ffc6c19475e1a8", - "host": "x86_64-linux-gnu", - "archiveFileName": "arc-toolchain-linux64-arcem.tar.bz2", - "size": "177840353" - } - ] - }, - { - "name": "arc-elf32", - "version": "1.6.9+1.0.1", - "systems": [ - { - "url": "https://downloadmirror.intel.com/25470/eng/arc-toolchain-windows-arcem-1.0.1.zip", - "checksum": "SHA-256:59614534473a55b1d964e1f4fa14f5e01e6aaa426d1e8319a8293ffa6576f58e", - "host": "i686-mingw32", - "archiveFileName": "arc-toolchain-windows-arcem-1.0.1.zip", - "size": "172455793" - }, - { - "url": "https://downloadmirror.intel.com/25470/eng/arc-toolchain-osx-arcem-1.0.1.tar.bz2", - "checksum": "SHA-256:456995157cf1549073b9330a114abb25f056352278c107e25b3cc79443040a44", - "host": "i386-apple-darwin11", - "archiveFileName": "arc-toolchain-osx-arcem-1.0.1.tar.bz2", - "size": "30014953" - }, - { - "url": "https://downloadmirror.intel.com/25470/eng/arc-toolchain-linux32-arcem-1.0.1.tar.bz2", - "checksum": "SHA-256:6aa92f239998d10992592cc16a16352bb1cce75a6bff1c72b8be18d939182915", - "host": "i686-linux-gnu", - "archiveFileName": "arc-toolchain-linux32-arcem-1.0.1.tar.bz2", - "size": "116481978" - }, - { - "url": "https://downloadmirror.intel.com/25470/eng/arc-toolchain-linux64-arcem-1.0.1.tar.bz2", - "checksum": "SHA-256:0ee03cecc27471eae58cb557a105c5edaea45b49557c86867fa436a13681392c", - "host": "x86_64-linux-gnu", - "archiveFileName": "arc-toolchain-linux64-arcem-1.0.1.tar.bz2", - "size": "129250679" - } - ] - }, - { - "name": "sketchUploader", - "version": "1.6.2+1.0", - "systems": [ - { - "size": "61789", - "checksum": "SHA-256:8395ccb57c627f997fe01170df4613de906f48c6ce99623b9ca42806079c28ad", - "host": "i386-apple-darwin11", - "archiveFileName": "intel-arduino-tools-20150316-osx.tar.gz", - "url": "https://github.com/01org/intel-arduino-tools/archive/1.6.2+1.0-osx.tar.gz" - }, - { - "size": "2534586", - "checksum": "SHA-256:c32d1ae4cde190242eef95122d20dbcb5da226e7de6c567079a1c8c292267ae5", - "host": "i686-mingw32", - "archiveFileName": "intel-arduino-tools-20150316-windows.zip", - "url": "https://github.com/01org/intel-arduino-tools/archive/1.6.2+1.0-windows.zip" - }, - { - "size": "178239", - "checksum": "SHA-256:2876db4153db22609d2f6c9c3bfb198efbb9d9574edad579aca7d58cff9d2cca", - "host": "x86_64-linux-gnu", - "archiveFileName": "intel-arduino-tools-20150316-linux64.tar.gz", - "url": "https://github.com/01org/intel-arduino-tools/archive/1.6.2+1.0-linux64.tar.gz" - }, - { - "size": "187995", - "checksum": "SHA-256:20d87602d0194be626f592d3f2bdc9566a5a897786b042393482ef4c26ae158c", - "host": "i686-linux-gnu", - "archiveFileName": "intel-arduino-tools-20150316-linux32.tar.gz", - "url": "https://github.com/01org/intel-arduino-tools/archive/1.6.2+1.0-linux32.tar.gz" - } - ] - }, - { - "version": "1.6.4+1.14", - "name": "sketchUploader", - "systems": [ - { - "url": "https://github.com/01org/intel-arduino-tools/archive/1.6.4+1.14-windows.zip", - "checksum": "SHA-256:694cc2e85bca897f2c5bf867d16f11ae4e93134e329a08079a41a83fa9fd7beb", - "host": "i686-mingw32", - "archiveFileName": "1.6.4+1.14-windows.zip", - "size": "8239124" - }, - { - "url": "https://github.com/01org/intel-arduino-tools/archive/1.6.4+1.14-osx.tar.gz", - "checksum": "SHA-256:cd9c81e72667f42fca2047b12da330917607d2f2412772758d3b25565f61cb61", - "host": "i386-apple-darwin11", - "archiveFileName": "1.6.4+1.14-osx.tar.gz", - "size": "324645" - }, - { - "url": "https://github.com/01org/intel-arduino-tools/archive/1.6.4+1.14-linux32.tar.gz", - "checksum": "SHA-256:8bd55d901ef26f89a2e0e67551eb966de2b3bd90504d8204bd200510b85e1a9b", - "host": "i686-linux-gnu", - "archiveFileName": "1.6.4+1.14-linux32.tar.gz", - "size": "224137" - }, - { - "url": "https://github.com/01org/intel-arduino-tools/archive/1.6.4+1.14-linux64.tar.gz", - "checksum": "SHA-256:2da8ac969f6e1731adfe0802d015891109b834fdedfa5ca199742d5439b4f038", - "host": "x86_64-linux-gnu", - "archiveFileName": "1.6.4+1.14-linux64.tar.gz", - "size": "216542" - } - ] - }, - { - "version": "1.6.4+1.18", - "name": "arduino101load", - "systems": [ - { - "url": "https://github.com/01org/intel-arduino-tools/archive/1.6.4+1.19-windows.zip", - "checksum": "SHA-256:66c184ed5b045ba262ee86e17eb00280ebb6407b73b21979186ccc2270624bf7", - "host": "i686-mingw32", - "archiveFileName": "1.6.4+1.19-windows.zip", - "size": "9367650" - }, - { - "url": "https://github.com/01org/intel-arduino-tools/archive/1.6.4+1.18-osx.tar.gz", - "checksum": "SHA-256:c698ced53fe27030dfae9d198cc550357bf130ede204d6ccac5eaac8c15e159a", - "host": "i386-apple-darwin11", - "archiveFileName": "1.6.4+1.18-osx.tar.gz", - "size": "1236355" - }, - { - "url": "https://github.com/01org/intel-arduino-tools/archive/1.6.4+1.18-linux32.tar.gz", - "checksum": "SHA-256:96a9a3c9306b2ddcdecf96db64d7640c76422626a12488ef90ecd1ecdf451f3c", - "host": "i686-linux-gnu", - "archiveFileName": "1.6.4+1.18-linux32.tar.gz", - "size": "1269508" - }, - { - "url": "https://github.com/01org/intel-arduino-tools/archive/1.6.4+1.18-linux64.tar.gz", - "checksum": "SHA-256:0e7a9c95a4b8ed9dbd9b3e2dcd00cb22c0f41a0090efe7f144cdf6fc94eb2a19", - "host": "x86_64-linux-gnu", - "archiveFileName": "1.6.4+1.18-linux64.tar.gz", - "size": "1467166" - } - ] - }, - { - "version": "1.6.9+1.24", - "name": "arduino101load", - "systems": [ - { - "url": "https://github.com/01org/intel-arduino-tools/archive/1.6.9+1.24-windows.zip", - "checksum": "SHA-256:b531d93a8aa5dcb3e9338c553060f71835e6530639106e6976ca8d9dea0039b0", - "host": "i686-mingw32", - "archiveFileName": "arduino101load-1.6.9+1.24-windows.zip", - "size": "9418690" - }, - { - "url": "https://github.com/01org/intel-arduino-tools/archive/1.6.9+1.24-osx.tar.gz", - "checksum": "SHA-256:b927e7996f48d861d803b911317062b345fa631c4fbe2f85f2a0dcb651508e92", - "host": "i386-apple-darwin11", - "archiveFileName": "arduino101load-1.6.9+1.24-osx.tar.gz", - "size": "1241701" - }, - { - "url": "https://github.com/01org/intel-arduino-tools/archive/1.6.9+1.24-linux32.tar.gz", - "checksum": "SHA-256:db418197f6b4fbdc104b682fc4137cd955681af1d12147a663054e7f352a3785", - "host": "i686-linux-gnu", - "archiveFileName": "arduino101load-1.6.9+1.24-linux32.tar.gz", - "size": "1305107" - }, - { - "url": "https://github.com/01org/intel-arduino-tools/archive/1.6.9+1.24-linux64.tar.gz", - "checksum": "SHA-256:b7723d8edac0ed957304dc2e275a5628f6602962b93863f32cc1986e1c2ee6ab", - "host": "x86_64-linux-gnu", - "archiveFileName": "arduino101-1.6.9+1.24-linux64.tar.gz", - "size": "1507392" - } - ] - }, - { - "version": "1.6.9+1.28", - "name": "arduino101load", - "systems": [ - { - "url": "https://github.com/01org/intel-arduino-tools/archive/1.6.9+1.28-windows.zip", - "checksum": "SHA-256:0847ba5466ad97c4624c7b76c84aea036f24f1189828274310f52b86e6c3de1e", - "host": "i686-mingw32", - "archiveFileName": "arduino101load-1.6.9+1.28-windows.zip", - "size": "9331111" - }, - { - "url": "https://github.com/01org/intel-arduino-tools/archive/1.6.9+1.28-osx.tar.gz", - "checksum": "SHA-256:011fcb145728842aa6dc7a2332a12b7cd0d0e4f9eae7e9c35400d3727eb33db9", - "host": "i386-apple-darwin11", - "archiveFileName": "arduino101load-1.6.9+1.28-osx.tar.gz", - "size": "1134614" - }, - { - "url": "https://github.com/01org/intel-arduino-tools/archive/1.6.9+1.28-linux32.tar.gz", - "checksum": "SHA-256:36681f3dbe4edc04c0f6c3888ab7787c8015b0fce2d9cffccd17d7ec5fb1204d", - "host": "i686-linux-gnu", - "archiveFileName": "arduino101load-1.6.9+1.28-linux32.tar.gz", - "size": "1202482" - }, - { - "url": "https://github.com/01org/intel-arduino-tools/archive/1.6.9+1.28-linux64.tar.gz", - "checksum": "SHA-256:c691e2f077771b18a83b61c1cda96608150c80707adb7bac6b9665232bc74d4b", - "host": "x86_64-linux-gnu", - "archiveFileName": "arduino101load-1.6.9+1.28-linux64.tar.gz", - "size": "1411007" - } - ] - }, - { - "name": "arduino101load", - "version": "2.0.0", - "systems": [ - { - "host": "i386-apple-darwin11", - "url": "http://downloads.arduino.cc/tools/arduino101load-2.0.0-darwin_amd64.tar.bz2", - "archiveFileName": "arduino101load-2.0.0-darwin_amd64.tar.bz2", - "size": "1115949", - "checksum": "SHA-256:1adc2bb7ae5c12dabd2ce62a281285557d85d694d88e3578176a26a892546bff" - }, - { - "host": "arm-linux-gnueabihf", - "url": "http://downloads.arduino.cc/tools/arduino101load-2.0.0-linux_arm.tar.bz2", - "archiveFileName": "arduino101load-2.0.0-linux_arm.tar.bz2", - "size": "992362", - "checksum": "SHA-256:ce5bc6598481cbf058a86695f4661f4b9f3a37481a8a1401bc8aa6e38055c13f" - }, - { - "host": "x86_64-linux-gnu", - "url": "http://downloads.arduino.cc/tools/arduino101load-2.0.0-linux_amd64.tar.bz2", - "archiveFileName": "arduino101load-2.0.0-linux_amd64.tar.bz2", - "size": "1111450", - "checksum": "SHA-256:70965f1830e97bb8eafe1a4cea59a202aeb7c08dd2e9f46eb6a658d382cbf3fe" - }, - { - "host": "i686-linux-gnu", - "url": "http://downloads.arduino.cc/tools/arduino101load-2.0.0-linux_386.tar.bz2", - "archiveFileName": "arduino101load-2.0.0-linux_386.tar.bz2", - "size": "1002073", - "checksum": "SHA-256:3a0880cbfc795a94cbc90e8c5e6bcf3dc47b893be8b61ba8657f009fdec364a0" - }, - { - "host": "i686-mingw32", - "url": "http://downloads.arduino.cc/tools/arduino101load-2.0.0-windows_386.tar.bz2", - "archiveFileName": "arduino101load-2.0.0-windows_386.tar.bz2", - "size": "1046285", - "checksum": "SHA-256:90923d95f3d30fe3161fa0fcac344db12f99e2bfba396a48bec596d1870370ce" - } - ] - }, - { - "name": "arduino101load", - "version": "2.0.1", - "systems": [ - { - "host": "i386-apple-darwin11", - "url": "http://downloads.arduino.cc/tools/arduino101load-2.0.1-darwin_amd64.tar.bz2", - "archiveFileName": "arduino101load-2.0.1-darwin_amd64.tar.bz2", - "size": "1114375", - "checksum": "SHA-256:1f96480028a2aaa9475a1f44c5912236b6a039fced948fe2042a0353c88c1fb0" - }, - { - "host": "arm-linux-gnueabihf", - "url": "http://downloads.arduino.cc/tools/arduino101load-2.0.1-linux_arm.tar.bz2", - "archiveFileName": "arduino101load-2.0.1-linux_arm.tar.bz2", - "size": "992557", - "checksum": "SHA-256:ff02bc7b64dd2f6a526fd283c55b36cab15297d045ccd214ec70d12067ce0991" - }, - { - "host": "x86_64-linux-gnu", - "url": "http://downloads.arduino.cc/tools/arduino101load-2.0.1-linux_amd64.tar.bz2", - "archiveFileName": "arduino101load-2.0.1-linux_amd64.tar.bz2", - "size": "1111519", - "checksum": "SHA-256:b15a213b495e599b76ecd68253602b56ff5eebda4fadc53442e8c1917964a45e" - }, - { - "host": "i686-linux-gnu", - "url": "http://downloads.arduino.cc/tools/arduino101load-2.0.1-linux_386.tar.bz2", - "archiveFileName": "arduino101load-2.0.1-linux_386.tar.bz2", - "size": "1001211", - "checksum": "SHA-256:2941d1f2f726ca1dd3789a744a2084e8f9000912bdaf25ef888c90fd454057e9" - }, - { - "host": "i686-mingw32", - "url": "http://downloads.arduino.cc/tools/arduino101load-2.0.1-windows_386.tar.bz2", - "archiveFileName": "arduino101load-2.0.1-windows_386.tar.bz2", - "size": "1046214", - "checksum": "SHA-256:932373b6da9a8ad8ee9051937ea42cedde604fa8437050dcf7baa29564fc4547" - } - ] - }, - { - "name": "arduino101load", - "version": "2.1.0", - "systems": [ - { - "host": "i386-apple-darwin11", - "url": "http://downloads.arduino.cc/tools/arduino101load-2.1.0-darwin_amd64.tar.bz2", - "archiveFileName": "arduino101load-2.1.0-darwin_amd64.tar.bz2", - "size": "1188264", - "checksum": "SHA-256:068310277e032df5e36bd7cf351680462bd14f667536baf0b46e0f98e88a5616" - }, - { - "host": "arm-linux-gnueabihf", - "url": "http://downloads.arduino.cc/tools/arduino101load-2.1.0-linux_arm.tar.bz2", - "archiveFileName": "arduino101load-2.1.0-linux_arm.tar.bz2", - "size": "1110912", - "checksum": "SHA-256:440c407d3fcca28333830891550bd4ed62ff4a6fb54a488330291bb79e737e97" - }, - { - "host": "x86_64-linux-gnu", - "url": "http://downloads.arduino.cc/tools/arduino101load-2.1.0-linux_amd64.tar.bz2", - "archiveFileName": "arduino101load-2.1.0-linux_amd64.tar.bz2", - "size": "1184509", - "checksum": "SHA-256:c86f707914c733f51d705b32d45ade9d708913f458382f30b7436bdcdc9bb514" - }, - { - "host": "i686-linux-gnu", - "url": "http://downloads.arduino.cc/tools/arduino101load-2.1.0-linux_386.tar.bz2", - "archiveFileName": "arduino101load-2.1.0-linux_386.tar.bz2", - "size": "1065618", - "checksum": "SHA-256:b17ce537f26e6ececf176585859594e1a66dfb788f074711d0be4a563c1815d8" - }, - { - "host": "i686-mingw32", - "url": "http://downloads.arduino.cc/tools/arduino101load-2.1.0-windows_386.tar.bz2", - "archiveFileName": "arduino101load-2.1.0-windows_386.tar.bz2", - "size": "1078361", - "checksum": "SHA-256:32ff223937fbf747f1c552256627dfcb8eeccb4903342a9e8ac8b3e6d89cb4a7" - } - ] - }, - { - "version": "0.9.0+0.1", - "name": "openocd", - "systems": [ - { - "url": "https://github.com/01org/OpenOCD/releases/download/0.9-0.1/openocd-windows.zip", - "checksum": "SHA-256:95accfa22294cf150f33fba3cac45e6aa6857ebc2ba5dacebc2963b4a6021962", - "host": "i686-mingw32", - "archiveFileName": "openocd-windows-0.9.0.zip", - "size": "9181935" - }, - { - "url": "https://github.com/01org/OpenOCD/releases/download/0.9-0.1/openocd-osx.tar.bz2", - "checksum": "SHA-256:57083e887ba77826a5f532f4b1ca4b7390cb7a2e2744583576a72f28a77dcc44", - "host": "i386-apple-darwin11", - "archiveFileName": "openocd-osx-0.9.0.tar.bz2", - "size": "896625" - }, - { - "url": "https://github.com/01org/OpenOCD/releases/download/0.9-0.1/openocd-linux32.tar.bz2", - "checksum": "SHA-256:49d2a220e4b25eead4fe03d2ffa339ed946abef9cb718debdc7369f7b3c70534", - "host": "i686-linux-gnu", - "archiveFileName": "openocd-linux32-0.9.0.tar.bz2", - "size": "3923308" - }, - { - "url": "https://github.com/01org/OpenOCD/releases/download/0.9-0.1/openocd-linux64.tar.bz2", - "checksum": "SHA-256:4df6d3d387b45fa6214145f736c48c95109871fcd85fa81b81c01b533097a031", - "host": "x86_64-linux-gnu", - "archiveFileName": "openocd-linux64-0.9.0.tar.bz2", - "size": "4010990" - } - ] - }, - { - "version": "1.0.0", - "name": "flashpack", - "systems": [ - { - "url": "https://github.com/arduino/ArduinoCore-arc32/releases/download/1.0.7/arduino101-factory_ble-flashpack-ide.tar.bz2", - "checksum": "SHA-256:6d4422cfa5c21ceba522ebf298bf24ebb2f57089e6bbaf6356038ef6fae6ca6d", - "host": "i686-mingw32", - "archiveFileName": "arduino101-factory_ble-flashpack-ide.tar.bz2", - "size": "654391" - }, - { - "url": "https://github.com/arduino/ArduinoCore-arc32/releases/download/1.0.7/arduino101-factory_ble-flashpack-ide.tar.bz2", - "checksum": "SHA-256:6d4422cfa5c21ceba522ebf298bf24ebb2f57089e6bbaf6356038ef6fae6ca6d", - "host": "i386-apple-darwin11", - "archiveFileName": "arduino101-factory_ble-flashpack-ide.tar.bz2", - "size": "654391" - }, - { - "url": "https://github.com/arduino/ArduinoCore-arc32/releases/download/1.0.7/arduino101-factory_ble-flashpack-ide.tar.bz2", - "checksum": "SHA-256:6d4422cfa5c21ceba522ebf298bf24ebb2f57089e6bbaf6356038ef6fae6ca6d", - "host": "i686-linux-gnu", - "archiveFileName": "arduino101-factory_ble-flashpack-ide.tar.bz2", - "size": "654391" - }, - { - "url": "https://github.com/arduino/ArduinoCore-arc32/releases/download/1.0.7/arduino101-factory_ble-flashpack-ide.tar.bz2", - "checksum": "SHA-256:6d4422cfa5c21ceba522ebf298bf24ebb2f57089e6bbaf6356038ef6fae6ca6d", - "host": "x86_64-linux-gnu", - "archiveFileName": "arduino101-factory_ble-flashpack-ide.tar.bz2", - "size": "654391" - } - ] - }, - { - "version": "2.0.0", - "name": "flashpack", - "systems": [ - { - "url": "https://github.com/arduino/ArduinoCore-arc32/releases/download/2.0.0/flashpack_ble_v3.tar.bz2", - "checksum": "SHA-256:d5c9dfacfa4a12580d8853db32c194537aa920f43564e99aee42f069590cce3e", - "host": "i686-mingw32", - "archiveFileName": "flashpack_ble_v3.tar.bz2", - "size": "678394" - }, - { - "url": "https://github.com/arduino/ArduinoCore-arc32/releases/download/2.0.0/flashpack_ble_v3.tar.bz2", - "checksum": "SHA-256:d5c9dfacfa4a12580d8853db32c194537aa920f43564e99aee42f069590cce3e", - "host": "i386-apple-darwin11", - "archiveFileName": "flashpack_ble_v3.tar.bz2", - "size": "678394" - }, - { - "url": "https://github.com/arduino/ArduinoCore-arc32/releases/download/2.0.0/flashpack_ble_v3.tar.bz2", - "checksum": "SHA-256:d5c9dfacfa4a12580d8853db32c194537aa920f43564e99aee42f069590cce3e", - "host": "i686-linux-gnu", - "archiveFileName": "flashpack_ble_v3.tar.bz2", - "size": "678394" - }, - { - "url": "https://github.com/arduino/ArduinoCore-arc32/releases/download/2.0.0/flashpack_ble_v3.tar.bz2", - "checksum": "SHA-256:d5c9dfacfa4a12580d8853db32c194537aa920f43564e99aee42f069590cce3e", - "host": "x86_64-linux-gnu", - "archiveFileName": "flashpack_ble_v3.tar.bz2", - "size": "678394" - } - ] - } - ] - }, - { - "name": "atmel-avr-xminis", - "maintainer": "Atmel University France", - "websiteURL": "https://github.com/AtmelUniversityFrance/atmel-avr-xmini-boardmanagermodule/wiki", - "help": - { - "online": "http://www.arduino.cc/en/Reference/HomePage" - }, - "platforms": - [ - { - "name": "Atmel AVR Xplained-minis", - "architecture": "avr", - "version": "0.3.0", - "category": "Partner", - "url": "https://github.com/AtmelUniversityFrance/atmel-avr-xmini-boardmanagermodule/releases/download/v0.3.0/atmel-avr-xmini-boardmanagermodule-0.3.0.tar.bz2", - "archiveFileName": "atmel-avr-xmini-boardmanagermodule-0.3.0.tar.bz2", - "checksum": "SHA-256:3bf7739682bdd86c8e8e566769429e424859f23022664295f800df489c782f18", - "size": "95352", - "boards": [ - { - "name": "atmega168pb-xmini" - }, - { - "name": "atmega328pb-xmini" - }, - { - "name": "atmega328p-xmini" - } - ], - "toolsDependencies": - [ - { - "packager": "arduino", - "name": "avr-gcc", - "version": "4.8.1-arduino5" - }, - { - "packager": "arduino", - "name": "avrdude", - "version": "6.0.1-arduino5" - } - ] - }, - { - "name": "Atmel AVR Xplained-minis", - "architecture": "avr", - "version": "0.4.0", - "category": "Partner", - "url": "https://github.com/AtmelUniversityFrance/atmel-avr-xmini-boardmanagermodule/releases/download/v0.4.0/atmel-avr-xmini-boardmanagermodule-0.4.0.tar.bz2", - "archiveFileName": "atmel-avr-xmini-boardmanagermodule-0.4.0.tar.bz2", - "checksum": "SHA-256:36e09208c91071ff2fce4a7ed06463cf820c867d9f59477192d18965c0830ed5", - "size": "95452", - "boards": [ - { - "name": "atmega168pb-xmini" - }, - { - "name": "atmega328pb-xmini" - }, - { - "name": "atmega328p-xmini" - } - ], - "toolsDependencies": - [ - ] - }, - { - "name": "Atmel AVR Xplained-minis", - "architecture": "avr", - "version": "0.5.0", - "category": "Partner", - "url": "https://github.com/AtmelUniversityFrance/atmel-avr-xmini-boardmanagermodule/releases/download/v0.5.0/atmel-avr-xmini-boardmanagermodule-0.5.0.tar.bz2", - "archiveFileName": "atmel-avr-xmini-boardmanagermodule-0.5.0.tar.bz2", - "checksum": "SHA-256:e2e401fc30f8e8519bcd628884699373dc386d83a366c740b1895aa9b8cc30f4", - "size": "95573", - "boards": [ - { - "name": "atmega168pb-xmini" - }, - { - "name": "atmega328pb-xmini" - }, - { - "name": "atmega328p-xmini" - } - ], - "toolsDependencies": - [ - ] - }, - { - "name": "Atmel AVR Xplained-minis", - "architecture": "avr", - "version": "0.6.0", - "category": "Partner", - "url": "https://github.com/AtmelUniversityFrance/atmel-avr-xmini-boardmanagermodule/releases/download/v0.6.0/atmel-avr-xmini-boardmanagermodule-0.6.0.tar.bz2", - "archiveFileName": "atmel-avr-xmini-boardmanagermodule-0.6.0.tar.bz2", - "checksum": "SHA-256:60bcb315a33056fac9b1d626ac039b3439efdae821ba91b70e09dc5ce8e07f88", - "size": "95447", - "boards": [ - { - "name": "atmega168pb-xmini" - }, - { - "name": "atmega328pb-xmini" - }, - { - "name": "atmega328p-xmini" - } - ], - "toolsDependencies": - [ - ] - } - ], - "tools": - [ - ] - }, - { - "name":"littleBits", - "maintainer":"littleBits Electronics", - "websiteURL":"http://www.littlebits.cc/bits/w6-arduino", - "email":"support@littlebits.cc", - "help":{ - "online":"http://www.littlebits.cc/arduino-help" - }, - "platforms":[ - { - "name":"littleBits Arduino AVR Modules", - "architecture":"avr", - "version":"1.0.0", - "category": "Arduino@Heart", - "url": "http://downloads.arduino.cc/cores/littlebits-avr-1.0.0.tar.bz2", - "archiveFileName":"littlebits-avr-1.0.0.tar.bz2", - "checksum":"SHA-256:8B867B8E89718B405231681CF9091F24372FAEF8B5B9FFBFBCF2486E3D9B5324", - "size":"27762", - "help":{ - "online":"http://www.littlebits.cc/arduino-help" - }, - "boards":[ - { "name":"littleBits w6 Arduino module" } - ], - "toolsDependencies":[ - { "packager":"arduino", "name":"avr-gcc", "version":"4.8.1-arduino5" }, - { "packager":"arduino", "name":"avrdude", "version":"6.0.1-arduino5" } - ] - } - ], - "tools":[] - }, - { - "name": "Microsoft", - "maintainer": "Microsoft.IoT", - "websiteURL": "https://github.com/ms-iot/iot-utilities/tree/master/IotCoreAppDeployment/ArduinoIde/", - "email": "bfjelds@microsoft.com", - "help": { - "online": "http://developer.microsoft.com/en-us/windows/iot/IotCoreAppDeployment_ArduinoIde.htm" - }, - "platforms": [ - { - "name": "Windows 10 Iot Core", - "architecture": "win10", - "version": "1.0.0", - "category": "Contributed", - "help": { - "online": "http://developer.microsoft.com/en-us/windows/iot/IotCoreAppDeployment_ArduinoIde.htm" - }, - "url": "https://github.com/ms-iot/iot-utilities/raw/master/IotCoreAppDeployment/ArduinoIde/release/win10_iotcore-1.0.0_ide-1.6.6.zip", - "archiveFileName": "win10_iotcore-1.0.0_ide-1.6.6.zip", - "checksum": "SHA-256:ed1b42b396217e242cd3a5b597ad5dad5957cb8117dd0f972376bafab7d8a0e5", - "size": "47325480", - "boards": [ - {"name": "Windows 10 IoT Core"} - ], - "toolsDependencies":[] - }, - { - "name": "Windows 10 Iot Core", - "architecture": "win10", - "version": "1.1.0", - "category": "Contributed", - "help": { - "online": "http://developer.microsoft.com/en-us/windows/iot/IotCoreAppDeployment_ArduinoIde.htm" - }, - "url": "https://github.com/ms-iot/iot-utilities/raw/master/IotCoreAppDeployment/ArduinoIde/release/win10_iotcore-1.1.0_ide-1.6.6.zip", - "archiveFileName": "win10_iotcore-1.1.0_ide-1.6.6.zip", - "checksum": "SHA-256:683dcb0a72e80b9d21117f6471e0860d8cc35cd9b86557ba6fd1ed255952413e", - "size": "48316890", - "boards": [ - {"name": "Windows 10 IoT Core"} - ], - "toolsDependencies":[] - }, - { - "name": "Windows 10 Iot Core", - "architecture": "win10", - "version": "1.1.1", - "category": "Contributed", - "help": { - "online": "http://ms-iot.github.io/content/en-US/win10/IotCoreAppDeployment_ArduinoIde.htm" - }, - "url": "https://github.com/ms-iot/iot-utilities/raw/master/IotCoreAppDeployment/ArduinoIde/release/win10_iotcore-1.1.1_ide-1.6.11.zip", - "archiveFileName": "win10_iotcore-1.1.1_ide-1.6.11.zip", - "checksum": "SHA-256:f455f2829164065faacde141b3c15604c51bb79b6874d55d1124c66aae372693", - "size": "48317624", - "boards": [ - {"name": "Windows 10 IoT Core"} - ], - "toolsDependencies":[] - }, - { - "name": "Windows 10 Iot Core", - "architecture": "win10", - "version": "1.1.2", - "category": "Contributed", - "help": { - "online": "http://ms-iot.github.io/content/en-US/win10/IotCoreAppDeployment_ArduinoIde.htm" - }, - "url": "https://github.com/ms-iot/iot-utilities/raw/master/IotCoreAppDeployment/ArduinoIde/release/win10_iotcore-1.1.2_ide-1.6.11.zip", - "archiveFileName": "win10_iotcore-1.1.2_ide-1.6.11.zip", - "checksum": "SHA-256:b1c9956b46f33bcebb7f500d29931b19ed4723c713ac0439681ea1fb172722d1", - "size": "48317648", - "boards": [ - {"name": "Windows 10 IoT Core"} - ], - "toolsDependencies":[] - } - ], - "tools":[] - }, - { - "name": "Arrow", - "maintainer": "Axel Elettronica S.r.l.", - "websiteURL": "http://axelelettronica.it/", - "email": "development@axelelettronica.it", - "help": { - "online": "http://www.arrowsmarteverything.com/support/" - }, - "platforms": [ - { - "name": "Arrow Boards", - "architecture": "samd", - "version": "1.2.0", - "category": "Partner", - "url": "http://downloads.arduino.cc/cores/Arrow-samd-1.2.0.tar.bz2", - "archiveFileName": "Arrow-samd-1.2.0.tar.bz2", - "checksum": "SHA-256:1d1cd66eb9986ed60a45b6554b8dcbf168401339c8a06bcf45c1b6ee2efa0943", - "size": "36575", - "boards": [ - {"name": "SmartEverything Fox"}, - {"name": "SmartTutto"} - ], - "toolsDependencies": [ - { - "packager": "arduino", - "name": "arm-none-eabi-gcc", - "version": "4.8.3-2014q1" - }, - { - "packager": "arduino", - "name": "bossac", - "version": "1.5-arduino" - }, - { - "packager": "arduino", - "name": "openocd", - "version": "0.9.0-arduino" - }, - { - "packager": "arduino", - "name": "CMSIS", - "version": "4.0.0-atmel" - } - ] - }, - { - "name": "Arrow Boards", - "architecture": "samd", - "version": "2.0.0", - "category": "Partner", - "url": "http://downloads.arduino.cc/cores/Arrow-samd-2.0.0.tar.gz", - "archiveFileName": "Arrow-samd-2.0.0.tar.gz", - "checksum": "SHA-256:e0bbf85d28af03a196a625462598294f9dd30ffbc9d686cbf2cc09bc5a76421a", - "size": "772778", - "boards": [ - {"name": "SmartEverything Fox"}, - {"name": "SmartEverything Fox3"}, - {"name": "SmartEverything Lion"}, - {"name": "SmartEverything Dragonfly"}, - {"name": "Analog ADI"}, - {"name": "SmartTutto"} - ], - "toolsDependencies": [ - ] - }, - { - "name": "Arrow Boards", - "architecture": "samd", - "version": "2.1.0", - "category": "Partner", - "url": "http://downloads.arduino.cc/cores/Arrow-samd-2.1.0.tar.gz", - "archiveFileName": "Arrow-samd-2.1.0.tar.gz", - "checksum": "SHA-256:fc593dba03249300a9e2cff88c06f50389681e4fe6e3c92207d3ffb8a8a673f7", - "size": "780064", - "boards": [ - {"name": "SmartEverything Fox"}, - {"name": "SmartEverything Fox3"}, - {"name": "SmartEverything Lion"}, - {"name": "SmartEverything Dragonfly"}, - {"name": "Analog ADI"}, - {"name": "SmartTutto"} - ], - "toolsDependencies": [ - ] - } - ], - "tools": [ - ] - }, - { - "name": "emoro", - "maintainer": "Inovatic-ICT", - "websiteURL": "http://www.emoro.eu/shop/system/download/EMoRo2560_and_GLAM_brochure.pdf.0b83da8ad90db30722cca3a5d2529494", - "email": "support@inovatic-ict.com", - "help": { - "online": "http://www.emoro.eu/shop/index.php?route=product/product&product_id=52" - }, - "platforms": [ - { - "name": "EMORO 2560", - "architecture": "avr", - "version": "3.2.1", - "category": "Arduino@Heart", - "url": "http://downloads.arduino.cc/cores/EMoRo_2560-3.2.1.zip", - "archiveFileName": "EMoRo_2560-3.2.1.zip", - "checksum": "SHA-256:56dd308fc2f84229688f6219a4c31629ec9b38bdadcd382c45fae9247b94f051", - "size": "846444", - "boards": [ - {"name": "EMoRo 2560. Board based on ATmega 2560 MCU"} - ], - "toolsDependencies": [ - ] - }, - { - "name": "EMORO 2560", - "architecture": "avr", - "version": "3.2.2", - "category": "Arduino@Heart", - "url": "http://downloads.arduino.cc/cores/EMoRo_2560-3.2.2.zip", - "archiveFileName": "EMoRo_2560-3.2.2.zip", - "checksum": "SHA-256:c67e6660af44c923c10deede252f9c46dabaf5b61d6e44f3785be688f1c9b46f", - "size": "565744", - "boards": [ - {"name": "EMoRo 2560. Board based on ATmega 2560 MCU"} - ], - "toolsDependencies": [ - ] - } - ], - "tools": [ - ] - }, - { - "name": "industruino", - "maintainer": "Industruino", - "websiteURL": "https://industruino.com/", - "email": "connect@industruino.com", - "help": { - "online": "https://github.com/Industruino/IndustruinoSAMD" - }, - "platforms": [ - { - "name": "Industruino SAMD Boards (32-bits ARM Cortex-M0+)", - "architecture": "samd", - "version": "1.0.0", - "category": "Contributed", - "url": "https://static.industruino.com/downloads/code/IndustruinoCores/IndustruinoSAMD/core/industruino-samd-1.0.0.tar.bz2", - "archiveFileName": "industruino-samd-1.0.0.tar.bz2", - "checksum": "SHA-256:f2e03e584117474c3a6481922c7030558236588762dceea0421ea79ceec3ae11", - "size": "172665", - "boards": [ - { "name": "Industruino D21G" } - ], - "toolsDependencies": [ - { - "packager": "arduino", - "name": "arm-none-eabi-gcc", - "version": "4.8.3-2014q1" - }, - { - "packager": "industruino", - "name": "bossac", - "version": "1.7.0-industruino" - }, - { - "packager": "arduino", - "name": "openocd", - "version": "0.9.0-arduino" - }, - { - "packager": "arduino", - "name": "avrdude", - "version": "6.3.0-arduino8" - }, - { - "packager": "arduino", - "name": "CMSIS", - "version": "4.5.0" - }, - { - "packager": "arduino", - "name": "CMSIS-Atmel", - "version": "1.0.0" - } - ] - }, - { - "name": "Industruino SAMD Boards (32-bits ARM Cortex-M0+)", - "architecture": "samd", - "version": "1.0.1", - "category": "Contributed", - "url": "https://static.industruino.com/downloads/code/IndustruinoCores/IndustruinoSAMD/core/industruino-samd-1.0.1.tar.bz2", - "archiveFileName": "industruino-samd-1.0.1.tar.bz2", - "checksum": "SHA-256:ffd9a0d53f0e659432182987bfc70eeca8ea8cceaeac802be677614ed51c371f", - "size": "203844", - "boards": [ - { "name": "Industruino D21G" } - ], - "toolsDependencies": [ - { - "packager": "arduino", - "name": "arm-none-eabi-gcc", - "version": "4.8.3-2014q1" - }, - { - "packager": "industruino", - "name": "bossac", - "version": "1.7.0-industruino" - }, - { - "packager": "arduino", - "name": "openocd", - "version": "0.9.0-arduino" - }, - { - "packager": "arduino", - "name": "avrdude", - "version": "6.3.0-arduino8" - }, - { - "packager": "arduino", - "name": "CMSIS", - "version": "4.5.0" - }, - { - "packager": "arduino", - "name": "CMSIS-Atmel", - "version": "1.0.0" - } - ] - } - ], - "tools": [ - { - "name": "bossac", - "version": "1.7.0-industruino", - "systems": [ - { - "host": "i686-mingw32", - "url": "https://static.industruino.com/downloads/code/IndustruinoCores/IndustruinoSAMD/tools/bossac-1.7.0-industruino-mingw32.tar.gz", - "archiveFileName": "bossac-1.7.0-industruino-mingw32.tar.gz", - "checksum": "SHA-256:960d91feb565e957dbac9399e16839aa4eb4400153f2373896b733eeea778ab2", - "size": "565844" - }, - { - "host": "x86_64-apple-darwin", - "url": "https://static.industruino.com/downloads/code/IndustruinoCores/IndustruinoSAMD/tools/bossac-1.7.0-industruino-i386-apple-darwin15.6.0.tar.gz", - "archiveFileName": "bossac-1.7.0-industruino-i386-apple-darwin15.6.0.tar.gz", - "checksum": "SHA-256:a2455d20fd8269d0655ebc50014e539911070a0b14964082337655f17de7cbf2", - "size": "128421" - }, - { - "host": "x86_64-pc-linux-gnu", - "url": "https://static.industruino.com/downloads/code/IndustruinoCores/IndustruinoSAMD/tools/bossac-1.7.0-industruino-x86_64-linux-gnu.tar.gz", - "archiveFileName": "bossac-1.7.0-industruino-x86_64-linux-gnu.tar.gz", - "checksum": "SHA-256:2cbeb64a0e0a58f3b769ef6cdcfe55fa939b3015845b3081a9beebe9432ba4a6", - "size": "62348" - }, - { - "host": "i686-pc-linux-gnu", - "url": "https://static.industruino.com/downloads/code/IndustruinoCores/IndustruinoSAMD/tools/bossac-1.7.0-industruino-i686-linux-gnu.tar.gz", - "archiveFileName": "bossac-1.7.0-industruino-i686-linux-gnu.tar.gz", - "checksum": "SHA-256:77b06322da2a9bdc17ddcbc29627802e8b2bf47b5625fe6fb17d90203e4a4071", - "size": "63204" - } - ] - }, - { - "name": "windows-drivers", - "version": "0.0.1", - "systems": [ - { - "host": "i686-mingw32", - "url": "https://static.industruino.com/downloads/drivers/drivers-industruino-windows-0.0.1.zip", - "archiveFileName": "drivers-industruino-windows-0.0.1.zip", - "checksum": "SHA-256:f1d7c7d30ca71f7224dac077f18f25f62ff97b43dd1e4a43ec4930a13a3ac484", - "size": "2545" - } - ] - } - ] - } - ] - } \ No newline at end of file diff --git a/v2/pkgs/testdata/test_tool_index.json b/v2/pkgs/testdata/test_tool_index.json new file mode 100644 index 000000000..b7f8b87d2 --- /dev/null +++ b/v2/pkgs/testdata/test_tool_index.json @@ -0,0 +1,521 @@ +{ + "packages": [ + { + "name": "arduino-test", + "maintainer": "Arduino", + "websiteURL": "http://www.arduino.cc/", + "email": "packages@arduino.cc", + "help": { + "online": "http://www.arduino.cc/en/Reference/HomePage" + }, + "platforms": [ + { + "name": "Arduino megaAVR Boards - Pre-release", + "architecture": "megaavr", + "version": "1.8.102", + "category": "Arduino", + "url": "http://downloads.arduino.cc/cores/staging/core-megaavr-1.8.102.tar.bz2", + "archiveFileName": "core-megaavr-1.8.102.tar.bz2", + "checksum": "SHA-256:ad5e60b828678d9ccff957032524a4c4d68b218737e7df24b905769a04dc2a6a", + "size": "858620", + "help": { + "online": "https://github.com/arduino/ArduinoCore-megaavr/issues" + }, + "boards": [ + { + "name": "Arduino Uno WiFi Rev2" + }, + { + "name": "Arduino Nano Every" + } + ], + "toolsDependencies": [ + { + "packager": "arduino", + "name": "avr-gcc", + "version": "7.3.0-atmel3.6.1-arduino5" + }, + { + "packager": "arduino", + "name": "avrdude", + "version": "7.0-arduino.3" + }, + { + "packager": "arduino", + "name": "arduinoOTA", + "version": "1.3.0" + } + ] + } + ], + "tools": [ + { + "name": "avrdude", + "version": "6.3.0-arduino17", + "systems": [ + { + "size": "219631", + "checksum": "SHA-256:2a8e68c5d803aa6f902ef219f177ec3a4c28275d85cbe272962ad2cd374f50d1", + "host": "arm-linux-gnueabihf", + "archiveFileName": "avrdude-6.3.0-arduino17-armhf-pc-linux-gnu.tar.bz2", + "url": "http://downloads.arduino.cc/tools/avrdude-6.3.0-arduino17-armhf-pc-linux-gnu.tar.bz2" + }, + { + "size": "229852", + "checksum": "SHA-256:6cf948f751acfe7b96684537f2291c766ec8b54b4f7dc95539864821456fa9fc", + "host": "aarch64-linux-gnu", + "archiveFileName": "avrdude-6.3.0-arduino17-aarch64-pc-linux-gnu.tar.bz2", + "url": "http://downloads.arduino.cc/tools/avrdude-6.3.0-arduino17-aarch64-pc-linux-gnu.tar.bz2" + }, + { + "size": "279045", + "checksum": "SHA-256:120cc9edaae699e7e9ac50b1b8eb0e7d51fdfa555bac54233c2511e6ee5418c9", + "host": "x86_64-apple-darwin12", + "archiveFileName": "avrdude-6.3.0-arduino17-x86_64-apple-darwin12.tar.bz2", + "url": "http://downloads.arduino.cc/tools/avrdude-6.3.0-arduino17-x86_64-apple-darwin12.tar.bz2" + }, + { + "size": "254271", + "checksum": "SHA-256:accdfb920af2aabf4f7461d2ac73c0751760f525216dc4e7657427a78c60d13d", + "host": "x86_64-linux-gnu", + "archiveFileName": "avrdude-6.3.0-arduino17-x86_64-pc-linux-gnu.tar.bz2", + "url": "http://downloads.arduino.cc/tools/avrdude-6.3.0-arduino17-x86_64-pc-linux-gnu.tar.bz2" + }, + { + "size": "244550", + "checksum": "SHA-256:5c8cc6c17db9300e1451fe41cd7178b0442b4490ee6fdbc0aed9811aef96c05f", + "host": "i686-linux-gnu", + "archiveFileName": "avrdude-6.3.0-arduino17-i686-pc-linux-gnu.tar.bz2", + "url": "http://downloads.arduino.cc/tools/avrdude-6.3.0-arduino17-i686-pc-linux-gnu.tar.bz2" + }, + { + "size": "328460", + "checksum": "SHA-256:e99188873c7c5ad8f8f906f068c33600e758b2e36cce3adbd518a21bd266749d", + "host": "i686-mingw32", + "archiveFileName": "avrdude-6.3.0-arduino17-i686-w64-mingw32.zip", + "url": "http://downloads.arduino.cc/tools/avrdude-6.3.0-arduino17-i686-w64-mingw32.zip" + } + ] + }, + { + "name": "bossac", + "version": "1.6.1-arduino", + "systems": [ + { + "host": "arm-linux-gnueabihf", + "url": "http://downloads.arduino.cc/bossac-1.6.1-arduino-arm-linux-gnueabihf.tar.bz2", + "archiveFileName": "bossac-1.6.1-arduino-arm-linux-gnueabihf.tar.bz2", + "checksum": "SHA-256:8c4e63db982178919c824e7a35580dffc95c3426afa7285de3eb583982d4d391", + "size": "201341" + }, + { + "host": "i686-mingw32", + "url": "http://downloads.arduino.cc/bossac-1.6.1-arduino-mingw32.tar.gz", + "archiveFileName": "bossac-1.6.1-arduino-mingw32.tar.gz", + "checksum": "SHA-256:d59f43e2e83a337d04c4ae88b195a4ee175b8d87fff4c43144d23412a4a9513b", + "size": "222918" + }, + { + "host": "x86_64-apple-darwin", + "url": "http://downloads.arduino.cc/bossac-1.6.1-arduino-i386-apple-darwin14.5.0.tar.gz", + "archiveFileName": "bossac-1.6.1-arduino-i386-apple-darwin14.5.0.tar.gz", + "checksum": "SHA-256:2f80ef569a3fb19da60ab3489e49d8fe7d4699876acf30ff4938c632230a09aa", + "size": "64587" + }, + { + "host": "x86_64-pc-linux-gnu", + "url": "http://downloads.arduino.cc/bossac-1.6.1-arduino-x86_64-linux-gnu.tar.gz", + "archiveFileName": "bossac-1.6.1-arduino-x86_64-linux-gnu.tar.gz", + "checksum": "SHA-256:b78afc66c00ccfdd69a08bd3959c260a0c64ccce78a71d5a1135ae4437ff40db", + "size": "30869" + }, + { + "host": "i686-pc-linux-gnu", + "url": "http://downloads.arduino.cc/bossac-1.6.1-arduino-i486-linux-gnu.tar.gz", + "archiveFileName": "bossac-1.6.1-arduino-i486-linux-gnu.tar.gz", + "checksum": "SHA-256:1e211347569d75193b337296a10dd25b0ce04419e3d7dc644355178b6b514f92", + "size": "30320" + } + ] + }, + { + "name": "bossac", + "version": "1.7.0-arduino3", + "systems": [ + { + "host": "i686-mingw32", + "url": "http://downloads.arduino.cc/tools/bossac-1.7.0-arduino3-windows.tar.gz", + "archiveFileName": "bossac-1.7.0-arduino3-windows.tar.gz", + "checksum": "SHA-256:62745cc5a98c26949ec9041ef20420643c561ec43e99dae659debf44e6836526", + "size": "3607421" + }, + { + "host": "x86_64-apple-darwin", + "url": "http://downloads.arduino.cc/tools/bossac-1.7.0-arduino3-osx.tar.gz", + "archiveFileName": "bossac-1.7.0-arduino3-osx.tar.gz", + "checksum": "SHA-256:adb3c14debd397d8135e9e970215c6972f0e592c7af7532fa15f9ce5e64b991f", + "size": "75510" + }, + { + "host": "x86_64-pc-linux-gnu", + "url": "http://downloads.arduino.cc/tools/bossac-1.7.0-arduino3-linux64.tar.gz", + "archiveFileName": "bossac-1.7.0-arduino3-linux64.tar.gz", + "checksum": "SHA-256:1ae54999c1f97234a5c603eb99ad39313b11746a4ca517269a9285afa05f9100", + "size": "207271" + }, + { + "host": "i686-pc-linux-gnu", + "url": "http://downloads.arduino.cc/tools/bossac-1.7.0-arduino3-linux32.tar.gz", + "archiveFileName": "bossac-1.7.0-arduino3-linux32.tar.gz", + "checksum": "SHA-256:4ac4354746d1a09258f49a43ef4d1baf030d81c022f8434774268b00f55d3ec3", + "size": "193577" + }, + { + "host": "arm-linux-gnueabihf", + "url": "http://downloads.arduino.cc/tools/bossac-1.7.0-arduino3-linuxarm.tar.gz", + "archiveFileName": "bossac-1.7.0-arduino3-linuxarm.tar.gz", + "checksum": "SHA-256:626c6cc548046901143037b782bf019af1663bae0d78cf19181a876fb9abbb90", + "size": "193941" + }, + { + "host": "aarch64-linux-gnu", + "url": "http://downloads.arduino.cc/tools/bossac-1.7.0-arduino3-linuxaarch64.tar.gz", + "archiveFileName": "bossac-1.7.0-arduino3-linuxaarch64.tar.gz", + "checksum": "SHA-256:a098b2cc23e29f0dc468416210d097c4a808752cd5da1a7b9b8b7b931a04180b", + "size": "268365" + } + ] + }, + { + "name": "bossac", + "version": "1.9.1-arduino2", + "systems": [ + { + "host": "i686-mingw32", + "url": "http://downloads.arduino.cc/tools/bossac-1.9.1-arduino2-windows.tar.gz", + "archiveFileName": "bossac-1.9.1-arduino2-windows.tar.gz", + "checksum": "SHA-256:5c994d04354f0db8e4bea136f49866d2ba537f0af74b2e78026f2d4fc75e3e39", + "size": "1260628" + }, + { + "host": "x86_64-apple-darwin", + "url": "http://downloads.arduino.cc/tools/bossac-1.9.1-arduino2-osx.tar.gz", + "archiveFileName": "bossac-1.9.1-arduino2-osx.tar.gz", + "checksum": "SHA-256:b7732129364a378676604db6579c9b8dab50dd965fb50d7a3afff1839c97ff80", + "size": "47870" + }, + { + "host": "x86_64-pc-linux-gnu", + "url": "http://downloads.arduino.cc/tools/bossac-1.9.1-arduino2-linux64.tar.gz", + "archiveFileName": "bossac-1.9.1-arduino2-linux64.tar.gz", + "checksum": "SHA-256:9eb549874391521999cee13dc823a2cfc8866b8246945339a281808d99c72d2c", + "size": "399532" + }, + { + "host": "i686-pc-linux-gnu", + "url": "http://downloads.arduino.cc/tools/bossac-1.9.1-arduino2-linux32.tar.gz", + "archiveFileName": "bossac-1.9.1-arduino2-linux32.tar.gz", + "checksum": "SHA-256:10d69f53f169f25afee2dd583dfd9dc803c10543e6c5260d106725cb0d174900", + "size": "384951" + }, + { + "host": "arm-linux-gnueabihf", + "url": "http://downloads.arduino.cc/tools/bossac-1.9.1-arduino2-linuxarm.tar.gz", + "archiveFileName": "bossac-1.9.1-arduino2-linuxarm.tar.gz", + "checksum": "SHA-256:c9539d161d23231b5beb1d09a71829744216c7f5bc2857a491999c3e567f5b19", + "size": "361915" + }, + { + "host": "aarch64-linux-gnu", + "url": "http://downloads.arduino.cc/tools/bossac-1.9.1-arduino2-linuxaarch64.tar.gz", + "archiveFileName": "bossac-1.9.1-arduino2-linuxaarch64.tar.gz", + "checksum": "SHA-256:c167fa0ea223966f4d21f5592da3888bcbfbae385be6c5c4e41f8abff35f5cb1", + "size": "442853" + } + ] + }, + { + "name": "openocd", + "version": "0.11.0-arduino2", + "systems": [ + { + "size": "1902818", + "checksum": "SHA-256:a1aa7f1435a61eafb72ee90722f2496d6a34a7a0f085d0315c2613e4a548b824", + "host": "aarch64-linux-gnu", + "archiveFileName": "openocd-0.11.0-arduino2-static-aarch64-linux-gnu.tar.bz2", + "url": "http://downloads.arduino.cc/tools/openocd-0.11.0-arduino2-static-aarch64-linux-gnu.tar.bz2" + }, + { + "size": "1986716", + "checksum": "SHA-256:57041130160be086e69387cceb4616eefc9819a0ef75de1f7c11aea57fb92699", + "host": "arm-linux-gnueabihf", + "archiveFileName": "openocd-0.11.0-arduino2-static-arm-linux-gnueabihf.tar.bz2", + "url": "http://downloads.arduino.cc/tools/openocd-0.11.0-arduino2-static-arm-linux-gnueabihf.tar.bz2" + }, + { + "size": "1971364", + "checksum": "SHA-256:6f4a8b77c8076aa18afb8438472526dff8c0d161a3ca68d0326163b59fcab663", + "host": "i686-linux-gnu", + "archiveFileName": "openocd-0.11.0-arduino2-static-i686-ubuntu12.04-linux-gnu.tar.bz2", + "url": "http://downloads.arduino.cc/tools/openocd-0.11.0-arduino2-static-i686-ubuntu12.04-linux-gnu.tar.bz2" + }, + { + "size": "2460087", + "checksum": "SHA-256:631010980f12b1e750c4c67ce012b31c5953caabf4d30607d806e3d2b717d4b8", + "host": "i686-mingw32", + "archiveFileName": "openocd-0.11.0-arduino2-static-i686-w64-mingw32.zip", + "url": "http://downloads.arduino.cc/tools/openocd-0.11.0-arduino2-static-i686-w64-mingw32.zip" + }, + { + "size": "1893150", + "checksum": "SHA-256:280e7234eba84e830e92d791ebc685286f71d2bc1d3347f93605ef170d54fef4", + "host": "i386-apple-darwin11", + "archiveFileName": "openocd-0.11.0-arduino2-static-x86_64-apple-darwin13.tar.bz2", + "url": "http://downloads.arduino.cc/tools/openocd-0.11.0-arduino2-static-x86_64-apple-darwin13.tar.bz2" + }, + { + "size": "2052080", + "checksum": "SHA-256:4d19b6e3906de1434ec86841e0e3138235714c655d45f037c0fabfa5e5c0681b", + "host": "x86_64-linux-gnu", + "archiveFileName": "openocd-0.11.0-arduino2-static-x86_64-ubuntu12.04-linux-gnu.tar.bz2", + "url": "http://downloads.arduino.cc/tools/openocd-0.11.0-arduino2-static-x86_64-ubuntu12.04-linux-gnu.tar.bz2" + } + ] + }, + { + "name": "dfu-util", + "version": "0.10.0-arduino1", + "systems": [ + { + "host": "i386-apple-darwin11", + "url": "http://downloads.arduino.cc/tools/dfu-util-0.10.0-arduino1-osx.tar.bz2", + "archiveFileName": "dfu-util-0.10.0-arduino1-osx.tar.bz2", + "size": "73921", + "checksum": "SHA-256:7562d128036759605828d64b8d672d42445a8d95555c4b9ba339f73a1711a640" + }, + { + "host": "arm-linux-gnueabihf", + "url": "http://downloads.arduino.cc/tools/dfu-util-0.10.0-arduino1-arm.tar.bz2", + "archiveFileName": "dfu-util-0.10.0-arduino1-arm.tar.bz2", + "size": "272153", + "checksum": "SHA-256:f1e550f40c235356b7fde1c59447bfbab28f768915d3c14bd858fe0576bfc5a9" + }, + { + "host": "aarch64-linux-gnu", + "url": "http://downloads.arduino.cc/tools/dfu-util-0.10.0-arduino1-arm64.tar.bz2", + "archiveFileName": "dfu-util-0.10.0-arduino1-arm64.tar.bz2", + "size": "277886", + "checksum": "SHA-256:ebfbd21d3030c500da1f83b9aae5b8c597bee04c3bde1ce0a51b41abeafc9614" + }, + { + "host": "x86_64-linux-gnu", + "url": "http://downloads.arduino.cc/tools/dfu-util-0.10.0-arduino1-linux64.tar.bz2", + "archiveFileName": "dfu-util-0.10.0-arduino1-linux64.tar.bz2", + "size": "77184", + "checksum": "SHA-256:13ef2ec591c1e8b0b7eb0a05da972ecd6695016e7a9607e332c7553899af9b4a" + }, + { + "host": "i686-linux-gnu", + "url": "http://downloads.arduino.cc/tools/dfu-util-0.10.0-arduino1-linux32.tar.bz2", + "archiveFileName": "dfu-util-0.10.0-arduino1-linux32.tar.bz2", + "size": "81826", + "checksum": "SHA-256:43599ec60c000e9ef016970a496d6ab2cbbe5a8b7df9d06ef3114ecf83f9d123" + }, + { + "host": "i686-mingw32", + "url": "http://downloads.arduino.cc/tools/dfu-util-0.10.0-arduino1-windows.tar.bz2", + "archiveFileName": "dfu-util-0.10.0-arduino1-windows.tar.bz2", + "size": "464314", + "checksum": "SHA-256:90816b669273ae796d734a2459c46bb340d4790783fd7aa01eb40c0443f1a9b1" + } + ] + }, + { + "name": "rp2040tools", + "version": "1.0.6", + "systems": [ + { + "host": "i386-apple-darwin11", + "url": "http://downloads.arduino.cc/tools/rp2040tools-1.0.6-darwin_amd64.tar.bz2", + "archiveFileName": "rp2040tools-1.0.6-darwin_amd64.tar.bz2", + "size": "1717967", + "checksum": "SHA-256:4e32aa4b8f36db40a17bfbdfd34d80da91710e30c3887732bf0c0bf0b02840a7" + }, + { + "host": "arm-linux-gnueabihf", + "url": "http://downloads.arduino.cc/tools/rp2040tools-1.0.6-linux_arm.tar.bz2", + "archiveFileName": "rp2040tools-1.0.6-linux_arm.tar.bz2", + "size": "8702508", + "checksum": "SHA-256:084a29accf0014bc79723fbb40057b95299c7ae63876f74494a077c987014cc3" + }, + { + "host": "aarch64-linux-gnu", + "url": "http://downloads.arduino.cc/tools/rp2040tools-1.0.6-linux_arm64.tar.bz2", + "archiveFileName": "rp2040tools-1.0.6-linux_arm64.tar.bz2", + "size": "9037783", + "checksum": "SHA-256:1a2a6cb1abf1f7b8198d494c8d8e838700297d748877be8232e02aaa5ca8d0df" + }, + { + "host": "x86_64-linux-gnu", + "url": "http://downloads.arduino.cc/tools/rp2040tools-1.0.6-linux_amd64.tar.bz2", + "archiveFileName": "rp2040tools-1.0.6-linux_amd64.tar.bz2", + "size": "6108121", + "checksum": "SHA-256:6e2ea818db1ff57f2d8e1e3010fbc5bdb5f28ff44f5a68900cae41d7d709f738" + }, + { + "host": "i686-linux-gnu", + "url": "http://downloads.arduino.cc/tools/rp2040tools-1.0.6-linux_386.tar.bz2", + "archiveFileName": "rp2040tools-1.0.6-linux_386.tar.bz2", + "size": "6604083", + "checksum": "SHA-256:ef339e2e0f5c7d5464b9911b612c634767daba39a6be977a1ffa41c95b9827a1" + }, + { + "host": "i686-mingw32", + "url": "http://downloads.arduino.cc/tools/rp2040tools-1.0.6-windows_386.tar.bz2", + "archiveFileName": "rp2040tools-1.0.6-windows_386.tar.bz2", + "size": "3145329", + "checksum": "SHA-256:26a5daebba68c2348dade33716a6e379ded89895ef0e49df1332964a724f6170" + } + ] + }, + { + "name": "esptool_py", + "version": "4.5.1", + "systems": [ + { + "host": "x86_64-pc-linux-gnu", + "url": "https://github.com/espressif/arduino-esp32/releases/download/2.0.7/esptool-v4.5.1-src.tar.gz", + "archiveFileName": "esptool-v4.5.1-src.tar.gz", + "checksum": "SHA-256:aa06831a7d88d8ccde4ea21241e983a08dbdae967290e181658b0d18bffc8f86", + "size": "96922" + }, + { + "host": "i686-pc-linux-gnu", + "url": "https://github.com/espressif/arduino-esp32/releases/download/2.0.7/esptool-v4.5.1-src.tar.gz", + "archiveFileName": "esptool-v4.5.1-src.tar.gz", + "checksum": "SHA-256:aa06831a7d88d8ccde4ea21241e983a08dbdae967290e181658b0d18bffc8f86", + "size": "96922" + }, + { + "host": "aarch64-linux-gnu", + "url": "https://github.com/espressif/arduino-esp32/releases/download/2.0.7/esptool-v4.5.1-src.tar.gz", + "archiveFileName": "esptool-v4.5.1-src.tar.gz", + "checksum": "SHA-256:aa06831a7d88d8ccde4ea21241e983a08dbdae967290e181658b0d18bffc8f86", + "size": "96922" + }, + { + "host": "arm-linux-gnueabihf", + "url": "https://github.com/espressif/arduino-esp32/releases/download/2.0.7/esptool-v4.5.1-src.tar.gz", + "archiveFileName": "esptool-v4.5.1-src.tar.gz", + "checksum": "SHA-256:aa06831a7d88d8ccde4ea21241e983a08dbdae967290e181658b0d18bffc8f86", + "size": "96922" + }, + { + "host": "x86_64-apple-darwin", + "url": "https://github.com/espressif/arduino-esp32/releases/download/2.0.7/esptool-v4.5.1-macos.tar.gz", + "archiveFileName": "esptool-v4.5.1-macos.tar.gz", + "checksum": "SHA-256:78b52acfd51541ceb97cee893b7d4d49b8ddc284602be8c73ea47e3d849e0956", + "size": "5850888" + }, + { + "host": "x86_64-mingw32", + "url": "https://github.com/espressif/arduino-esp32/releases/download/2.0.7/esptool-v4.5.1-win64.zip", + "archiveFileName": "esptool-v4.5.1-win64.zip", + "checksum": "SHA-256:64d0c24499d46b80d6bd7a05c98bdacc3455ab6d503cc2a99e35711310216045", + "size": "6638448" + }, + { + "host": "i686-mingw32", + "url": "https://github.com/espressif/arduino-esp32/releases/download/2.0.7/esptool-v4.5.1-win64.zip", + "archiveFileName": "esptool-v4.5.1-win64.zip", + "checksum": "SHA-256:64d0c24499d46b80d6bd7a05c98bdacc3455ab6d503cc2a99e35711310216045", + "size": "6638448" + } + ] + }, + { + "name": "arduino-fwuploader", + "version": "2.2.0", + "systems": [ + { + "host": "i686-mingw32", + "url": "http://downloads.arduino.cc/arduino-fwuploader/arduino-fwuploader_2.2.0_Windows_32bit.zip", + "archiveFileName": "arduino-fwuploader_2.2.0_Windows_32bit.zip", + "checksum": "SHA-256:c0ff772702460fb5cbd8593f8ce731145d21fbf550342da556e45ef946c7d2f5", + "size": "7442444" + }, + { + "host": "i386-apple-darwin11", + "url": "http://downloads.arduino.cc/arduino-fwuploader/arduino-fwuploader_2.2.0_macOS_64bit.tar.gz", + "archiveFileName": "arduino-fwuploader_2.2.0_macOS_64bit.tar.gz", + "checksum": "SHA-256:ce4444e92ba88c6b24736adb4b0b2b6c4241e4fb916945acbc7de6391d5bfe8c", + "size": "7301372" + } + ] + }, + { + "name": "arduino-fwuploader", + "version": "2.2.2", + "systems": [ + { + "host": "i686-linux-gnu", + "url": "http://downloads.arduino.cc/arduino-fwuploader/arduino-fwuploader_2.2.2_Linux_32bit.tar.gz", + "archiveFileName": "arduino-fwuploader_2.2.2_Linux_32bit.tar.gz", + "checksum": "SHA-256:503b9f8b24c6e396d09eb64f0e1f625c6f9aa5a90b01a50d7dec6477f4a866f0", + "size": "7262873" + }, + { + "host": "x86_64-linux-gnu", + "url": "http://downloads.arduino.cc/arduino-fwuploader/arduino-fwuploader_2.2.2_Linux_64bit.tar.gz", + "archiveFileName": "arduino-fwuploader_2.2.2_Linux_64bit.tar.gz", + "checksum": "SHA-256:8d77d0b33c8b0787fe3b80191709b69d638ef2a447d9853536cda35bfafd274b", + "size": "7306763" + }, + { + "host": "i686-mingw32", + "url": "http://downloads.arduino.cc/arduino-fwuploader/arduino-fwuploader_2.2.2_Windows_32bit.zip", + "archiveFileName": "arduino-fwuploader_2.2.2_Windows_32bit.zip", + "checksum": "SHA-256:74ad9a5d369204b51be288c98d74f949ceb7a0c227ee64eb65ae179ec884c84c", + "size": "7450717" + }, + { + "host": "x86_64-mingw32", + "url": "http://downloads.arduino.cc/arduino-fwuploader/arduino-fwuploader_2.2.2_Windows_64bit.zip", + "archiveFileName": "arduino-fwuploader_2.2.2_Windows_64bit.zip", + "checksum": "SHA-256:b25ac549cb0645166613c96cf899aebc541e482fe196aada6408bd7cff2c7d02", + "size": "7390999" + }, + { + "host": "x86_64-apple-darwin", + "url": "http://downloads.arduino.cc/arduino-fwuploader/arduino-fwuploader_2.2.2_macOS_64bit.tar.gz", + "archiveFileName": "arduino-fwuploader_2.2.2_macOS_64bit.tar.gz", + "checksum": "SHA-256:2cd6168ff470457b5124ba0faf118f315be2d1b9fb4fef43eb74370cd83620a2", + "size": "7306576" + }, + { + "host": "arm64-apple-darwin", + "url": "http://downloads.arduino.cc/arduino-fwuploader/arduino-fwuploader_2.2.2_macOS_ARM64.tar.gz", + "archiveFileName": "arduino-fwuploader_2.2.2_macOS_ARM64.tar.gz", + "checksum": "SHA-256:10ae5614af4d82096b6ba0e1e07aab667fa140d2bf1d5e3407dd8ad4c6748195", + "size": "6878214" + }, + { + "host": "arm-linux-gnueabihf", + "url": "http://downloads.arduino.cc/arduino-fwuploader/arduino-fwuploader_2.2.2_Linux_ARMv6.tar.gz", + "archiveFileName": "arduino-fwuploader_2.2.2_Linux_ARMv6.tar.gz", + "checksum": "SHA-256:5aadf6e50ffe620635faf941fdf82c0765c8cba4830951bb53267ad125fc5af8", + "size": "6940393" + }, + { + "host": "aarch64-linux-gnu", + "url": "http://downloads.arduino.cc/arduino-fwuploader/arduino-fwuploader_2.2.2_Linux_ARM64.tar.gz", + "archiveFileName": "arduino-fwuploader_2.2.2_Linux_ARM64.tar.gz", + "checksum": "SHA-256:6d11a4f4aa5a81de865f3d18ca395a2780fdbb1e1597a2b11b2b5329e09f30fd", + "size": "6829396" + } + ] + } + ] + } + ] +} diff --git a/v2/pkgs/tools.go b/v2/pkgs/tools.go index ce2050436..7f34e3d08 100644 --- a/v2/pkgs/tools.go +++ b/v2/pkgs/tools.go @@ -1,66 +1,113 @@ +// Copyright 2022 Arduino SA +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published +// by the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + package pkgs import ( "bytes" "context" + "crypto/rsa" "crypto/sha256" "encoding/hex" "encoding/json" "errors" "fmt" "io" - "io/ioutil" "net/http" "os" "path/filepath" "runtime" "strings" + "sync" "github.com/arduino/arduino-create-agent/gen/tools" - "github.com/codeclysm/extract/v3" - "github.com/xrash/smetrics" + "github.com/arduino/arduino-create-agent/index" + "github.com/arduino/arduino-create-agent/utilities" + "github.com/blang/semver" + "github.com/codeclysm/extract/v4" +) + +// public vars to allow override in the tests +var ( + OS = runtime.GOOS + Arch = runtime.GOARCH ) // Tools is a client that implements github.com/arduino/arduino-create-agent/gen/tools.Service interface. // It saves tools in a specified folder with this structure: packager/name/version // For example: -// folder -// └── arduino -// └── bossac -// ├── 1.6.1-arduino -// │   └── bossac -// └── 1.7.0 -// └── bossac -// It requires an Indexes client to list and read package index files: use the Indexes struct +// +// folder +// └── arduino +// └── bossac +// ├── 1.6.1-arduino +// │   └── bossac +// └── 1.7.0 +// └── bossac +// +// It requires an Index Resource to search for tools type Tools struct { - Indexes interface { - List(context.Context) ([]string, error) - Get(context.Context, string) (Index, error) + index *index.Resource + folder string + behaviour string + installed map[string]string + mutex sync.RWMutex + verifySignaturePubKey *rsa.PublicKey // public key used to verify the signature of a command sent to the boards +} + +// New will return a Tool object, allowing the caller to execute operations on it. +// The New function will accept an index as parameter (used to download the indexes) +// and a folder used to download the indexes +func New(index *index.Resource, folder, behaviour string, verifySignaturePubKey *rsa.PublicKey) *Tools { + t := &Tools{ + index: index, + folder: folder, + behaviour: behaviour, + installed: map[string]string{}, + mutex: sync.RWMutex{}, + verifySignaturePubKey: verifySignaturePubKey, } - Folder string + t.readInstalled() + return t +} + +// Installedhead is here only because it was required by the front-end. +// Probably when we bumped GOA something changed: +// Before that the frontend was able to perform the HEAD request to `v2/pkgs/tools/installed`. +// After the bump we have to implement it explicitly. Currently I do not know a better way in achieving the same result. +func (t *Tools) Installedhead(ctx context.Context) (err error) { + return nil } // Available crawles the downloaded package index files and returns a list of tools that can be installed. -func (c *Tools) Available(ctx context.Context) (res tools.ToolCollection, err error) { - list, err := c.Indexes.List(ctx) +func (t *Tools) Available(ctx context.Context) (res tools.ToolCollection, err error) { + body, err := t.index.Read() if err != nil { return nil, err } - for _, url := range list { - index, err := c.Indexes.Get(ctx, url) - if err != nil { - return nil, err - } + var index Index + json.Unmarshal(body, &index) - for _, packager := range index.Packages { - for _, tool := range packager.Tools { - res = append(res, &tools.Tool{ - Packager: packager.Name, - Name: tool.Name, - Version: tool.Version, - }) - } + for _, packager := range index.Packages { + for _, tool := range packager.Tools { + res = append(res, &tools.Tool{ + Packager: packager.Name, + Name: tool.Name, + Version: tool.Version, + }) } } @@ -68,16 +115,16 @@ func (c *Tools) Available(ctx context.Context) (res tools.ToolCollection, err er } // Installed crawles the Tools Folder and finds the installed tools. -func (c *Tools) Installed(ctx context.Context) (tools.ToolCollection, error) { +func (t *Tools) Installed(ctx context.Context) (tools.ToolCollection, error) { res := tools.ToolCollection{} // Find packagers - packagers, err := ioutil.ReadDir(c.Folder) + packagers, err := os.ReadDir(t.folder) if err != nil { if !strings.Contains(err.Error(), "no such file") { return nil, err } - err = os.MkdirAll(c.Folder, 0755) + err = os.MkdirAll(t.folder, 0755) if err != nil { return nil, err } @@ -89,15 +136,15 @@ func (c *Tools) Installed(ctx context.Context) (tools.ToolCollection, error) { } // Find tools - toolss, err := ioutil.ReadDir(filepath.Join(c.Folder, packager.Name())) + toolss, err := os.ReadDir(filepath.Join(t.folder, packager.Name())) if err != nil { return nil, err } for _, tool := range toolss { // Find versions - path := filepath.Join(c.Folder, packager.Name(), tool.Name()) - versions, err := ioutil.ReadDir(path) + path := filepath.Join(t.folder, packager.Name(), tool.Name()) + versions, err := os.ReadDir(path) if err != nil { continue // we ignore errors because the folders could be dirty } @@ -117,80 +164,95 @@ func (c *Tools) Installed(ctx context.Context) (tools.ToolCollection, error) { // Install crawles the Index folder, downloads the specified tool, extracts the archive in the Tools Folder. // It checks for the Signature specified in the package index. -func (c *Tools) Install(ctx context.Context, payload *tools.ToolPayload) (*tools.Operation, error) { +func (t *Tools) Install(ctx context.Context, payload *tools.ToolPayload) (*tools.Operation, error) { path := filepath.Join(payload.Packager, payload.Name, payload.Version) - if payload.URL != nil { - return c.install(ctx, path, *payload.URL, *payload.Checksum) + //if URL is defined and is signed we verify the signature and override the name, payload, version parameters + if payload.URL != nil && payload.Signature != nil && payload.Checksum != nil { + err := utilities.VerifyInput(*payload.URL, *payload.Signature, t.verifySignaturePubKey) + if err != nil { + return nil, err + } + return t.install(ctx, path, *payload.URL, *payload.Checksum) } - list, err := c.Indexes.List(ctx) + // otherwise we install from the default index + body, err := t.index.Read() if err != nil { return nil, err } - for _, url := range list { - index, err := c.Indexes.Get(ctx, url) - if err != nil { - return nil, err - } - - for _, packager := range index.Packages { - if packager.Name != payload.Packager { - continue - } - - for _, tool := range packager.Tools { - if tool.Name == payload.Name && - tool.Version == payload.Version { + var index Index + json.Unmarshal(body, &index) - i := findSystem(tool) + correctTool, correctSystem, found := FindTool(payload.Packager, payload.Name, payload.Version, index) + path = filepath.Join(payload.Packager, correctTool.Name, correctTool.Version) - return c.install(ctx, path, tool.Systems[i].URL, tool.Systems[i].Checksum) - } + key := correctTool.Name + "-" + correctTool.Version + // Check if it already exists + if t.behaviour == "keep" && pathExists(t.folder) { + location, ok := t.getInstalledValue(key) + if ok && pathExists(location) { + // overwrite the default tool with this one + err := t.writeInstalled(path) + if err != nil { + return nil, err } + return &tools.Operation{Status: "ok"}, nil } } + if found { + return t.install(ctx, path, correctSystem.URL, correctSystem.Checksum) + } return nil, tools.MakeNotFound( fmt.Errorf("tool not found with packager '%s', name '%s', version '%s'", payload.Packager, payload.Name, payload.Version)) } -func (c *Tools) install(ctx context.Context, path, url, checksum string) (*tools.Operation, error) { - // Download +func (t *Tools) install(ctx context.Context, path, url, checksum string) (*tools.Operation, error) { + // Download the archive res, err := http.Get(url) if err != nil { return nil, err } defer res.Body.Close() - // Use a teereader to only read once var buffer bytes.Buffer - reader := io.TeeReader(res.Body, &buffer) - // Cleanup - err = os.RemoveAll(filepath.Join(c.Folder, path)) + // We copy the body of the response to a buffer to calculate the checksum + _, err = io.Copy(&buffer, res.Body) if err != nil { return nil, err } - err = extract.Archive(ctx, reader, c.Folder, rename(path)) + // Check the checksum + sum := sha256.Sum256(buffer.Bytes()) + sumString := "SHA-256:" + hex.EncodeToString(sum[:sha256.Size]) + + if sumString != checksum { + return nil, errors.New("checksum of downloaded file doesn't match, expected: " + checksum + " got: " + sumString) + } + + safePath, err := utilities.SafeJoin(t.folder, path) if err != nil { - os.RemoveAll(path) return nil, err } - sum := sha256.Sum256(buffer.Bytes()) - sumString := "SHA-256:" + hex.EncodeToString(sum[:sha256.Size]) + // Cleanup + err = os.RemoveAll(safePath) + if err != nil { + return nil, err + } - if sumString != checksum { - os.RemoveAll(path) - return nil, errors.New("checksum doesn't match") + err = extract.Archive(ctx, &buffer, t.folder, rename(path)) + if err != nil { + os.RemoveAll(safePath) + return nil, err } // Write installed.json for retrocompatibility with v1 - err = writeInstalled(c.Folder, path) + err = t.writeInstalled(path) if err != nil { return nil, err } @@ -199,10 +261,14 @@ func (c *Tools) install(ctx context.Context, path, url, checksum string) (*tools } // Remove deletes the tool folder from Tools Folder -func (c *Tools) Remove(ctx context.Context, payload *tools.ToolPayload) (*tools.Operation, error) { +func (t *Tools) Remove(ctx context.Context, payload *tools.ToolPayload) (*tools.Operation, error) { path := filepath.Join(payload.Packager, payload.Name, payload.Version) + pathToRemove, err := utilities.SafeJoin(t.folder, path) + if err != nil { + return nil, err + } - err := os.RemoveAll(filepath.Join(c.Folder, path)) + err = os.RemoveAll(pathToRemove) if err != nil { return nil, err } @@ -210,61 +276,117 @@ func (c *Tools) Remove(ctx context.Context, payload *tools.ToolPayload) (*tools. return &tools.Operation{Status: "ok"}, nil } +// rename function is used to rename the path of the extracted files func rename(base string) extract.Renamer { + // "Rename" the given path adding the "base" and removing the root folder in "path" (if present). return func(path string) string { parts := strings.Split(filepath.ToSlash(path), "/") + if len(parts) <= 1 { + // The path does not contain a root folder. This might happen for tool packages (zip files) + // that have an invalid structure. Do not try to remove the root folder in these cases. + return filepath.Join(base, path) + } + // Removes the first part of the path (the root folder). path = strings.Join(parts[1:], "/") - path = filepath.Join(base, path) - return path + return filepath.Join(base, path) } } -func findSystem(tool Tool) int { - var systems = map[string]string{ - "linuxamd64": "x86_64-linux-gnu", - "linux386": "i686-linux-gnu", - "darwinamd64": "apple-darwin", - "windows386": "i686-mingw32", - "windowsamd64": "i686-mingw32", - "linuxarm": "arm-linux-gnueabihf", +func (t *Tools) readInstalled() error { + t.mutex.RLock() + defer t.mutex.RUnlock() + // read installed.json + installedFile, err := utilities.SafeJoin(t.folder, "installed.json") + if err != nil { + return err } + data, err := os.ReadFile(installedFile) + if err != nil { + return err + } + return json.Unmarshal(data, &t.installed) +} - var correctSystem int - maxSimilarity := 0.7 +func (t *Tools) writeInstalled(path string) error { + t.mutex.Lock() + defer t.mutex.Unlock() - for i, system := range tool.Systems { - similarity := smetrics.Jaro(system.Host, systems[runtime.GOOS+runtime.GOARCH]) - if similarity > maxSimilarity { - correctSystem = i - maxSimilarity = similarity - } + parts := strings.Split(path, string(filepath.Separator)) + tool := parts[len(parts)-2] + toolWithVersion := fmt.Sprint(tool, "-", parts[len(parts)-1]) + toolFile, err := utilities.SafeJoin(t.folder, path) + if err != nil { + return err } + t.installed[tool] = toolFile + t.installed[toolWithVersion] = toolFile - return correctSystem + data, err := json.Marshal(t.installed) + if err != nil { + return err + } + + installedFile, err := utilities.SafeJoin(t.folder, "installed.json") + if err != nil { + return err + } + + return os.WriteFile(installedFile, data, 0644) } -func writeInstalled(folder, path string) error { - // read installed.json - installed := map[string]string{} +// SetBehaviour sets the download behaviour to either keep or replace +func (t *Tools) SetBehaviour(behaviour string) { + t.behaviour = behaviour +} - data, err := ioutil.ReadFile(filepath.Join(folder, "installed.json")) +func (t *Tools) getInstalledValue(key string) (string, bool) { + t.mutex.RLock() + defer t.mutex.RUnlock() + location, ok := t.installed[key] + return location, ok +} + +func pathExists(path string) bool { + _, err := os.Stat(path) if err == nil { - err = json.Unmarshal(data, &installed) - if err != nil { - return err - } + return true + } + if os.IsNotExist(err) { + return false } + return true +} - parts := strings.Split(path, string(filepath.Separator)) - tool := parts[len(parts)-2] - toolWithVersion := fmt.Sprint(tool, "-", parts[len(parts)-1]) - installed[tool] = filepath.Join(folder, path) - installed[toolWithVersion] = filepath.Join(folder, path) +// FindTool searches the index for the correct tool and system that match the specified tool name and version +func FindTool(pack, name, version string, data Index) (Tool, System, bool) { + var correctTool Tool + correctTool.Version = "0.0" + found := false - data, err = json.Marshal(installed) - if err != nil { - return err + for _, p := range data.Packages { + if p.Name != pack { + continue + } + for _, t := range p.Tools { + if version != "latest" { + if t.Name == name && t.Version == version { + correctTool = t + found = true + } + } else { + // Find latest + v1, _ := semver.Make(t.Version) + v2, _ := semver.Make(correctTool.Version) + if t.Name == name && v1.Compare(v2) > 0 { + correctTool = t + found = true + } + } + } } - return ioutil.WriteFile(filepath.Join(folder, "installed.json"), data, 0644) + // Find the url based on system + correctSystem := correctTool.GetFlavourCompatibleWith(OS, Arch) + + return correctTool, correctSystem, found } diff --git a/v2/pkgs/tools_test.go b/v2/pkgs/tools_test.go index 5f923a34d..7bf0ff0e3 100644 --- a/v2/pkgs/tools_test.go +++ b/v2/pkgs/tools_test.go @@ -1,61 +1,62 @@ +// Copyright 2022 Arduino SA +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published +// by the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + package pkgs_test import ( "context" - "io/ioutil" - "net/http" - "net/http/httptest" "os" "runtime" "strings" "testing" + "time" - "github.com/arduino/arduino-create-agent/gen/indexes" + "github.com/arduino/arduino-create-agent/config" "github.com/arduino/arduino-create-agent/gen/tools" + "github.com/arduino/arduino-create-agent/globals" + "github.com/arduino/arduino-create-agent/index" + "github.com/arduino/arduino-create-agent/utilities" "github.com/arduino/arduino-create-agent/v2/pkgs" + "github.com/arduino/go-paths-helper" + "github.com/stretchr/testify/require" ) // TestTools performs a series of operations about tools, ensuring it behaves as expected. // This test depends on the internet so it could fail unexpectedly func TestTools(t *testing.T) { - // Use local file as index - ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - http.ServeFile(w, r, "testdata/package_index.json") - })) - defer ts.Close() - // Initialize indexes with a temp folder - tmp, err := ioutil.TempDir("", "") + tmp, err := os.MkdirTemp("", "") if err != nil { t.Fatal(err) } defer os.RemoveAll(tmp) - indexesClient := pkgs.Indexes{ - Folder: tmp, - } + indexURL := "https://downloads.arduino.cc/packages/package_index.json" + // Instantiate Index + Index := index.Init(indexURL, config.GetDataDir()) - service := pkgs.Tools{ - Folder: tmp, - Indexes: &indexesClient, - } + service := pkgs.New(Index, tmp, "replace", utilities.MustParseRsaPublicKey([]byte(globals.ArduinoSignaturePubKey))) ctx := context.Background() - // Add a new index - _, err = indexesClient.Add(ctx, &indexes.IndexPayload{URL: ts.URL}) - if err != nil { - t.Fatal(err) - } - // List available tools available, err := service.Available(ctx) if err != nil { t.Fatal(err) } - if len(available) != 61 { - t.Fatalf("expected %d == %d (%s)", len(available), 61, "len(available)") - } + require.NotEmpty(t, available) // Try to install a non-existent tool _, err = service.Install(ctx, &tools.ToolPayload{}) @@ -116,52 +117,162 @@ func TestTools(t *testing.T) { if len(installed) != 0 { t.Fatalf("expected %d == %d (%s)", len(installed), 0, "len(installed)") } +} - // Install a tool by specifying url and checksum - _, err = service.Install(ctx, &tools.ToolPayload{ - Packager: "arduino", - Name: "avrdude", - Version: "6.0.1-arduino2", - URL: strpoint(url()), - Checksum: strpoint(checksum()), - }) - if err != nil { - t.Fatal(err) +func TestEvilFilename(t *testing.T) { + + // Initialize indexes with a temp folder + tmp := t.TempDir() + + indexURL := "https://downloads.arduino.cc/packages/package_index.json" + // Instantiate Index + Index := index.Init(indexURL, config.GetDataDir()) + + service := pkgs.New(Index, tmp, "replace", utilities.MustParseRsaPublicKey([]byte(globals.ArduinoSignaturePubKey))) + + ctx := context.Background() + + type test struct { + fileName string + errBody string } - installed, err = service.Installed(ctx) - if err != nil { - t.Fatal(err) + evilFileNames := []string{ + "/", + "..", + "../", + "../evil.txt", + "../../../../../../../../../../../../../../../../../../../../tmp/evil.txt", + "some/path/../../../../../../../../../../../../../../../../../../../../tmp/evil.txt", } - if len(installed) != 1 { - t.Fatalf("expected %d == %d (%s)", len(installed), 1, "len(installed)") + if runtime.GOOS == "windows" { + evilFileNames = []string{ + "..\\", + "..\\evil.txt", + "..\\..\\..\\..\\..\\..\\..\\..\\..\\..\\..\\..\\..\\..\\..\\..\\..\\..\\..\\..\\tmp\\evil.txt", + "some\\path\\..\\..\\..\\..\\..\\..\\..\\..\\..\\..\\..\\..\\..\\..\\..\\..\\..\\..\\..\\..\\tmp\\evil.txt", + } + } + tests := []test{} + for _, evilFileName := range evilFileNames { + tests = append(tests, test{fileName: evilFileName, + errBody: "unsafe path join"}) + } + + toolsTemplate := tools.ToolPayload{ + // We'll replace the name directly in the test + Checksum: strpoint("SHA-256:1ae54999c1f97234a5c603eb99ad39313b11746a4ca517269a9285afa05f9100"), + Signature: strpoint("382898a97b5a86edd74208f10107d2fecbf7059ffe9cc856e045266fb4db4e98802728a0859cfdcda1c0b9075ec01e42dbea1f430b813530d5a6ae1766dfbba64c3e689b59758062dc2ab2e32b2a3491dc2b9a80b9cda4ae514fbe0ec5af210111b6896976053ab76bac55bcecfcececa68adfa3299e3cde6b7f117b3552a7d80ca419374bb497e3c3f12b640cf5b20875416b45e662fc6150b99b178f8e41d6982b4c0a255925ea39773683f9aa9201dc5768b6fc857c87ff602b6a93452a541b8ec10ca07f166e61a9e9d91f0a6090bd2038ed4427af6251039fb9fe8eb62ec30d7b0f3df38bc9de7204dec478fb86f8eb3f71543710790ee169dce039d3e0"), + URL: strpoint("http://downloads.arduino.cc/tools/bossac-1.7.0-arduino3-linux64.tar.gz"), + } + + for _, test := range tests { + t.Run("REMOVE payload containing evil names: "+test.fileName, func(t *testing.T) { + // Here we could inject malicious name also in the Packager and Version field. + // Since the path is made by joining all of these 3 fields, we're using only the Name, + // as it won't change the result and let us keep the test small and readable. + _, err := service.Remove(ctx, &tools.ToolPayload{Name: test.fileName}) + require.Error(t, err, test) + require.ErrorContains(t, err, test.errBody) + }) } + for _, test := range tests { + toolsTemplate.Name = test.fileName + t.Run("INSTALL payload containing evil names: "+toolsTemplate.Name, func(t *testing.T) { + // Here we could inject malicious name also in the Packager and Version field. + // Since the path is made by joining all of these 3 fields, we're using only the Name, + // as it won't change the result and let us keep the test small and readable. + _, err := service.Install(ctx, &toolsTemplate) + require.Error(t, err, test) + require.ErrorContains(t, err, test.errBody) + }) + } +} + +func TestInstalledHead(t *testing.T) { + // Initialize indexes with a temp folder + tmp := t.TempDir() + + indexURL := "https://downloads.arduino.cc/packages/package_index.json" + // Instantiate Index + Index := index.Init(indexURL, config.GetDataDir()) + + service := pkgs.New(Index, tmp, "replace", utilities.MustParseRsaPublicKey([]byte(globals.ArduinoSignaturePubKey))) + + ctx := context.Background() + + err := service.Installedhead(ctx) + require.NoError(t, err) } func strpoint(s string) *string { return &s } -func url() string { - urls := map[string]string{ - "linuxamd64": "https://downloads.arduino.cc/tools/avrdude-6.0.1-arduino2-x86_64-pc-linux-gnu.tar.bz2", - "linux386": "https://downloads.arduino.cc/tools/avrdude-6.0.1-arduino2-i686-pc-linux-gnu.tar.bz2", - "darwinamd64": "https://downloads.arduino.cc/tools/avrdude-6.0.1-arduino2-i386-apple-darwin11.tar.bz2", - "windows386": "https://downloads.arduino.cc/tools/avrdude-6.0.1-arduino2-i686-mingw32.zip", - "windowsamd64": "https://downloads.arduino.cc/tools/avrdude-6.0.1-arduino2-i686-mingw32.zip", +func TestInstall(t *testing.T) { + // Initialize indexes with a temp folder + tmp := t.TempDir() + + testIndex := &index.Resource{ + IndexFile: *paths.New("testdata", "test_tool_index.json"), + LastRefresh: time.Now(), } - return urls[runtime.GOOS+runtime.GOARCH] -} + tool := pkgs.New(testIndex, tmp, "replace", utilities.MustParseRsaPublicKey([]byte(globals.ArduinoSignaturePubKey))) + + ctx := context.Background() + + testCases := []tools.ToolPayload{ + // https://github.com/arduino/arduino-create-agent/issues/920 + {Name: "avrdude", Version: "6.3.0-arduino17", Packager: "arduino-test", URL: nil, Checksum: nil, Signature: nil}, + {Name: "bossac", Version: "1.6.1-arduino", Packager: "arduino-test", URL: nil, Checksum: nil, Signature: nil}, + {Name: "bossac", Version: "1.7.0-arduino3", Packager: "arduino-test", URL: nil, Checksum: nil, Signature: nil}, + {Name: "bossac", Version: "1.9.1-arduino2", Packager: "arduino-test", URL: nil, Checksum: nil, Signature: nil}, + {Name: "openocd", Version: "0.11.0-arduino2", Packager: "arduino-test", URL: nil, Checksum: nil, Signature: nil}, + {Name: "dfu-util", Version: "0.10.0-arduino1", Packager: "arduino-test", URL: nil, Checksum: nil, Signature: nil}, + {Name: "rp2040tools", Version: "1.0.6", Packager: "arduino-test", URL: nil, Checksum: nil, Signature: nil}, + {Name: "esptool_py", Version: "4.5.1", Packager: "arduino-test", URL: nil, Checksum: nil, Signature: nil}, + {Name: "arduino-fwuploader", Version: "2.2.2", Packager: "arduino-test", URL: nil, Checksum: nil, Signature: nil}, + // test download of a tool not present in index. the same archive is downloaded on linux/win/mac See https://github.com/arduino/arduino-create-agent/issues/980 + {Name: "esptool", Version: "2.5.0-3-20ed2b9", Packager: "esp8266", URL: strpoint("https://github.com/earlephilhower/esp-quick-toolchain/releases/download/2.5.0-3/x86_64-linux-gnu.esptool-f80ae31.tar.gz"), Checksum: strpoint("SHA-256:bded1dca953377838b6086a9bcd40a1dc5286ba5f69f2372c22a1d1819baad24"), Signature: strpoint("852b58871419ce5e5633ecfaa72c0f0fa890ceb51164b362b8133bc0e3e003a21cec48935b8cdc078f4031219cbf17fb7edd9d7c9ca8ed85492911c9ca6353c9aa4691eb91fda99563a6bd49aeca0d9981fb05ec76e45c6024f8a6822862ad1e34ddc652fbbf4fa909887a255d4f087398ec386577efcec523c21203be3d10fc9e9b0f990a7536875a77dc2bc5cbffea7734b62238e31719111b718bacccebffc9be689545540e81d23b81caa66214376f58a0d6a45cf7efc5d3af62ab932b371628162fffe403906f41d5534921e5be081c5ac2ecc9db5caec03a105cc44b00ce19a95ad079843501eb8182e0717ce327867380c0e39d2b48698547fc1d0d66")}, + } + + expectedFiles := map[string][]string{ + "avrdude-6.3.0-arduino17": {"bin", "etc"}, + "bossac-1.6.1-arduino": {"bossac"}, + "bossac-1.7.0-arduino3": {"bossac"}, + "bossac-1.9.1-arduino2": {"bossac"}, + "openocd-0.11.0-arduino2": {"bin", "share"}, + "dfu-util-0.10.0-arduino1": {"dfu-prefix", "dfu-suffix", "dfu-util"}, + "rp2040tools-1.0.6": {"elf2uf2", "picotool", "pioasm", "rp2040load"}, + "esptool_py-4.5.1": {"esptool"}, + "arduino-fwuploader-2.2.2": {"arduino-fwuploader"}, + // "esptool-2.5.0-3-20ed2b9": {"esptool"}, // we don't check if there is esptool in the archive because it's the same archive even on windows (no extension) + } + for _, tc := range testCases { + t.Run(tc.Name+"-"+tc.Version, func(t *testing.T) { + // Install the Tool + _, err := tool.Install(ctx, &tc) + require.NoError(t, err) + + // Check that the tool has been downloaded + toolDir := paths.New(tmp).Join(tc.Packager, tc.Name, tc.Version) + require.DirExists(t, toolDir.String()) -func checksum() string { - checksums := map[string]string{ - "linuxamd64": "SHA-256:2489004d1d98177eaf69796760451f89224007c98b39ebb5577a9a34f51425f1", - "linux386": "SHA-256:6f633dd6270ad0d9ef19507bcbf8697b414a15208e4c0f71deec25ef89cdef3f", - "darwinamd64": "SHA-256:71117cce0096dad6c091e2c34eb0b9a3386d3aec7d863d2da733d9e5eac3a6b1", - "windows386": "SHA-256:6c5483800ba753c80893607e30cade8ab77b182808fcc5ea15fa3019c63d76ae", - "windowsamd64": "SHA-256:6c5483800ba753c80893607e30cade8ab77b182808fcc5ea15fa3019c63d76ae", + // Check that the files have been created + for _, file := range expectedFiles[tc.Name+"-"+tc.Version] { + filePath := toolDir.Join(file) + if filePath.IsDir() { + require.DirExists(t, filePath.String()) + } else { + if runtime.GOOS == "windows" { + require.FileExists(t, filePath.String()+".exe") + } else { + require.FileExists(t, filePath.String()) + } + } + } + }) } - return checksums[runtime.GOOS+runtime.GOARCH] }