├── .devcontainer ├── Dockerfile └── devcontainer.json ├── .github ├── dependabot.yml ├── release-drafter.yml └── workflows │ ├── ci.yml │ ├── npmpublish.yml │ └── release-drafter.yml ├── .gitignore ├── LICENSE ├── README.md ├── example.html ├── package-lock.json ├── package.json ├── rollup.config.mjs ├── script ├── build └── develop ├── src ├── ble.ts ├── components │ ├── ib-button.ts │ ├── ib-circular-progress.ts │ ├── ib-dialog.ts │ └── ib-textfield.ts ├── const.ts ├── launch-button.ts ├── provision-dialog.ts ├── provision.ts └── util.ts └── tsconfig.json /.devcontainer/Dockerfile: -------------------------------------------------------------------------------- 1 | # See here for image contents: https://github.com/microsoft/vscode-dev-containers/tree/v0.177.0/containers/typescript-node/.devcontainer/base.Dockerfile 2 | 3 | # [Choice] Node.js version: 16, 14, 12 4 | ARG VARIANT="16-buster" 5 | FROM mcr.microsoft.com/vscode/devcontainers/typescript-node:0-${VARIANT} 6 | 7 | # [Optional] Uncomment this section to install additional OS packages. 8 | # RUN apt-get update && export DEBIAN_FRONTEND=noninteractive \ 9 | # && apt-get -y install --no-install-recommends 10 | 11 | # [Optional] Uncomment if you want to install an additional version of node using nvm 12 | # ARG EXTRA_NODE_VERSION=10 13 | # RUN su node -c "source /usr/local/share/nvm/nvm.sh && nvm install ${EXTRA_NODE_VERSION}" 14 | 15 | # [Optional] Uncomment if you want to install more global node packages 16 | # RUN su node -c "npm install -g " 17 | -------------------------------------------------------------------------------- /.devcontainer/devcontainer.json: -------------------------------------------------------------------------------- 1 | // For format details, see https://aka.ms/devcontainer.json. For config options, see the README at: 2 | // https://github.com/microsoft/vscode-dev-containers/tree/v0.177.0/containers/typescript-node 3 | { 4 | "name": "Node.js & TypeScript", 5 | "build": { 6 | "dockerfile": "Dockerfile", 7 | // Update 'VARIANT' to pick a Node version: 12, 14, 16 8 | "args": { 9 | "VARIANT": "16" 10 | } 11 | }, 12 | 13 | // Add the IDs of extensions you want installed when the container is created. 14 | "extensions": [ 15 | "dbaeumer.vscode-eslint", 16 | "esbenp.prettier-vscode", 17 | "bierner.lit-html", 18 | "runem.lit-plugin" 19 | ], 20 | 21 | // Use 'forwardPorts' to make a list of ports inside the container available locally. 22 | // "forwardPorts": [], 23 | 24 | // Use 'postCreateCommand' to run commands after the container is created. 25 | "postCreateCommand": "npm install", 26 | 27 | // Comment out connect as root instead. More info: https://aka.ms/vscode-remote/containers/non-root. 28 | "remoteUser": "node", 29 | 30 | "settings": { 31 | "files.eol": "\n", 32 | "editor.tabSize": 2, 33 | "editor.formatOnPaste": false, 34 | "editor.formatOnSave": true, 35 | "editor.formatOnType": true, 36 | "[typescript]": { 37 | "editor.defaultFormatter": "esbenp.prettier-vscode" 38 | }, 39 | "[javascript]": { 40 | "editor.defaultFormatter": "esbenp.prettier-vscode" 41 | }, 42 | "files.trimTrailingWhitespace": true 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | version: 2 2 | updates: 3 | - package-ecosystem: "github-actions" 4 | directory: "/" 5 | schedule: 6 | interval: weekly 7 | - package-ecosystem: "npm" 8 | directory: "/" 9 | schedule: 10 | interval: "weekly" 11 | -------------------------------------------------------------------------------- /.github/release-drafter.yml: -------------------------------------------------------------------------------- 1 | categories: 2 | - title: "⬆️ Dependencies" 3 | collapse-after: 1 4 | labels: 5 | - "dependencies" 6 | template: | 7 | ## What's Changed 8 | 9 | $CHANGES 10 | -------------------------------------------------------------------------------- /.github/workflows/ci.yml: -------------------------------------------------------------------------------- 1 | # This workflow will do a clean install of node dependencies, build the source code and run tests across different versions of node 2 | # For more information see: https://help.github.com/actions/language-and-framework-guides/using-nodejs-with-github-actions 3 | 4 | name: CI 5 | 6 | on: 7 | push: 8 | branches: [main] 9 | pull_request: 10 | branches: [main] 11 | 12 | jobs: 13 | build: 14 | runs-on: ubuntu-latest 15 | 16 | steps: 17 | - uses: actions/checkout@v3 18 | - name: Use Node.js 19 | uses: actions/setup-node@v3 20 | with: 21 | node-version: 16 22 | - run: npm ci 23 | - run: script/build 24 | - run: npm exec -- prettier --check src 25 | -------------------------------------------------------------------------------- /.github/workflows/npmpublish.yml: -------------------------------------------------------------------------------- 1 | # This workflow will run tests using node and then publish a package to GitHub Packages when a release is created 2 | # For more information see: https://help.github.com/actions/language-and-framework-guides/publishing-nodejs-packages 3 | 4 | name: Node.js Package 5 | 6 | on: 7 | release: 8 | types: [published] 9 | 10 | jobs: 11 | publish-npm: 12 | runs-on: ubuntu-latest 13 | steps: 14 | - uses: actions/checkout@v3 15 | - uses: actions/setup-node@v3 16 | with: 17 | node-version: 16 18 | registry-url: https://registry.npmjs.org/ 19 | - run: npm ci 20 | - run: npm publish 21 | env: 22 | NODE_AUTH_TOKEN: ${{secrets.NPM_TOKEN}} 23 | -------------------------------------------------------------------------------- /.github/workflows/release-drafter.yml: -------------------------------------------------------------------------------- 1 | name: Release Drafter 2 | 3 | on: 4 | push: 5 | branches: 6 | - main 7 | 8 | jobs: 9 | update_release_draft: 10 | runs-on: ubuntu-latest 11 | steps: 12 | - uses: release-drafter/release-drafter@v5 13 | env: 14 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 15 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | dist 2 | node_modules 3 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS 177 | 178 | APPENDIX: How to apply the Apache License to your work. 179 | 180 | To apply the Apache License to your work, attach the following 181 | boilerplate notice, with the fields enclosed by brackets "[]" 182 | replaced with your own identifying information. (Don't include 183 | the brackets!) The text should be enclosed in the appropriate 184 | comment syntax for the file format. We also recommend that a 185 | file or class name and description of purpose be included on the 186 | same "printed page" as the copyright notice for easier 187 | identification within third-party archives. 188 | 189 | Copyright [yyyy] [name of copyright owner] 190 | 191 | Licensed under the Apache License, Version 2.0 (the "License"); 192 | you may not use this file except in compliance with the License. 193 | You may obtain a copy of the License at 194 | 195 | http://www.apache.org/licenses/LICENSE-2.0 196 | 197 | Unless required by applicable law or agreed to in writing, software 198 | distributed under the License is distributed on an "AS IS" BASIS, 199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 200 | See the License for the specific language governing permissions and 201 | limitations under the License. 202 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # JavaScript SDK for Improv Wi-Fi over BLE 2 | 3 | ## Installation 4 | 5 | You can use the JavaScript SDK by adding the following HTML to your website: 6 | 7 | ```html 8 | 9 | ``` 10 | 11 | If you are using a bundler and JavaScript package manager, you can install the SDK via NPM: 12 | 13 | ``` 14 | npm install --save improv-wifi-sdk 15 | ``` 16 | 17 | And then import it in your code: 18 | 19 | ``` 20 | import 'improv-wifi-sdk'; 21 | ``` 22 | 23 | ## Usage 24 | 25 | Add the following to your website to show a button to start the provisioning process: 26 | 27 | ```html 28 | 29 | ``` 30 | 31 | A warning message will be rendered if the browser does not support WebBluetooth. 32 | 33 | ### Attributes 34 | 35 | The following attributes are automatically added to `` and can be used for styling: 36 | 37 | | Attribute | Description | 38 | | -- | -- | 39 | | `supported` | Added if this browser is supported 40 | | `unsupported` | Added if this browser is not supported 41 | 42 | ### Slots 43 | 44 | It is possible to customize the button and the message. You do this by putting your elements inside the `` element and adding the appropriate `slot` attribute. Use `activate` to replace the activation button and `unsupported` to replace the unsupported message: 45 | 46 | ```html 47 | 48 | 49 | Your browser does not support provisioning. 50 | 51 | ``` 52 | 53 | ## Events 54 | 55 | When the state of provisioning changes, a `state-changed` event is fired. 56 | 57 | A `state-changed` event contains the following information: 58 | 59 | Field | Description 60 | -- | -- 61 | state | The current state (`CONNECTING`, `AUTHORIZATION_REQUIRED`, `AUTHORIZED`, `PROVISIONING`, `PROVISIONED`, `ERROR`, `UNKNOWN`) 62 | 63 | ## Browser Support 64 | 65 | This SDK requires a browser with support for WebBluetooth. Currently this is supported by Google Chrome, Microsoft Edge and other browsers based on the Blink engine. 66 | 67 | No iOS devices are supported. 68 | -------------------------------------------------------------------------------- /example.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | Improv BLE Example 4 | 15 | 16 | 17 |

Default button:

18 | 19 |

Custom launch button:

20 | 21 | Launch improv 22 | 23 |

Custom message if unsupported:

24 | 25 | ⚠️ Browser set-up not supported 26 | 27 |

Events:

28 |

29 |     
30 |     
38 |   
39 | 
40 | 


--------------------------------------------------------------------------------
/package-lock.json:
--------------------------------------------------------------------------------
   1 | {
   2 |   "name": "improv-wifi-sdk",
   3 |   "version": "1.4.0",
   4 |   "lockfileVersion": 2,
   5 |   "requires": true,
   6 |   "packages": {
   7 |     "": {
   8 |       "name": "improv-wifi-sdk",
   9 |       "version": "1.4.0",
  10 |       "license": "Apache-2.0",
  11 |       "dependencies": {
  12 |         "@material/mwc-button": "^0.27.0",
  13 |         "@material/mwc-circular-progress": "^0.27.0",
  14 |         "@material/mwc-dialog": "^0.27.0",
  15 |         "@material/mwc-textfield": "^0.27.0",
  16 |         "lit": "^2.6.1",
  17 |         "tslib": "^2.4.1"
  18 |       },
  19 |       "devDependencies": {
  20 |         "@rollup/plugin-node-resolve": "^15.0.1",
  21 |         "@rollup/plugin-terser": "^0.3.0",
  22 |         "@rollup/plugin-typescript": "^11.0.0",
  23 |         "@types/web-bluetooth": "^0.0.16",
  24 |         "prettier": "^2.8.3",
  25 |         "rollup": "^3.10.0",
  26 |         "serve": "^14.1.2",
  27 |         "typescript": "^4.9.4"
  28 |       }
  29 |     },
  30 |     "node_modules/@jridgewell/gen-mapping": {
  31 |       "version": "0.3.2",
  32 |       "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz",
  33 |       "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==",
  34 |       "dev": true,
  35 |       "dependencies": {
  36 |         "@jridgewell/set-array": "^1.0.1",
  37 |         "@jridgewell/sourcemap-codec": "^1.4.10",
  38 |         "@jridgewell/trace-mapping": "^0.3.9"
  39 |       },
  40 |       "engines": {
  41 |         "node": ">=6.0.0"
  42 |       }
  43 |     },
  44 |     "node_modules/@jridgewell/resolve-uri": {
  45 |       "version": "3.1.0",
  46 |       "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz",
  47 |       "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==",
  48 |       "dev": true,
  49 |       "engines": {
  50 |         "node": ">=6.0.0"
  51 |       }
  52 |     },
  53 |     "node_modules/@jridgewell/set-array": {
  54 |       "version": "1.1.2",
  55 |       "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz",
  56 |       "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==",
  57 |       "dev": true,
  58 |       "engines": {
  59 |         "node": ">=6.0.0"
  60 |       }
  61 |     },
  62 |     "node_modules/@jridgewell/source-map": {
  63 |       "version": "0.3.2",
  64 |       "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz",
  65 |       "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==",
  66 |       "dev": true,
  67 |       "dependencies": {
  68 |         "@jridgewell/gen-mapping": "^0.3.0",
  69 |         "@jridgewell/trace-mapping": "^0.3.9"
  70 |       }
  71 |     },
  72 |     "node_modules/@jridgewell/sourcemap-codec": {
  73 |       "version": "1.4.14",
  74 |       "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz",
  75 |       "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==",
  76 |       "dev": true
  77 |     },
  78 |     "node_modules/@jridgewell/trace-mapping": {
  79 |       "version": "0.3.17",
  80 |       "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz",
  81 |       "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==",
  82 |       "dev": true,
  83 |       "dependencies": {
  84 |         "@jridgewell/resolve-uri": "3.1.0",
  85 |         "@jridgewell/sourcemap-codec": "1.4.14"
  86 |       }
  87 |     },
  88 |     "node_modules/@lit-labs/ssr-dom-shim": {
  89 |       "version": "1.0.0",
  90 |       "resolved": "https://registry.npmjs.org/@lit-labs/ssr-dom-shim/-/ssr-dom-shim-1.0.0.tgz",
  91 |       "integrity": "sha512-ic93MBXfApIFTrup4a70M/+ddD8xdt2zxxj9sRwHQzhS9ag/syqkD8JPdTXsc1gUy2K8TTirhlCqyTEM/sifNw=="
  92 |     },
  93 |     "node_modules/@lit/reactive-element": {
  94 |       "version": "1.6.1",
  95 |       "resolved": "https://registry.npmjs.org/@lit/reactive-element/-/reactive-element-1.6.1.tgz",
  96 |       "integrity": "sha512-va15kYZr7KZNNPZdxONGQzpUr+4sxVu7V/VG7a8mRfPPXUyhEYj5RzXCQmGrlP3tAh0L3HHm5AjBMFYRqlM9SA==",
  97 |       "dependencies": {
  98 |         "@lit-labs/ssr-dom-shim": "^1.0.0"
  99 |       }
 100 |     },
 101 |     "node_modules/@material/animation": {
 102 |       "version": "14.0.0-canary.53b3cad2f.0",
 103 |       "resolved": "https://registry.npmjs.org/@material/animation/-/animation-14.0.0-canary.53b3cad2f.0.tgz",
 104 |       "integrity": "sha512-GBuR4VmcTQW1D0lPXEosf5Giho72LLbyGIydWGtaEUtLJoive/D9kFkwTN4Fsyt9Kkl7hbhs35vrNe6QkAH4/Q==",
 105 |       "dependencies": {
 106 |         "tslib": "^2.1.0"
 107 |       }
 108 |     },
 109 |     "node_modules/@material/base": {
 110 |       "version": "14.0.0-canary.53b3cad2f.0",
 111 |       "resolved": "https://registry.npmjs.org/@material/base/-/base-14.0.0-canary.53b3cad2f.0.tgz",
 112 |       "integrity": "sha512-UJKbXwZtkrA3sfQDmj8Zbw1Q3Tqtl6KdfVFws95Yf7TCUgTFzbZI/FSx1w7dVugQPOEnIBuZnzqZam/MtHkx4w==",
 113 |       "dependencies": {
 114 |         "tslib": "^2.1.0"
 115 |       }
 116 |     },
 117 |     "node_modules/@material/button": {
 118 |       "version": "14.0.0-canary.53b3cad2f.0",
 119 |       "resolved": "https://registry.npmjs.org/@material/button/-/button-14.0.0-canary.53b3cad2f.0.tgz",
 120 |       "integrity": "sha512-IPBAByKpQjrWNVmAWx5VCTCLnOw4ymbLsbHmBkLiDgcLPs1EtwYnKKIwQ+/t3bV02OShUdMiyboL8V/C0gMS1A==",
 121 |       "dependencies": {
 122 |         "@material/density": "14.0.0-canary.53b3cad2f.0",
 123 |         "@material/dom": "14.0.0-canary.53b3cad2f.0",
 124 |         "@material/elevation": "14.0.0-canary.53b3cad2f.0",
 125 |         "@material/feature-targeting": "14.0.0-canary.53b3cad2f.0",
 126 |         "@material/focus-ring": "14.0.0-canary.53b3cad2f.0",
 127 |         "@material/ripple": "14.0.0-canary.53b3cad2f.0",
 128 |         "@material/rtl": "14.0.0-canary.53b3cad2f.0",
 129 |         "@material/shape": "14.0.0-canary.53b3cad2f.0",
 130 |         "@material/theme": "14.0.0-canary.53b3cad2f.0",
 131 |         "@material/tokens": "14.0.0-canary.53b3cad2f.0",
 132 |         "@material/touch-target": "14.0.0-canary.53b3cad2f.0",
 133 |         "@material/typography": "14.0.0-canary.53b3cad2f.0",
 134 |         "tslib": "^2.1.0"
 135 |       }
 136 |     },
 137 |     "node_modules/@material/circular-progress": {
 138 |       "version": "14.0.0-canary.53b3cad2f.0",
 139 |       "resolved": "https://registry.npmjs.org/@material/circular-progress/-/circular-progress-14.0.0-canary.53b3cad2f.0.tgz",
 140 |       "integrity": "sha512-4A+HMgp66b45Fvbcbh9qb1j0vRFjKESbE2fHFkSMMNDPqFiKcvq4tJFBxKG2szYzpAnXdWLYaB+DeQ2+wSu9hg==",
 141 |       "dependencies": {
 142 |         "@material/animation": "14.0.0-canary.53b3cad2f.0",
 143 |         "@material/base": "14.0.0-canary.53b3cad2f.0",
 144 |         "@material/feature-targeting": "14.0.0-canary.53b3cad2f.0",
 145 |         "@material/progress-indicator": "14.0.0-canary.53b3cad2f.0",
 146 |         "@material/rtl": "14.0.0-canary.53b3cad2f.0",
 147 |         "@material/theme": "14.0.0-canary.53b3cad2f.0",
 148 |         "tslib": "^2.1.0"
 149 |       }
 150 |     },
 151 |     "node_modules/@material/density": {
 152 |       "version": "14.0.0-canary.53b3cad2f.0",
 153 |       "resolved": "https://registry.npmjs.org/@material/density/-/density-14.0.0-canary.53b3cad2f.0.tgz",
 154 |       "integrity": "sha512-Eh/vZ3vVyqtpylg5Ci33qlgtToS4H1/ppd450Ib3tcdISIoodgijYY0w4XsRvrnZgbI/h/1STFdLxdzS0UNuFw==",
 155 |       "dependencies": {
 156 |         "tslib": "^2.1.0"
 157 |       }
 158 |     },
 159 |     "node_modules/@material/dialog": {
 160 |       "version": "14.0.0-canary.53b3cad2f.0",
 161 |       "resolved": "https://registry.npmjs.org/@material/dialog/-/dialog-14.0.0-canary.53b3cad2f.0.tgz",
 162 |       "integrity": "sha512-yiG2nlVKTW0Ro3CF8Z/MVpTwSyG/8Kio3AaTUbeQdbjt5r692s4x5Yhd8m1IjEQKUeulY4CndvIbCUwZ8/G2PA==",
 163 |       "dependencies": {
 164 |         "@material/animation": "14.0.0-canary.53b3cad2f.0",
 165 |         "@material/base": "14.0.0-canary.53b3cad2f.0",
 166 |         "@material/button": "14.0.0-canary.53b3cad2f.0",
 167 |         "@material/dom": "14.0.0-canary.53b3cad2f.0",
 168 |         "@material/elevation": "14.0.0-canary.53b3cad2f.0",
 169 |         "@material/feature-targeting": "14.0.0-canary.53b3cad2f.0",
 170 |         "@material/icon-button": "14.0.0-canary.53b3cad2f.0",
 171 |         "@material/ripple": "14.0.0-canary.53b3cad2f.0",
 172 |         "@material/rtl": "14.0.0-canary.53b3cad2f.0",
 173 |         "@material/shape": "14.0.0-canary.53b3cad2f.0",
 174 |         "@material/theme": "14.0.0-canary.53b3cad2f.0",
 175 |         "@material/tokens": "14.0.0-canary.53b3cad2f.0",
 176 |         "@material/touch-target": "14.0.0-canary.53b3cad2f.0",
 177 |         "@material/typography": "14.0.0-canary.53b3cad2f.0",
 178 |         "tslib": "^2.1.0"
 179 |       }
 180 |     },
 181 |     "node_modules/@material/dom": {
 182 |       "version": "14.0.0-canary.53b3cad2f.0",
 183 |       "resolved": "https://registry.npmjs.org/@material/dom/-/dom-14.0.0-canary.53b3cad2f.0.tgz",
 184 |       "integrity": "sha512-aR+rfncF6oi2ivdOlKSJI4UXwNzWV5rXM88MLDoSJF1D7lXxhAKhge+tMUBodWGV/q0+FnXLuVAa0WYTrKjo+A==",
 185 |       "dependencies": {
 186 |         "@material/feature-targeting": "14.0.0-canary.53b3cad2f.0",
 187 |         "tslib": "^2.1.0"
 188 |       }
 189 |     },
 190 |     "node_modules/@material/elevation": {
 191 |       "version": "14.0.0-canary.53b3cad2f.0",
 192 |       "resolved": "https://registry.npmjs.org/@material/elevation/-/elevation-14.0.0-canary.53b3cad2f.0.tgz",
 193 |       "integrity": "sha512-3h+EkR588RMZ5TSNQ4UeXD1FOBnL3ABQix0DQIGwtNJCqSMoPndT/oJEFvwQbTkZNDbFIKN9p1Q7/KuFPVY8Pw==",
 194 |       "dependencies": {
 195 |         "@material/animation": "14.0.0-canary.53b3cad2f.0",
 196 |         "@material/base": "14.0.0-canary.53b3cad2f.0",
 197 |         "@material/feature-targeting": "14.0.0-canary.53b3cad2f.0",
 198 |         "@material/rtl": "14.0.0-canary.53b3cad2f.0",
 199 |         "@material/theme": "14.0.0-canary.53b3cad2f.0",
 200 |         "tslib": "^2.1.0"
 201 |       }
 202 |     },
 203 |     "node_modules/@material/feature-targeting": {
 204 |       "version": "14.0.0-canary.53b3cad2f.0",
 205 |       "resolved": "https://registry.npmjs.org/@material/feature-targeting/-/feature-targeting-14.0.0-canary.53b3cad2f.0.tgz",
 206 |       "integrity": "sha512-fn7Af3PRyARtNeYqtjxXmE3Y/dCpnpQVWWys57MqiGR/nvc6qpgOfJ6rOdcu/MrOysOE/oebTUDmDnTmwpe9Hw==",
 207 |       "dependencies": {
 208 |         "tslib": "^2.1.0"
 209 |       }
 210 |     },
 211 |     "node_modules/@material/floating-label": {
 212 |       "version": "14.0.0-canary.53b3cad2f.0",
 213 |       "resolved": "https://registry.npmjs.org/@material/floating-label/-/floating-label-14.0.0-canary.53b3cad2f.0.tgz",
 214 |       "integrity": "sha512-gHZUTTVKnP+Zjz4l9IT/G89NPmypn5FlTGLWKKqXbuQphr37rsKFR3Y80SJxULRyMDnAdKSxuZwiXLFKQz9KlA==",
 215 |       "dependencies": {
 216 |         "@material/animation": "14.0.0-canary.53b3cad2f.0",
 217 |         "@material/base": "14.0.0-canary.53b3cad2f.0",
 218 |         "@material/dom": "14.0.0-canary.53b3cad2f.0",
 219 |         "@material/feature-targeting": "14.0.0-canary.53b3cad2f.0",
 220 |         "@material/rtl": "14.0.0-canary.53b3cad2f.0",
 221 |         "@material/theme": "14.0.0-canary.53b3cad2f.0",
 222 |         "@material/typography": "14.0.0-canary.53b3cad2f.0",
 223 |         "tslib": "^2.1.0"
 224 |       }
 225 |     },
 226 |     "node_modules/@material/focus-ring": {
 227 |       "version": "14.0.0-canary.53b3cad2f.0",
 228 |       "resolved": "https://registry.npmjs.org/@material/focus-ring/-/focus-ring-14.0.0-canary.53b3cad2f.0.tgz",
 229 |       "integrity": "sha512-exPX5VrjQimipBwgcFDGRiEE783sOBgpkFui59A6i6iGvS2UrLHlYY2E65fyyyQnD1f/rv4Po1OOnCesE1kulg==",
 230 |       "dependencies": {
 231 |         "@material/dom": "14.0.0-canary.53b3cad2f.0",
 232 |         "@material/feature-targeting": "14.0.0-canary.53b3cad2f.0",
 233 |         "@material/rtl": "14.0.0-canary.53b3cad2f.0"
 234 |       }
 235 |     },
 236 |     "node_modules/@material/icon-button": {
 237 |       "version": "14.0.0-canary.53b3cad2f.0",
 238 |       "resolved": "https://registry.npmjs.org/@material/icon-button/-/icon-button-14.0.0-canary.53b3cad2f.0.tgz",
 239 |       "integrity": "sha512-BFdj3CP0JXHC/F2bDmpmzWhum4fkzIDgCCavvnpE/KcCbr0AaoSULRde+LtqvbdLIYW20cXhvjinIOlRhSOshA==",
 240 |       "dependencies": {
 241 |         "@material/base": "14.0.0-canary.53b3cad2f.0",
 242 |         "@material/density": "14.0.0-canary.53b3cad2f.0",
 243 |         "@material/dom": "14.0.0-canary.53b3cad2f.0",
 244 |         "@material/elevation": "14.0.0-canary.53b3cad2f.0",
 245 |         "@material/feature-targeting": "14.0.0-canary.53b3cad2f.0",
 246 |         "@material/focus-ring": "14.0.0-canary.53b3cad2f.0",
 247 |         "@material/ripple": "14.0.0-canary.53b3cad2f.0",
 248 |         "@material/rtl": "14.0.0-canary.53b3cad2f.0",
 249 |         "@material/theme": "14.0.0-canary.53b3cad2f.0",
 250 |         "@material/touch-target": "14.0.0-canary.53b3cad2f.0",
 251 |         "tslib": "^2.1.0"
 252 |       }
 253 |     },
 254 |     "node_modules/@material/line-ripple": {
 255 |       "version": "14.0.0-canary.53b3cad2f.0",
 256 |       "resolved": "https://registry.npmjs.org/@material/line-ripple/-/line-ripple-14.0.0-canary.53b3cad2f.0.tgz",
 257 |       "integrity": "sha512-k8f8uuDwnSqZZ98CzbYtQVtxlp1ryUup9nd2uobo3kiqQNlQfXdGkVjuCXcla0OPiKFizNn7dS6Kl/j6L09XUA==",
 258 |       "dependencies": {
 259 |         "@material/animation": "14.0.0-canary.53b3cad2f.0",
 260 |         "@material/base": "14.0.0-canary.53b3cad2f.0",
 261 |         "@material/feature-targeting": "14.0.0-canary.53b3cad2f.0",
 262 |         "@material/theme": "14.0.0-canary.53b3cad2f.0",
 263 |         "tslib": "^2.1.0"
 264 |       }
 265 |     },
 266 |     "node_modules/@material/mwc-base": {
 267 |       "version": "0.27.0",
 268 |       "resolved": "https://registry.npmjs.org/@material/mwc-base/-/mwc-base-0.27.0.tgz",
 269 |       "integrity": "sha512-oCWWtjbyQ52AaUbzINLGBKScIPyqhps2Y7c8t6Gu6fcFeDxhKXMV1Cqvtj/OMhtAt53XjHfD2XruWwYv3cYYUA==",
 270 |       "dependencies": {
 271 |         "@material/base": "=14.0.0-canary.53b3cad2f.0",
 272 |         "@material/dom": "=14.0.0-canary.53b3cad2f.0",
 273 |         "lit": "^2.0.0",
 274 |         "tslib": "^2.0.1"
 275 |       }
 276 |     },
 277 |     "node_modules/@material/mwc-button": {
 278 |       "version": "0.27.0",
 279 |       "resolved": "https://registry.npmjs.org/@material/mwc-button/-/mwc-button-0.27.0.tgz",
 280 |       "integrity": "sha512-t5m2zfE93RNKHMjdsU67X6csFzuSG08VJKKvXVQ+BriGE3xBgzY5nZdmZXomFpaWjDENPAlyS4ppCFm6o+DILw==",
 281 |       "dependencies": {
 282 |         "@material/mwc-icon": "^0.27.0",
 283 |         "@material/mwc-ripple": "^0.27.0",
 284 |         "lit": "^2.0.0",
 285 |         "tslib": "^2.0.1"
 286 |       }
 287 |     },
 288 |     "node_modules/@material/mwc-circular-progress": {
 289 |       "version": "0.27.0",
 290 |       "resolved": "https://registry.npmjs.org/@material/mwc-circular-progress/-/mwc-circular-progress-0.27.0.tgz",
 291 |       "integrity": "sha512-7DkqMb5pUrHfLus5EZ7IT2HUMoE+uPpjGzu3MnDpIzDlfYo6I8p+ifWtEytI0NtXdY5UmITNuCv0RC77mhJrgQ==",
 292 |       "dependencies": {
 293 |         "@material/circular-progress": "=14.0.0-canary.53b3cad2f.0",
 294 |         "@material/mwc-base": "^0.27.0",
 295 |         "@material/theme": "=14.0.0-canary.53b3cad2f.0",
 296 |         "lit": "^2.0.0",
 297 |         "tslib": "^2.0.1"
 298 |       }
 299 |     },
 300 |     "node_modules/@material/mwc-dialog": {
 301 |       "version": "0.27.0",
 302 |       "resolved": "https://registry.npmjs.org/@material/mwc-dialog/-/mwc-dialog-0.27.0.tgz",
 303 |       "integrity": "sha512-rkOEmCroVs0wBQbj87vH79SvSHHZ61QRCTUYsU2rHGZCvdzlmvHjWdoyKjJER6WwwM3rrT8xthfecmjICI28CA==",
 304 |       "dependencies": {
 305 |         "@material/dialog": "=14.0.0-canary.53b3cad2f.0",
 306 |         "@material/dom": "=14.0.0-canary.53b3cad2f.0",
 307 |         "@material/mwc-base": "^0.27.0",
 308 |         "@material/mwc-button": "^0.27.0",
 309 |         "blocking-elements": "^0.1.0",
 310 |         "lit": "^2.0.0",
 311 |         "tslib": "^2.0.1",
 312 |         "wicg-inert": "^3.0.0"
 313 |       }
 314 |     },
 315 |     "node_modules/@material/mwc-floating-label": {
 316 |       "version": "0.27.0",
 317 |       "resolved": "https://registry.npmjs.org/@material/mwc-floating-label/-/mwc-floating-label-0.27.0.tgz",
 318 |       "integrity": "sha512-uLleloTxQ6dDShcZzqgqfC8otQY8DtGMO9HFQbAEncoFAWpAehcEonsuT/IUhMORN+c5un0P5WXwcZsInJb7og==",
 319 |       "dependencies": {
 320 |         "@material/floating-label": "=14.0.0-canary.53b3cad2f.0",
 321 |         "lit": "^2.0.0",
 322 |         "tslib": "^2.0.1"
 323 |       }
 324 |     },
 325 |     "node_modules/@material/mwc-icon": {
 326 |       "version": "0.27.0",
 327 |       "resolved": "https://registry.npmjs.org/@material/mwc-icon/-/mwc-icon-0.27.0.tgz",
 328 |       "integrity": "sha512-Sul44I37M9Ewynn0A9DjkEBrmll2VtNbth6Pxj7I1A/EAwEfaCrPvryyGqfIu1T2hTsRcaojzQx6QjF+B5QW9A==",
 329 |       "dependencies": {
 330 |         "lit": "^2.0.0",
 331 |         "tslib": "^2.0.1"
 332 |       }
 333 |     },
 334 |     "node_modules/@material/mwc-line-ripple": {
 335 |       "version": "0.27.0",
 336 |       "resolved": "https://registry.npmjs.org/@material/mwc-line-ripple/-/mwc-line-ripple-0.27.0.tgz",
 337 |       "integrity": "sha512-n9Xpt5g3RJEl9rvk14OP6dUNJUtsJA46beTQiep7ppO7IPVFLC1v/5sPpUzfNPUBsclSPxdBuNlCxsgcIYueUw==",
 338 |       "dependencies": {
 339 |         "@material/line-ripple": "=14.0.0-canary.53b3cad2f.0",
 340 |         "lit": "^2.0.0",
 341 |         "tslib": "^2.0.1"
 342 |       }
 343 |     },
 344 |     "node_modules/@material/mwc-notched-outline": {
 345 |       "version": "0.27.0",
 346 |       "resolved": "https://registry.npmjs.org/@material/mwc-notched-outline/-/mwc-notched-outline-0.27.0.tgz",
 347 |       "integrity": "sha512-IlqfQVaEd1RAHqhOG0Xk5JhTDgBe/P9og0pnACglK6bPE0vUhYKwibJiHcr4ACTPtGWHO9o92aktR+7AIEAKtQ==",
 348 |       "dependencies": {
 349 |         "@material/mwc-base": "^0.27.0",
 350 |         "@material/notched-outline": "=14.0.0-canary.53b3cad2f.0",
 351 |         "lit": "^2.0.0",
 352 |         "tslib": "^2.0.1"
 353 |       }
 354 |     },
 355 |     "node_modules/@material/mwc-ripple": {
 356 |       "version": "0.27.0",
 357 |       "resolved": "https://registry.npmjs.org/@material/mwc-ripple/-/mwc-ripple-0.27.0.tgz",
 358 |       "integrity": "sha512-by0O8d8g3Rd96/sUB8hxy6MrDx1QTstqOsA64vqypWd526hMTBGRik08jTNap5sVIyrN9Vq17jb4NJLWQLnNHQ==",
 359 |       "dependencies": {
 360 |         "@material/dom": "=14.0.0-canary.53b3cad2f.0",
 361 |         "@material/mwc-base": "^0.27.0",
 362 |         "@material/ripple": "=14.0.0-canary.53b3cad2f.0",
 363 |         "lit": "^2.0.0",
 364 |         "tslib": "^2.0.1"
 365 |       }
 366 |     },
 367 |     "node_modules/@material/mwc-textfield": {
 368 |       "version": "0.27.0",
 369 |       "resolved": "https://registry.npmjs.org/@material/mwc-textfield/-/mwc-textfield-0.27.0.tgz",
 370 |       "integrity": "sha512-4/OEeEVAWWQ1DzpjeMLYLsa9HMlifOPjAvi0681Yj1g/RYJs5ONZS80HZ8HOT+efAOlZDugshgM4gdNS3I0XFQ==",
 371 |       "dependencies": {
 372 |         "@material/floating-label": "=14.0.0-canary.53b3cad2f.0",
 373 |         "@material/line-ripple": "=14.0.0-canary.53b3cad2f.0",
 374 |         "@material/mwc-base": "^0.27.0",
 375 |         "@material/mwc-floating-label": "^0.27.0",
 376 |         "@material/mwc-line-ripple": "^0.27.0",
 377 |         "@material/mwc-notched-outline": "^0.27.0",
 378 |         "@material/textfield": "=14.0.0-canary.53b3cad2f.0",
 379 |         "lit": "^2.0.0",
 380 |         "tslib": "^2.0.1"
 381 |       }
 382 |     },
 383 |     "node_modules/@material/notched-outline": {
 384 |       "version": "14.0.0-canary.53b3cad2f.0",
 385 |       "resolved": "https://registry.npmjs.org/@material/notched-outline/-/notched-outline-14.0.0-canary.53b3cad2f.0.tgz",
 386 |       "integrity": "sha512-3ByiPOC/wWQmFKfgJS98kb5/6v92n7uIfJ6v6sryKJlJCJn39qfpGcCM5RpRIws1RET1s1zBJT2JDwYeu/hM5A==",
 387 |       "dependencies": {
 388 |         "@material/base": "14.0.0-canary.53b3cad2f.0",
 389 |         "@material/feature-targeting": "14.0.0-canary.53b3cad2f.0",
 390 |         "@material/floating-label": "14.0.0-canary.53b3cad2f.0",
 391 |         "@material/rtl": "14.0.0-canary.53b3cad2f.0",
 392 |         "@material/shape": "14.0.0-canary.53b3cad2f.0",
 393 |         "@material/theme": "14.0.0-canary.53b3cad2f.0",
 394 |         "tslib": "^2.1.0"
 395 |       }
 396 |     },
 397 |     "node_modules/@material/progress-indicator": {
 398 |       "version": "14.0.0-canary.53b3cad2f.0",
 399 |       "resolved": "https://registry.npmjs.org/@material/progress-indicator/-/progress-indicator-14.0.0-canary.53b3cad2f.0.tgz",
 400 |       "integrity": "sha512-vW0oZK70QOpAarip95ueCQ/I3kBClcWjxsc0F0QjkqT76DOVXpjnZ4XoRRyq9eMpwLqlKLTecrsSNpmqwwF1Dg==",
 401 |       "dependencies": {
 402 |         "tslib": "^2.1.0"
 403 |       }
 404 |     },
 405 |     "node_modules/@material/ripple": {
 406 |       "version": "14.0.0-canary.53b3cad2f.0",
 407 |       "resolved": "https://registry.npmjs.org/@material/ripple/-/ripple-14.0.0-canary.53b3cad2f.0.tgz",
 408 |       "integrity": "sha512-6g2G62vd8DsMuIUSXlRrzb98qkZ4o8ZREknNwNP2zaLQEOkJ//4j9HaqDt98/3LIjUTY9UIVFTQENiMmlwKHYQ==",
 409 |       "dependencies": {
 410 |         "@material/animation": "14.0.0-canary.53b3cad2f.0",
 411 |         "@material/base": "14.0.0-canary.53b3cad2f.0",
 412 |         "@material/dom": "14.0.0-canary.53b3cad2f.0",
 413 |         "@material/feature-targeting": "14.0.0-canary.53b3cad2f.0",
 414 |         "@material/rtl": "14.0.0-canary.53b3cad2f.0",
 415 |         "@material/theme": "14.0.0-canary.53b3cad2f.0",
 416 |         "tslib": "^2.1.0"
 417 |       }
 418 |     },
 419 |     "node_modules/@material/rtl": {
 420 |       "version": "14.0.0-canary.53b3cad2f.0",
 421 |       "resolved": "https://registry.npmjs.org/@material/rtl/-/rtl-14.0.0-canary.53b3cad2f.0.tgz",
 422 |       "integrity": "sha512-f08LT0HSa0WYU+4Jz/tbm1TQ9Fcf2k+H6dPPYv0J1sZmX6hMgCEmNiUdUFLQFvszoXx2XrRi1/hIFjbz2e69Yg==",
 423 |       "dependencies": {
 424 |         "@material/theme": "14.0.0-canary.53b3cad2f.0",
 425 |         "tslib": "^2.1.0"
 426 |       }
 427 |     },
 428 |     "node_modules/@material/shape": {
 429 |       "version": "14.0.0-canary.53b3cad2f.0",
 430 |       "resolved": "https://registry.npmjs.org/@material/shape/-/shape-14.0.0-canary.53b3cad2f.0.tgz",
 431 |       "integrity": "sha512-RyjInLCNe+nI/ulKea0ZLHphXQDiDqYazS25SRn18g8Hoa5qGNaY5oOBncDXUYn3jm5oI5kFc9oif//kulkbjg==",
 432 |       "dependencies": {
 433 |         "@material/feature-targeting": "14.0.0-canary.53b3cad2f.0",
 434 |         "@material/rtl": "14.0.0-canary.53b3cad2f.0",
 435 |         "@material/theme": "14.0.0-canary.53b3cad2f.0",
 436 |         "tslib": "^2.1.0"
 437 |       }
 438 |     },
 439 |     "node_modules/@material/textfield": {
 440 |       "version": "14.0.0-canary.53b3cad2f.0",
 441 |       "resolved": "https://registry.npmjs.org/@material/textfield/-/textfield-14.0.0-canary.53b3cad2f.0.tgz",
 442 |       "integrity": "sha512-Pla9Tr94Is18o97E/mqHKdkR24rPES9atGm3BlXrNzyr5tu6+h++RBbxy7V6IExcfl0MX+v9Gyqz7sPZzFtwMA==",
 443 |       "dependencies": {
 444 |         "@material/animation": "14.0.0-canary.53b3cad2f.0",
 445 |         "@material/base": "14.0.0-canary.53b3cad2f.0",
 446 |         "@material/density": "14.0.0-canary.53b3cad2f.0",
 447 |         "@material/dom": "14.0.0-canary.53b3cad2f.0",
 448 |         "@material/feature-targeting": "14.0.0-canary.53b3cad2f.0",
 449 |         "@material/floating-label": "14.0.0-canary.53b3cad2f.0",
 450 |         "@material/line-ripple": "14.0.0-canary.53b3cad2f.0",
 451 |         "@material/notched-outline": "14.0.0-canary.53b3cad2f.0",
 452 |         "@material/ripple": "14.0.0-canary.53b3cad2f.0",
 453 |         "@material/rtl": "14.0.0-canary.53b3cad2f.0",
 454 |         "@material/shape": "14.0.0-canary.53b3cad2f.0",
 455 |         "@material/theme": "14.0.0-canary.53b3cad2f.0",
 456 |         "@material/tokens": "14.0.0-canary.53b3cad2f.0",
 457 |         "@material/typography": "14.0.0-canary.53b3cad2f.0",
 458 |         "tslib": "^2.1.0"
 459 |       }
 460 |     },
 461 |     "node_modules/@material/theme": {
 462 |       "version": "14.0.0-canary.53b3cad2f.0",
 463 |       "resolved": "https://registry.npmjs.org/@material/theme/-/theme-14.0.0-canary.53b3cad2f.0.tgz",
 464 |       "integrity": "sha512-S06XAevDCDWMe+GgsEpITMS07imUidzadNaTbJsqssFajBLr53QWVZsG84BpjXKXoYvyEJvb0hX5U0lq6ip9UQ==",
 465 |       "dependencies": {
 466 |         "@material/feature-targeting": "14.0.0-canary.53b3cad2f.0",
 467 |         "tslib": "^2.1.0"
 468 |       }
 469 |     },
 470 |     "node_modules/@material/tokens": {
 471 |       "version": "14.0.0-canary.53b3cad2f.0",
 472 |       "resolved": "https://registry.npmjs.org/@material/tokens/-/tokens-14.0.0-canary.53b3cad2f.0.tgz",
 473 |       "integrity": "sha512-myHFB7vac8zErA3qgkqmV+kpE+i9JEwc/6Yf0MOumDSpylJGw28QikpNC6eAVBK2EmPQTaFn20mqUxyud8dGqw==",
 474 |       "dependencies": {
 475 |         "@material/elevation": "14.0.0-canary.53b3cad2f.0"
 476 |       }
 477 |     },
 478 |     "node_modules/@material/touch-target": {
 479 |       "version": "14.0.0-canary.53b3cad2f.0",
 480 |       "resolved": "https://registry.npmjs.org/@material/touch-target/-/touch-target-14.0.0-canary.53b3cad2f.0.tgz",
 481 |       "integrity": "sha512-d83e5vbqoLyL542yOTTp4TLVltddWiqbI/j1w/D9ipE30YKfe2EDN+CNJc32Zufh5IUfK41DsZdrN8fI9cL99A==",
 482 |       "dependencies": {
 483 |         "@material/base": "14.0.0-canary.53b3cad2f.0",
 484 |         "@material/feature-targeting": "14.0.0-canary.53b3cad2f.0",
 485 |         "@material/rtl": "14.0.0-canary.53b3cad2f.0",
 486 |         "tslib": "^2.1.0"
 487 |       }
 488 |     },
 489 |     "node_modules/@material/typography": {
 490 |       "version": "14.0.0-canary.53b3cad2f.0",
 491 |       "resolved": "https://registry.npmjs.org/@material/typography/-/typography-14.0.0-canary.53b3cad2f.0.tgz",
 492 |       "integrity": "sha512-9J0k2fq7uyHsRzRqJDJLGmg3YzRpfRPtFDVeUH/xBcYoqpZE7wYw5Mb7s/l8eP626EtR7HhXhSPjvRTLA6NIJg==",
 493 |       "dependencies": {
 494 |         "@material/feature-targeting": "14.0.0-canary.53b3cad2f.0",
 495 |         "@material/theme": "14.0.0-canary.53b3cad2f.0",
 496 |         "tslib": "^2.1.0"
 497 |       }
 498 |     },
 499 |     "node_modules/@rollup/plugin-node-resolve": {
 500 |       "version": "15.0.1",
 501 |       "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-15.0.1.tgz",
 502 |       "integrity": "sha512-ReY88T7JhJjeRVbfCyNj+NXAG3IIsVMsX9b5/9jC98dRP8/yxlZdz7mHZbHk5zHr24wZZICS5AcXsFZAXYUQEg==",
 503 |       "dev": true,
 504 |       "dependencies": {
 505 |         "@rollup/pluginutils": "^5.0.1",
 506 |         "@types/resolve": "1.20.2",
 507 |         "deepmerge": "^4.2.2",
 508 |         "is-builtin-module": "^3.2.0",
 509 |         "is-module": "^1.0.0",
 510 |         "resolve": "^1.22.1"
 511 |       },
 512 |       "engines": {
 513 |         "node": ">=14.0.0"
 514 |       },
 515 |       "peerDependencies": {
 516 |         "rollup": "^2.78.0||^3.0.0"
 517 |       },
 518 |       "peerDependenciesMeta": {
 519 |         "rollup": {
 520 |           "optional": true
 521 |         }
 522 |       }
 523 |     },
 524 |     "node_modules/@rollup/plugin-terser": {
 525 |       "version": "0.3.0",
 526 |       "resolved": "https://registry.npmjs.org/@rollup/plugin-terser/-/plugin-terser-0.3.0.tgz",
 527 |       "integrity": "sha512-mYTkNW9KjOscS/3QWU5LfOKsR3/fAAVDaqcAe2TZ7ng6pN46f+C7FOZbITuIW/neA+PhcjoKl7yMyB3XcmA4gw==",
 528 |       "dev": true,
 529 |       "dependencies": {
 530 |         "serialize-javascript": "^6.0.0",
 531 |         "smob": "^0.0.6",
 532 |         "terser": "^5.15.1"
 533 |       },
 534 |       "engines": {
 535 |         "node": ">=14.0.0"
 536 |       },
 537 |       "peerDependencies": {
 538 |         "rollup": "^2.x || ^3.x"
 539 |       },
 540 |       "peerDependenciesMeta": {
 541 |         "rollup": {
 542 |           "optional": true
 543 |         }
 544 |       }
 545 |     },
 546 |     "node_modules/@rollup/plugin-terser/node_modules/serialize-javascript": {
 547 |       "version": "6.0.1",
 548 |       "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz",
 549 |       "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==",
 550 |       "dev": true,
 551 |       "dependencies": {
 552 |         "randombytes": "^2.1.0"
 553 |       }
 554 |     },
 555 |     "node_modules/@rollup/plugin-typescript": {
 556 |       "version": "11.0.0",
 557 |       "resolved": "https://registry.npmjs.org/@rollup/plugin-typescript/-/plugin-typescript-11.0.0.tgz",
 558 |       "integrity": "sha512-goPyCWBiimk1iJgSTgsehFD5OOFHiAknrRJjqFCudcW8JtWiBlK284Xnn4flqMqg6YAjVG/EE+3aVzrL5qNSzQ==",
 559 |       "dev": true,
 560 |       "dependencies": {
 561 |         "@rollup/pluginutils": "^5.0.1",
 562 |         "resolve": "^1.22.1"
 563 |       },
 564 |       "engines": {
 565 |         "node": ">=14.0.0"
 566 |       },
 567 |       "peerDependencies": {
 568 |         "rollup": "^2.14.0||^3.0.0",
 569 |         "tslib": "*",
 570 |         "typescript": ">=3.7.0"
 571 |       },
 572 |       "peerDependenciesMeta": {
 573 |         "rollup": {
 574 |           "optional": true
 575 |         },
 576 |         "tslib": {
 577 |           "optional": true
 578 |         }
 579 |       }
 580 |     },
 581 |     "node_modules/@rollup/pluginutils": {
 582 |       "version": "5.0.2",
 583 |       "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.0.2.tgz",
 584 |       "integrity": "sha512-pTd9rIsP92h+B6wWwFbW8RkZv4hiR/xKsqre4SIuAOaOEQRxi0lqLke9k2/7WegC85GgUs9pjmOjCUi3In4vwA==",
 585 |       "dev": true,
 586 |       "dependencies": {
 587 |         "@types/estree": "^1.0.0",
 588 |         "estree-walker": "^2.0.2",
 589 |         "picomatch": "^2.3.1"
 590 |       },
 591 |       "engines": {
 592 |         "node": ">=14.0.0"
 593 |       },
 594 |       "peerDependencies": {
 595 |         "rollup": "^1.20.0||^2.0.0||^3.0.0"
 596 |       },
 597 |       "peerDependenciesMeta": {
 598 |         "rollup": {
 599 |           "optional": true
 600 |         }
 601 |       }
 602 |     },
 603 |     "node_modules/@types/estree": {
 604 |       "version": "1.0.0",
 605 |       "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.0.tgz",
 606 |       "integrity": "sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==",
 607 |       "dev": true
 608 |     },
 609 |     "node_modules/@types/resolve": {
 610 |       "version": "1.20.2",
 611 |       "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.20.2.tgz",
 612 |       "integrity": "sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==",
 613 |       "dev": true
 614 |     },
 615 |     "node_modules/@types/trusted-types": {
 616 |       "version": "2.0.2",
 617 |       "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.2.tgz",
 618 |       "integrity": "sha512-F5DIZ36YVLE+PN+Zwws4kJogq47hNgX3Nx6WyDJ3kcplxyke3XIzB8uK5n/Lpm1HBsbGzd6nmGehL8cPekP+Tg=="
 619 |     },
 620 |     "node_modules/@types/web-bluetooth": {
 621 |       "version": "0.0.16",
 622 |       "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.16.tgz",
 623 |       "integrity": "sha512-oh8q2Zc32S6gd/j50GowEjKLoOVOwHP/bWVjKJInBwQqdOYMdPrf1oVlelTlyfFK3CKxL1uahMDAr+vy8T7yMQ==",
 624 |       "dev": true
 625 |     },
 626 |     "node_modules/@zeit/schemas": {
 627 |       "version": "2.21.0",
 628 |       "resolved": "https://registry.npmjs.org/@zeit/schemas/-/schemas-2.21.0.tgz",
 629 |       "integrity": "sha512-/J4WBTpWtQ4itN1rb3ao8LfClmVcmz2pO6oYb7Qd4h7VSqUhIbJIvrykz9Ew1WMg6eFWsKdsMHc5uPbFxqlCpg==",
 630 |       "dev": true
 631 |     },
 632 |     "node_modules/accepts": {
 633 |       "version": "1.3.8",
 634 |       "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz",
 635 |       "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==",
 636 |       "dev": true,
 637 |       "dependencies": {
 638 |         "mime-types": "~2.1.34",
 639 |         "negotiator": "0.6.3"
 640 |       },
 641 |       "engines": {
 642 |         "node": ">= 0.6"
 643 |       }
 644 |     },
 645 |     "node_modules/acorn": {
 646 |       "version": "8.8.1",
 647 |       "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz",
 648 |       "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==",
 649 |       "dev": true,
 650 |       "bin": {
 651 |         "acorn": "bin/acorn"
 652 |       },
 653 |       "engines": {
 654 |         "node": ">=0.4.0"
 655 |       }
 656 |     },
 657 |     "node_modules/ajv": {
 658 |       "version": "8.11.0",
 659 |       "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz",
 660 |       "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==",
 661 |       "dev": true,
 662 |       "dependencies": {
 663 |         "fast-deep-equal": "^3.1.1",
 664 |         "json-schema-traverse": "^1.0.0",
 665 |         "require-from-string": "^2.0.2",
 666 |         "uri-js": "^4.2.2"
 667 |       },
 668 |       "funding": {
 669 |         "type": "github",
 670 |         "url": "https://github.com/sponsors/epoberezkin"
 671 |       }
 672 |     },
 673 |     "node_modules/ansi-align": {
 674 |       "version": "3.0.1",
 675 |       "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz",
 676 |       "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==",
 677 |       "dev": true,
 678 |       "dependencies": {
 679 |         "string-width": "^4.1.0"
 680 |       }
 681 |     },
 682 |     "node_modules/ansi-align/node_modules/ansi-regex": {
 683 |       "version": "5.0.1",
 684 |       "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
 685 |       "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
 686 |       "dev": true,
 687 |       "engines": {
 688 |         "node": ">=8"
 689 |       }
 690 |     },
 691 |     "node_modules/ansi-align/node_modules/emoji-regex": {
 692 |       "version": "8.0.0",
 693 |       "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
 694 |       "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
 695 |       "dev": true
 696 |     },
 697 |     "node_modules/ansi-align/node_modules/string-width": {
 698 |       "version": "4.2.3",
 699 |       "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
 700 |       "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
 701 |       "dev": true,
 702 |       "dependencies": {
 703 |         "emoji-regex": "^8.0.0",
 704 |         "is-fullwidth-code-point": "^3.0.0",
 705 |         "strip-ansi": "^6.0.1"
 706 |       },
 707 |       "engines": {
 708 |         "node": ">=8"
 709 |       }
 710 |     },
 711 |     "node_modules/ansi-align/node_modules/strip-ansi": {
 712 |       "version": "6.0.1",
 713 |       "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
 714 |       "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
 715 |       "dev": true,
 716 |       "dependencies": {
 717 |         "ansi-regex": "^5.0.1"
 718 |       },
 719 |       "engines": {
 720 |         "node": ">=8"
 721 |       }
 722 |     },
 723 |     "node_modules/ansi-regex": {
 724 |       "version": "6.0.1",
 725 |       "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz",
 726 |       "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==",
 727 |       "dev": true,
 728 |       "engines": {
 729 |         "node": ">=12"
 730 |       },
 731 |       "funding": {
 732 |         "url": "https://github.com/chalk/ansi-regex?sponsor=1"
 733 |       }
 734 |     },
 735 |     "node_modules/arch": {
 736 |       "version": "2.2.0",
 737 |       "resolved": "https://registry.npmjs.org/arch/-/arch-2.2.0.tgz",
 738 |       "integrity": "sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==",
 739 |       "dev": true,
 740 |       "funding": [
 741 |         {
 742 |           "type": "github",
 743 |           "url": "https://github.com/sponsors/feross"
 744 |         },
 745 |         {
 746 |           "type": "patreon",
 747 |           "url": "https://www.patreon.com/feross"
 748 |         },
 749 |         {
 750 |           "type": "consulting",
 751 |           "url": "https://feross.org/support"
 752 |         }
 753 |       ]
 754 |     },
 755 |     "node_modules/arg": {
 756 |       "version": "5.0.2",
 757 |       "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz",
 758 |       "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==",
 759 |       "dev": true
 760 |     },
 761 |     "node_modules/balanced-match": {
 762 |       "version": "1.0.2",
 763 |       "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
 764 |       "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
 765 |       "dev": true
 766 |     },
 767 |     "node_modules/blocking-elements": {
 768 |       "version": "0.1.1",
 769 |       "resolved": "https://registry.npmjs.org/blocking-elements/-/blocking-elements-0.1.1.tgz",
 770 |       "integrity": "sha512-/SLWbEzMoVIMZACCyhD/4Ya2M1PWP1qMKuiymowPcI+PdWDARqeARBjhj73kbUBCxEmTZCUu5TAqxtwUO9C1Ig=="
 771 |     },
 772 |     "node_modules/boxen": {
 773 |       "version": "7.0.0",
 774 |       "resolved": "https://registry.npmjs.org/boxen/-/boxen-7.0.0.tgz",
 775 |       "integrity": "sha512-j//dBVuyacJbvW+tvZ9HuH03fZ46QcaKvvhZickZqtB271DxJ7SNRSNxrV/dZX0085m7hISRZWbzWlJvx/rHSg==",
 776 |       "dev": true,
 777 |       "dependencies": {
 778 |         "ansi-align": "^3.0.1",
 779 |         "camelcase": "^7.0.0",
 780 |         "chalk": "^5.0.1",
 781 |         "cli-boxes": "^3.0.0",
 782 |         "string-width": "^5.1.2",
 783 |         "type-fest": "^2.13.0",
 784 |         "widest-line": "^4.0.1",
 785 |         "wrap-ansi": "^8.0.1"
 786 |       },
 787 |       "engines": {
 788 |         "node": ">=14.16"
 789 |       },
 790 |       "funding": {
 791 |         "url": "https://github.com/sponsors/sindresorhus"
 792 |       }
 793 |     },
 794 |     "node_modules/boxen/node_modules/chalk": {
 795 |       "version": "5.0.1",
 796 |       "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.0.1.tgz",
 797 |       "integrity": "sha512-Fo07WOYGqMfCWHOzSXOt2CxDbC6skS/jO9ynEcmpANMoPrD+W1r1K6Vx7iNm+AQmETU1Xr2t+n8nzkV9t6xh3w==",
 798 |       "dev": true,
 799 |       "engines": {
 800 |         "node": "^12.17.0 || ^14.13 || >=16.0.0"
 801 |       },
 802 |       "funding": {
 803 |         "url": "https://github.com/chalk/chalk?sponsor=1"
 804 |       }
 805 |     },
 806 |     "node_modules/brace-expansion": {
 807 |       "version": "1.1.11",
 808 |       "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
 809 |       "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
 810 |       "dev": true,
 811 |       "dependencies": {
 812 |         "balanced-match": "^1.0.0",
 813 |         "concat-map": "0.0.1"
 814 |       }
 815 |     },
 816 |     "node_modules/buffer-from": {
 817 |       "version": "1.1.2",
 818 |       "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
 819 |       "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==",
 820 |       "dev": true
 821 |     },
 822 |     "node_modules/builtin-modules": {
 823 |       "version": "3.3.0",
 824 |       "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz",
 825 |       "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==",
 826 |       "dev": true,
 827 |       "engines": {
 828 |         "node": ">=6"
 829 |       },
 830 |       "funding": {
 831 |         "url": "https://github.com/sponsors/sindresorhus"
 832 |       }
 833 |     },
 834 |     "node_modules/bytes": {
 835 |       "version": "3.0.0",
 836 |       "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz",
 837 |       "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=",
 838 |       "dev": true,
 839 |       "engines": {
 840 |         "node": ">= 0.8"
 841 |       }
 842 |     },
 843 |     "node_modules/camelcase": {
 844 |       "version": "7.0.0",
 845 |       "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-7.0.0.tgz",
 846 |       "integrity": "sha512-JToIvOmz6nhGsUhAYScbo2d6Py5wojjNfoxoc2mEVLUdJ70gJK2gnd+ABY1Tc3sVMyK7QDPtN0T/XdlCQWITyQ==",
 847 |       "dev": true,
 848 |       "engines": {
 849 |         "node": ">=14.16"
 850 |       },
 851 |       "funding": {
 852 |         "url": "https://github.com/sponsors/sindresorhus"
 853 |       }
 854 |     },
 855 |     "node_modules/chalk-template": {
 856 |       "version": "0.4.0",
 857 |       "resolved": "https://registry.npmjs.org/chalk-template/-/chalk-template-0.4.0.tgz",
 858 |       "integrity": "sha512-/ghrgmhfY8RaSdeo43hNXxpoHAtxdbskUHjPpfqUWGttFgycUhYPGx3YZBCnUCvOa7Doivn1IZec3DEGFoMgLg==",
 859 |       "dev": true,
 860 |       "dependencies": {
 861 |         "chalk": "^4.1.2"
 862 |       },
 863 |       "engines": {
 864 |         "node": ">=12"
 865 |       },
 866 |       "funding": {
 867 |         "url": "https://github.com/chalk/chalk-template?sponsor=1"
 868 |       }
 869 |     },
 870 |     "node_modules/chalk-template/node_modules/ansi-styles": {
 871 |       "version": "4.3.0",
 872 |       "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
 873 |       "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
 874 |       "dev": true,
 875 |       "dependencies": {
 876 |         "color-convert": "^2.0.1"
 877 |       },
 878 |       "engines": {
 879 |         "node": ">=8"
 880 |       },
 881 |       "funding": {
 882 |         "url": "https://github.com/chalk/ansi-styles?sponsor=1"
 883 |       }
 884 |     },
 885 |     "node_modules/chalk-template/node_modules/chalk": {
 886 |       "version": "4.1.2",
 887 |       "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
 888 |       "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
 889 |       "dev": true,
 890 |       "dependencies": {
 891 |         "ansi-styles": "^4.1.0",
 892 |         "supports-color": "^7.1.0"
 893 |       },
 894 |       "engines": {
 895 |         "node": ">=10"
 896 |       },
 897 |       "funding": {
 898 |         "url": "https://github.com/chalk/chalk?sponsor=1"
 899 |       }
 900 |     },
 901 |     "node_modules/chalk-template/node_modules/color-convert": {
 902 |       "version": "2.0.1",
 903 |       "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
 904 |       "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
 905 |       "dev": true,
 906 |       "dependencies": {
 907 |         "color-name": "~1.1.4"
 908 |       },
 909 |       "engines": {
 910 |         "node": ">=7.0.0"
 911 |       }
 912 |     },
 913 |     "node_modules/chalk-template/node_modules/color-name": {
 914 |       "version": "1.1.4",
 915 |       "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
 916 |       "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
 917 |       "dev": true
 918 |     },
 919 |     "node_modules/chalk-template/node_modules/has-flag": {
 920 |       "version": "4.0.0",
 921 |       "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
 922 |       "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
 923 |       "dev": true,
 924 |       "engines": {
 925 |         "node": ">=8"
 926 |       }
 927 |     },
 928 |     "node_modules/chalk-template/node_modules/supports-color": {
 929 |       "version": "7.2.0",
 930 |       "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
 931 |       "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
 932 |       "dev": true,
 933 |       "dependencies": {
 934 |         "has-flag": "^4.0.0"
 935 |       },
 936 |       "engines": {
 937 |         "node": ">=8"
 938 |       }
 939 |     },
 940 |     "node_modules/cli-boxes": {
 941 |       "version": "3.0.0",
 942 |       "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz",
 943 |       "integrity": "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==",
 944 |       "dev": true,
 945 |       "engines": {
 946 |         "node": ">=10"
 947 |       },
 948 |       "funding": {
 949 |         "url": "https://github.com/sponsors/sindresorhus"
 950 |       }
 951 |     },
 952 |     "node_modules/clipboardy": {
 953 |       "version": "3.0.0",
 954 |       "resolved": "https://registry.npmjs.org/clipboardy/-/clipboardy-3.0.0.tgz",
 955 |       "integrity": "sha512-Su+uU5sr1jkUy1sGRpLKjKrvEOVXgSgiSInwa/qeID6aJ07yh+5NWc3h2QfjHjBnfX4LhtFcuAWKUsJ3r+fjbg==",
 956 |       "dev": true,
 957 |       "dependencies": {
 958 |         "arch": "^2.2.0",
 959 |         "execa": "^5.1.1",
 960 |         "is-wsl": "^2.2.0"
 961 |       },
 962 |       "engines": {
 963 |         "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
 964 |       },
 965 |       "funding": {
 966 |         "url": "https://github.com/sponsors/sindresorhus"
 967 |       }
 968 |     },
 969 |     "node_modules/commander": {
 970 |       "version": "2.20.3",
 971 |       "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
 972 |       "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
 973 |       "dev": true
 974 |     },
 975 |     "node_modules/compressible": {
 976 |       "version": "2.0.18",
 977 |       "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz",
 978 |       "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==",
 979 |       "dev": true,
 980 |       "dependencies": {
 981 |         "mime-db": ">= 1.43.0 < 2"
 982 |       },
 983 |       "engines": {
 984 |         "node": ">= 0.6"
 985 |       }
 986 |     },
 987 |     "node_modules/compression": {
 988 |       "version": "1.7.4",
 989 |       "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz",
 990 |       "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==",
 991 |       "dev": true,
 992 |       "dependencies": {
 993 |         "accepts": "~1.3.5",
 994 |         "bytes": "3.0.0",
 995 |         "compressible": "~2.0.16",
 996 |         "debug": "2.6.9",
 997 |         "on-headers": "~1.0.2",
 998 |         "safe-buffer": "5.1.2",
 999 |         "vary": "~1.1.2"
1000 |       },
1001 |       "engines": {
1002 |         "node": ">= 0.8.0"
1003 |       }
1004 |     },
1005 |     "node_modules/concat-map": {
1006 |       "version": "0.0.1",
1007 |       "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
1008 |       "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
1009 |       "dev": true
1010 |     },
1011 |     "node_modules/content-disposition": {
1012 |       "version": "0.5.2",
1013 |       "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz",
1014 |       "integrity": "sha512-kRGRZw3bLlFISDBgwTSA1TMBFN6J6GWDeubmDE3AF+3+yXL8hTWv8r5rkLbqYXY4RjPk/EzHnClI3zQf1cFmHA==",
1015 |       "dev": true,
1016 |       "engines": {
1017 |         "node": ">= 0.6"
1018 |       }
1019 |     },
1020 |     "node_modules/cross-spawn": {
1021 |       "version": "7.0.3",
1022 |       "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
1023 |       "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
1024 |       "dev": true,
1025 |       "dependencies": {
1026 |         "path-key": "^3.1.0",
1027 |         "shebang-command": "^2.0.0",
1028 |         "which": "^2.0.1"
1029 |       },
1030 |       "engines": {
1031 |         "node": ">= 8"
1032 |       }
1033 |     },
1034 |     "node_modules/debug": {
1035 |       "version": "2.6.9",
1036 |       "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
1037 |       "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
1038 |       "dev": true,
1039 |       "dependencies": {
1040 |         "ms": "2.0.0"
1041 |       }
1042 |     },
1043 |     "node_modules/deep-extend": {
1044 |       "version": "0.6.0",
1045 |       "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz",
1046 |       "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==",
1047 |       "dev": true,
1048 |       "engines": {
1049 |         "node": ">=4.0.0"
1050 |       }
1051 |     },
1052 |     "node_modules/deepmerge": {
1053 |       "version": "4.2.2",
1054 |       "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz",
1055 |       "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==",
1056 |       "dev": true,
1057 |       "engines": {
1058 |         "node": ">=0.10.0"
1059 |       }
1060 |     },
1061 |     "node_modules/eastasianwidth": {
1062 |       "version": "0.2.0",
1063 |       "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz",
1064 |       "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==",
1065 |       "dev": true
1066 |     },
1067 |     "node_modules/emoji-regex": {
1068 |       "version": "9.2.2",
1069 |       "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
1070 |       "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",
1071 |       "dev": true
1072 |     },
1073 |     "node_modules/estree-walker": {
1074 |       "version": "2.0.2",
1075 |       "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz",
1076 |       "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==",
1077 |       "dev": true
1078 |     },
1079 |     "node_modules/execa": {
1080 |       "version": "5.1.1",
1081 |       "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz",
1082 |       "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==",
1083 |       "dev": true,
1084 |       "dependencies": {
1085 |         "cross-spawn": "^7.0.3",
1086 |         "get-stream": "^6.0.0",
1087 |         "human-signals": "^2.1.0",
1088 |         "is-stream": "^2.0.0",
1089 |         "merge-stream": "^2.0.0",
1090 |         "npm-run-path": "^4.0.1",
1091 |         "onetime": "^5.1.2",
1092 |         "signal-exit": "^3.0.3",
1093 |         "strip-final-newline": "^2.0.0"
1094 |       },
1095 |       "engines": {
1096 |         "node": ">=10"
1097 |       },
1098 |       "funding": {
1099 |         "url": "https://github.com/sindresorhus/execa?sponsor=1"
1100 |       }
1101 |     },
1102 |     "node_modules/fast-deep-equal": {
1103 |       "version": "3.1.3",
1104 |       "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
1105 |       "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
1106 |       "dev": true
1107 |     },
1108 |     "node_modules/fast-url-parser": {
1109 |       "version": "1.1.3",
1110 |       "resolved": "https://registry.npmjs.org/fast-url-parser/-/fast-url-parser-1.1.3.tgz",
1111 |       "integrity": "sha512-5jOCVXADYNuRkKFzNJ0dCCewsZiYo0dz8QNYljkOpFC6r2U4OBmKtvm/Tsuh4w1YYdDqDb31a8TVhBJ2OJKdqQ==",
1112 |       "dev": true,
1113 |       "dependencies": {
1114 |         "punycode": "^1.3.2"
1115 |       }
1116 |     },
1117 |     "node_modules/fsevents": {
1118 |       "version": "2.3.2",
1119 |       "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
1120 |       "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
1121 |       "dev": true,
1122 |       "hasInstallScript": true,
1123 |       "optional": true,
1124 |       "os": [
1125 |         "darwin"
1126 |       ],
1127 |       "engines": {
1128 |         "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
1129 |       }
1130 |     },
1131 |     "node_modules/function-bind": {
1132 |       "version": "1.1.1",
1133 |       "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
1134 |       "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
1135 |       "dev": true
1136 |     },
1137 |     "node_modules/get-stream": {
1138 |       "version": "6.0.1",
1139 |       "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
1140 |       "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==",
1141 |       "dev": true,
1142 |       "engines": {
1143 |         "node": ">=10"
1144 |       },
1145 |       "funding": {
1146 |         "url": "https://github.com/sponsors/sindresorhus"
1147 |       }
1148 |     },
1149 |     "node_modules/has": {
1150 |       "version": "1.0.3",
1151 |       "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
1152 |       "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
1153 |       "dev": true,
1154 |       "dependencies": {
1155 |         "function-bind": "^1.1.1"
1156 |       },
1157 |       "engines": {
1158 |         "node": ">= 0.4.0"
1159 |       }
1160 |     },
1161 |     "node_modules/human-signals": {
1162 |       "version": "2.1.0",
1163 |       "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz",
1164 |       "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==",
1165 |       "dev": true,
1166 |       "engines": {
1167 |         "node": ">=10.17.0"
1168 |       }
1169 |     },
1170 |     "node_modules/ini": {
1171 |       "version": "1.3.8",
1172 |       "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz",
1173 |       "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==",
1174 |       "dev": true
1175 |     },
1176 |     "node_modules/is-builtin-module": {
1177 |       "version": "3.2.0",
1178 |       "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.2.0.tgz",
1179 |       "integrity": "sha512-phDA4oSGt7vl1n5tJvTWooWWAsXLY+2xCnxNqvKhGEzujg+A43wPlPOyDg3C8XQHN+6k/JTQWJ/j0dQh/qr+Hw==",
1180 |       "dev": true,
1181 |       "dependencies": {
1182 |         "builtin-modules": "^3.3.0"
1183 |       },
1184 |       "engines": {
1185 |         "node": ">=6"
1186 |       },
1187 |       "funding": {
1188 |         "url": "https://github.com/sponsors/sindresorhus"
1189 |       }
1190 |     },
1191 |     "node_modules/is-core-module": {
1192 |       "version": "2.11.0",
1193 |       "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz",
1194 |       "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==",
1195 |       "dev": true,
1196 |       "dependencies": {
1197 |         "has": "^1.0.3"
1198 |       },
1199 |       "funding": {
1200 |         "url": "https://github.com/sponsors/ljharb"
1201 |       }
1202 |     },
1203 |     "node_modules/is-docker": {
1204 |       "version": "2.2.1",
1205 |       "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz",
1206 |       "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==",
1207 |       "dev": true,
1208 |       "bin": {
1209 |         "is-docker": "cli.js"
1210 |       },
1211 |       "engines": {
1212 |         "node": ">=8"
1213 |       },
1214 |       "funding": {
1215 |         "url": "https://github.com/sponsors/sindresorhus"
1216 |       }
1217 |     },
1218 |     "node_modules/is-fullwidth-code-point": {
1219 |       "version": "3.0.0",
1220 |       "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
1221 |       "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
1222 |       "dev": true,
1223 |       "engines": {
1224 |         "node": ">=8"
1225 |       }
1226 |     },
1227 |     "node_modules/is-module": {
1228 |       "version": "1.0.0",
1229 |       "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz",
1230 |       "integrity": "sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE=",
1231 |       "dev": true
1232 |     },
1233 |     "node_modules/is-port-reachable": {
1234 |       "version": "4.0.0",
1235 |       "resolved": "https://registry.npmjs.org/is-port-reachable/-/is-port-reachable-4.0.0.tgz",
1236 |       "integrity": "sha512-9UoipoxYmSk6Xy7QFgRv2HDyaysmgSG75TFQs6S+3pDM7ZhKTF/bskZV+0UlABHzKjNVhPjYCLfeZUEg1wXxig==",
1237 |       "dev": true,
1238 |       "engines": {
1239 |         "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
1240 |       },
1241 |       "funding": {
1242 |         "url": "https://github.com/sponsors/sindresorhus"
1243 |       }
1244 |     },
1245 |     "node_modules/is-stream": {
1246 |       "version": "2.0.1",
1247 |       "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
1248 |       "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
1249 |       "dev": true,
1250 |       "engines": {
1251 |         "node": ">=8"
1252 |       },
1253 |       "funding": {
1254 |         "url": "https://github.com/sponsors/sindresorhus"
1255 |       }
1256 |     },
1257 |     "node_modules/is-wsl": {
1258 |       "version": "2.2.0",
1259 |       "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz",
1260 |       "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==",
1261 |       "dev": true,
1262 |       "dependencies": {
1263 |         "is-docker": "^2.0.0"
1264 |       },
1265 |       "engines": {
1266 |         "node": ">=8"
1267 |       }
1268 |     },
1269 |     "node_modules/isexe": {
1270 |       "version": "2.0.0",
1271 |       "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
1272 |       "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
1273 |       "dev": true
1274 |     },
1275 |     "node_modules/json-schema-traverse": {
1276 |       "version": "1.0.0",
1277 |       "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
1278 |       "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
1279 |       "dev": true
1280 |     },
1281 |     "node_modules/lit": {
1282 |       "version": "2.6.1",
1283 |       "resolved": "https://registry.npmjs.org/lit/-/lit-2.6.1.tgz",
1284 |       "integrity": "sha512-DT87LD64f8acR7uVp7kZfhLRrHkfC/N4BVzAtnw9Yg8087mbBJ//qedwdwX0kzDbxgPccWRW6mFwGbRQIxy0pw==",
1285 |       "dependencies": {
1286 |         "@lit/reactive-element": "^1.6.0",
1287 |         "lit-element": "^3.2.0",
1288 |         "lit-html": "^2.6.0"
1289 |       }
1290 |     },
1291 |     "node_modules/lit-element": {
1292 |       "version": "3.2.0",
1293 |       "resolved": "https://registry.npmjs.org/lit-element/-/lit-element-3.2.0.tgz",
1294 |       "integrity": "sha512-HbE7yt2SnUtg5DCrWt028oaU4D5F4k/1cntAFHTkzY8ZIa8N0Wmu92PxSxucsQSOXlODFrICkQ5x/tEshKi13g==",
1295 |       "dependencies": {
1296 |         "@lit/reactive-element": "^1.3.0",
1297 |         "lit-html": "^2.2.0"
1298 |       }
1299 |     },
1300 |     "node_modules/lit-html": {
1301 |       "version": "2.6.1",
1302 |       "resolved": "https://registry.npmjs.org/lit-html/-/lit-html-2.6.1.tgz",
1303 |       "integrity": "sha512-Z3iw+E+3KKFn9t2YKNjsXNEu/LRLI98mtH/C6lnFg7kvaqPIzPn124Yd4eT/43lyqrejpc5Wb6BHq3fdv4S8Rw==",
1304 |       "dependencies": {
1305 |         "@types/trusted-types": "^2.0.2"
1306 |       }
1307 |     },
1308 |     "node_modules/merge-stream": {
1309 |       "version": "2.0.0",
1310 |       "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
1311 |       "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
1312 |       "dev": true
1313 |     },
1314 |     "node_modules/mime-db": {
1315 |       "version": "1.52.0",
1316 |       "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
1317 |       "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
1318 |       "dev": true,
1319 |       "engines": {
1320 |         "node": ">= 0.6"
1321 |       }
1322 |     },
1323 |     "node_modules/mime-types": {
1324 |       "version": "2.1.35",
1325 |       "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
1326 |       "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
1327 |       "dev": true,
1328 |       "dependencies": {
1329 |         "mime-db": "1.52.0"
1330 |       },
1331 |       "engines": {
1332 |         "node": ">= 0.6"
1333 |       }
1334 |     },
1335 |     "node_modules/mimic-fn": {
1336 |       "version": "2.1.0",
1337 |       "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
1338 |       "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
1339 |       "dev": true,
1340 |       "engines": {
1341 |         "node": ">=6"
1342 |       }
1343 |     },
1344 |     "node_modules/minimatch": {
1345 |       "version": "3.1.2",
1346 |       "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
1347 |       "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
1348 |       "dev": true,
1349 |       "dependencies": {
1350 |         "brace-expansion": "^1.1.7"
1351 |       },
1352 |       "engines": {
1353 |         "node": "*"
1354 |       }
1355 |     },
1356 |     "node_modules/minimist": {
1357 |       "version": "1.2.6",
1358 |       "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz",
1359 |       "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==",
1360 |       "dev": true
1361 |     },
1362 |     "node_modules/ms": {
1363 |       "version": "2.0.0",
1364 |       "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
1365 |       "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
1366 |       "dev": true
1367 |     },
1368 |     "node_modules/negotiator": {
1369 |       "version": "0.6.3",
1370 |       "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz",
1371 |       "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==",
1372 |       "dev": true,
1373 |       "engines": {
1374 |         "node": ">= 0.6"
1375 |       }
1376 |     },
1377 |     "node_modules/npm-run-path": {
1378 |       "version": "4.0.1",
1379 |       "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz",
1380 |       "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==",
1381 |       "dev": true,
1382 |       "dependencies": {
1383 |         "path-key": "^3.0.0"
1384 |       },
1385 |       "engines": {
1386 |         "node": ">=8"
1387 |       }
1388 |     },
1389 |     "node_modules/on-headers": {
1390 |       "version": "1.0.2",
1391 |       "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz",
1392 |       "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==",
1393 |       "dev": true,
1394 |       "engines": {
1395 |         "node": ">= 0.8"
1396 |       }
1397 |     },
1398 |     "node_modules/onetime": {
1399 |       "version": "5.1.2",
1400 |       "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz",
1401 |       "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
1402 |       "dev": true,
1403 |       "dependencies": {
1404 |         "mimic-fn": "^2.1.0"
1405 |       },
1406 |       "engines": {
1407 |         "node": ">=6"
1408 |       },
1409 |       "funding": {
1410 |         "url": "https://github.com/sponsors/sindresorhus"
1411 |       }
1412 |     },
1413 |     "node_modules/path-is-inside": {
1414 |       "version": "1.0.2",
1415 |       "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz",
1416 |       "integrity": "sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==",
1417 |       "dev": true
1418 |     },
1419 |     "node_modules/path-key": {
1420 |       "version": "3.1.1",
1421 |       "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
1422 |       "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
1423 |       "dev": true,
1424 |       "engines": {
1425 |         "node": ">=8"
1426 |       }
1427 |     },
1428 |     "node_modules/path-parse": {
1429 |       "version": "1.0.7",
1430 |       "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
1431 |       "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
1432 |       "dev": true
1433 |     },
1434 |     "node_modules/path-to-regexp": {
1435 |       "version": "2.2.1",
1436 |       "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-2.2.1.tgz",
1437 |       "integrity": "sha512-gu9bD6Ta5bwGrrU8muHzVOBFFREpp2iRkVfhBJahwJ6p6Xw20SjT0MxLnwkjOibQmGSYhiUnf2FLe7k+jcFmGQ==",
1438 |       "dev": true
1439 |     },
1440 |     "node_modules/picomatch": {
1441 |       "version": "2.3.1",
1442 |       "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
1443 |       "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
1444 |       "dev": true,
1445 |       "engines": {
1446 |         "node": ">=8.6"
1447 |       },
1448 |       "funding": {
1449 |         "url": "https://github.com/sponsors/jonschlinkert"
1450 |       }
1451 |     },
1452 |     "node_modules/prettier": {
1453 |       "version": "2.8.4",
1454 |       "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.4.tgz",
1455 |       "integrity": "sha512-vIS4Rlc2FNh0BySk3Wkd6xmwxB0FpOndW5fisM5H8hsZSxU2VWVB5CWIkIjWvrHjIhxk2g3bfMKM87zNTrZddw==",
1456 |       "dev": true,
1457 |       "bin": {
1458 |         "prettier": "bin-prettier.js"
1459 |       },
1460 |       "engines": {
1461 |         "node": ">=10.13.0"
1462 |       },
1463 |       "funding": {
1464 |         "url": "https://github.com/prettier/prettier?sponsor=1"
1465 |       }
1466 |     },
1467 |     "node_modules/punycode": {
1468 |       "version": "1.4.1",
1469 |       "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
1470 |       "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==",
1471 |       "dev": true
1472 |     },
1473 |     "node_modules/randombytes": {
1474 |       "version": "2.1.0",
1475 |       "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
1476 |       "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
1477 |       "dev": true,
1478 |       "dependencies": {
1479 |         "safe-buffer": "^5.1.0"
1480 |       }
1481 |     },
1482 |     "node_modules/range-parser": {
1483 |       "version": "1.2.0",
1484 |       "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz",
1485 |       "integrity": "sha512-kA5WQoNVo4t9lNx2kQNFCxKeBl5IbbSNBl1M/tLkw9WCn+hxNBAW5Qh8gdhs63CJnhjJ2zQWFoqPJP2sK1AV5A==",
1486 |       "dev": true,
1487 |       "engines": {
1488 |         "node": ">= 0.6"
1489 |       }
1490 |     },
1491 |     "node_modules/rc": {
1492 |       "version": "1.2.8",
1493 |       "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz",
1494 |       "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==",
1495 |       "dev": true,
1496 |       "dependencies": {
1497 |         "deep-extend": "^0.6.0",
1498 |         "ini": "~1.3.0",
1499 |         "minimist": "^1.2.0",
1500 |         "strip-json-comments": "~2.0.1"
1501 |       },
1502 |       "bin": {
1503 |         "rc": "cli.js"
1504 |       }
1505 |     },
1506 |     "node_modules/registry-auth-token": {
1507 |       "version": "3.3.2",
1508 |       "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.3.2.tgz",
1509 |       "integrity": "sha512-JL39c60XlzCVgNrO+qq68FoNb56w/m7JYvGR2jT5iR1xBrUA3Mfx5Twk5rqTThPmQKMWydGmq8oFtDlxfrmxnQ==",
1510 |       "dev": true,
1511 |       "dependencies": {
1512 |         "rc": "^1.1.6",
1513 |         "safe-buffer": "^5.0.1"
1514 |       }
1515 |     },
1516 |     "node_modules/registry-url": {
1517 |       "version": "3.1.0",
1518 |       "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz",
1519 |       "integrity": "sha512-ZbgR5aZEdf4UKZVBPYIgaglBmSF2Hi94s2PcIHhRGFjKYu+chjJdYfHn4rt3hB6eCKLJ8giVIIfgMa1ehDfZKA==",
1520 |       "dev": true,
1521 |       "dependencies": {
1522 |         "rc": "^1.0.1"
1523 |       },
1524 |       "engines": {
1525 |         "node": ">=0.10.0"
1526 |       }
1527 |     },
1528 |     "node_modules/require-from-string": {
1529 |       "version": "2.0.2",
1530 |       "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz",
1531 |       "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==",
1532 |       "dev": true,
1533 |       "engines": {
1534 |         "node": ">=0.10.0"
1535 |       }
1536 |     },
1537 |     "node_modules/resolve": {
1538 |       "version": "1.22.1",
1539 |       "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz",
1540 |       "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==",
1541 |       "dev": true,
1542 |       "dependencies": {
1543 |         "is-core-module": "^2.9.0",
1544 |         "path-parse": "^1.0.7",
1545 |         "supports-preserve-symlinks-flag": "^1.0.0"
1546 |       },
1547 |       "bin": {
1548 |         "resolve": "bin/resolve"
1549 |       },
1550 |       "funding": {
1551 |         "url": "https://github.com/sponsors/ljharb"
1552 |       }
1553 |     },
1554 |     "node_modules/rollup": {
1555 |       "version": "3.15.0",
1556 |       "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.15.0.tgz",
1557 |       "integrity": "sha512-F9hrCAhnp5/zx/7HYmftvsNBkMfLfk/dXUh73hPSM2E3CRgap65orDNJbLetoiUFwSAk6iHPLvBrZ5iHYvzqsg==",
1558 |       "dev": true,
1559 |       "bin": {
1560 |         "rollup": "dist/bin/rollup"
1561 |       },
1562 |       "engines": {
1563 |         "node": ">=14.18.0",
1564 |         "npm": ">=8.0.0"
1565 |       },
1566 |       "optionalDependencies": {
1567 |         "fsevents": "~2.3.2"
1568 |       }
1569 |     },
1570 |     "node_modules/safe-buffer": {
1571 |       "version": "5.1.2",
1572 |       "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
1573 |       "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
1574 |       "dev": true
1575 |     },
1576 |     "node_modules/serve": {
1577 |       "version": "14.1.2",
1578 |       "resolved": "https://registry.npmjs.org/serve/-/serve-14.1.2.tgz",
1579 |       "integrity": "sha512-luwVfJwbeE7dhCKeRU0vIBpt4bXdbAfzwsWJIQ5eqrIW2e+4nLWXbSlZ0WzelSFHQq+FlueOW6dr90jEewS9zw==",
1580 |       "dev": true,
1581 |       "dependencies": {
1582 |         "@zeit/schemas": "2.21.0",
1583 |         "ajv": "8.11.0",
1584 |         "arg": "5.0.2",
1585 |         "boxen": "7.0.0",
1586 |         "chalk": "5.0.1",
1587 |         "chalk-template": "0.4.0",
1588 |         "clipboardy": "3.0.0",
1589 |         "compression": "1.7.4",
1590 |         "is-port-reachable": "4.0.0",
1591 |         "serve-handler": "6.1.5",
1592 |         "update-check": "1.5.4"
1593 |       },
1594 |       "bin": {
1595 |         "serve": "build/main.js"
1596 |       },
1597 |       "engines": {
1598 |         "node": ">= 14"
1599 |       }
1600 |     },
1601 |     "node_modules/serve-handler": {
1602 |       "version": "6.1.5",
1603 |       "resolved": "https://registry.npmjs.org/serve-handler/-/serve-handler-6.1.5.tgz",
1604 |       "integrity": "sha512-ijPFle6Hwe8zfmBxJdE+5fta53fdIY0lHISJvuikXB3VYFafRjMRpOffSPvCYsbKyBA7pvy9oYr/BT1O3EArlg==",
1605 |       "dev": true,
1606 |       "dependencies": {
1607 |         "bytes": "3.0.0",
1608 |         "content-disposition": "0.5.2",
1609 |         "fast-url-parser": "1.1.3",
1610 |         "mime-types": "2.1.18",
1611 |         "minimatch": "3.1.2",
1612 |         "path-is-inside": "1.0.2",
1613 |         "path-to-regexp": "2.2.1",
1614 |         "range-parser": "1.2.0"
1615 |       }
1616 |     },
1617 |     "node_modules/serve-handler/node_modules/mime-db": {
1618 |       "version": "1.33.0",
1619 |       "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz",
1620 |       "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==",
1621 |       "dev": true,
1622 |       "engines": {
1623 |         "node": ">= 0.6"
1624 |       }
1625 |     },
1626 |     "node_modules/serve-handler/node_modules/mime-types": {
1627 |       "version": "2.1.18",
1628 |       "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz",
1629 |       "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==",
1630 |       "dev": true,
1631 |       "dependencies": {
1632 |         "mime-db": "~1.33.0"
1633 |       },
1634 |       "engines": {
1635 |         "node": ">= 0.6"
1636 |       }
1637 |     },
1638 |     "node_modules/serve/node_modules/chalk": {
1639 |       "version": "5.0.1",
1640 |       "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.0.1.tgz",
1641 |       "integrity": "sha512-Fo07WOYGqMfCWHOzSXOt2CxDbC6skS/jO9ynEcmpANMoPrD+W1r1K6Vx7iNm+AQmETU1Xr2t+n8nzkV9t6xh3w==",
1642 |       "dev": true,
1643 |       "engines": {
1644 |         "node": "^12.17.0 || ^14.13 || >=16.0.0"
1645 |       },
1646 |       "funding": {
1647 |         "url": "https://github.com/chalk/chalk?sponsor=1"
1648 |       }
1649 |     },
1650 |     "node_modules/shebang-command": {
1651 |       "version": "2.0.0",
1652 |       "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
1653 |       "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
1654 |       "dev": true,
1655 |       "dependencies": {
1656 |         "shebang-regex": "^3.0.0"
1657 |       },
1658 |       "engines": {
1659 |         "node": ">=8"
1660 |       }
1661 |     },
1662 |     "node_modules/shebang-regex": {
1663 |       "version": "3.0.0",
1664 |       "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
1665 |       "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
1666 |       "dev": true,
1667 |       "engines": {
1668 |         "node": ">=8"
1669 |       }
1670 |     },
1671 |     "node_modules/signal-exit": {
1672 |       "version": "3.0.7",
1673 |       "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
1674 |       "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
1675 |       "dev": true
1676 |     },
1677 |     "node_modules/smob": {
1678 |       "version": "0.0.6",
1679 |       "resolved": "https://registry.npmjs.org/smob/-/smob-0.0.6.tgz",
1680 |       "integrity": "sha512-V21+XeNni+tTyiST1MHsa84AQhT1aFZipzPpOFAVB8DkHzwJyjjAmt9bgwnuZiZWnIbMo2duE29wybxv/7HWUw==",
1681 |       "dev": true
1682 |     },
1683 |     "node_modules/source-map": {
1684 |       "version": "0.6.1",
1685 |       "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
1686 |       "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
1687 |       "dev": true,
1688 |       "engines": {
1689 |         "node": ">=0.10.0"
1690 |       }
1691 |     },
1692 |     "node_modules/source-map-support": {
1693 |       "version": "0.5.21",
1694 |       "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz",
1695 |       "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==",
1696 |       "dev": true,
1697 |       "dependencies": {
1698 |         "buffer-from": "^1.0.0",
1699 |         "source-map": "^0.6.0"
1700 |       }
1701 |     },
1702 |     "node_modules/string-width": {
1703 |       "version": "5.1.2",
1704 |       "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz",
1705 |       "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==",
1706 |       "dev": true,
1707 |       "dependencies": {
1708 |         "eastasianwidth": "^0.2.0",
1709 |         "emoji-regex": "^9.2.2",
1710 |         "strip-ansi": "^7.0.1"
1711 |       },
1712 |       "engines": {
1713 |         "node": ">=12"
1714 |       },
1715 |       "funding": {
1716 |         "url": "https://github.com/sponsors/sindresorhus"
1717 |       }
1718 |     },
1719 |     "node_modules/strip-ansi": {
1720 |       "version": "7.0.1",
1721 |       "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz",
1722 |       "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==",
1723 |       "dev": true,
1724 |       "dependencies": {
1725 |         "ansi-regex": "^6.0.1"
1726 |       },
1727 |       "engines": {
1728 |         "node": ">=12"
1729 |       },
1730 |       "funding": {
1731 |         "url": "https://github.com/chalk/strip-ansi?sponsor=1"
1732 |       }
1733 |     },
1734 |     "node_modules/strip-final-newline": {
1735 |       "version": "2.0.0",
1736 |       "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz",
1737 |       "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==",
1738 |       "dev": true,
1739 |       "engines": {
1740 |         "node": ">=6"
1741 |       }
1742 |     },
1743 |     "node_modules/strip-json-comments": {
1744 |       "version": "2.0.1",
1745 |       "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
1746 |       "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==",
1747 |       "dev": true,
1748 |       "engines": {
1749 |         "node": ">=0.10.0"
1750 |       }
1751 |     },
1752 |     "node_modules/supports-preserve-symlinks-flag": {
1753 |       "version": "1.0.0",
1754 |       "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
1755 |       "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
1756 |       "dev": true,
1757 |       "engines": {
1758 |         "node": ">= 0.4"
1759 |       },
1760 |       "funding": {
1761 |         "url": "https://github.com/sponsors/ljharb"
1762 |       }
1763 |     },
1764 |     "node_modules/terser": {
1765 |       "version": "5.16.1",
1766 |       "resolved": "https://registry.npmjs.org/terser/-/terser-5.16.1.tgz",
1767 |       "integrity": "sha512-xvQfyfA1ayT0qdK47zskQgRZeWLoOQ8JQ6mIgRGVNwZKdQMU+5FkCBjmv4QjcrTzyZquRw2FVtlJSRUmMKQslw==",
1768 |       "dev": true,
1769 |       "dependencies": {
1770 |         "@jridgewell/source-map": "^0.3.2",
1771 |         "acorn": "^8.5.0",
1772 |         "commander": "^2.20.0",
1773 |         "source-map-support": "~0.5.20"
1774 |       },
1775 |       "bin": {
1776 |         "terser": "bin/terser"
1777 |       },
1778 |       "engines": {
1779 |         "node": ">=10"
1780 |       }
1781 |     },
1782 |     "node_modules/tslib": {
1783 |       "version": "2.4.1",
1784 |       "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz",
1785 |       "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA=="
1786 |     },
1787 |     "node_modules/type-fest": {
1788 |       "version": "2.16.0",
1789 |       "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.16.0.tgz",
1790 |       "integrity": "sha512-qpaThT2HQkFb83gMOrdKVsfCN7LKxP26Yq+smPzY1FqoHRjqmjqHXA7n5Gkxi8efirtbeEUxzfEdePthQWCuHw==",
1791 |       "dev": true,
1792 |       "engines": {
1793 |         "node": ">=12.20"
1794 |       },
1795 |       "funding": {
1796 |         "url": "https://github.com/sponsors/sindresorhus"
1797 |       }
1798 |     },
1799 |     "node_modules/typescript": {
1800 |       "version": "4.9.5",
1801 |       "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz",
1802 |       "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==",
1803 |       "dev": true,
1804 |       "bin": {
1805 |         "tsc": "bin/tsc",
1806 |         "tsserver": "bin/tsserver"
1807 |       },
1808 |       "engines": {
1809 |         "node": ">=4.2.0"
1810 |       }
1811 |     },
1812 |     "node_modules/update-check": {
1813 |       "version": "1.5.4",
1814 |       "resolved": "https://registry.npmjs.org/update-check/-/update-check-1.5.4.tgz",
1815 |       "integrity": "sha512-5YHsflzHP4t1G+8WGPlvKbJEbAJGCgw+Em+dGR1KmBUbr1J36SJBqlHLjR7oob7sco5hWHGQVcr9B2poIVDDTQ==",
1816 |       "dev": true,
1817 |       "dependencies": {
1818 |         "registry-auth-token": "3.3.2",
1819 |         "registry-url": "3.1.0"
1820 |       }
1821 |     },
1822 |     "node_modules/uri-js": {
1823 |       "version": "4.4.1",
1824 |       "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
1825 |       "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
1826 |       "dev": true,
1827 |       "dependencies": {
1828 |         "punycode": "^2.1.0"
1829 |       }
1830 |     },
1831 |     "node_modules/uri-js/node_modules/punycode": {
1832 |       "version": "2.1.1",
1833 |       "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
1834 |       "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
1835 |       "dev": true,
1836 |       "engines": {
1837 |         "node": ">=6"
1838 |       }
1839 |     },
1840 |     "node_modules/vary": {
1841 |       "version": "1.1.2",
1842 |       "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
1843 |       "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==",
1844 |       "dev": true,
1845 |       "engines": {
1846 |         "node": ">= 0.8"
1847 |       }
1848 |     },
1849 |     "node_modules/which": {
1850 |       "version": "2.0.2",
1851 |       "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
1852 |       "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
1853 |       "dev": true,
1854 |       "dependencies": {
1855 |         "isexe": "^2.0.0"
1856 |       },
1857 |       "bin": {
1858 |         "node-which": "bin/node-which"
1859 |       },
1860 |       "engines": {
1861 |         "node": ">= 8"
1862 |       }
1863 |     },
1864 |     "node_modules/wicg-inert": {
1865 |       "version": "3.1.1",
1866 |       "resolved": "https://registry.npmjs.org/wicg-inert/-/wicg-inert-3.1.1.tgz",
1867 |       "integrity": "sha512-PhBaNh8ur9Xm4Ggy4umelwNIP6pPP1bv3EaWaKqfb/QNme2rdLjm7wIInvV4WhxVHhzA4Spgw9qNSqWtB/ca2A=="
1868 |     },
1869 |     "node_modules/widest-line": {
1870 |       "version": "4.0.1",
1871 |       "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-4.0.1.tgz",
1872 |       "integrity": "sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==",
1873 |       "dev": true,
1874 |       "dependencies": {
1875 |         "string-width": "^5.0.1"
1876 |       },
1877 |       "engines": {
1878 |         "node": ">=12"
1879 |       },
1880 |       "funding": {
1881 |         "url": "https://github.com/sponsors/sindresorhus"
1882 |       }
1883 |     },
1884 |     "node_modules/wrap-ansi": {
1885 |       "version": "8.0.1",
1886 |       "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.0.1.tgz",
1887 |       "integrity": "sha512-QFF+ufAqhoYHvoHdajT/Po7KoXVBPXS2bgjIam5isfWJPfIOnQZ50JtUiVvCv/sjgacf3yRrt2ZKUZ/V4itN4g==",
1888 |       "dev": true,
1889 |       "dependencies": {
1890 |         "ansi-styles": "^6.1.0",
1891 |         "string-width": "^5.0.1",
1892 |         "strip-ansi": "^7.0.1"
1893 |       },
1894 |       "engines": {
1895 |         "node": ">=12"
1896 |       },
1897 |       "funding": {
1898 |         "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
1899 |       }
1900 |     },
1901 |     "node_modules/wrap-ansi/node_modules/ansi-styles": {
1902 |       "version": "6.1.0",
1903 |       "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.1.0.tgz",
1904 |       "integrity": "sha512-VbqNsoz55SYGczauuup0MFUyXNQviSpFTj1RQtFzmQLk18qbVSpTFFGMT293rmDaQuKCT6InmbuEyUne4mTuxQ==",
1905 |       "dev": true,
1906 |       "engines": {
1907 |         "node": ">=12"
1908 |       },
1909 |       "funding": {
1910 |         "url": "https://github.com/chalk/ansi-styles?sponsor=1"
1911 |       }
1912 |     }
1913 |   },
1914 |   "dependencies": {
1915 |     "@jridgewell/gen-mapping": {
1916 |       "version": "0.3.2",
1917 |       "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz",
1918 |       "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==",
1919 |       "dev": true,
1920 |       "requires": {
1921 |         "@jridgewell/set-array": "^1.0.1",
1922 |         "@jridgewell/sourcemap-codec": "^1.4.10",
1923 |         "@jridgewell/trace-mapping": "^0.3.9"
1924 |       }
1925 |     },
1926 |     "@jridgewell/resolve-uri": {
1927 |       "version": "3.1.0",
1928 |       "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz",
1929 |       "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==",
1930 |       "dev": true
1931 |     },
1932 |     "@jridgewell/set-array": {
1933 |       "version": "1.1.2",
1934 |       "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz",
1935 |       "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==",
1936 |       "dev": true
1937 |     },
1938 |     "@jridgewell/source-map": {
1939 |       "version": "0.3.2",
1940 |       "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz",
1941 |       "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==",
1942 |       "dev": true,
1943 |       "requires": {
1944 |         "@jridgewell/gen-mapping": "^0.3.0",
1945 |         "@jridgewell/trace-mapping": "^0.3.9"
1946 |       }
1947 |     },
1948 |     "@jridgewell/sourcemap-codec": {
1949 |       "version": "1.4.14",
1950 |       "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz",
1951 |       "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==",
1952 |       "dev": true
1953 |     },
1954 |     "@jridgewell/trace-mapping": {
1955 |       "version": "0.3.17",
1956 |       "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz",
1957 |       "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==",
1958 |       "dev": true,
1959 |       "requires": {
1960 |         "@jridgewell/resolve-uri": "3.1.0",
1961 |         "@jridgewell/sourcemap-codec": "1.4.14"
1962 |       }
1963 |     },
1964 |     "@lit-labs/ssr-dom-shim": {
1965 |       "version": "1.0.0",
1966 |       "resolved": "https://registry.npmjs.org/@lit-labs/ssr-dom-shim/-/ssr-dom-shim-1.0.0.tgz",
1967 |       "integrity": "sha512-ic93MBXfApIFTrup4a70M/+ddD8xdt2zxxj9sRwHQzhS9ag/syqkD8JPdTXsc1gUy2K8TTirhlCqyTEM/sifNw=="
1968 |     },
1969 |     "@lit/reactive-element": {
1970 |       "version": "1.6.1",
1971 |       "resolved": "https://registry.npmjs.org/@lit/reactive-element/-/reactive-element-1.6.1.tgz",
1972 |       "integrity": "sha512-va15kYZr7KZNNPZdxONGQzpUr+4sxVu7V/VG7a8mRfPPXUyhEYj5RzXCQmGrlP3tAh0L3HHm5AjBMFYRqlM9SA==",
1973 |       "requires": {
1974 |         "@lit-labs/ssr-dom-shim": "^1.0.0"
1975 |       }
1976 |     },
1977 |     "@material/animation": {
1978 |       "version": "14.0.0-canary.53b3cad2f.0",
1979 |       "resolved": "https://registry.npmjs.org/@material/animation/-/animation-14.0.0-canary.53b3cad2f.0.tgz",
1980 |       "integrity": "sha512-GBuR4VmcTQW1D0lPXEosf5Giho72LLbyGIydWGtaEUtLJoive/D9kFkwTN4Fsyt9Kkl7hbhs35vrNe6QkAH4/Q==",
1981 |       "requires": {
1982 |         "tslib": "^2.1.0"
1983 |       }
1984 |     },
1985 |     "@material/base": {
1986 |       "version": "14.0.0-canary.53b3cad2f.0",
1987 |       "resolved": "https://registry.npmjs.org/@material/base/-/base-14.0.0-canary.53b3cad2f.0.tgz",
1988 |       "integrity": "sha512-UJKbXwZtkrA3sfQDmj8Zbw1Q3Tqtl6KdfVFws95Yf7TCUgTFzbZI/FSx1w7dVugQPOEnIBuZnzqZam/MtHkx4w==",
1989 |       "requires": {
1990 |         "tslib": "^2.1.0"
1991 |       }
1992 |     },
1993 |     "@material/button": {
1994 |       "version": "14.0.0-canary.53b3cad2f.0",
1995 |       "resolved": "https://registry.npmjs.org/@material/button/-/button-14.0.0-canary.53b3cad2f.0.tgz",
1996 |       "integrity": "sha512-IPBAByKpQjrWNVmAWx5VCTCLnOw4ymbLsbHmBkLiDgcLPs1EtwYnKKIwQ+/t3bV02OShUdMiyboL8V/C0gMS1A==",
1997 |       "requires": {
1998 |         "@material/density": "14.0.0-canary.53b3cad2f.0",
1999 |         "@material/dom": "14.0.0-canary.53b3cad2f.0",
2000 |         "@material/elevation": "14.0.0-canary.53b3cad2f.0",
2001 |         "@material/feature-targeting": "14.0.0-canary.53b3cad2f.0",
2002 |         "@material/focus-ring": "14.0.0-canary.53b3cad2f.0",
2003 |         "@material/ripple": "14.0.0-canary.53b3cad2f.0",
2004 |         "@material/rtl": "14.0.0-canary.53b3cad2f.0",
2005 |         "@material/shape": "14.0.0-canary.53b3cad2f.0",
2006 |         "@material/theme": "14.0.0-canary.53b3cad2f.0",
2007 |         "@material/tokens": "14.0.0-canary.53b3cad2f.0",
2008 |         "@material/touch-target": "14.0.0-canary.53b3cad2f.0",
2009 |         "@material/typography": "14.0.0-canary.53b3cad2f.0",
2010 |         "tslib": "^2.1.0"
2011 |       }
2012 |     },
2013 |     "@material/circular-progress": {
2014 |       "version": "14.0.0-canary.53b3cad2f.0",
2015 |       "resolved": "https://registry.npmjs.org/@material/circular-progress/-/circular-progress-14.0.0-canary.53b3cad2f.0.tgz",
2016 |       "integrity": "sha512-4A+HMgp66b45Fvbcbh9qb1j0vRFjKESbE2fHFkSMMNDPqFiKcvq4tJFBxKG2szYzpAnXdWLYaB+DeQ2+wSu9hg==",
2017 |       "requires": {
2018 |         "@material/animation": "14.0.0-canary.53b3cad2f.0",
2019 |         "@material/base": "14.0.0-canary.53b3cad2f.0",
2020 |         "@material/feature-targeting": "14.0.0-canary.53b3cad2f.0",
2021 |         "@material/progress-indicator": "14.0.0-canary.53b3cad2f.0",
2022 |         "@material/rtl": "14.0.0-canary.53b3cad2f.0",
2023 |         "@material/theme": "14.0.0-canary.53b3cad2f.0",
2024 |         "tslib": "^2.1.0"
2025 |       }
2026 |     },
2027 |     "@material/density": {
2028 |       "version": "14.0.0-canary.53b3cad2f.0",
2029 |       "resolved": "https://registry.npmjs.org/@material/density/-/density-14.0.0-canary.53b3cad2f.0.tgz",
2030 |       "integrity": "sha512-Eh/vZ3vVyqtpylg5Ci33qlgtToS4H1/ppd450Ib3tcdISIoodgijYY0w4XsRvrnZgbI/h/1STFdLxdzS0UNuFw==",
2031 |       "requires": {
2032 |         "tslib": "^2.1.0"
2033 |       }
2034 |     },
2035 |     "@material/dialog": {
2036 |       "version": "14.0.0-canary.53b3cad2f.0",
2037 |       "resolved": "https://registry.npmjs.org/@material/dialog/-/dialog-14.0.0-canary.53b3cad2f.0.tgz",
2038 |       "integrity": "sha512-yiG2nlVKTW0Ro3CF8Z/MVpTwSyG/8Kio3AaTUbeQdbjt5r692s4x5Yhd8m1IjEQKUeulY4CndvIbCUwZ8/G2PA==",
2039 |       "requires": {
2040 |         "@material/animation": "14.0.0-canary.53b3cad2f.0",
2041 |         "@material/base": "14.0.0-canary.53b3cad2f.0",
2042 |         "@material/button": "14.0.0-canary.53b3cad2f.0",
2043 |         "@material/dom": "14.0.0-canary.53b3cad2f.0",
2044 |         "@material/elevation": "14.0.0-canary.53b3cad2f.0",
2045 |         "@material/feature-targeting": "14.0.0-canary.53b3cad2f.0",
2046 |         "@material/icon-button": "14.0.0-canary.53b3cad2f.0",
2047 |         "@material/ripple": "14.0.0-canary.53b3cad2f.0",
2048 |         "@material/rtl": "14.0.0-canary.53b3cad2f.0",
2049 |         "@material/shape": "14.0.0-canary.53b3cad2f.0",
2050 |         "@material/theme": "14.0.0-canary.53b3cad2f.0",
2051 |         "@material/tokens": "14.0.0-canary.53b3cad2f.0",
2052 |         "@material/touch-target": "14.0.0-canary.53b3cad2f.0",
2053 |         "@material/typography": "14.0.0-canary.53b3cad2f.0",
2054 |         "tslib": "^2.1.0"
2055 |       }
2056 |     },
2057 |     "@material/dom": {
2058 |       "version": "14.0.0-canary.53b3cad2f.0",
2059 |       "resolved": "https://registry.npmjs.org/@material/dom/-/dom-14.0.0-canary.53b3cad2f.0.tgz",
2060 |       "integrity": "sha512-aR+rfncF6oi2ivdOlKSJI4UXwNzWV5rXM88MLDoSJF1D7lXxhAKhge+tMUBodWGV/q0+FnXLuVAa0WYTrKjo+A==",
2061 |       "requires": {
2062 |         "@material/feature-targeting": "14.0.0-canary.53b3cad2f.0",
2063 |         "tslib": "^2.1.0"
2064 |       }
2065 |     },
2066 |     "@material/elevation": {
2067 |       "version": "14.0.0-canary.53b3cad2f.0",
2068 |       "resolved": "https://registry.npmjs.org/@material/elevation/-/elevation-14.0.0-canary.53b3cad2f.0.tgz",
2069 |       "integrity": "sha512-3h+EkR588RMZ5TSNQ4UeXD1FOBnL3ABQix0DQIGwtNJCqSMoPndT/oJEFvwQbTkZNDbFIKN9p1Q7/KuFPVY8Pw==",
2070 |       "requires": {
2071 |         "@material/animation": "14.0.0-canary.53b3cad2f.0",
2072 |         "@material/base": "14.0.0-canary.53b3cad2f.0",
2073 |         "@material/feature-targeting": "14.0.0-canary.53b3cad2f.0",
2074 |         "@material/rtl": "14.0.0-canary.53b3cad2f.0",
2075 |         "@material/theme": "14.0.0-canary.53b3cad2f.0",
2076 |         "tslib": "^2.1.0"
2077 |       }
2078 |     },
2079 |     "@material/feature-targeting": {
2080 |       "version": "14.0.0-canary.53b3cad2f.0",
2081 |       "resolved": "https://registry.npmjs.org/@material/feature-targeting/-/feature-targeting-14.0.0-canary.53b3cad2f.0.tgz",
2082 |       "integrity": "sha512-fn7Af3PRyARtNeYqtjxXmE3Y/dCpnpQVWWys57MqiGR/nvc6qpgOfJ6rOdcu/MrOysOE/oebTUDmDnTmwpe9Hw==",
2083 |       "requires": {
2084 |         "tslib": "^2.1.0"
2085 |       }
2086 |     },
2087 |     "@material/floating-label": {
2088 |       "version": "14.0.0-canary.53b3cad2f.0",
2089 |       "resolved": "https://registry.npmjs.org/@material/floating-label/-/floating-label-14.0.0-canary.53b3cad2f.0.tgz",
2090 |       "integrity": "sha512-gHZUTTVKnP+Zjz4l9IT/G89NPmypn5FlTGLWKKqXbuQphr37rsKFR3Y80SJxULRyMDnAdKSxuZwiXLFKQz9KlA==",
2091 |       "requires": {
2092 |         "@material/animation": "14.0.0-canary.53b3cad2f.0",
2093 |         "@material/base": "14.0.0-canary.53b3cad2f.0",
2094 |         "@material/dom": "14.0.0-canary.53b3cad2f.0",
2095 |         "@material/feature-targeting": "14.0.0-canary.53b3cad2f.0",
2096 |         "@material/rtl": "14.0.0-canary.53b3cad2f.0",
2097 |         "@material/theme": "14.0.0-canary.53b3cad2f.0",
2098 |         "@material/typography": "14.0.0-canary.53b3cad2f.0",
2099 |         "tslib": "^2.1.0"
2100 |       }
2101 |     },
2102 |     "@material/focus-ring": {
2103 |       "version": "14.0.0-canary.53b3cad2f.0",
2104 |       "resolved": "https://registry.npmjs.org/@material/focus-ring/-/focus-ring-14.0.0-canary.53b3cad2f.0.tgz",
2105 |       "integrity": "sha512-exPX5VrjQimipBwgcFDGRiEE783sOBgpkFui59A6i6iGvS2UrLHlYY2E65fyyyQnD1f/rv4Po1OOnCesE1kulg==",
2106 |       "requires": {
2107 |         "@material/dom": "14.0.0-canary.53b3cad2f.0",
2108 |         "@material/feature-targeting": "14.0.0-canary.53b3cad2f.0",
2109 |         "@material/rtl": "14.0.0-canary.53b3cad2f.0"
2110 |       }
2111 |     },
2112 |     "@material/icon-button": {
2113 |       "version": "14.0.0-canary.53b3cad2f.0",
2114 |       "resolved": "https://registry.npmjs.org/@material/icon-button/-/icon-button-14.0.0-canary.53b3cad2f.0.tgz",
2115 |       "integrity": "sha512-BFdj3CP0JXHC/F2bDmpmzWhum4fkzIDgCCavvnpE/KcCbr0AaoSULRde+LtqvbdLIYW20cXhvjinIOlRhSOshA==",
2116 |       "requires": {
2117 |         "@material/base": "14.0.0-canary.53b3cad2f.0",
2118 |         "@material/density": "14.0.0-canary.53b3cad2f.0",
2119 |         "@material/dom": "14.0.0-canary.53b3cad2f.0",
2120 |         "@material/elevation": "14.0.0-canary.53b3cad2f.0",
2121 |         "@material/feature-targeting": "14.0.0-canary.53b3cad2f.0",
2122 |         "@material/focus-ring": "14.0.0-canary.53b3cad2f.0",
2123 |         "@material/ripple": "14.0.0-canary.53b3cad2f.0",
2124 |         "@material/rtl": "14.0.0-canary.53b3cad2f.0",
2125 |         "@material/theme": "14.0.0-canary.53b3cad2f.0",
2126 |         "@material/touch-target": "14.0.0-canary.53b3cad2f.0",
2127 |         "tslib": "^2.1.0"
2128 |       }
2129 |     },
2130 |     "@material/line-ripple": {
2131 |       "version": "14.0.0-canary.53b3cad2f.0",
2132 |       "resolved": "https://registry.npmjs.org/@material/line-ripple/-/line-ripple-14.0.0-canary.53b3cad2f.0.tgz",
2133 |       "integrity": "sha512-k8f8uuDwnSqZZ98CzbYtQVtxlp1ryUup9nd2uobo3kiqQNlQfXdGkVjuCXcla0OPiKFizNn7dS6Kl/j6L09XUA==",
2134 |       "requires": {
2135 |         "@material/animation": "14.0.0-canary.53b3cad2f.0",
2136 |         "@material/base": "14.0.0-canary.53b3cad2f.0",
2137 |         "@material/feature-targeting": "14.0.0-canary.53b3cad2f.0",
2138 |         "@material/theme": "14.0.0-canary.53b3cad2f.0",
2139 |         "tslib": "^2.1.0"
2140 |       }
2141 |     },
2142 |     "@material/mwc-base": {
2143 |       "version": "0.27.0",
2144 |       "resolved": "https://registry.npmjs.org/@material/mwc-base/-/mwc-base-0.27.0.tgz",
2145 |       "integrity": "sha512-oCWWtjbyQ52AaUbzINLGBKScIPyqhps2Y7c8t6Gu6fcFeDxhKXMV1Cqvtj/OMhtAt53XjHfD2XruWwYv3cYYUA==",
2146 |       "requires": {
2147 |         "@material/base": "=14.0.0-canary.53b3cad2f.0",
2148 |         "@material/dom": "=14.0.0-canary.53b3cad2f.0",
2149 |         "lit": "^2.0.0",
2150 |         "tslib": "^2.0.1"
2151 |       }
2152 |     },
2153 |     "@material/mwc-button": {
2154 |       "version": "0.27.0",
2155 |       "resolved": "https://registry.npmjs.org/@material/mwc-button/-/mwc-button-0.27.0.tgz",
2156 |       "integrity": "sha512-t5m2zfE93RNKHMjdsU67X6csFzuSG08VJKKvXVQ+BriGE3xBgzY5nZdmZXomFpaWjDENPAlyS4ppCFm6o+DILw==",
2157 |       "requires": {
2158 |         "@material/mwc-icon": "^0.27.0",
2159 |         "@material/mwc-ripple": "^0.27.0",
2160 |         "lit": "^2.0.0",
2161 |         "tslib": "^2.0.1"
2162 |       }
2163 |     },
2164 |     "@material/mwc-circular-progress": {
2165 |       "version": "0.27.0",
2166 |       "resolved": "https://registry.npmjs.org/@material/mwc-circular-progress/-/mwc-circular-progress-0.27.0.tgz",
2167 |       "integrity": "sha512-7DkqMb5pUrHfLus5EZ7IT2HUMoE+uPpjGzu3MnDpIzDlfYo6I8p+ifWtEytI0NtXdY5UmITNuCv0RC77mhJrgQ==",
2168 |       "requires": {
2169 |         "@material/circular-progress": "=14.0.0-canary.53b3cad2f.0",
2170 |         "@material/mwc-base": "^0.27.0",
2171 |         "@material/theme": "=14.0.0-canary.53b3cad2f.0",
2172 |         "lit": "^2.0.0",
2173 |         "tslib": "^2.0.1"
2174 |       }
2175 |     },
2176 |     "@material/mwc-dialog": {
2177 |       "version": "0.27.0",
2178 |       "resolved": "https://registry.npmjs.org/@material/mwc-dialog/-/mwc-dialog-0.27.0.tgz",
2179 |       "integrity": "sha512-rkOEmCroVs0wBQbj87vH79SvSHHZ61QRCTUYsU2rHGZCvdzlmvHjWdoyKjJER6WwwM3rrT8xthfecmjICI28CA==",
2180 |       "requires": {
2181 |         "@material/dialog": "=14.0.0-canary.53b3cad2f.0",
2182 |         "@material/dom": "=14.0.0-canary.53b3cad2f.0",
2183 |         "@material/mwc-base": "^0.27.0",
2184 |         "@material/mwc-button": "^0.27.0",
2185 |         "blocking-elements": "^0.1.0",
2186 |         "lit": "^2.0.0",
2187 |         "tslib": "^2.0.1",
2188 |         "wicg-inert": "^3.0.0"
2189 |       }
2190 |     },
2191 |     "@material/mwc-floating-label": {
2192 |       "version": "0.27.0",
2193 |       "resolved": "https://registry.npmjs.org/@material/mwc-floating-label/-/mwc-floating-label-0.27.0.tgz",
2194 |       "integrity": "sha512-uLleloTxQ6dDShcZzqgqfC8otQY8DtGMO9HFQbAEncoFAWpAehcEonsuT/IUhMORN+c5un0P5WXwcZsInJb7og==",
2195 |       "requires": {
2196 |         "@material/floating-label": "=14.0.0-canary.53b3cad2f.0",
2197 |         "lit": "^2.0.0",
2198 |         "tslib": "^2.0.1"
2199 |       }
2200 |     },
2201 |     "@material/mwc-icon": {
2202 |       "version": "0.27.0",
2203 |       "resolved": "https://registry.npmjs.org/@material/mwc-icon/-/mwc-icon-0.27.0.tgz",
2204 |       "integrity": "sha512-Sul44I37M9Ewynn0A9DjkEBrmll2VtNbth6Pxj7I1A/EAwEfaCrPvryyGqfIu1T2hTsRcaojzQx6QjF+B5QW9A==",
2205 |       "requires": {
2206 |         "lit": "^2.0.0",
2207 |         "tslib": "^2.0.1"
2208 |       }
2209 |     },
2210 |     "@material/mwc-line-ripple": {
2211 |       "version": "0.27.0",
2212 |       "resolved": "https://registry.npmjs.org/@material/mwc-line-ripple/-/mwc-line-ripple-0.27.0.tgz",
2213 |       "integrity": "sha512-n9Xpt5g3RJEl9rvk14OP6dUNJUtsJA46beTQiep7ppO7IPVFLC1v/5sPpUzfNPUBsclSPxdBuNlCxsgcIYueUw==",
2214 |       "requires": {
2215 |         "@material/line-ripple": "=14.0.0-canary.53b3cad2f.0",
2216 |         "lit": "^2.0.0",
2217 |         "tslib": "^2.0.1"
2218 |       }
2219 |     },
2220 |     "@material/mwc-notched-outline": {
2221 |       "version": "0.27.0",
2222 |       "resolved": "https://registry.npmjs.org/@material/mwc-notched-outline/-/mwc-notched-outline-0.27.0.tgz",
2223 |       "integrity": "sha512-IlqfQVaEd1RAHqhOG0Xk5JhTDgBe/P9og0pnACglK6bPE0vUhYKwibJiHcr4ACTPtGWHO9o92aktR+7AIEAKtQ==",
2224 |       "requires": {
2225 |         "@material/mwc-base": "^0.27.0",
2226 |         "@material/notched-outline": "=14.0.0-canary.53b3cad2f.0",
2227 |         "lit": "^2.0.0",
2228 |         "tslib": "^2.0.1"
2229 |       }
2230 |     },
2231 |     "@material/mwc-ripple": {
2232 |       "version": "0.27.0",
2233 |       "resolved": "https://registry.npmjs.org/@material/mwc-ripple/-/mwc-ripple-0.27.0.tgz",
2234 |       "integrity": "sha512-by0O8d8g3Rd96/sUB8hxy6MrDx1QTstqOsA64vqypWd526hMTBGRik08jTNap5sVIyrN9Vq17jb4NJLWQLnNHQ==",
2235 |       "requires": {
2236 |         "@material/dom": "=14.0.0-canary.53b3cad2f.0",
2237 |         "@material/mwc-base": "^0.27.0",
2238 |         "@material/ripple": "=14.0.0-canary.53b3cad2f.0",
2239 |         "lit": "^2.0.0",
2240 |         "tslib": "^2.0.1"
2241 |       }
2242 |     },
2243 |     "@material/mwc-textfield": {
2244 |       "version": "0.27.0",
2245 |       "resolved": "https://registry.npmjs.org/@material/mwc-textfield/-/mwc-textfield-0.27.0.tgz",
2246 |       "integrity": "sha512-4/OEeEVAWWQ1DzpjeMLYLsa9HMlifOPjAvi0681Yj1g/RYJs5ONZS80HZ8HOT+efAOlZDugshgM4gdNS3I0XFQ==",
2247 |       "requires": {
2248 |         "@material/floating-label": "=14.0.0-canary.53b3cad2f.0",
2249 |         "@material/line-ripple": "=14.0.0-canary.53b3cad2f.0",
2250 |         "@material/mwc-base": "^0.27.0",
2251 |         "@material/mwc-floating-label": "^0.27.0",
2252 |         "@material/mwc-line-ripple": "^0.27.0",
2253 |         "@material/mwc-notched-outline": "^0.27.0",
2254 |         "@material/textfield": "=14.0.0-canary.53b3cad2f.0",
2255 |         "lit": "^2.0.0",
2256 |         "tslib": "^2.0.1"
2257 |       }
2258 |     },
2259 |     "@material/notched-outline": {
2260 |       "version": "14.0.0-canary.53b3cad2f.0",
2261 |       "resolved": "https://registry.npmjs.org/@material/notched-outline/-/notched-outline-14.0.0-canary.53b3cad2f.0.tgz",
2262 |       "integrity": "sha512-3ByiPOC/wWQmFKfgJS98kb5/6v92n7uIfJ6v6sryKJlJCJn39qfpGcCM5RpRIws1RET1s1zBJT2JDwYeu/hM5A==",
2263 |       "requires": {
2264 |         "@material/base": "14.0.0-canary.53b3cad2f.0",
2265 |         "@material/feature-targeting": "14.0.0-canary.53b3cad2f.0",
2266 |         "@material/floating-label": "14.0.0-canary.53b3cad2f.0",
2267 |         "@material/rtl": "14.0.0-canary.53b3cad2f.0",
2268 |         "@material/shape": "14.0.0-canary.53b3cad2f.0",
2269 |         "@material/theme": "14.0.0-canary.53b3cad2f.0",
2270 |         "tslib": "^2.1.0"
2271 |       }
2272 |     },
2273 |     "@material/progress-indicator": {
2274 |       "version": "14.0.0-canary.53b3cad2f.0",
2275 |       "resolved": "https://registry.npmjs.org/@material/progress-indicator/-/progress-indicator-14.0.0-canary.53b3cad2f.0.tgz",
2276 |       "integrity": "sha512-vW0oZK70QOpAarip95ueCQ/I3kBClcWjxsc0F0QjkqT76DOVXpjnZ4XoRRyq9eMpwLqlKLTecrsSNpmqwwF1Dg==",
2277 |       "requires": {
2278 |         "tslib": "^2.1.0"
2279 |       }
2280 |     },
2281 |     "@material/ripple": {
2282 |       "version": "14.0.0-canary.53b3cad2f.0",
2283 |       "resolved": "https://registry.npmjs.org/@material/ripple/-/ripple-14.0.0-canary.53b3cad2f.0.tgz",
2284 |       "integrity": "sha512-6g2G62vd8DsMuIUSXlRrzb98qkZ4o8ZREknNwNP2zaLQEOkJ//4j9HaqDt98/3LIjUTY9UIVFTQENiMmlwKHYQ==",
2285 |       "requires": {
2286 |         "@material/animation": "14.0.0-canary.53b3cad2f.0",
2287 |         "@material/base": "14.0.0-canary.53b3cad2f.0",
2288 |         "@material/dom": "14.0.0-canary.53b3cad2f.0",
2289 |         "@material/feature-targeting": "14.0.0-canary.53b3cad2f.0",
2290 |         "@material/rtl": "14.0.0-canary.53b3cad2f.0",
2291 |         "@material/theme": "14.0.0-canary.53b3cad2f.0",
2292 |         "tslib": "^2.1.0"
2293 |       }
2294 |     },
2295 |     "@material/rtl": {
2296 |       "version": "14.0.0-canary.53b3cad2f.0",
2297 |       "resolved": "https://registry.npmjs.org/@material/rtl/-/rtl-14.0.0-canary.53b3cad2f.0.tgz",
2298 |       "integrity": "sha512-f08LT0HSa0WYU+4Jz/tbm1TQ9Fcf2k+H6dPPYv0J1sZmX6hMgCEmNiUdUFLQFvszoXx2XrRi1/hIFjbz2e69Yg==",
2299 |       "requires": {
2300 |         "@material/theme": "14.0.0-canary.53b3cad2f.0",
2301 |         "tslib": "^2.1.0"
2302 |       }
2303 |     },
2304 |     "@material/shape": {
2305 |       "version": "14.0.0-canary.53b3cad2f.0",
2306 |       "resolved": "https://registry.npmjs.org/@material/shape/-/shape-14.0.0-canary.53b3cad2f.0.tgz",
2307 |       "integrity": "sha512-RyjInLCNe+nI/ulKea0ZLHphXQDiDqYazS25SRn18g8Hoa5qGNaY5oOBncDXUYn3jm5oI5kFc9oif//kulkbjg==",
2308 |       "requires": {
2309 |         "@material/feature-targeting": "14.0.0-canary.53b3cad2f.0",
2310 |         "@material/rtl": "14.0.0-canary.53b3cad2f.0",
2311 |         "@material/theme": "14.0.0-canary.53b3cad2f.0",
2312 |         "tslib": "^2.1.0"
2313 |       }
2314 |     },
2315 |     "@material/textfield": {
2316 |       "version": "14.0.0-canary.53b3cad2f.0",
2317 |       "resolved": "https://registry.npmjs.org/@material/textfield/-/textfield-14.0.0-canary.53b3cad2f.0.tgz",
2318 |       "integrity": "sha512-Pla9Tr94Is18o97E/mqHKdkR24rPES9atGm3BlXrNzyr5tu6+h++RBbxy7V6IExcfl0MX+v9Gyqz7sPZzFtwMA==",
2319 |       "requires": {
2320 |         "@material/animation": "14.0.0-canary.53b3cad2f.0",
2321 |         "@material/base": "14.0.0-canary.53b3cad2f.0",
2322 |         "@material/density": "14.0.0-canary.53b3cad2f.0",
2323 |         "@material/dom": "14.0.0-canary.53b3cad2f.0",
2324 |         "@material/feature-targeting": "14.0.0-canary.53b3cad2f.0",
2325 |         "@material/floating-label": "14.0.0-canary.53b3cad2f.0",
2326 |         "@material/line-ripple": "14.0.0-canary.53b3cad2f.0",
2327 |         "@material/notched-outline": "14.0.0-canary.53b3cad2f.0",
2328 |         "@material/ripple": "14.0.0-canary.53b3cad2f.0",
2329 |         "@material/rtl": "14.0.0-canary.53b3cad2f.0",
2330 |         "@material/shape": "14.0.0-canary.53b3cad2f.0",
2331 |         "@material/theme": "14.0.0-canary.53b3cad2f.0",
2332 |         "@material/tokens": "14.0.0-canary.53b3cad2f.0",
2333 |         "@material/typography": "14.0.0-canary.53b3cad2f.0",
2334 |         "tslib": "^2.1.0"
2335 |       }
2336 |     },
2337 |     "@material/theme": {
2338 |       "version": "14.0.0-canary.53b3cad2f.0",
2339 |       "resolved": "https://registry.npmjs.org/@material/theme/-/theme-14.0.0-canary.53b3cad2f.0.tgz",
2340 |       "integrity": "sha512-S06XAevDCDWMe+GgsEpITMS07imUidzadNaTbJsqssFajBLr53QWVZsG84BpjXKXoYvyEJvb0hX5U0lq6ip9UQ==",
2341 |       "requires": {
2342 |         "@material/feature-targeting": "14.0.0-canary.53b3cad2f.0",
2343 |         "tslib": "^2.1.0"
2344 |       }
2345 |     },
2346 |     "@material/tokens": {
2347 |       "version": "14.0.0-canary.53b3cad2f.0",
2348 |       "resolved": "https://registry.npmjs.org/@material/tokens/-/tokens-14.0.0-canary.53b3cad2f.0.tgz",
2349 |       "integrity": "sha512-myHFB7vac8zErA3qgkqmV+kpE+i9JEwc/6Yf0MOumDSpylJGw28QikpNC6eAVBK2EmPQTaFn20mqUxyud8dGqw==",
2350 |       "requires": {
2351 |         "@material/elevation": "14.0.0-canary.53b3cad2f.0"
2352 |       }
2353 |     },
2354 |     "@material/touch-target": {
2355 |       "version": "14.0.0-canary.53b3cad2f.0",
2356 |       "resolved": "https://registry.npmjs.org/@material/touch-target/-/touch-target-14.0.0-canary.53b3cad2f.0.tgz",
2357 |       "integrity": "sha512-d83e5vbqoLyL542yOTTp4TLVltddWiqbI/j1w/D9ipE30YKfe2EDN+CNJc32Zufh5IUfK41DsZdrN8fI9cL99A==",
2358 |       "requires": {
2359 |         "@material/base": "14.0.0-canary.53b3cad2f.0",
2360 |         "@material/feature-targeting": "14.0.0-canary.53b3cad2f.0",
2361 |         "@material/rtl": "14.0.0-canary.53b3cad2f.0",
2362 |         "tslib": "^2.1.0"
2363 |       }
2364 |     },
2365 |     "@material/typography": {
2366 |       "version": "14.0.0-canary.53b3cad2f.0",
2367 |       "resolved": "https://registry.npmjs.org/@material/typography/-/typography-14.0.0-canary.53b3cad2f.0.tgz",
2368 |       "integrity": "sha512-9J0k2fq7uyHsRzRqJDJLGmg3YzRpfRPtFDVeUH/xBcYoqpZE7wYw5Mb7s/l8eP626EtR7HhXhSPjvRTLA6NIJg==",
2369 |       "requires": {
2370 |         "@material/feature-targeting": "14.0.0-canary.53b3cad2f.0",
2371 |         "@material/theme": "14.0.0-canary.53b3cad2f.0",
2372 |         "tslib": "^2.1.0"
2373 |       }
2374 |     },
2375 |     "@rollup/plugin-node-resolve": {
2376 |       "version": "15.0.1",
2377 |       "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-15.0.1.tgz",
2378 |       "integrity": "sha512-ReY88T7JhJjeRVbfCyNj+NXAG3IIsVMsX9b5/9jC98dRP8/yxlZdz7mHZbHk5zHr24wZZICS5AcXsFZAXYUQEg==",
2379 |       "dev": true,
2380 |       "requires": {
2381 |         "@rollup/pluginutils": "^5.0.1",
2382 |         "@types/resolve": "1.20.2",
2383 |         "deepmerge": "^4.2.2",
2384 |         "is-builtin-module": "^3.2.0",
2385 |         "is-module": "^1.0.0",
2386 |         "resolve": "^1.22.1"
2387 |       }
2388 |     },
2389 |     "@rollup/plugin-terser": {
2390 |       "version": "0.3.0",
2391 |       "resolved": "https://registry.npmjs.org/@rollup/plugin-terser/-/plugin-terser-0.3.0.tgz",
2392 |       "integrity": "sha512-mYTkNW9KjOscS/3QWU5LfOKsR3/fAAVDaqcAe2TZ7ng6pN46f+C7FOZbITuIW/neA+PhcjoKl7yMyB3XcmA4gw==",
2393 |       "dev": true,
2394 |       "requires": {
2395 |         "serialize-javascript": "^6.0.0",
2396 |         "smob": "^0.0.6",
2397 |         "terser": "^5.15.1"
2398 |       },
2399 |       "dependencies": {
2400 |         "serialize-javascript": {
2401 |           "version": "6.0.1",
2402 |           "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz",
2403 |           "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==",
2404 |           "dev": true,
2405 |           "requires": {
2406 |             "randombytes": "^2.1.0"
2407 |           }
2408 |         }
2409 |       }
2410 |     },
2411 |     "@rollup/plugin-typescript": {
2412 |       "version": "11.0.0",
2413 |       "resolved": "https://registry.npmjs.org/@rollup/plugin-typescript/-/plugin-typescript-11.0.0.tgz",
2414 |       "integrity": "sha512-goPyCWBiimk1iJgSTgsehFD5OOFHiAknrRJjqFCudcW8JtWiBlK284Xnn4flqMqg6YAjVG/EE+3aVzrL5qNSzQ==",
2415 |       "dev": true,
2416 |       "requires": {
2417 |         "@rollup/pluginutils": "^5.0.1",
2418 |         "resolve": "^1.22.1"
2419 |       }
2420 |     },
2421 |     "@rollup/pluginutils": {
2422 |       "version": "5.0.2",
2423 |       "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.0.2.tgz",
2424 |       "integrity": "sha512-pTd9rIsP92h+B6wWwFbW8RkZv4hiR/xKsqre4SIuAOaOEQRxi0lqLke9k2/7WegC85GgUs9pjmOjCUi3In4vwA==",
2425 |       "dev": true,
2426 |       "requires": {
2427 |         "@types/estree": "^1.0.0",
2428 |         "estree-walker": "^2.0.2",
2429 |         "picomatch": "^2.3.1"
2430 |       }
2431 |     },
2432 |     "@types/estree": {
2433 |       "version": "1.0.0",
2434 |       "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.0.tgz",
2435 |       "integrity": "sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==",
2436 |       "dev": true
2437 |     },
2438 |     "@types/resolve": {
2439 |       "version": "1.20.2",
2440 |       "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.20.2.tgz",
2441 |       "integrity": "sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==",
2442 |       "dev": true
2443 |     },
2444 |     "@types/trusted-types": {
2445 |       "version": "2.0.2",
2446 |       "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.2.tgz",
2447 |       "integrity": "sha512-F5DIZ36YVLE+PN+Zwws4kJogq47hNgX3Nx6WyDJ3kcplxyke3XIzB8uK5n/Lpm1HBsbGzd6nmGehL8cPekP+Tg=="
2448 |     },
2449 |     "@types/web-bluetooth": {
2450 |       "version": "0.0.16",
2451 |       "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.16.tgz",
2452 |       "integrity": "sha512-oh8q2Zc32S6gd/j50GowEjKLoOVOwHP/bWVjKJInBwQqdOYMdPrf1oVlelTlyfFK3CKxL1uahMDAr+vy8T7yMQ==",
2453 |       "dev": true
2454 |     },
2455 |     "@zeit/schemas": {
2456 |       "version": "2.21.0",
2457 |       "resolved": "https://registry.npmjs.org/@zeit/schemas/-/schemas-2.21.0.tgz",
2458 |       "integrity": "sha512-/J4WBTpWtQ4itN1rb3ao8LfClmVcmz2pO6oYb7Qd4h7VSqUhIbJIvrykz9Ew1WMg6eFWsKdsMHc5uPbFxqlCpg==",
2459 |       "dev": true
2460 |     },
2461 |     "accepts": {
2462 |       "version": "1.3.8",
2463 |       "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz",
2464 |       "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==",
2465 |       "dev": true,
2466 |       "requires": {
2467 |         "mime-types": "~2.1.34",
2468 |         "negotiator": "0.6.3"
2469 |       }
2470 |     },
2471 |     "acorn": {
2472 |       "version": "8.8.1",
2473 |       "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz",
2474 |       "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==",
2475 |       "dev": true
2476 |     },
2477 |     "ajv": {
2478 |       "version": "8.11.0",
2479 |       "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz",
2480 |       "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==",
2481 |       "dev": true,
2482 |       "requires": {
2483 |         "fast-deep-equal": "^3.1.1",
2484 |         "json-schema-traverse": "^1.0.0",
2485 |         "require-from-string": "^2.0.2",
2486 |         "uri-js": "^4.2.2"
2487 |       }
2488 |     },
2489 |     "ansi-align": {
2490 |       "version": "3.0.1",
2491 |       "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz",
2492 |       "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==",
2493 |       "dev": true,
2494 |       "requires": {
2495 |         "string-width": "^4.1.0"
2496 |       },
2497 |       "dependencies": {
2498 |         "ansi-regex": {
2499 |           "version": "5.0.1",
2500 |           "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
2501 |           "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
2502 |           "dev": true
2503 |         },
2504 |         "emoji-regex": {
2505 |           "version": "8.0.0",
2506 |           "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
2507 |           "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
2508 |           "dev": true
2509 |         },
2510 |         "string-width": {
2511 |           "version": "4.2.3",
2512 |           "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
2513 |           "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
2514 |           "dev": true,
2515 |           "requires": {
2516 |             "emoji-regex": "^8.0.0",
2517 |             "is-fullwidth-code-point": "^3.0.0",
2518 |             "strip-ansi": "^6.0.1"
2519 |           }
2520 |         },
2521 |         "strip-ansi": {
2522 |           "version": "6.0.1",
2523 |           "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
2524 |           "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
2525 |           "dev": true,
2526 |           "requires": {
2527 |             "ansi-regex": "^5.0.1"
2528 |           }
2529 |         }
2530 |       }
2531 |     },
2532 |     "ansi-regex": {
2533 |       "version": "6.0.1",
2534 |       "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz",
2535 |       "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==",
2536 |       "dev": true
2537 |     },
2538 |     "arch": {
2539 |       "version": "2.2.0",
2540 |       "resolved": "https://registry.npmjs.org/arch/-/arch-2.2.0.tgz",
2541 |       "integrity": "sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==",
2542 |       "dev": true
2543 |     },
2544 |     "arg": {
2545 |       "version": "5.0.2",
2546 |       "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz",
2547 |       "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==",
2548 |       "dev": true
2549 |     },
2550 |     "balanced-match": {
2551 |       "version": "1.0.2",
2552 |       "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
2553 |       "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
2554 |       "dev": true
2555 |     },
2556 |     "blocking-elements": {
2557 |       "version": "0.1.1",
2558 |       "resolved": "https://registry.npmjs.org/blocking-elements/-/blocking-elements-0.1.1.tgz",
2559 |       "integrity": "sha512-/SLWbEzMoVIMZACCyhD/4Ya2M1PWP1qMKuiymowPcI+PdWDARqeARBjhj73kbUBCxEmTZCUu5TAqxtwUO9C1Ig=="
2560 |     },
2561 |     "boxen": {
2562 |       "version": "7.0.0",
2563 |       "resolved": "https://registry.npmjs.org/boxen/-/boxen-7.0.0.tgz",
2564 |       "integrity": "sha512-j//dBVuyacJbvW+tvZ9HuH03fZ46QcaKvvhZickZqtB271DxJ7SNRSNxrV/dZX0085m7hISRZWbzWlJvx/rHSg==",
2565 |       "dev": true,
2566 |       "requires": {
2567 |         "ansi-align": "^3.0.1",
2568 |         "camelcase": "^7.0.0",
2569 |         "chalk": "^5.0.1",
2570 |         "cli-boxes": "^3.0.0",
2571 |         "string-width": "^5.1.2",
2572 |         "type-fest": "^2.13.0",
2573 |         "widest-line": "^4.0.1",
2574 |         "wrap-ansi": "^8.0.1"
2575 |       },
2576 |       "dependencies": {
2577 |         "chalk": {
2578 |           "version": "5.0.1",
2579 |           "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.0.1.tgz",
2580 |           "integrity": "sha512-Fo07WOYGqMfCWHOzSXOt2CxDbC6skS/jO9ynEcmpANMoPrD+W1r1K6Vx7iNm+AQmETU1Xr2t+n8nzkV9t6xh3w==",
2581 |           "dev": true
2582 |         }
2583 |       }
2584 |     },
2585 |     "brace-expansion": {
2586 |       "version": "1.1.11",
2587 |       "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
2588 |       "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
2589 |       "dev": true,
2590 |       "requires": {
2591 |         "balanced-match": "^1.0.0",
2592 |         "concat-map": "0.0.1"
2593 |       }
2594 |     },
2595 |     "buffer-from": {
2596 |       "version": "1.1.2",
2597 |       "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
2598 |       "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==",
2599 |       "dev": true
2600 |     },
2601 |     "builtin-modules": {
2602 |       "version": "3.3.0",
2603 |       "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz",
2604 |       "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==",
2605 |       "dev": true
2606 |     },
2607 |     "bytes": {
2608 |       "version": "3.0.0",
2609 |       "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz",
2610 |       "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=",
2611 |       "dev": true
2612 |     },
2613 |     "camelcase": {
2614 |       "version": "7.0.0",
2615 |       "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-7.0.0.tgz",
2616 |       "integrity": "sha512-JToIvOmz6nhGsUhAYScbo2d6Py5wojjNfoxoc2mEVLUdJ70gJK2gnd+ABY1Tc3sVMyK7QDPtN0T/XdlCQWITyQ==",
2617 |       "dev": true
2618 |     },
2619 |     "chalk-template": {
2620 |       "version": "0.4.0",
2621 |       "resolved": "https://registry.npmjs.org/chalk-template/-/chalk-template-0.4.0.tgz",
2622 |       "integrity": "sha512-/ghrgmhfY8RaSdeo43hNXxpoHAtxdbskUHjPpfqUWGttFgycUhYPGx3YZBCnUCvOa7Doivn1IZec3DEGFoMgLg==",
2623 |       "dev": true,
2624 |       "requires": {
2625 |         "chalk": "^4.1.2"
2626 |       },
2627 |       "dependencies": {
2628 |         "ansi-styles": {
2629 |           "version": "4.3.0",
2630 |           "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
2631 |           "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
2632 |           "dev": true,
2633 |           "requires": {
2634 |             "color-convert": "^2.0.1"
2635 |           }
2636 |         },
2637 |         "chalk": {
2638 |           "version": "4.1.2",
2639 |           "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
2640 |           "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
2641 |           "dev": true,
2642 |           "requires": {
2643 |             "ansi-styles": "^4.1.0",
2644 |             "supports-color": "^7.1.0"
2645 |           }
2646 |         },
2647 |         "color-convert": {
2648 |           "version": "2.0.1",
2649 |           "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
2650 |           "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
2651 |           "dev": true,
2652 |           "requires": {
2653 |             "color-name": "~1.1.4"
2654 |           }
2655 |         },
2656 |         "color-name": {
2657 |           "version": "1.1.4",
2658 |           "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
2659 |           "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
2660 |           "dev": true
2661 |         },
2662 |         "has-flag": {
2663 |           "version": "4.0.0",
2664 |           "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
2665 |           "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
2666 |           "dev": true
2667 |         },
2668 |         "supports-color": {
2669 |           "version": "7.2.0",
2670 |           "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
2671 |           "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
2672 |           "dev": true,
2673 |           "requires": {
2674 |             "has-flag": "^4.0.0"
2675 |           }
2676 |         }
2677 |       }
2678 |     },
2679 |     "cli-boxes": {
2680 |       "version": "3.0.0",
2681 |       "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz",
2682 |       "integrity": "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==",
2683 |       "dev": true
2684 |     },
2685 |     "clipboardy": {
2686 |       "version": "3.0.0",
2687 |       "resolved": "https://registry.npmjs.org/clipboardy/-/clipboardy-3.0.0.tgz",
2688 |       "integrity": "sha512-Su+uU5sr1jkUy1sGRpLKjKrvEOVXgSgiSInwa/qeID6aJ07yh+5NWc3h2QfjHjBnfX4LhtFcuAWKUsJ3r+fjbg==",
2689 |       "dev": true,
2690 |       "requires": {
2691 |         "arch": "^2.2.0",
2692 |         "execa": "^5.1.1",
2693 |         "is-wsl": "^2.2.0"
2694 |       }
2695 |     },
2696 |     "commander": {
2697 |       "version": "2.20.3",
2698 |       "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
2699 |       "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
2700 |       "dev": true
2701 |     },
2702 |     "compressible": {
2703 |       "version": "2.0.18",
2704 |       "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz",
2705 |       "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==",
2706 |       "dev": true,
2707 |       "requires": {
2708 |         "mime-db": ">= 1.43.0 < 2"
2709 |       }
2710 |     },
2711 |     "compression": {
2712 |       "version": "1.7.4",
2713 |       "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz",
2714 |       "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==",
2715 |       "dev": true,
2716 |       "requires": {
2717 |         "accepts": "~1.3.5",
2718 |         "bytes": "3.0.0",
2719 |         "compressible": "~2.0.16",
2720 |         "debug": "2.6.9",
2721 |         "on-headers": "~1.0.2",
2722 |         "safe-buffer": "5.1.2",
2723 |         "vary": "~1.1.2"
2724 |       }
2725 |     },
2726 |     "concat-map": {
2727 |       "version": "0.0.1",
2728 |       "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
2729 |       "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
2730 |       "dev": true
2731 |     },
2732 |     "content-disposition": {
2733 |       "version": "0.5.2",
2734 |       "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz",
2735 |       "integrity": "sha512-kRGRZw3bLlFISDBgwTSA1TMBFN6J6GWDeubmDE3AF+3+yXL8hTWv8r5rkLbqYXY4RjPk/EzHnClI3zQf1cFmHA==",
2736 |       "dev": true
2737 |     },
2738 |     "cross-spawn": {
2739 |       "version": "7.0.3",
2740 |       "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
2741 |       "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
2742 |       "dev": true,
2743 |       "requires": {
2744 |         "path-key": "^3.1.0",
2745 |         "shebang-command": "^2.0.0",
2746 |         "which": "^2.0.1"
2747 |       }
2748 |     },
2749 |     "debug": {
2750 |       "version": "2.6.9",
2751 |       "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
2752 |       "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
2753 |       "dev": true,
2754 |       "requires": {
2755 |         "ms": "2.0.0"
2756 |       }
2757 |     },
2758 |     "deep-extend": {
2759 |       "version": "0.6.0",
2760 |       "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz",
2761 |       "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==",
2762 |       "dev": true
2763 |     },
2764 |     "deepmerge": {
2765 |       "version": "4.2.2",
2766 |       "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz",
2767 |       "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==",
2768 |       "dev": true
2769 |     },
2770 |     "eastasianwidth": {
2771 |       "version": "0.2.0",
2772 |       "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz",
2773 |       "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==",
2774 |       "dev": true
2775 |     },
2776 |     "emoji-regex": {
2777 |       "version": "9.2.2",
2778 |       "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
2779 |       "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",
2780 |       "dev": true
2781 |     },
2782 |     "estree-walker": {
2783 |       "version": "2.0.2",
2784 |       "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz",
2785 |       "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==",
2786 |       "dev": true
2787 |     },
2788 |     "execa": {
2789 |       "version": "5.1.1",
2790 |       "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz",
2791 |       "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==",
2792 |       "dev": true,
2793 |       "requires": {
2794 |         "cross-spawn": "^7.0.3",
2795 |         "get-stream": "^6.0.0",
2796 |         "human-signals": "^2.1.0",
2797 |         "is-stream": "^2.0.0",
2798 |         "merge-stream": "^2.0.0",
2799 |         "npm-run-path": "^4.0.1",
2800 |         "onetime": "^5.1.2",
2801 |         "signal-exit": "^3.0.3",
2802 |         "strip-final-newline": "^2.0.0"
2803 |       }
2804 |     },
2805 |     "fast-deep-equal": {
2806 |       "version": "3.1.3",
2807 |       "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
2808 |       "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
2809 |       "dev": true
2810 |     },
2811 |     "fast-url-parser": {
2812 |       "version": "1.1.3",
2813 |       "resolved": "https://registry.npmjs.org/fast-url-parser/-/fast-url-parser-1.1.3.tgz",
2814 |       "integrity": "sha512-5jOCVXADYNuRkKFzNJ0dCCewsZiYo0dz8QNYljkOpFC6r2U4OBmKtvm/Tsuh4w1YYdDqDb31a8TVhBJ2OJKdqQ==",
2815 |       "dev": true,
2816 |       "requires": {
2817 |         "punycode": "^1.3.2"
2818 |       }
2819 |     },
2820 |     "fsevents": {
2821 |       "version": "2.3.2",
2822 |       "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
2823 |       "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
2824 |       "dev": true,
2825 |       "optional": true
2826 |     },
2827 |     "function-bind": {
2828 |       "version": "1.1.1",
2829 |       "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
2830 |       "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
2831 |       "dev": true
2832 |     },
2833 |     "get-stream": {
2834 |       "version": "6.0.1",
2835 |       "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
2836 |       "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==",
2837 |       "dev": true
2838 |     },
2839 |     "has": {
2840 |       "version": "1.0.3",
2841 |       "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
2842 |       "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
2843 |       "dev": true,
2844 |       "requires": {
2845 |         "function-bind": "^1.1.1"
2846 |       }
2847 |     },
2848 |     "human-signals": {
2849 |       "version": "2.1.0",
2850 |       "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz",
2851 |       "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==",
2852 |       "dev": true
2853 |     },
2854 |     "ini": {
2855 |       "version": "1.3.8",
2856 |       "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz",
2857 |       "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==",
2858 |       "dev": true
2859 |     },
2860 |     "is-builtin-module": {
2861 |       "version": "3.2.0",
2862 |       "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.2.0.tgz",
2863 |       "integrity": "sha512-phDA4oSGt7vl1n5tJvTWooWWAsXLY+2xCnxNqvKhGEzujg+A43wPlPOyDg3C8XQHN+6k/JTQWJ/j0dQh/qr+Hw==",
2864 |       "dev": true,
2865 |       "requires": {
2866 |         "builtin-modules": "^3.3.0"
2867 |       }
2868 |     },
2869 |     "is-core-module": {
2870 |       "version": "2.11.0",
2871 |       "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz",
2872 |       "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==",
2873 |       "dev": true,
2874 |       "requires": {
2875 |         "has": "^1.0.3"
2876 |       }
2877 |     },
2878 |     "is-docker": {
2879 |       "version": "2.2.1",
2880 |       "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz",
2881 |       "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==",
2882 |       "dev": true
2883 |     },
2884 |     "is-fullwidth-code-point": {
2885 |       "version": "3.0.0",
2886 |       "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
2887 |       "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
2888 |       "dev": true
2889 |     },
2890 |     "is-module": {
2891 |       "version": "1.0.0",
2892 |       "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz",
2893 |       "integrity": "sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE=",
2894 |       "dev": true
2895 |     },
2896 |     "is-port-reachable": {
2897 |       "version": "4.0.0",
2898 |       "resolved": "https://registry.npmjs.org/is-port-reachable/-/is-port-reachable-4.0.0.tgz",
2899 |       "integrity": "sha512-9UoipoxYmSk6Xy7QFgRv2HDyaysmgSG75TFQs6S+3pDM7ZhKTF/bskZV+0UlABHzKjNVhPjYCLfeZUEg1wXxig==",
2900 |       "dev": true
2901 |     },
2902 |     "is-stream": {
2903 |       "version": "2.0.1",
2904 |       "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
2905 |       "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
2906 |       "dev": true
2907 |     },
2908 |     "is-wsl": {
2909 |       "version": "2.2.0",
2910 |       "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz",
2911 |       "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==",
2912 |       "dev": true,
2913 |       "requires": {
2914 |         "is-docker": "^2.0.0"
2915 |       }
2916 |     },
2917 |     "isexe": {
2918 |       "version": "2.0.0",
2919 |       "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
2920 |       "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
2921 |       "dev": true
2922 |     },
2923 |     "json-schema-traverse": {
2924 |       "version": "1.0.0",
2925 |       "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
2926 |       "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
2927 |       "dev": true
2928 |     },
2929 |     "lit": {
2930 |       "version": "2.6.1",
2931 |       "resolved": "https://registry.npmjs.org/lit/-/lit-2.6.1.tgz",
2932 |       "integrity": "sha512-DT87LD64f8acR7uVp7kZfhLRrHkfC/N4BVzAtnw9Yg8087mbBJ//qedwdwX0kzDbxgPccWRW6mFwGbRQIxy0pw==",
2933 |       "requires": {
2934 |         "@lit/reactive-element": "^1.6.0",
2935 |         "lit-element": "^3.2.0",
2936 |         "lit-html": "^2.6.0"
2937 |       }
2938 |     },
2939 |     "lit-element": {
2940 |       "version": "3.2.0",
2941 |       "resolved": "https://registry.npmjs.org/lit-element/-/lit-element-3.2.0.tgz",
2942 |       "integrity": "sha512-HbE7yt2SnUtg5DCrWt028oaU4D5F4k/1cntAFHTkzY8ZIa8N0Wmu92PxSxucsQSOXlODFrICkQ5x/tEshKi13g==",
2943 |       "requires": {
2944 |         "@lit/reactive-element": "^1.3.0",
2945 |         "lit-html": "^2.2.0"
2946 |       }
2947 |     },
2948 |     "lit-html": {
2949 |       "version": "2.6.1",
2950 |       "resolved": "https://registry.npmjs.org/lit-html/-/lit-html-2.6.1.tgz",
2951 |       "integrity": "sha512-Z3iw+E+3KKFn9t2YKNjsXNEu/LRLI98mtH/C6lnFg7kvaqPIzPn124Yd4eT/43lyqrejpc5Wb6BHq3fdv4S8Rw==",
2952 |       "requires": {
2953 |         "@types/trusted-types": "^2.0.2"
2954 |       }
2955 |     },
2956 |     "merge-stream": {
2957 |       "version": "2.0.0",
2958 |       "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
2959 |       "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
2960 |       "dev": true
2961 |     },
2962 |     "mime-db": {
2963 |       "version": "1.52.0",
2964 |       "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
2965 |       "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
2966 |       "dev": true
2967 |     },
2968 |     "mime-types": {
2969 |       "version": "2.1.35",
2970 |       "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
2971 |       "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
2972 |       "dev": true,
2973 |       "requires": {
2974 |         "mime-db": "1.52.0"
2975 |       }
2976 |     },
2977 |     "mimic-fn": {
2978 |       "version": "2.1.0",
2979 |       "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
2980 |       "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
2981 |       "dev": true
2982 |     },
2983 |     "minimatch": {
2984 |       "version": "3.1.2",
2985 |       "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
2986 |       "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
2987 |       "dev": true,
2988 |       "requires": {
2989 |         "brace-expansion": "^1.1.7"
2990 |       }
2991 |     },
2992 |     "minimist": {
2993 |       "version": "1.2.6",
2994 |       "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz",
2995 |       "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==",
2996 |       "dev": true
2997 |     },
2998 |     "ms": {
2999 |       "version": "2.0.0",
3000 |       "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
3001 |       "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
3002 |       "dev": true
3003 |     },
3004 |     "negotiator": {
3005 |       "version": "0.6.3",
3006 |       "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz",
3007 |       "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==",
3008 |       "dev": true
3009 |     },
3010 |     "npm-run-path": {
3011 |       "version": "4.0.1",
3012 |       "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz",
3013 |       "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==",
3014 |       "dev": true,
3015 |       "requires": {
3016 |         "path-key": "^3.0.0"
3017 |       }
3018 |     },
3019 |     "on-headers": {
3020 |       "version": "1.0.2",
3021 |       "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz",
3022 |       "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==",
3023 |       "dev": true
3024 |     },
3025 |     "onetime": {
3026 |       "version": "5.1.2",
3027 |       "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz",
3028 |       "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
3029 |       "dev": true,
3030 |       "requires": {
3031 |         "mimic-fn": "^2.1.0"
3032 |       }
3033 |     },
3034 |     "path-is-inside": {
3035 |       "version": "1.0.2",
3036 |       "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz",
3037 |       "integrity": "sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==",
3038 |       "dev": true
3039 |     },
3040 |     "path-key": {
3041 |       "version": "3.1.1",
3042 |       "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
3043 |       "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
3044 |       "dev": true
3045 |     },
3046 |     "path-parse": {
3047 |       "version": "1.0.7",
3048 |       "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
3049 |       "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
3050 |       "dev": true
3051 |     },
3052 |     "path-to-regexp": {
3053 |       "version": "2.2.1",
3054 |       "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-2.2.1.tgz",
3055 |       "integrity": "sha512-gu9bD6Ta5bwGrrU8muHzVOBFFREpp2iRkVfhBJahwJ6p6Xw20SjT0MxLnwkjOibQmGSYhiUnf2FLe7k+jcFmGQ==",
3056 |       "dev": true
3057 |     },
3058 |     "picomatch": {
3059 |       "version": "2.3.1",
3060 |       "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
3061 |       "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
3062 |       "dev": true
3063 |     },
3064 |     "prettier": {
3065 |       "version": "2.8.4",
3066 |       "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.4.tgz",
3067 |       "integrity": "sha512-vIS4Rlc2FNh0BySk3Wkd6xmwxB0FpOndW5fisM5H8hsZSxU2VWVB5CWIkIjWvrHjIhxk2g3bfMKM87zNTrZddw==",
3068 |       "dev": true
3069 |     },
3070 |     "punycode": {
3071 |       "version": "1.4.1",
3072 |       "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
3073 |       "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==",
3074 |       "dev": true
3075 |     },
3076 |     "randombytes": {
3077 |       "version": "2.1.0",
3078 |       "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
3079 |       "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
3080 |       "dev": true,
3081 |       "requires": {
3082 |         "safe-buffer": "^5.1.0"
3083 |       }
3084 |     },
3085 |     "range-parser": {
3086 |       "version": "1.2.0",
3087 |       "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz",
3088 |       "integrity": "sha512-kA5WQoNVo4t9lNx2kQNFCxKeBl5IbbSNBl1M/tLkw9WCn+hxNBAW5Qh8gdhs63CJnhjJ2zQWFoqPJP2sK1AV5A==",
3089 |       "dev": true
3090 |     },
3091 |     "rc": {
3092 |       "version": "1.2.8",
3093 |       "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz",
3094 |       "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==",
3095 |       "dev": true,
3096 |       "requires": {
3097 |         "deep-extend": "^0.6.0",
3098 |         "ini": "~1.3.0",
3099 |         "minimist": "^1.2.0",
3100 |         "strip-json-comments": "~2.0.1"
3101 |       }
3102 |     },
3103 |     "registry-auth-token": {
3104 |       "version": "3.3.2",
3105 |       "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.3.2.tgz",
3106 |       "integrity": "sha512-JL39c60XlzCVgNrO+qq68FoNb56w/m7JYvGR2jT5iR1xBrUA3Mfx5Twk5rqTThPmQKMWydGmq8oFtDlxfrmxnQ==",
3107 |       "dev": true,
3108 |       "requires": {
3109 |         "rc": "^1.1.6",
3110 |         "safe-buffer": "^5.0.1"
3111 |       }
3112 |     },
3113 |     "registry-url": {
3114 |       "version": "3.1.0",
3115 |       "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz",
3116 |       "integrity": "sha512-ZbgR5aZEdf4UKZVBPYIgaglBmSF2Hi94s2PcIHhRGFjKYu+chjJdYfHn4rt3hB6eCKLJ8giVIIfgMa1ehDfZKA==",
3117 |       "dev": true,
3118 |       "requires": {
3119 |         "rc": "^1.0.1"
3120 |       }
3121 |     },
3122 |     "require-from-string": {
3123 |       "version": "2.0.2",
3124 |       "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz",
3125 |       "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==",
3126 |       "dev": true
3127 |     },
3128 |     "resolve": {
3129 |       "version": "1.22.1",
3130 |       "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz",
3131 |       "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==",
3132 |       "dev": true,
3133 |       "requires": {
3134 |         "is-core-module": "^2.9.0",
3135 |         "path-parse": "^1.0.7",
3136 |         "supports-preserve-symlinks-flag": "^1.0.0"
3137 |       }
3138 |     },
3139 |     "rollup": {
3140 |       "version": "3.15.0",
3141 |       "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.15.0.tgz",
3142 |       "integrity": "sha512-F9hrCAhnp5/zx/7HYmftvsNBkMfLfk/dXUh73hPSM2E3CRgap65orDNJbLetoiUFwSAk6iHPLvBrZ5iHYvzqsg==",
3143 |       "dev": true,
3144 |       "requires": {
3145 |         "fsevents": "~2.3.2"
3146 |       }
3147 |     },
3148 |     "safe-buffer": {
3149 |       "version": "5.1.2",
3150 |       "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
3151 |       "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
3152 |       "dev": true
3153 |     },
3154 |     "serve": {
3155 |       "version": "14.1.2",
3156 |       "resolved": "https://registry.npmjs.org/serve/-/serve-14.1.2.tgz",
3157 |       "integrity": "sha512-luwVfJwbeE7dhCKeRU0vIBpt4bXdbAfzwsWJIQ5eqrIW2e+4nLWXbSlZ0WzelSFHQq+FlueOW6dr90jEewS9zw==",
3158 |       "dev": true,
3159 |       "requires": {
3160 |         "@zeit/schemas": "2.21.0",
3161 |         "ajv": "8.11.0",
3162 |         "arg": "5.0.2",
3163 |         "boxen": "7.0.0",
3164 |         "chalk": "5.0.1",
3165 |         "chalk-template": "0.4.0",
3166 |         "clipboardy": "3.0.0",
3167 |         "compression": "1.7.4",
3168 |         "is-port-reachable": "4.0.0",
3169 |         "serve-handler": "6.1.5",
3170 |         "update-check": "1.5.4"
3171 |       },
3172 |       "dependencies": {
3173 |         "chalk": {
3174 |           "version": "5.0.1",
3175 |           "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.0.1.tgz",
3176 |           "integrity": "sha512-Fo07WOYGqMfCWHOzSXOt2CxDbC6skS/jO9ynEcmpANMoPrD+W1r1K6Vx7iNm+AQmETU1Xr2t+n8nzkV9t6xh3w==",
3177 |           "dev": true
3178 |         }
3179 |       }
3180 |     },
3181 |     "serve-handler": {
3182 |       "version": "6.1.5",
3183 |       "resolved": "https://registry.npmjs.org/serve-handler/-/serve-handler-6.1.5.tgz",
3184 |       "integrity": "sha512-ijPFle6Hwe8zfmBxJdE+5fta53fdIY0lHISJvuikXB3VYFafRjMRpOffSPvCYsbKyBA7pvy9oYr/BT1O3EArlg==",
3185 |       "dev": true,
3186 |       "requires": {
3187 |         "bytes": "3.0.0",
3188 |         "content-disposition": "0.5.2",
3189 |         "fast-url-parser": "1.1.3",
3190 |         "mime-types": "2.1.18",
3191 |         "minimatch": "3.1.2",
3192 |         "path-is-inside": "1.0.2",
3193 |         "path-to-regexp": "2.2.1",
3194 |         "range-parser": "1.2.0"
3195 |       },
3196 |       "dependencies": {
3197 |         "mime-db": {
3198 |           "version": "1.33.0",
3199 |           "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz",
3200 |           "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==",
3201 |           "dev": true
3202 |         },
3203 |         "mime-types": {
3204 |           "version": "2.1.18",
3205 |           "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz",
3206 |           "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==",
3207 |           "dev": true,
3208 |           "requires": {
3209 |             "mime-db": "~1.33.0"
3210 |           }
3211 |         }
3212 |       }
3213 |     },
3214 |     "shebang-command": {
3215 |       "version": "2.0.0",
3216 |       "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
3217 |       "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
3218 |       "dev": true,
3219 |       "requires": {
3220 |         "shebang-regex": "^3.0.0"
3221 |       }
3222 |     },
3223 |     "shebang-regex": {
3224 |       "version": "3.0.0",
3225 |       "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
3226 |       "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
3227 |       "dev": true
3228 |     },
3229 |     "signal-exit": {
3230 |       "version": "3.0.7",
3231 |       "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
3232 |       "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
3233 |       "dev": true
3234 |     },
3235 |     "smob": {
3236 |       "version": "0.0.6",
3237 |       "resolved": "https://registry.npmjs.org/smob/-/smob-0.0.6.tgz",
3238 |       "integrity": "sha512-V21+XeNni+tTyiST1MHsa84AQhT1aFZipzPpOFAVB8DkHzwJyjjAmt9bgwnuZiZWnIbMo2duE29wybxv/7HWUw==",
3239 |       "dev": true
3240 |     },
3241 |     "source-map": {
3242 |       "version": "0.6.1",
3243 |       "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
3244 |       "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
3245 |       "dev": true
3246 |     },
3247 |     "source-map-support": {
3248 |       "version": "0.5.21",
3249 |       "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz",
3250 |       "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==",
3251 |       "dev": true,
3252 |       "requires": {
3253 |         "buffer-from": "^1.0.0",
3254 |         "source-map": "^0.6.0"
3255 |       }
3256 |     },
3257 |     "string-width": {
3258 |       "version": "5.1.2",
3259 |       "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz",
3260 |       "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==",
3261 |       "dev": true,
3262 |       "requires": {
3263 |         "eastasianwidth": "^0.2.0",
3264 |         "emoji-regex": "^9.2.2",
3265 |         "strip-ansi": "^7.0.1"
3266 |       }
3267 |     },
3268 |     "strip-ansi": {
3269 |       "version": "7.0.1",
3270 |       "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz",
3271 |       "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==",
3272 |       "dev": true,
3273 |       "requires": {
3274 |         "ansi-regex": "^6.0.1"
3275 |       }
3276 |     },
3277 |     "strip-final-newline": {
3278 |       "version": "2.0.0",
3279 |       "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz",
3280 |       "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==",
3281 |       "dev": true
3282 |     },
3283 |     "strip-json-comments": {
3284 |       "version": "2.0.1",
3285 |       "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
3286 |       "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==",
3287 |       "dev": true
3288 |     },
3289 |     "supports-preserve-symlinks-flag": {
3290 |       "version": "1.0.0",
3291 |       "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
3292 |       "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
3293 |       "dev": true
3294 |     },
3295 |     "terser": {
3296 |       "version": "5.16.1",
3297 |       "resolved": "https://registry.npmjs.org/terser/-/terser-5.16.1.tgz",
3298 |       "integrity": "sha512-xvQfyfA1ayT0qdK47zskQgRZeWLoOQ8JQ6mIgRGVNwZKdQMU+5FkCBjmv4QjcrTzyZquRw2FVtlJSRUmMKQslw==",
3299 |       "dev": true,
3300 |       "requires": {
3301 |         "@jridgewell/source-map": "^0.3.2",
3302 |         "acorn": "^8.5.0",
3303 |         "commander": "^2.20.0",
3304 |         "source-map-support": "~0.5.20"
3305 |       }
3306 |     },
3307 |     "tslib": {
3308 |       "version": "2.4.1",
3309 |       "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz",
3310 |       "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA=="
3311 |     },
3312 |     "type-fest": {
3313 |       "version": "2.16.0",
3314 |       "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.16.0.tgz",
3315 |       "integrity": "sha512-qpaThT2HQkFb83gMOrdKVsfCN7LKxP26Yq+smPzY1FqoHRjqmjqHXA7n5Gkxi8efirtbeEUxzfEdePthQWCuHw==",
3316 |       "dev": true
3317 |     },
3318 |     "typescript": {
3319 |       "version": "4.9.5",
3320 |       "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz",
3321 |       "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==",
3322 |       "dev": true
3323 |     },
3324 |     "update-check": {
3325 |       "version": "1.5.4",
3326 |       "resolved": "https://registry.npmjs.org/update-check/-/update-check-1.5.4.tgz",
3327 |       "integrity": "sha512-5YHsflzHP4t1G+8WGPlvKbJEbAJGCgw+Em+dGR1KmBUbr1J36SJBqlHLjR7oob7sco5hWHGQVcr9B2poIVDDTQ==",
3328 |       "dev": true,
3329 |       "requires": {
3330 |         "registry-auth-token": "3.3.2",
3331 |         "registry-url": "3.1.0"
3332 |       }
3333 |     },
3334 |     "uri-js": {
3335 |       "version": "4.4.1",
3336 |       "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
3337 |       "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
3338 |       "dev": true,
3339 |       "requires": {
3340 |         "punycode": "^2.1.0"
3341 |       },
3342 |       "dependencies": {
3343 |         "punycode": {
3344 |           "version": "2.1.1",
3345 |           "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
3346 |           "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
3347 |           "dev": true
3348 |         }
3349 |       }
3350 |     },
3351 |     "vary": {
3352 |       "version": "1.1.2",
3353 |       "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
3354 |       "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==",
3355 |       "dev": true
3356 |     },
3357 |     "which": {
3358 |       "version": "2.0.2",
3359 |       "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
3360 |       "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
3361 |       "dev": true,
3362 |       "requires": {
3363 |         "isexe": "^2.0.0"
3364 |       }
3365 |     },
3366 |     "wicg-inert": {
3367 |       "version": "3.1.1",
3368 |       "resolved": "https://registry.npmjs.org/wicg-inert/-/wicg-inert-3.1.1.tgz",
3369 |       "integrity": "sha512-PhBaNh8ur9Xm4Ggy4umelwNIP6pPP1bv3EaWaKqfb/QNme2rdLjm7wIInvV4WhxVHhzA4Spgw9qNSqWtB/ca2A=="
3370 |     },
3371 |     "widest-line": {
3372 |       "version": "4.0.1",
3373 |       "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-4.0.1.tgz",
3374 |       "integrity": "sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==",
3375 |       "dev": true,
3376 |       "requires": {
3377 |         "string-width": "^5.0.1"
3378 |       }
3379 |     },
3380 |     "wrap-ansi": {
3381 |       "version": "8.0.1",
3382 |       "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.0.1.tgz",
3383 |       "integrity": "sha512-QFF+ufAqhoYHvoHdajT/Po7KoXVBPXS2bgjIam5isfWJPfIOnQZ50JtUiVvCv/sjgacf3yRrt2ZKUZ/V4itN4g==",
3384 |       "dev": true,
3385 |       "requires": {
3386 |         "ansi-styles": "^6.1.0",
3387 |         "string-width": "^5.0.1",
3388 |         "strip-ansi": "^7.0.1"
3389 |       },
3390 |       "dependencies": {
3391 |         "ansi-styles": {
3392 |           "version": "6.1.0",
3393 |           "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.1.0.tgz",
3394 |           "integrity": "sha512-VbqNsoz55SYGczauuup0MFUyXNQviSpFTj1RQtFzmQLk18qbVSpTFFGMT293rmDaQuKCT6InmbuEyUne4mTuxQ==",
3395 |           "dev": true
3396 |         }
3397 |       }
3398 |     }
3399 |   }
3400 | }
3401 | 


--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
 1 | {
 2 |   "name": "improv-wifi-sdk",
 3 |   "version": "1.4.0",
 4 |   "description": "Improv Wi-Fi SDK for the browser",
 5 |   "main": "dist/launch-button.js",
 6 |   "repository": "https://github.com/improv-wifi/sdk-js",
 7 |   "author": "Improv Wi-Fi maintainers",
 8 |   "license": "Apache-2.0",
 9 |   "scripts": {
10 |     "prepublishOnly": "script/build"
11 |   },
12 |   "devDependencies": {
13 |     "@rollup/plugin-node-resolve": "^15.0.1",
14 |     "@rollup/plugin-terser": "^0.3.0",
15 |     "@rollup/plugin-typescript": "^11.0.0",
16 |     "@types/web-bluetooth": "^0.0.16",
17 |     "prettier": "^2.8.3",
18 |     "rollup": "^3.10.0",
19 |     "serve": "^14.1.2",
20 |     "typescript": "^4.9.4"
21 |   },
22 |   "dependencies": {
23 |     "@material/mwc-button": "^0.27.0",
24 |     "@material/mwc-circular-progress": "^0.27.0",
25 |     "@material/mwc-dialog": "^0.27.0",
26 |     "@material/mwc-textfield": "^0.27.0",
27 |     "lit": "^2.6.1",
28 |     "tslib": "^2.4.1"
29 |   }
30 | }
31 | 


--------------------------------------------------------------------------------
/rollup.config.mjs:
--------------------------------------------------------------------------------
 1 | import { nodeResolve } from "@rollup/plugin-node-resolve";
 2 | import terser from "@rollup/plugin-terser";
 3 | 
 4 | const config = {
 5 |   input: "dist/launch-button.js",
 6 |   output: {
 7 |     dir: "dist/web",
 8 |     format: "module",
 9 |   },
10 |   preserveEntrySignatures: false,
11 |   plugins: [nodeResolve()],
12 | };
13 | 
14 | if (process.env.NODE_ENV === "production") {
15 |   config.plugins.push(
16 |     terser({
17 |       ecma: 2019,
18 |       toplevel: true,
19 |       output: {
20 |         comments: false,
21 |       },
22 |     })
23 |   );
24 | }
25 | 
26 | export default config;
27 | 


--------------------------------------------------------------------------------
/script/build:
--------------------------------------------------------------------------------
1 | # Stop on errors
2 | set -e
3 | 
4 | cd "$(dirname "$0")/.."
5 | 
6 | rm -rf dist
7 | NODE_ENV=production npm exec -- tsc
8 | NODE_ENV=production npm exec -- rollup -c
9 | 


--------------------------------------------------------------------------------
/script/develop:
--------------------------------------------------------------------------------
 1 | # Stop on errors
 2 | set -e
 3 | 
 4 | cd "$(dirname "$0")/.."
 5 | 
 6 | rm -rf dist
 7 | 
 8 | # Quit all background tasks when script exits
 9 | trap "kill 0" EXIT
10 | 
11 | # Run tsc once as rollup expects those files
12 | npm exec -- tsc || true
13 | 
14 | npm exec -- serve -p 5003 &
15 | npm exec -- tsc --watch &
16 | npm exec -- rollup -c --watch &
17 | wait
18 | 


--------------------------------------------------------------------------------
/src/ble.ts:
--------------------------------------------------------------------------------
  1 | import {
  2 |   ImprovCurrentState,
  3 |   ImprovErrorState,
  4 |   ImprovRPCCommand,
  5 |   IMPROV_BLE_CURRENT_STATE_CHARACTERISTIC,
  6 |   IMPROV_BLE_ERROR_STATE_CHARACTERISTIC,
  7 |   IMPROV_BLE_RPC_COMMAND_CHARACTERISTIC,
  8 |   IMPROV_BLE_RPC_RESULT_CHARACTERISTIC,
  9 |   IMPROV_BLE_SERVICE,
 10 |   ImprovRPCResult,
 11 |   IMPROV_BLE_CAPABILITIES_CHARACTERISTIC,
 12 |   Logger,
 13 | } from "./const";
 14 | 
 15 | export class ImprovBluetoothLE extends EventTarget {
 16 |   public currentState?: ImprovCurrentState | undefined;
 17 |   public errorState = ImprovErrorState.NO_ERROR;
 18 |   public RPCResult?: ImprovRPCResult;
 19 |   public capabilities = 0;
 20 |   public nextUrl: string | undefined;
 21 | 
 22 |   private _currentStateChar?: BluetoothRemoteGATTCharacteristic;
 23 |   private _errorStateChar?: BluetoothRemoteGATTCharacteristic;
 24 |   private _rpcCommandChar?: BluetoothRemoteGATTCharacteristic;
 25 |   private _rpcResultChar?: BluetoothRemoteGATTCharacteristic;
 26 |   private _rpcFeedback?: {
 27 |     command: ImprovRPCCommand;
 28 |     resolve: (value: ImprovRPCResult) => void;
 29 |     reject: (err: ImprovErrorState) => void;
 30 |   };
 31 | 
 32 |   constructor(public device: BluetoothDevice, public logger: Logger) {
 33 |     super();
 34 |   }
 35 | 
 36 |   public get name() {
 37 |     return this.device.name;
 38 |   }
 39 | 
 40 |   public async initialize() {
 41 |     this.logger.log("Trying to connect to Improv BLE service");
 42 |     this.device.addEventListener("gattserverdisconnected", () => {
 43 |       // If we're provisioned, we expect to be disconnected.
 44 |       if (this.currentState === ImprovCurrentState.PROVISIONED) {
 45 |         return;
 46 |       }
 47 |       this.dispatchEvent(new CustomEvent("disconnect"));
 48 |     });
 49 |     // Do everything in sequence as some OSes do not support parallel GATT commands
 50 |     // https://github.com/WebBluetoothCG/web-bluetooth/issues/188#issuecomment-255121220
 51 | 
 52 |     await this.device.gatt!.connect();
 53 | 
 54 |     const service = await this.device.gatt!.getPrimaryService(
 55 |       IMPROV_BLE_SERVICE
 56 |     );
 57 | 
 58 |     this._currentStateChar = await service.getCharacteristic(
 59 |       IMPROV_BLE_CURRENT_STATE_CHARACTERISTIC
 60 |     );
 61 |     this._errorStateChar = await service.getCharacteristic(
 62 |       IMPROV_BLE_ERROR_STATE_CHARACTERISTIC
 63 |     );
 64 |     this._rpcCommandChar = await service.getCharacteristic(
 65 |       IMPROV_BLE_RPC_COMMAND_CHARACTERISTIC
 66 |     );
 67 |     this._rpcResultChar = await service.getCharacteristic(
 68 |       IMPROV_BLE_RPC_RESULT_CHARACTERISTIC
 69 |     );
 70 |     try {
 71 |       const capabilitiesChar = await service.getCharacteristic(
 72 |         IMPROV_BLE_CAPABILITIES_CHARACTERISTIC
 73 |       );
 74 |       const capabilitiesValue = await capabilitiesChar.readValue();
 75 |       this.capabilities = capabilitiesValue.getUint8(0);
 76 |     } catch (err) {
 77 |       console.warn(
 78 |         "Firmware not according to spec, missing capability support."
 79 |       );
 80 |     }
 81 | 
 82 |     this._currentStateChar.addEventListener(
 83 |       "characteristicvaluechanged",
 84 |       (ev: any) => this._handleImprovCurrentStateChange(ev.target.value)
 85 |     );
 86 |     await this._currentStateChar.startNotifications();
 87 | 
 88 |     this._errorStateChar.addEventListener(
 89 |       "characteristicvaluechanged",
 90 |       (ev: any) => this._handleImprovErrorStateChange(ev.target.value)
 91 |     );
 92 |     await this._errorStateChar.startNotifications();
 93 | 
 94 |     this._rpcResultChar.addEventListener(
 95 |       "characteristicvaluechanged",
 96 |       (ev: any) => this._handleImprovRPCResultChange(ev.target.value)
 97 |     );
 98 |     await this._rpcResultChar.startNotifications();
 99 | 
100 |     const curState = await this._currentStateChar.readValue();
101 |     const errorState = await this._errorStateChar.readValue();
102 | 
103 |     this._handleImprovCurrentStateChange(curState);
104 |     this._handleImprovErrorStateChange(errorState);
105 |   }
106 | 
107 |   public close() {
108 |     if (this.device.gatt!.connected) {
109 |       this.logger.debug("Disconnecting gatt");
110 |       this.device.gatt!.disconnect();
111 |     }
112 |   }
113 | 
114 |   public identify() {
115 |     this.sendRPC(ImprovRPCCommand.IDENTIFY, new Uint8Array());
116 |   }
117 | 
118 |   public async provision(
119 |     ssid: string,
120 |     password: string
121 |   ): Promise {
122 |     const encoder = new TextEncoder();
123 |     const ssidEncoded = encoder.encode(ssid);
124 |     const pwEncoded = encoder.encode(password);
125 |     const data = new Uint8Array([
126 |       ssidEncoded.length,
127 |       ...ssidEncoded,
128 |       pwEncoded.length,
129 |       ...pwEncoded,
130 |     ]);
131 |     try {
132 |       const rpcResult = await this.sendRPCWithResponse(
133 |         ImprovRPCCommand.SEND_WIFI_SETTINGS,
134 |         data
135 |       );
136 |       this.logger.debug("Provisioned! Disconnecting gatt");
137 |       // We're going to set this result manually in case we get RPC result first
138 |       // that way it's safe to disconnect.
139 |       this.currentState = ImprovCurrentState.PROVISIONED;
140 |       this.dispatchEvent(new CustomEvent("state-changed"));
141 |       this.device.gatt!.disconnect();
142 |       this.dispatchEvent(new CustomEvent("disconnect"));
143 |       this.nextUrl =
144 |         rpcResult.values.length > 0 ? rpcResult.values[0] : undefined;
145 |       return this.nextUrl;
146 |     } catch (err) {
147 |       // Do nothing. Error code will handle itself.
148 |       return undefined;
149 |     }
150 |   }
151 | 
152 |   public async sendRPCWithResponse(
153 |     command: ImprovRPCCommand,
154 |     data: Uint8Array
155 |   ) {
156 |     // Commands that receive feedback will finish when either
157 |     // the state changes or the error code becomes not 0.
158 |     if (this._rpcFeedback) {
159 |       throw new Error(
160 |         "Only 1 RPC command that requires feedback can be active"
161 |       );
162 |     }
163 | 
164 |     return await new Promise((resolve, reject) => {
165 |       this._rpcFeedback = { command, resolve, reject };
166 |       this.sendRPC(command, data);
167 |     });
168 |   }
169 | 
170 |   public sendRPC(command: ImprovRPCCommand, data: Uint8Array) {
171 |     this.logger.debug("RPC COMMAND", command, data);
172 |     const payload = new Uint8Array([command, data.length, ...data, 0]);
173 |     payload[payload.length - 1] = payload.reduce((sum, cur) => sum + cur, 0);
174 |     this.RPCResult = undefined;
175 |     this._rpcCommandChar!.writeValueWithoutResponse(payload);
176 |   }
177 | 
178 |   private _handleImprovCurrentStateChange(encodedState: DataView) {
179 |     const state = encodedState.getUint8(0) as ImprovCurrentState;
180 |     this.logger.debug("improv current state", state);
181 |     this.currentState = state;
182 |     this.dispatchEvent(new CustomEvent("state-changed"));
183 |   }
184 | 
185 |   private _handleImprovErrorStateChange(encodedState: DataView) {
186 |     const state = encodedState.getUint8(0) as ImprovErrorState;
187 |     this.logger.debug("improv error state", state);
188 |     this.errorState = state;
189 |     // Sending an RPC command sets error to no error.
190 |     // If we get a real error it means the RPC command is done.
191 |     if (state !== ImprovErrorState.NO_ERROR) {
192 |       if (this._rpcFeedback) {
193 |         this._rpcFeedback.reject(state);
194 |         this._rpcFeedback = undefined;
195 |       }
196 |     }
197 |   }
198 | 
199 |   private _handleImprovRPCResultChange(encodedResult: DataView) {
200 |     this.logger.debug("improv RPC result", encodedResult);
201 | 
202 |     const command = encodedResult.getUint8(0) as ImprovRPCCommand;
203 |     const result: ImprovRPCResult = {
204 |       command,
205 |       values: [],
206 |     };
207 |     const dataLength = encodedResult.getUint8(1);
208 | 
209 |     const baseOffset = 2;
210 |     const decoder = new TextDecoder();
211 | 
212 |     for (let start = 0; start < dataLength; ) {
213 |       const valueLength = encodedResult.getUint8(baseOffset + start);
214 |       const valueBytes = new Uint8Array(valueLength);
215 |       const valueOffset = baseOffset + start + 1;
216 |       for (let i = 0; i < valueLength; i++) {
217 |         valueBytes[i] = encodedResult.getUint8(valueOffset + i);
218 |       }
219 |       result.values.push(decoder.decode(valueBytes));
220 |       start += valueLength + 1; // +1 for length byte
221 |     }
222 | 
223 |     this.RPCResult = result;
224 | 
225 |     if (this._rpcFeedback) {
226 |       if (this._rpcFeedback.command !== command) {
227 |         this.logger.error("Received ");
228 |       }
229 |       this._rpcFeedback.resolve(result);
230 |       this._rpcFeedback = undefined;
231 |     }
232 |   }
233 | }
234 | 


--------------------------------------------------------------------------------
/src/components/ib-button.ts:
--------------------------------------------------------------------------------
 1 | import { ButtonBase } from "@material/mwc-button/mwc-button-base";
 2 | import { styles } from "@material/mwc-button/styles.css";
 3 | 
 4 | declare global {
 5 |   interface HTMLElementTagNameMap {
 6 |     "ib-button": IbButton;
 7 |   }
 8 | }
 9 | 
10 | export class IbButton extends ButtonBase {
11 |   static override styles = [styles];
12 | }
13 | 
14 | customElements.define("ib-button", IbButton);
15 | 


--------------------------------------------------------------------------------
/src/components/ib-circular-progress.ts:
--------------------------------------------------------------------------------
 1 | import { CircularProgressBase } from "@material/mwc-circular-progress/mwc-circular-progress-base";
 2 | import { styles } from "@material/mwc-circular-progress/mwc-circular-progress.css";
 3 | 
 4 | declare global {
 5 |   interface HTMLElementTagNameMap {
 6 |     "ib-circular-progress": IbCircularProgress;
 7 |   }
 8 | }
 9 | 
10 | export class IbCircularProgress extends CircularProgressBase {
11 |   static override styles = [styles];
12 | }
13 | 
14 | customElements.define("ib-circular-progress", IbCircularProgress);
15 | 


--------------------------------------------------------------------------------
/src/components/ib-dialog.ts:
--------------------------------------------------------------------------------
 1 | import { DialogBase } from "@material/mwc-dialog/mwc-dialog-base";
 2 | import { styles } from "@material/mwc-dialog/mwc-dialog.css";
 3 | 
 4 | declare global {
 5 |   interface HTMLElementTagNameMap {
 6 |     "ib-dialog": IbDialog;
 7 |   }
 8 | }
 9 | 
10 | export class IbDialog extends DialogBase {
11 |   static override styles = [styles];
12 | }
13 | 
14 | customElements.define("ib-dialog", IbDialog);
15 | 


--------------------------------------------------------------------------------
/src/components/ib-textfield.ts:
--------------------------------------------------------------------------------
 1 | import { TextFieldBase } from "@material/mwc-textfield/mwc-textfield-base";
 2 | import { styles } from "@material/mwc-textfield/mwc-textfield.css";
 3 | 
 4 | declare global {
 5 |   interface HTMLElementTagNameMap {
 6 |     "ib-textfield": IbTextfield;
 7 |   }
 8 | }
 9 | 
10 | export class IbTextfield extends TextFieldBase {
11 |   static override styles = [styles];
12 | }
13 | 
14 | customElements.define("ib-textfield", IbTextfield);
15 | 


--------------------------------------------------------------------------------
/src/const.ts:
--------------------------------------------------------------------------------
 1 | export interface Logger {
 2 |   log(msg: string, ...args: any[]): void;
 3 |   error(msg: string, ...args: any[]): void;
 4 |   debug(msg: string, ...args: any[]): void;
 5 | }
 6 | 
 7 | export const IMPROV_BLE_SERVICE = "00467768-6228-2272-4663-277478268000";
 8 | export const IMPROV_BLE_CURRENT_STATE_CHARACTERISTIC =
 9 |   "00467768-6228-2272-4663-277478268001";
10 | export const IMPROV_BLE_ERROR_STATE_CHARACTERISTIC =
11 |   "00467768-6228-2272-4663-277478268002";
12 | export const IMPROV_BLE_RPC_COMMAND_CHARACTERISTIC =
13 |   "00467768-6228-2272-4663-277478268003";
14 | // []
15 | export const IMPROV_BLE_RPC_RESULT_CHARACTERISTIC =
16 |   "00467768-6228-2272-4663-277478268004";
17 | export const IMPROV_BLE_CAPABILITIES_CHARACTERISTIC =
18 |   "00467768-6228-2272-4663-277478268005";
19 | 
20 | export type State = "CONNECTING" | "IMPROV-STATE" | "ERROR";
21 | 
22 | export interface ImprovState {
23 |   state:
24 |     | Omit
25 |     | keyof typeof ImprovCurrentState
26 |     | "UNKNOWN";
27 | }
28 | 
29 | export enum ImprovCurrentState {
30 |   AUTHORIZATION_REQUIRED = 0x01,
31 |   AUTHORIZED = 0x02,
32 |   PROVISIONING = 0x03,
33 |   PROVISIONED = 0x04,
34 | }
35 | 
36 | export const enum ImprovErrorState {
37 |   NO_ERROR = 0x00,
38 |   INVALID_RPC_PACKET = 0x01,
39 |   UNKNOWN_RPC_COMMAND = 0x02,
40 |   UNABLE_TO_CONNECT = 0x03,
41 |   NOT_AUTHORIZED = 0x04,
42 |   UNKNOWN_ERROR = 0xff,
43 | }
44 | 
45 | export const enum ImprovRPCCommand {
46 |   SEND_WIFI_SETTINGS = 0x01,
47 |   IDENTIFY = 0x02,
48 | }
49 | 
50 | export interface ImprovRPCResult {
51 |   command: ImprovRPCCommand;
52 |   values: string[];
53 | }
54 | 
55 | export const hasIdentifyCapability = (capabilities: number) =>
56 |   (capabilities & 1) === 1;
57 | 
58 | declare global {
59 |   interface HTMLElementEventMap {
60 |     "state-changed": CustomEvent;
61 |   }
62 | }
63 | 


--------------------------------------------------------------------------------
/src/launch-button.ts:
--------------------------------------------------------------------------------
 1 | export class LaunchButton extends HTMLElement {
 2 |   public static isSupported = "bluetooth" in navigator;
 3 | 
 4 |   public static isAllowed = window.isSecureContext;
 5 | 
 6 |   private static style = `
 7 |   button {
 8 |     position: relative;
 9 |     cursor: pointer;
10 |     font-size: 14px;
11 |     padding: 8px 28px;
12 |     color: var(--improv-on-primary-color, #fff);
13 |     background-color: var(--improv-primary-color, #03a9f4);
14 |     border: none;
15 |     border-radius: 4px;
16 |     box-shadow: 0 2px 2px 0 rgba(0,0,0,.14), 0 3px 1px -2px rgba(0,0,0,.12), 0 1px 5px 0 rgba(0,0,0,.2);
17 |   }
18 |   button::before {
19 |     content: " ";
20 |     position: absolute;
21 |     top: 0;
22 |     bottom: 0;
23 |     left: 0;
24 |     right: 0;
25 |     opacity: 0.2;
26 |     border-radius: 4px;
27 |   }
28 |   button:hover {
29 |     box-shadow: 0 4px 8px 0 rgba(0,0,0,.14), 0 1px 7px 0 rgba(0,0,0,.12), 0 3px 1px -1px rgba(0,0,0,.2);
30 |   }
31 |   button:hover::before {
32 |     background-color: rgba(255,255,255,.8);
33 |   }
34 |   button:focus {
35 |     outline: none;
36 |   }
37 |   button:focus::before {
38 |     background-color: white;
39 |   }
40 |   button:active::before {
41 |     background-color: grey;
42 |   }
43 | `;
44 | 
45 |   private renderRoot?: ShadowRoot;
46 | 
47 |   public connectedCallback() {
48 |     if (this.renderRoot) {
49 |       return;
50 |     }
51 | 
52 |     this.renderRoot = this.attachShadow({ mode: "open" });
53 | 
54 |     if (!LaunchButton.isSupported || !LaunchButton.isAllowed) {
55 |       this.toggleAttribute("not-supported", true);
56 |       this.renderRoot.innerHTML = !LaunchButton.isAllowed
57 |         ? "You can only use Improv on HTTPS sites or localhost."
58 |         : "Your browser does not support bluetooth provisioning. Use Google Chrome or Microsoft Edge.";
59 |       return;
60 |     }
61 | 
62 |     this.toggleAttribute("supported", true);
63 | 
64 |     this.addEventListener("mouseover", () => {
65 |       // Preload
66 |       import("./provision");
67 |     });
68 | 
69 |     const slot = document.createElement("slot");
70 |     slot.name = "activate";
71 |     const button = document.createElement("button");
72 |     button.innerText = "Connect device to Wi-Fi";
73 |     slot.append(button);
74 | 
75 |     slot.addEventListener("click", async (ev) => {
76 |       ev.preventDefault();
77 |       const mod = await import("./provision");
78 |       mod.startProvisioning(this);
79 |     });
80 | 
81 |     if (
82 |       "adoptedStyleSheets" in Document.prototype &&
83 |       "replaceSync" in CSSStyleSheet.prototype
84 |     ) {
85 |       const sheet = new CSSStyleSheet();
86 |       sheet.replaceSync(LaunchButton.style);
87 |       this.renderRoot.adoptedStyleSheets = [sheet];
88 |     } else {
89 |       const styleSheet = document.createElement("style");
90 |       styleSheet.innerText = LaunchButton.style;
91 |       this.renderRoot.append(styleSheet);
92 |     }
93 | 
94 |     this.renderRoot.append(slot);
95 |   }
96 | }
97 | 
98 | customElements.define("improv-wifi-launch-button", LaunchButton);
99 | 


--------------------------------------------------------------------------------
/src/provision-dialog.ts:
--------------------------------------------------------------------------------
  1 | import { LitElement, html, PropertyValues, css, TemplateResult } from "lit";
  2 | import { customElement, query, state } from "lit/decorators.js";
  3 | import "./components/ib-dialog";
  4 | import "./components/ib-textfield";
  5 | import "./components/ib-button";
  6 | import "./components/ib-circular-progress";
  7 | import type { IbTextfield } from "./components/ib-textfield";
  8 | import {
  9 |   hasIdentifyCapability,
 10 |   ImprovCurrentState,
 11 |   ImprovErrorState,
 12 |   State,
 13 |   ImprovState,
 14 | } from "./const";
 15 | import { ImprovBluetoothLE } from "./ble";
 16 | 
 17 | const ERROR_ICON = "⚠️";
 18 | const OK_ICON = "🎉";
 19 | const AUTHORIZE_ICON = "👉";
 20 | 
 21 | @customElement("improv-wifi-provision-dialog")
 22 | class ProvisionDialog extends LitElement {
 23 |   public device!: BluetoothDevice;
 24 | 
 25 |   public stateUpdateCallback!: (state: ImprovState) => void;
 26 | 
 27 |   @state() private _state: State = "CONNECTING";
 28 | 
 29 |   @state() private _improvCurrentState?: ImprovCurrentState | undefined;
 30 |   @state() private _improvErrorState = ImprovErrorState.NO_ERROR;
 31 |   @state() private _improvCapabilities = 0;
 32 | 
 33 |   @state() private _busy = false;
 34 | 
 35 |   private _error?: string;
 36 | 
 37 |   @query("ib-textfield[name=ssid]") private _inputSSID!: IbTextfield;
 38 |   @query("ib-textfield[name=password]") private _inputPassword!: IbTextfield;
 39 | 
 40 |   private __client?: ImprovBluetoothLE;
 41 | 
 42 |   private get _client(): ImprovBluetoothLE {
 43 |     if (!this.__client) {
 44 |       this.__client = new ImprovBluetoothLE(this.device, console);
 45 |     }
 46 |     return this.__client;
 47 |   }
 48 | 
 49 |   protected render() {
 50 |     let heading: string = "";
 51 |     let content: TemplateResult;
 52 |     let hideActions = false;
 53 | 
 54 |     if (this._state === "CONNECTING") {
 55 |       content = this._renderProgress("Connecting");
 56 |       hideActions = true;
 57 |     } else if (this._state === "ERROR") {
 58 |       content = this._renderMessage(
 59 |         ERROR_ICON,
 60 |         `An error occurred. ${this._error}`,
 61 |         true
 62 |       );
 63 |     } else if (
 64 |       this._improvCurrentState === ImprovCurrentState.AUTHORIZATION_REQUIRED
 65 |     ) {
 66 |       content = this._renderMessage(
 67 |         AUTHORIZE_ICON,
 68 |         "Press the authorize button on the device",
 69 |         false
 70 |       );
 71 |     } else if (this._improvCurrentState === ImprovCurrentState.AUTHORIZED) {
 72 |       if (this._busy) {
 73 |         content = this._renderProgress("Provisioning");
 74 |         hideActions = true;
 75 |       } else {
 76 |         heading = "Configure Wi-Fi";
 77 |         content = this._renderImprovAuthorized();
 78 |       }
 79 |     } else if (this._improvCurrentState === ImprovCurrentState.PROVISIONING) {
 80 |       content = this._renderProgress("Provisioning");
 81 |       hideActions = true;
 82 |     } else if (this._improvCurrentState === ImprovCurrentState.PROVISIONED) {
 83 |       content = this._renderImprovProvisioned();
 84 |     } else {
 85 |       content = this._renderMessage(
 86 |         ERROR_ICON,
 87 |         `Unexpected state: ${this._state} - ${this._improvCurrentState}`,
 88 |         true
 89 |       );
 90 |     }
 91 | 
 92 |     return html`
 93 |       ${content}
101 |     `;
102 |   }
103 | 
104 |   _renderProgress(label: string) {
105 |     return html`
106 |       
107 |
108 | 113 |
114 | ${label} 115 |
116 | `; 117 | } 118 | 119 | _renderMessage(icon: string, label: string, showClose: boolean) { 120 | return html` 121 |
122 |
${icon}
123 | ${label} 124 |
125 | ${showClose 126 | ? html` 127 | 132 | ` 133 | : ``} 134 | `; 135 | } 136 | 137 | private _renderImprovAuthorized() { 138 | let error: string | undefined; 139 | 140 | switch (this._improvErrorState) { 141 | case ImprovErrorState.UNABLE_TO_CONNECT: 142 | error = "Unable to connect"; 143 | break; 144 | 145 | case ImprovErrorState.NO_ERROR: 146 | break; 147 | 148 | default: 149 | error = `Unknown error (${this._improvErrorState})`; 150 | } 151 | 152 | return html` 153 |
154 | Enter the credentials of the Wi-Fi network that you want 155 | ${this._client.name || "your device"} to connect to. 156 | ${hasIdentifyCapability(this._improvCapabilities) 157 | ? html` 158 | 161 | ` 162 | : ""} 163 |
164 | ${error ? html`

${error}

` : ""} 165 | 166 | 171 | 176 | 181 | `; 182 | } 183 | 184 | private _renderImprovProvisioned() { 185 | return html` 186 |
187 |
${OK_ICON}
188 | Provisioned! 189 |
190 | ${this._client.nextUrl === undefined 191 | ? html` 192 | 197 | ` 198 | : html` 199 | 205 | 206 | 207 | `} 208 | `; 209 | } 210 | 211 | protected firstUpdated(changedProps: PropertyValues) { 212 | super.firstUpdated(changedProps); 213 | this._client.addEventListener("state-changed", () => { 214 | this._state = "IMPROV-STATE"; 215 | this._busy = false; 216 | this._improvCurrentState = this._client.currentState; 217 | }); 218 | this._client.addEventListener("error-changed", () => { 219 | this._improvErrorState = this._client.errorState; 220 | // Sending an RPC command sets error to no error. 221 | // If we get a real error it means the RPC command is done. 222 | 223 | if (this._improvErrorState !== ImprovErrorState.NO_ERROR) { 224 | this._busy = false; 225 | } 226 | }); 227 | this._client.addEventListener("disconnect", () => { 228 | // If we're provisioned, we expect to be disconnected. 229 | if ( 230 | this._state === "IMPROV-STATE" && 231 | this._improvCurrentState === ImprovCurrentState.PROVISIONED 232 | ) { 233 | return; 234 | } 235 | this._state = "ERROR"; 236 | this._error = "Device disconnected."; 237 | }); 238 | this._connect(); 239 | } 240 | 241 | private async _connect() { 242 | try { 243 | await this._client.initialize(); 244 | this._improvCurrentState = this._client.currentState; 245 | this._improvErrorState = this._client.errorState; 246 | this._improvCapabilities = this._client.capabilities; 247 | this._state = "IMPROV-STATE"; 248 | } catch (err: any) { 249 | this._state = "ERROR"; 250 | this._error = err.message; 251 | } 252 | } 253 | 254 | private async _provision() { 255 | this._busy = true; 256 | try { 257 | await this._client.provision( 258 | this._inputSSID.value, 259 | this._inputPassword.value 260 | ); 261 | } catch (err) { 262 | // Ignore, error state takes care of this. 263 | } finally { 264 | this._busy = false; 265 | } 266 | } 267 | 268 | private _identify() { 269 | this._client.identify(); 270 | } 271 | 272 | protected updated(changedProps: PropertyValues) { 273 | super.updated(changedProps); 274 | 275 | if ( 276 | changedProps.has("_state") || 277 | (this._state === "IMPROV-STATE" && 278 | changedProps.has("_improvCurrentState")) 279 | ) { 280 | const state = 281 | this._state === "IMPROV-STATE" 282 | ? (ImprovCurrentState[ 283 | this._improvCurrentState! 284 | ] as keyof typeof ImprovCurrentState) || "UNKNOWN" 285 | : this._state; 286 | this.stateUpdateCallback({ state }); 287 | } 288 | 289 | if ( 290 | (changedProps.has("_improvCurrentState") || changedProps.has("_state")) && 291 | this._state === "IMPROV-STATE" && 292 | this._improvCurrentState === ImprovCurrentState.AUTHORIZED 293 | ) { 294 | const input = this._inputSSID; 295 | input.updateComplete.then(() => input.focus()); 296 | } 297 | } 298 | 299 | private _handleClose() { 300 | this._client.close(); 301 | this.parentNode!.removeChild(this); 302 | } 303 | 304 | static styles = css` 305 | :host { 306 | --mdc-dialog-max-width: 390px; 307 | --mdc-theme-primary: var(--improv-primary-color, #03a9f4); 308 | --mdc-theme-on-primary: var(--improv-on-primary-color, #fff); 309 | } 310 | ib-textfield { 311 | display: block; 312 | } 313 | ib-textfield { 314 | margin-top: 16px; 315 | } 316 | .center { 317 | text-align: center; 318 | } 319 | ib-circular-progress { 320 | margin-bottom: 16px; 321 | } 322 | a.has-button { 323 | text-decoration: none; 324 | } 325 | .icon { 326 | font-size: 50px; 327 | line-height: 80px; 328 | color: black; 329 | } 330 | .error { 331 | color: #db4437; 332 | } 333 | button.link { 334 | background: none; 335 | color: inherit; 336 | border: none; 337 | padding: 0; 338 | font: inherit; 339 | text-align: left; 340 | text-decoration: underline; 341 | cursor: pointer; 342 | } 343 | `; 344 | } 345 | 346 | declare global { 347 | interface HTMLElementTagNameMap { 348 | "improv-wifi-provision-dialog": ProvisionDialog; 349 | } 350 | } 351 | -------------------------------------------------------------------------------- /src/provision.ts: -------------------------------------------------------------------------------- 1 | import { IMPROV_BLE_SERVICE } from "./const"; 2 | import type { LaunchButton } from "./launch-button"; 3 | import { fireEvent } from "./util"; 4 | 5 | export const startProvisioning = async (button: LaunchButton) => { 6 | import("./provision-dialog"); 7 | let device: BluetoothDevice | undefined; 8 | try { 9 | device = await navigator.bluetooth.requestDevice({ 10 | filters: [{ services: [IMPROV_BLE_SERVICE] }], 11 | }); 12 | } catch (err) { 13 | console.error("Failed to get device", err); 14 | } 15 | 16 | if (!device) { 17 | return; 18 | } 19 | 20 | const el = document.createElement("improv-wifi-provision-dialog"); 21 | el.device = device; 22 | el.stateUpdateCallback = (state) => { 23 | fireEvent(button, "state-changed", state); 24 | }; 25 | document.body.appendChild(el); 26 | }; 27 | -------------------------------------------------------------------------------- /src/util.ts: -------------------------------------------------------------------------------- 1 | export const fireEvent = ( 2 | eventTarget: EventTarget, 3 | type: Event, 4 | // @ts-ignore 5 | detail?: HTMLElementEventMap[Event]["detail"], 6 | options?: { 7 | bubbles?: boolean; 8 | cancelable?: boolean; 9 | composed?: boolean; 10 | } 11 | ): void => { 12 | options = options || {}; 13 | const event = new CustomEvent(type, { 14 | bubbles: options.bubbles === undefined ? true : options.bubbles, 15 | cancelable: Boolean(options.cancelable), 16 | composed: options.composed === undefined ? true : options.composed, 17 | detail, 18 | }); 19 | eventTarget.dispatchEvent(event); 20 | }; 21 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "lib": ["es2019", "dom"], 4 | "target": "es2019", 5 | "module": "es2020", 6 | "moduleResolution": "node", 7 | "outDir": "dist", 8 | "declaration": true, 9 | "experimentalDecorators": true, 10 | "noFallthroughCasesInSwitch": true, 11 | "noImplicitReturns": true, 12 | "noUnusedLocals": true, 13 | "forceConsistentCasingInFileNames": true, 14 | "strict": true, 15 | "suppressImplicitAnyIndexErrors": true, 16 | "skipLibCheck": true, 17 | "importHelpers": true 18 | }, 19 | "include": ["src/*"] 20 | } 21 | --------------------------------------------------------------------------------