From dfce79be25aef8efb3ec64d71fcaf71308842dfa Mon Sep 17 00:00:00 2001 From: Daniel Engelson <danen038@student.liu.se> Date: Sun, 9 May 2021 14:35:46 +0200 Subject: [PATCH] choose map file implemented --- docker-compose.yml | 15 + src/gui/.eslintignore | 1 - src/gui/.eslintrc | 46 - src/gui/LICENSE | 202 - src/gui/data/example.secret | 1 - src/gui/demo/README.md | 67 - src/gui/demo/css/component.css | 642 -- src/gui/demo/css/demo.css | 414 - src/gui/demo/index.html | 170 - src/gui/demo/js/btnstate.js | 49 - src/gui/demo/js/controller.js | 189 - src/gui/demo/js/log.js | 57 - src/gui/demo/js/ros2dmap.js | 60 - src/gui/examples/html/client.html | 85 - src/gui/examples/html/publisher.html | 81 - src/gui/examples/html/service.html | 79 - src/gui/examples/html/subscription.html | 78 - src/gui/lhw_gui/index.js | 23 - src/gui/npm-pack.sh | 36 - src/gui/test/README.md | 14 - src/gui/test/browser/html_list.json | 24 - src/gui/test/browser/resources/LICENSE | 30 - .../test/browser/resources/testharness.css | 102 - src/gui/test/browser/resources/testharness.js | 2938 ------ .../browser/resources/testharnessreport.js | 57 - src/gui/test/browser/server.js | 22 - src/gui/test/browser/test-example.html | 27 - src/gui/test/browser/test-goal.html | 27 - src/gui/test/browser/test-html.js | 94 - src/gui/test/browser/test-ros.html | 161 - src/gui/test/browser/test-service.html | 218 - src/gui/test/browser/test-topic.html | 192 - .../test/nodejs/protocol/entry-client-mode.js | 77 - src/gui/test/nodejs/protocol/entry.js | 102 - .../nodejs/protocol/test-advertise-msg.js | 115 - .../nodejs/protocol/test-advertise-service.js | 128 - .../test/nodejs/protocol/test-advertise.js | 131 - .../test/nodejs/protocol/test-call-service.js | 157 - src/gui/test/nodejs/protocol/test-op-neg.js | 59 - .../test/nodejs/protocol/test-publish-msg.js | 295 - src/gui/test/nodejs/protocol/test-publish.js | 123 - .../test/nodejs/protocol/test-response-op.js | 90 - .../protocol/test-ros2-protocol-workflow.js | 44 - .../nodejs/protocol/test-service-response.js | 122 - .../test/nodejs/protocol/test-set-level.js | 105 - .../nodejs/protocol/test-subscribe-msg.js | 215 - .../test/nodejs/protocol/test-subscribe.js | 147 - .../protocol/test-unadvertise-service.js | 123 - .../test/nodejs/protocol/test-unadvertise.js | 117 - .../test/nodejs/protocol/test-unsubscribe.js | 104 - src/gui/test/nodejs/test-rosauth-internal.js | 187 - src/{gui => lhw_gui}/.gitignore | 0 src/{gui => lhw_gui}/.travis.yml | 0 src/{gui => lhw_gui}/Dockerfile | 0 src/{gui => lhw_gui}/README.md | 0 src/{gui => lhw_gui}/appveyor.yml | 0 src/{gui => lhw_gui}/index.js | 0 .../lhw_gui/html/room_navigation.html | 35 +- .../examples => lhw_gui/lhw_gui}/index.js | 0 src/lhw_gui/package-lock.json | 7876 +++++++++++++++++ src/{gui => lhw_gui}/package.json | 4 +- src/lhw_motion/Dockerfile | 3 + src/lhw_motion/lhw_motion/room_navigation.py | 3 +- .../maps/simple_map.png | Bin .../maps/simple_map_rooms.png | Bin .../maps/simple_map_with_goals.png | Bin 66 files changed, 7925 insertions(+), 8638 deletions(-) delete mode 100644 src/gui/.eslintignore delete mode 100644 src/gui/.eslintrc delete mode 100644 src/gui/LICENSE delete mode 100644 src/gui/data/example.secret delete mode 100644 src/gui/demo/README.md delete mode 100644 src/gui/demo/css/component.css delete mode 100644 src/gui/demo/css/demo.css delete mode 100644 src/gui/demo/index.html delete mode 100644 src/gui/demo/js/btnstate.js delete mode 100644 src/gui/demo/js/controller.js delete mode 100644 src/gui/demo/js/log.js delete mode 100644 src/gui/demo/js/ros2dmap.js delete mode 100644 src/gui/examples/html/client.html delete mode 100644 src/gui/examples/html/publisher.html delete mode 100644 src/gui/examples/html/service.html delete mode 100644 src/gui/examples/html/subscription.html delete mode 100644 src/gui/lhw_gui/index.js delete mode 100755 src/gui/npm-pack.sh delete mode 100644 src/gui/test/README.md delete mode 100644 src/gui/test/browser/html_list.json delete mode 100644 src/gui/test/browser/resources/LICENSE delete mode 100644 src/gui/test/browser/resources/testharness.css delete mode 100644 src/gui/test/browser/resources/testharness.js delete mode 100644 src/gui/test/browser/resources/testharnessreport.js delete mode 100644 src/gui/test/browser/server.js delete mode 100644 src/gui/test/browser/test-example.html delete mode 100644 src/gui/test/browser/test-goal.html delete mode 100644 src/gui/test/browser/test-html.js delete mode 100644 src/gui/test/browser/test-ros.html delete mode 100644 src/gui/test/browser/test-service.html delete mode 100644 src/gui/test/browser/test-topic.html delete mode 100644 src/gui/test/nodejs/protocol/entry-client-mode.js delete mode 100644 src/gui/test/nodejs/protocol/entry.js delete mode 100644 src/gui/test/nodejs/protocol/test-advertise-msg.js delete mode 100644 src/gui/test/nodejs/protocol/test-advertise-service.js delete mode 100644 src/gui/test/nodejs/protocol/test-advertise.js delete mode 100644 src/gui/test/nodejs/protocol/test-call-service.js delete mode 100644 src/gui/test/nodejs/protocol/test-op-neg.js delete mode 100644 src/gui/test/nodejs/protocol/test-publish-msg.js delete mode 100644 src/gui/test/nodejs/protocol/test-publish.js delete mode 100644 src/gui/test/nodejs/protocol/test-response-op.js delete mode 100644 src/gui/test/nodejs/protocol/test-ros2-protocol-workflow.js delete mode 100644 src/gui/test/nodejs/protocol/test-service-response.js delete mode 100644 src/gui/test/nodejs/protocol/test-set-level.js delete mode 100644 src/gui/test/nodejs/protocol/test-subscribe-msg.js delete mode 100644 src/gui/test/nodejs/protocol/test-subscribe.js delete mode 100644 src/gui/test/nodejs/protocol/test-unadvertise-service.js delete mode 100644 src/gui/test/nodejs/protocol/test-unadvertise.js delete mode 100644 src/gui/test/nodejs/protocol/test-unsubscribe.js delete mode 100644 src/gui/test/nodejs/test-rosauth-internal.js rename src/{gui => lhw_gui}/.gitignore (100%) rename src/{gui => lhw_gui}/.travis.yml (100%) rename src/{gui => lhw_gui}/Dockerfile (100%) rename src/{gui => lhw_gui}/README.md (100%) rename src/{gui => lhw_gui}/appveyor.yml (100%) rename src/{gui => lhw_gui}/index.js (100%) rename src/{gui => lhw_gui}/lhw_gui/html/room_navigation.html (86%) rename src/{gui/examples => lhw_gui/lhw_gui}/index.js (100%) create mode 100644 src/lhw_gui/package-lock.json rename src/{gui => lhw_gui}/package.json (100%) rename src/{gui/lhw_gui => lhw_motion}/maps/simple_map.png (100%) rename src/{gui/lhw_gui => lhw_motion}/maps/simple_map_rooms.png (100%) rename src/{gui/lhw_gui => lhw_motion}/maps/simple_map_with_goals.png (100%) diff --git a/docker-compose.yml b/docker-compose.yml index 5ce37c06..26b55e5a 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -95,6 +95,21 @@ services: - ./src/lhw_qi:/workspace/liu-home-wreckers/src/lhw_qi - ./installs/lhw_qi:/workspace/liu-home-wreckers/install command: zsh -c ./waiter + + lhw_gui: + extends: lhw + container_name: lhw_gui + build: + context: . + dockerfile: ./src/lhw_gui/Dockerfile + image: lhw_gui + environment: + - DISPLAY=$DISPLAY + - RCUTILS_COLORIZED_OUTPUT=1 + volumes: + - /tmp/.X11-unix:/tmp/.X11-unix + - ./src/lhw_gui:/workspace/liu-home-wreckers/src/lhw_gui + command: zsh -c ./waiter lhw_ros1: container_name: lhw_ros1 diff --git a/src/gui/.eslintignore b/src/gui/.eslintignore deleted file mode 100644 index 8fbb2e15..00000000 --- a/src/gui/.eslintignore +++ /dev/null @@ -1 +0,0 @@ -test/browser diff --git a/src/gui/.eslintrc b/src/gui/.eslintrc deleted file mode 100644 index be0ed10d..00000000 --- a/src/gui/.eslintrc +++ /dev/null @@ -1,46 +0,0 @@ -env: - node: true - es6: true - -globals: - every: true - after: true - constantly: true - -rules: - camelcase: [2, {properties: "always"}] - comma-dangle: 0 - comma-spacing: [2, {before: false, after: true}] - comma-style: [2, "last"] - handle-callback-err: [2, "^.*(e|E)rr" ] - indent: [2, 2] - key-spacing: [2, { beforeColon: false, afterColon: true }] - max-depth: [1, 6] - max-len: ["error", {"code": 120, "tabWidth": 2, "ignoreComments": true}] - max-nested-callbacks: [1, 7] - no-cond-assign: 2 - no-constant-condition: 2 - no-dupe-args: 2 - no-dupe-keys: 2 - no-else-return: 2 - no-empty: 2 - no-lonely-if: 2 - no-multiple-empty-lines: 2 - no-nested-ternary: 2 - no-self-compare: 2 - no-sync: 1 - no-throw-literal: 2 - no-underscore-dangle: 0 - quote-props: [2, "as-needed"] - quotes: [2, "single", {"avoidEscape": true}] - radix: 2 - semi-spacing: [2, {before: false, after: true}] - semi: [2, "always"] - keyword-spacing: [2, {before: true, after: true}] - space-before-blocks: [2, "always"] - space-before-function-paren: [1, "never"] - space-in-parens: [2, "never"] - spaced-comment: [1, "always"] - strict: [2, "global"] - valid-jsdoc: 2 - yoda: [2, "never"] diff --git a/src/gui/LICENSE b/src/gui/LICENSE deleted file mode 100644 index d6456956..00000000 --- a/src/gui/LICENSE +++ /dev/null @@ -1,202 +0,0 @@ - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/src/gui/data/example.secret b/src/gui/data/example.secret deleted file mode 100644 index 4654c732..00000000 --- a/src/gui/data/example.secret +++ /dev/null @@ -1 +0,0 @@ -relaxthisain'tmyfirstrodeo \ No newline at end of file diff --git a/src/gui/demo/README.md b/src/gui/demo/README.md deleted file mode 100644 index e65da316..00000000 --- a/src/gui/demo/README.md +++ /dev/null @@ -1,67 +0,0 @@ -# Introduction -Web demo app for ROS Conference 2018 - -## Hardware: -* [Intel Up-board Squared](http://www.up-board.org/upsquared/) -* [TurtleBot3 Burger](http://www.robotis.us/turtlebot-3/) -* USB Wi-Fi adpater -* An available wireless network -* Node.js 8.11.4 installed - -## Pre-condition -* Ubuntu Linux 16.04 installed on Up-board Squared -* ROS2 release package available - -## Setup -### Install MicroRTPSAgent -``` -$ git clone https://github.com/eProsima/micro-RTPS-agent.git -$ cd micro-RTPS-agent -$ mkdir build && cd build -$ cmake -DTHIRDPARTY=ON .. -$ make -$ sudo make install -``` - -### Install ros2-web-bridge -``` -$ source <path/to/ros2-linux>/local_setup.bash -$ git clone https://github.com/RobotWebTools/ros2-web-bridge.git -$ cd ros2-web-bridge -$ npm install -``` - -### Install http-server CLI tools -``` -$ npm install -g http-server -``` - -## Run the demo -### Start up MicroRTPSAgent -New a terminal session, run -``` -$ cd /usr/local/bin -$ ./MicroRTPSAgent serial /dev/ttyACM0 -``` - -### Start up the web bridge server -New a terminal session, run -``` -$ source <path/to/ros2-linux>/local_setup.bash -$ cd ros2-web-bridge -$ export DEBUG=ros2-web-bridge:* -$ node bin/rosbridge.js -``` - -### Host the web demo app -New a terminal session and run -``` -$ cd ros2-web-bridge/demo -$ http-server -c-1 -``` - -### Try to control the robot remotely -Now you can put the TurtleBot3 robot on the ground. Let another PC be in the same wireless network, then launch the browser and enter: `http://<up-board ip>:8080`. After the page loaded, you can press the `Up/Left/Right/Down` buttons to control the robot remotely. - -## Known limitation: -If you shutdown the MicroRTPSAgent utility, you have to reset the OpenCR before you launch it again. diff --git a/src/gui/demo/css/component.css b/src/gui/demo/css/component.css deleted file mode 100644 index b58e5299..00000000 --- a/src/gui/demo/css/component.css +++ /dev/null @@ -1,642 +0,0 @@ -html, body, .perspective { - width: 100%; - height: 100%; -} - -.perspective { - background: #aaa; - position: relative; -} - -.container { - background: linear-gradient(115deg, rgba(112, 193, 179,1) 5%,rgba(36, 123, 160,1) 95%); - min-height: 100%; - position: relative; - color: #fff; - outline: 1px solid rgba(0,0,0,0); - z-index: 10; - -webkit-transform: translateZ(0) translateX(0) rotateY(0deg); /* reset transforms (Chrome bug) */ - transform: translateZ(0) translateX(0) rotateY(0deg); -} - -.container::after { - content: ''; - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 0px; - opacity: 0; - background: rgba(0,0,0,0.2); - /* the transition delay of the height needs to be synced with the container transition time */ - -webkit-transition: opacity 0.4s, height 0s 0.4s; - transition: opacity 0.4s, height 0s 0.4s; -} - -.wrapper { - position: relative; -} - -.component { - margin: 0 auto; - width: 60%; - text-align: justify; - font-size: 1.5em; -} - -/* Modal view */ -.perspective.modalview { - position: fixed; - -webkit-perspective: 1500px; - perspective: 1500px; -} - -.modalview .container { - position: absolute; - overflow: hidden; - width: 100%; - height: 100%; - cursor: pointer; - -webkit-backface-visibility: hidden; - backface-visibility: hidden; -} - -.modalview .wrapper { - -webkit-transform: translateZ(-1px); /* solves a rendering bug in Chrome on Windows */ -} - -.animate .container::after { - opacity: 1; - height: 101%; - -webkit-transition: opacity 0.3s; - transition: opacity 0.3s; -} - -/* Outer Nav */ -.outer-nav { - position: absolute; - height: auto; - font-size: 2em; -} - -.outer-nav.vertical { - top: 50%; - -webkit-transform: translateY(-50%); - transform: translateY(-50%); - -webkit-transform-style: preserve-3d; - transform-style: preserve-3d; -} - -.outer-nav.horizontal { - left: 50%; - width: 75%; - max-width: 1000px; - text-align: center; - -webkit-transform: translateX(-50%); - transform: translateX(-50%); -} - -.outer-nav.left { - left: 25%; -} - -.outer-nav.right { - right: 25%; -} - -.outer-nav.top { - top: 25%; -} - -.outer-nav.bottom { - bottom: 25%; -} - -.outer-nav a { - display: inline-block; - white-space: nowrap; - font-weight: 300; - margin: 0 0 30px 0; - color: #fff; - -webkit-transition: color 0.3s; - transition: color 0.3s; - -webkit-transform-style: preserve-3d; - transform-style: preserve-3d; -} - -.outer-nav a:hover { - color: #ffdccd; -} - -.outer-nav.vertical a { - display: block; -} - -.outer-nav.horizontal a { - margin: 15px 20px; -} - -.outer-nav a::before { - display: inline-block; - speak: none; - font-style: normal; - font-weight: normal; - font-variant: normal; - text-transform: none; - line-height: 1; - margin-right: 10px; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - -webkit-backface-visibility: hidden; - backface-visibility: hidden; -} - - -/* Effect airbnb */ -.effect-airbnb { - background: #b8b6b4; -} - -.effect-airbnb .container { - -webkit-transition: -webkit-transform 0.4s; - transition: transform 0.4s; - -webkit-transform-origin: 50% 50%; - transform-origin: 50% 50%; -} - -.effect-airbnb.animate .container { - -webkit-transform: translateZ(-1500px) translateX(100%) rotateY(-45deg); - transform: translateZ(-1500px) translateX(100%) rotateY(-45deg); -} - -.no-csstransforms3d .effect-airbnb.animate .container { - left: 75%; -} - -.effect-airbnb .outer-nav a { - opacity: 0; - -webkit-transform: translateX(-150px); - transform: translateX(-150px); - -webkit-transition: -webkit-transform 0.4s, opacity 0.4s; - transition: transform 0.4s, opacity 0.4s; -} - -.effect-airbnb.animate .outer-nav a { - opacity: 1; - -webkit-transform: translateX(0); - transform: translateX(0); -} - -.effect-airbnb.animate .outer-nav a:nth-child(2) { - -webkit-transition-delay: 0.04s; - transition-delay: 0.04s; -} - -.effect-airbnb.animate .outer-nav a:nth-child(3) { - -webkit-transition-delay: 0.08s; - transition-delay: 0.08s; -} - -.effect-airbnb.animate .outer-nav a:nth-child(4) { - -webkit-transition-delay: 0.12s; - transition-delay: 0.12s; -} - -.effect-airbnb.animate .outer-nav a:nth-child(5) { - -webkit-transition-delay: 0.16s; - transition-delay: 0.16s; -} - -.effect-airbnb.animate .outer-nav a:nth-child(6) { - -webkit-transition-delay: 0.2s; - transition-delay: 0.2s; -} - -.effect-airbnb.animate .outer-nav a:nth-child(7) { - -webkit-transition-delay: 0.24s; - transition-delay: 0.24s; -} - -/* Effect Move Left */ -.effect-moveleft { - background: #f4f3f1; -} - -.effect-moveleft .container { - -webkit-transition: -webkit-transform 0.4s; - transition: transform 0.4s; - -webkit-transform-origin: 50% 50%; - transform-origin: 50% 50%; -} - -.effect-moveleft .container::after { - background: rgba(255,255,255,0.6); -} - -.effect-moveleft.animate .container { - -webkit-transform: translateX(-50%) rotateY(45deg) translateZ(-50px); - transform: translateX(-50%) rotateY(45deg) translateZ(-50px); -} - -.no-csstransforms3d .effect-moveleft.animate .container { - left: -75%; -} - -.effect-moveleft .outer-nav a { - color: #e86a32; - opacity: 0; - -webkit-transform: translateX(100px) translateZ(-1000px); - transform: translateX(100px) translateZ(-1000px); - -webkit-transition: -webkit-transform 0.4s, opacity 0.4s; - transition: transform 0.4s, opacity 0.4s; -} - -.effect-moveleft .outer-nav a:hover { - color: #333; -} - -.effect-moveleft.animate .outer-nav a { - opacity: 1; - -webkit-transform: translateX(0) translateZ(0); - transform: translateX(0) translateZ(0); -} - -.effect-moveleft.animate .outer-nav a:nth-child(2) { - -webkit-transition-delay: 0.04s; - transition-delay: 0.04s; -} - -.effect-moveleft.animate .outer-nav a:nth-child(3) { - -webkit-transition-delay: 0.08s; - transition-delay: 0.08s; -} - -.effect-moveleft.animate .outer-nav a:nth-child(4) { - -webkit-transition-delay: 0.12s; - transition-delay: 0.12s; -} - -.effect-moveleft.animate .outer-nav a:nth-child(5) { - -webkit-transition-delay: 0.16s; - transition-delay: 0.16s; -} - -.effect-moveleft.animate .outer-nav a:nth-child(6) { - -webkit-transition-delay: 0.2s; - transition-delay: 0.2s; -} - -.effect-moveleft.animate .outer-nav a:nth-child(7) { - -webkit-transition-delay: 0.24s; - transition-delay: 0.24s; -} - -/* Effect Rotate Left */ -.effect-rotateleft { - background: #e96e4f; -} - -.effect-rotateleft .container { - -webkit-transition: -webkit-transform 0.4s; - transition: transform 0.4s; - -webkit-transform-origin: 0% 50%; - transform-origin: 0% 50%; -} - -.effect-rotateleft .container::after { - background: rgba(255,255,255,0.6); -} - -.effect-rotateleft.animate .container { - -webkit-transform: translateZ(-1800px) translateX(-50%) rotateY(45deg); - transform: translateZ(-1800px) translateX(-50%) rotateY(45deg); -} - -.no-csstransforms3d .effect-rotateleft.animate .container { - left: -75%; -} - -.effect-rotateleft .outer-nav a { - opacity: 0; - -webkit-transform: translateX(350px) translateZ(-1000px); - transform: translateX(350px) translateZ(-1000px); - -webkit-transition: -webkit-transform 0.4s, opacity 0.4s; - transition: transform 0.4s, opacity 0.4s; -} - -.effect-rotateleft.animate .outer-nav a { - opacity: 1; - -webkit-transform: translateX(0) translateZ(0); - transform: translateX(0) translateZ(0); -} - -.effect-rotateleft.animate .outer-nav a:nth-child(2) { - -webkit-transition-delay: 0.04s; - transition-delay: 0.04s; -} - -.effect-rotateleft.animate .outer-nav a:nth-child(3) { - -webkit-transition-delay: 0.08s; - transition-delay: 0.08s; -} - -.effect-rotateleft.animate .outer-nav a:nth-child(4) { - -webkit-transition-delay: 0.08s; - transition-delay: 0.08s; -} - -.effect-rotateleft.animate .outer-nav a:nth-child(5) { - -webkit-transition-delay: 0.16s; - transition-delay: 0.16s; -} - -.effect-rotateleft.animate .outer-nav a:nth-child(6) { - -webkit-transition-delay: 0.2s; - transition-delay: 0.2s; -} - -.effect-rotateleft.animate .outer-nav a:nth-child(7) { - -webkit-transition-delay: 0.24s; - transition-delay: 0.24s; -} - -/* Effect Move Down */ -.effect-movedown { - background:linear-gradient(115deg, rgba(36, 123, 160,1) 2%, rgba(216, 49, 91, 1.0) 99%); -} - -.effect-movedown .container { - -webkit-transition: -webkit-transform 0.4s; - transition: transform 0.4s; - -webkit-transform-origin: 50% 50%; - transform-origin: 50% 50%; -} - -.effect-movedown .container::after { - background: rgba(52, 73, 94, 0.5); -} - -.effect-movedown.animate .container { - -webkit-transform: translateY(100%) translateZ(-1500px); - transform: translateY(100%) translateZ(-1500px); -} - -.no-csstransforms3d .effect-movedown.animate .container { - top: 75%; -} - -.effect-movedown .outer-nav a { - opacity: 0; - -webkit-transform: translateY(-20px); - transform: translateY(-20px); - -webkit-transition: -webkit-transform 0.4s, opacity 0.4s; - transition: transform 0.4s, opacity 0.4s; -} - -.effect-movedown .outer-nav a:hover { - color: rgba(255, 22, 84, 1.0); -} - -.effect-movedown.animate .outer-nav a { - opacity: 1; - -webkit-transform: translateY(0); - transform: translateY(0); -} - -.effect-movedown.animate .outer-nav a:nth-child(2) { - -webkit-transition-delay: 0.04s; - transition-delay: 0.04s; -} - -.effect-movedown.animate .outer-nav a:nth-child(3) { - -webkit-transition-delay: 0.08s; - transition-delay: 0.08s; -} - -.effect-movedown.animate .outer-nav a:nth-child(4) { - -webkit-transition-delay: 0.12s; - transition-delay: 0.12s; -} - -.effect-movedown.animate .outer-nav a:nth-child(5) { - -webkit-transition-delay: 0.16s; - transition-delay: 0.16s; -} - -.effect-movedown.animate .outer-nav a:nth-child(6) { - -webkit-transition-delay: 0.2s; - transition-delay: 0.2s; -} - -.effect-movedown.animate .outer-nav a:nth-child(7) { - -webkit-transition-delay: 0.24s; - transition-delay: 0.24s; -} - -/* Effect Rotate Top */ -.effect-rotatetop { - background: #edcdbb; -} - -.effect-rotatetop .container { - -webkit-transition: -webkit-transform 0.4s; - transition: transform 0.4s; - -webkit-transform-origin: 50% 50%; - transform-origin: 50% 50%; -} - -.effect-rotatetop .container::after { - background: rgba(94,59,43,0.6); -} - -.effect-rotatetop.animate .container { - -webkit-transform: translateZ(-1500px) translateY(-50%) rotateX(-45deg); - transform: translateZ(-1500px) translateY(-50%) rotateX(-45deg); -} - -.no-csstransforms3d .effect-rotatetop.animate .container { - top: -75%; -} - -.effect-rotatetop .outer-nav a { - opacity: 0; - color: rgba(255, 22, 84, 1.0); - -webkit-transform: translateY(200px) translateZ(-1000px); - transform: translateY(200px) translateZ(-1000px); - -webkit-transition: -webkit-transform 0.4s, opacity 0.4s; - transition: transform 0.4s, opacity 0.4s; -} - -.effect-rotatetop .outer-nav a:hover { - color: #777; -} - -.effect-rotatetop.animate .outer-nav a { - opacity: 1; - -webkit-transform: translateY(0) translateZ(0); - transform: translateY(0) translateZ(0); -} - -.effect-rotatetop.animate .outer-nav a:nth-child(2) { - -webkit-transition-delay: 0.04s; - transition-delay: 0.04s; -} - -.effect-rotatetop.animate .outer-nav a:nth-child(3) { - -webkit-transition-delay: 0.08s; - transition-delay: 0.08s; -} - -.effect-rotatetop.animate .outer-nav a:nth-child(4) { - -webkit-transition-delay: 0.12s; - transition-delay: 0.12s; -} - -.effect-rotatetop.animate .outer-nav a:nth-child(5) { - -webkit-transition-delay: 0.16s; - transition-delay: 0.16s; -} - -.effect-rotatetop.animate .outer-nav a:nth-child(6) { - -webkit-transition-delay: 0.2s; - transition-delay: 0.2s; -} - -.effect-rotatetop.animate .outer-nav a:nth-child(7) { - -webkit-transition-delay: 0.24s; - transition-delay: 0.24s; -} - -/* Effect Lay Down */ -.effect-laydown { - background: #b8b6b4; -} - -.effect-laydown .container { - -webkit-transition: -webkit-transform 0.4s; - transition: transform 0.4s; - -webkit-transform-origin: 50% 150%; - transform-origin: 50% 150%; -} - -.effect-laydown.animate .container { - -webkit-transform: translateZ(-1500px) rotateX(80deg); - transform: translateZ(-1500px) rotateX(80deg); -} - -.no-csstransforms3d .effect-laydown.animate .container { - top: 75%; -} - -.effect-laydown .outer-nav a { - opacity: 0; - -webkit-transform: translateY(-200px) translateZ(-1000px); - transform: translateY(-200px) translateZ(-1000px); - -webkit-transition: -webkit-transform 0.4s, opacity 0.4s; - transition: transform 0.4s, opacity 0.4s; -} - -.effect-laydown.animate .outer-nav a { - opacity: 1; - -webkit-transform: translateY(0) translateZ(0); - transform: translateY(0) translateZ(0); -} - -.effect-laydown.animate .outer-nav a:nth-child(7){ - -webkit-transition-delay: 0.0s; - transition-delay: 0.0s; -} - -.effect-laydown.animate .outer-nav a:nth-child(6) { - -webkit-transition-delay: 0.04s; - transition-delay: 0.04s; -} - -.effect-laydown.animate .outer-nav a:nth-child(5) { - -webkit-transition-delay: 0.08s; - transition-delay: 0.08s; -} - -.effect-laydown.animate .outer-nav a:nth-child(4) { - -webkit-transition-delay: 0.12s; - transition-delay: 0.12s; -} - -.effect-laydown.animate .outer-nav a:nth-child(3) { - -webkit-transition-delay: 0.16s; - transition-delay: 0.16s; -} - -.effect-laydown.animate .outer-nav a:nth-child(2) { - -webkit-transition-delay: 0.2s; - transition-delay: 0.2s; -} - -.effect-laydown.animate .outer-nav a:first-child { - -webkit-transition-delay: 0.24s; - transition-delay: 0.24s; -} - -/* Media Queries */ -@media screen and (max-width: 77em) { - - .outer-nav.top { - top: 15%; - } - - .outer-nav.bottom { - bottom: 15%; - } -} - -@media screen and (max-width: 36.625em), screen and (max-height: 41.75em) { - - .outer-nav.top { - top: 5%; - } - - .outer-nav.bottom { - bottom: 5%; - } - - .outer-nav.horizontal { - font-size: 1.7em; - width: 6.2em; - } - - .outer-nav.horizontal a { - display: block; - text-align: left; - } - - /* Special Case */ - .effect-rotatetop .outer-nav.horizontal { - width: 95%; - bottom: auto; - top: 50%; - } - - .effect-rotatetop .outer-nav.horizontal a { - display: inline-block; - } - -} - -@media screen and (max-width: 31em), screen and (max-height: 36.2em) { - .outer-nav.horizontal, - .outer-nav.vertical { - font-size: 1.2em; - width: 6.8em; - } - - .outer-nav.right { - right: auto; - left: 50%; - } -} - -@media screen and (max-height: 31.6em) { - .outer-nav a { - margin-bottom: 20px; - } -} \ No newline at end of file diff --git a/src/gui/demo/css/demo.css b/src/gui/demo/css/demo.css deleted file mode 100644 index 9fb5c872..00000000 --- a/src/gui/demo/css/demo.css +++ /dev/null @@ -1,414 +0,0 @@ -*, -*:after, -*:before { - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; -} - -body { - color: #5a5350; - font-weight: 200; - font-family: 'Lato', Calibri, Arial, sans-serif; - overflow-y: scroll; - overflow-x: hidden; - text-shadow: #000 1px 1px; -} - -a { - text-decoration: none; - color: rgba(255, 255, 255, 0.8) !important; - outline: none; -} - -a:hover, -a:focus { - color: rgba(255, 255, 255, 1.0) !important; - text-shadow: #000 1px 2px; - outline: none; -} - -.clearfix:before, -.clearfix:after { - display: table; - content: " "; -} - -.clearfix:after { - clear: both; -} - -.ros-header, -.ros-top { - font-family: 'Lato', Arial, sans-serif; -} - -.ros-header { - margin: 0 auto 1em; - padding: 2em; - text-align: center; -} - -.ros-header h1 { - margin: 0; - font-weight: 300; - font-size: 2.625em; - line-height: 1.2; -} - -.ros-header span { - display: block; - padding: 0 0 0.6em 0.1em; - font-size: 60%; - color: #aca89a; -} - -/* To Navigation Style */ - -.ros-top { - width: 100%; - text-transform: uppercase; - font-size: 0.69em; - line-height: 2.2; - font-weight: 700; - background: rgba(255, 255, 255, 0.3); -} - -.ros-top a { - display: inline-block; - padding: 0 1em; - text-decoration: none; - letter-spacing: 0.1em; -} - -.ros-top a:hover { - background: rgba(255, 255, 255, 0.4); - color: #333; -} - -.ros-top span.right { - float: right; -} - -.ros-top span.right a { - display: block; - float: left; -} - -.twodmap { - border: 1px rgba(255, 255, 255, 0.2); - /* padding: 4em; */ -} - -.main { - max-width: 96em; - margin: 0 auto; -} - -.columnleft { - float: left; - width: 38.2%; - padding: 0 2em; - min-height: 300px; - position: relative; - text-align: center; -} - -.columnright { - float: left; - width: 61.8%; - padding: 0 2em; - min-height: 300px; - position: relative; - text-align: right; -} - -.columnright { - /* box-shadow: -1px 0 0 rgba(0, 0, 0, 0.1); */ - text-align: left; -} - -.controller { - text-align: center; - display: inline-flex; - justify-content: center; - flex-direction: column; -} - -.controller .nx { - text-align: center; - display: inline-flex; - justify-content: center; - flex-direction: row; -} - -.controller .nx div { - width: 100px; - height: 100px; -} - -.playstop { - text-align: center; - margin: 0 auto; -} - -.playstop div { - font-size: 1.5em; - border: 6px solid rgba(255, 255, 255, 0.6); - padding: 0.4em 0.8em 0.5em 0.8em; - width: 180px; - margin: 2em auto; - border-radius: 12px; - font-weight: 600; - color: rgba(255, 255, 255, 0.9); -} - -.playstop div:hover { - color: rgba(255, 255, 255, 1.0); - border: 6px solid rgba(255, 255, 255, 1.0); - cursor: pointer; - font-weight: 800; -} - -svg { - color: rgba(255, 255, 255, 0.6); -} - -svg:hover { - color: rgba(255, 255, 255, 1.0); - cursor: pointer; -} - -svg:active { - color: rgba(255, 255, 255, 1.0); - cursor: pointer; -} - -svg:focus { - color: rgba(255, 0, 0, 1.0); -} - -.log { - border: 1px solid rgba(255, 255, 255, 0.2); - min-height: 460px; - font-family: 'Courier New', Courier, monospace; - font-size: 16px; - padding: 1em; - color: rgba(255, 255, 255, 1.0); - text-align: left; - background-color: rgba(0, 0, 0, 1.0); -} - -.column p { - font-weight: 300; - font-size: 2em; - padding: 0 0 0.5em; - margin: 0; - line-height: 1.5; -} - -.ros-demos a, -button { - border: none; - padding: 0.6em 1.2em; - background: transparent; - color: #fff; - font-family: 'Lato', Calibri, Arial, sans-serif; - cursor: pointer; - display: inline-block; - font-weight: 400; - text-shadow: #000 1px 1px; -} - -button { - position: absolute; - left: 32px; - top: 36px; -} - -.ros-demos a:hover, -.ros-demos a:active, -.ros-demos a.current-demo { - background: rgba(216, 49, 91, 1); -} - -button { - background: transparent; -} - -button:hover, -button:active { - border: 1px solid #fff; -} - -.related { - text-align: center; - font-size: 1.5em; - margin-top: 3em; - clear: both; - padding: 3em 0; -} - -.related a { - font-weight: 700; - font-size: 0.9em; -} - -.flex-container { - display: flex; - justify-content: center; - flex-direction: row; - text-align: center; -} - -.flex-container .n { - width: 180px; - height: 100px; -} - -.ltr { - text-align: center; - margin: 0 auto; - display: flex; - justify-content: center; - flex-direction: column; - align-items: center; -} - -.utd { - text-align: center; - display: flex; - justify-content: center; - flex-direction: row; - align-items: center; -} - -.svg-arrow { - display: flex; - justify-content: center; - flex-direction: row; - text-align: center; -} - -.svg-arrow svg { - height: 20px; - width: 20px; -} - -.italic { - font-style: italic; - font-size: 20px; -} - -.vno { - visibility: hidden; -} - -.arrow svg { - color: rgba(255, 255, 255, 0.9); -} - -.arrow svg:hover { - color: rgba(255, 255, 255, 1.0); -} - -.roslibjsworkflow .round { - width: 180px; - height: 100px; - border-radius: 10px; - overflow: hidden; - justify-content: center; - box-shadow: 0 2px 4px rgba(0, 0, 0, 0.3); -} - -.roslibjsworkflow .round .mark { - position: relative; - left: 14px; - top: -80px; - width: 10px; - height: 60px; - border-radius: 12px; - box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1); - background: rgba(255, 255, 255, 0.5); - z-index: 1000; -} - -.roslibjsworkflow .round .roundnow { - width: 100%; - height: 100%; - display: flex; - justify-content: center; - flex-direction: column; - text-align: center; - background: rgba(0, 0, 0, 0.4); - -webkit-animation: roundnow 300s linear infinite; - animation: roundnow 300s linear infinite; - -webkit-transform: rotate(0deg); - transform: rotate(0deg); - font-size: 26px; -} - -/* .roundnow:hover { - background-color: rgba(10, 36, 99, 1.0); -} */ - -.roundcolor { - background: rgba(216, 49, 91, 1.0) !important; -} - -.roundcolor2 { - background: rgba(10, 36, 99, 1.0) !important; -} - -input { - border: 0px; - padding: 16px 30px; - margin: 2em auto; - font-size: 1em; - background-color: #fff; - color: rgba(10, 36, 99, 1.0) ; - box-shadow: 0 1px 2px rgba(0, 0, 0, 0.5); - border-radius: 10px; - width: 100%; -} - -input:hover { - cursor: pointer; - color: #fff; - background-color: rgba(10, 36, 99, 1.0); - border: 0px; -} - - -@media screen and (max-width: 46.0625em) { - .ros-header { - margin-bottom: 0; - padding-bottom: 1em; - } - .column { - width: 100%; - min-width: auto; - min-height: 0; - padding: 2em; - text-align: center; - } - .column p { - font-size: 1.5em; - } - .column:nth-child(2) { - text-align: center; - box-shadow: 0 -1px 0 rgba(0, 0, 0, 0.1); - } -} - -@media screen and (max-width: 25em) { - .ros-header { - font-size: 80%; - } - .ros-top { - font-size: 120%; - } - .ros-icon span { - display: none; - } -} diff --git a/src/gui/demo/index.html b/src/gui/demo/index.html deleted file mode 100644 index b6e7f13e..00000000 --- a/src/gui/demo/index.html +++ /dev/null @@ -1,170 +0,0 @@ -<!DOCTYPE html> -<html lang="en" class="no-js"> - -<head> - <meta charset="UTF-8" /> - <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1"> - <title>ROS</title> - <meta name="keywords" content="roslibjs, ros2-web-bridge and rclnodejs" /> - <meta name="author" content="ros" /> - <link rel="stylesheet" type="text/css" href="css/demo.css" /> - <link rel="stylesheet" type="text/css" href="css/component.css" /> - <script src="https://static.robotwebtools.org/EventEmitter2/current/eventemitter2.min.js"></script> - <script src="https://static.robotwebtools.org/roslibjs/current/roslib.min.js"></script> - <script src="https://static.robotwebtools.org/EaselJS/current/easeljs.min.js"></script> - <script src="https://static.robotwebtools.org/ros2djs/current/ros2d.min.js"></script> -</head> -<body> - <div id="perspective" class="perspective effect-movedown"> - <div class="container"> - <div class="wrapper"> - <header class="ros-header"> - <div class="columnleft"> - <div class='controller'> - <div class='nx'> - <div></div> - <div id="up"> - <svg aria-hidden="true" data-prefix="far" data-icon="arrow-alt-circle-up" class="" role="img" xmlns="http://www.w3.org/2000/svg" - viewBox="0 0 512 512"> - <path fill="currentColor" d="M256 504c137 0 248-111 248-248S393 8 256 8 8 119 8 256s111 248 248 248zm0-448c110.5 0 200 89.5 200 200s-89.5 200-200 200S56 366.5 56 256 145.5 56 256 56zm20 328h-40c-6.6 0-12-5.4-12-12V256h-67c-10.7 0-16-12.9-8.5-20.5l99-99c4.7-4.7 12.3-4.7 17 0l99 99c7.6 7.6 2.2 20.5-8.5 20.5h-67v116c0 6.6-5.4 12-12 12z"></path> - </svg> - </div> - <div></div> - </div> - <div class='nx'> - <div id="left"> - <svg aria-hidden="true" data-prefix="far" data-icon="arrow-alt-circle-left" class="" role="img" xmlns="http://www.w3.org/2000/svg" - viewBox="0 0 512 512"> - <path fill="currentColor" d="M8 256c0 137 111 248 248 248s248-111 248-248S393 8 256 8 8 119 8 256zm448 0c0 110.5-89.5 200-200 200S56 366.5 56 256 145.5 56 256 56s200 89.5 200 200zm-72-20v40c0 6.6-5.4 12-12 12H256v67c0 10.7-12.9 16-20.5 8.5l-99-99c-4.7-4.7-4.7-12.3 0-17l99-99c7.6-7.6 20.5-2.2 20.5 8.5v67h116c6.6 0 12 5.4 12 12z"></path> - </svg> - </div> - <div></div> - <div id="right"> - <svg aria-hidden="true" data-prefix="far" data-icon="arrow-alt-circle-right" class="" role="img" xmlns="http://www.w3.org/2000/svg" - viewBox="0 0 512 512"> - <path fill="currentColor" d="M504 256C504 119 393 8 256 8S8 119 8 256s111 248 248 248 248-111 248-248zm-448 0c0-110.5 89.5-200 200-200s200 89.5 200 200-89.5 200-200 200S56 366.5 56 256zm72 20v-40c0-6.6 5.4-12 12-12h116v-67c0-10.7 12.9-16 20.5-8.5l99 99c4.7 4.7 4.7 12.3 0 17l-99 99c-7.6 7.6-20.5 2.2-20.5-8.5v-67H140c-6.6 0-12-5.4-12-12z"></path> - </svg> - </div> - </div> - <div class='nx'> - <div></div> - <div id="down"> - <svg aria-hidden="true" data-prefix="far" data-icon="arrow-alt-circle-down" class="" role="img" xmlns="http://www.w3.org/2000/svg" - viewBox="0 0 512 512"> - <path fill="currentColor" d="M256 8C119 8 8 119 8 256s111 248 248 248 248-111 248-248S393 8 256 8zm0 448c-110.5 0-200-89.5-200-200S145.5 56 256 56s200 89.5 200 200-89.5 200-200 200zm-32-316v116h-67c-10.7 0-16 12.9-8.5 20.5l99 99c4.7 4.7 12.3 4.7 17 0l99-99c7.6-7.6 2.2-20.5-8.5-20.5h-67V140c0-6.6-5.4-12-12-12h-40c-6.6 0-12 5.4-12 12z"></path> - </svg> - </div> - <div></div> - </div> - </div> - <div class='playstop'> - <div id="start"> - Play - </div> - </div> - </div> - <div class="twodmap" id="ros2dmap"> - </div> - </header> - <div class="main clearfix"> - <div class="log" id="log"></div> - </div> - </div> - </div> - </div> - <script src="js/btnstate.js"></script> - <script src="js/ros2dmap.js"></script> - <script src="js/log.js"></script> - <script src="js/controller.js"></script> - <script> - let ros = new ROSLIB.Ros(); - let bridgeHost = window.location.hostname; - let bridgePort = 9090; - - ros.on('connection', function() { - console.log('bridge connected'); - }); - ros.on('error', function(data) { - console.log('error'); - }); - ros.on('closed', function() { - console.log('bridge closed'); - }); - ros.connect('ws://' + bridgeHost + ':' + bridgePort); - - let ros2dmap = new Ros2dMap(ros, { - divName: 'ros2dmap', - width: 400, - height: 400 - }); - let webRosController = new WebRosController(ros, ros2dmap); - let btnState = new ButtonState(); - - let startBtn = document.getElementById('start'); - startBtn.onclick = function() { - - if (!webRosController.isRobotMoving) { - webRosController.start(); - startBtn.innerHTML = 'Stop'; - btnState.clearState(); - btnState.setStartButton(true); - } else { - webRosController.stop(); - startBtn.innerHTML = 'Start'; - btnState.clearState(); - btnState.setStartButton(false); - } - }; - - function upStartHandler() { - webRosController.moveForward(); - btnState.setSvgButton('up'); - } - - function downStartHandler() { - webRosController.moveBack(); - btnState.setSvgButton('down'); - } - - function leftStartHandler() { - webRosController.turnLeft(); - btnState.setSvgButton('left'); - } - - function rightStartHandler() { - webRosController.turnRight(); - btnState.setSvgButton('right'); - } - - function endHandler() { - webRosController.stop(); - btnState.clearState(); - } - - let btnUp = document.getElementById('up'); - btnUp.addEventListener('mousedown', upStartHandler, false); - btnUp.addEventListener('mouseup', endHandler, false); - btnUp.addEventListener('touchstart', upStartHandler, false); - btnUp.addEventListener('touchend', endHandler, false); - - let btnDown = document.getElementById('down'); - btnDown.addEventListener('mousedown', downStartHandler, false); - btnDown.addEventListener('mouseup', endHandler, false); - btnDown.addEventListener('touchstart', downStartHandler, false); - btnDown.addEventListener('touchend', endHandler, false); - - let btnLeft = document.getElementById('left'); - btnLeft.addEventListener('mousedown', leftStartHandler, false); - btnLeft.addEventListener('mouseup', endHandler, false); - btnLeft.addEventListener('touchstart', leftStartHandler, false); - btnLeft.addEventListener('touchend', endHandler, false); - - let btnRight = document.getElementById('right'); - btnRight.addEventListener('mousedown', rightStartHandler, false); - btnRight.addEventListener('mouseup', endHandler, false); - btnRight.addEventListener('touchstart', rightStartHandler, false); - btnRight.addEventListener('touchend', endHandler, false); - </script> - </body> -</html> diff --git a/src/gui/demo/js/btnstate.js b/src/gui/demo/js/btnstate.js deleted file mode 100644 index 9218618b..00000000 --- a/src/gui/demo/js/btnstate.js +++ /dev/null @@ -1,49 +0,0 @@ -'use strict'; - -function ButtonState() { - - this.defaultColor = 0xfffff; - this.btnClicked = false; - this.svgClicked = false; -} - -ButtonState.prototype.clearState = function() { - console.log('clear button state'); - let btns = document.getElementsByTagName('svg'); - - for (let i = 0; i < 4; i++) { - btns[i].style.color = ''; - } - - this.btnClicked = false; - this.svgClicked = false; -}; - -ButtonState.prototype.setSvgButton = function(btnId) { - this.clearState(); - - console.log('setSVgButton'); - let btnIndexMap = { - up: 0, - left: 1, - right: 2, - down: 3 - }; - - let btns = document.getElementsByTagName('svg'); - btns[btnIndexMap[btnId]].style.color = 'green'; - this.svgClicked = true; -}; - -ButtonState.prototype.setStartButton = function(start) { - this.clearState(); - - let btn = document.getElementById('start'); - if (start) { - btn.style.backgroundColor = 'green'; - } else { - btn.style.backgroundColor = ''; - } -}; - - diff --git a/src/gui/demo/js/controller.js b/src/gui/demo/js/controller.js deleted file mode 100644 index 09b1e5f4..00000000 --- a/src/gui/demo/js/controller.js +++ /dev/null @@ -1,189 +0,0 @@ -'use strict'; - -function WebRosController(ros, ros2dmap) { - this.ros = ros; - - this.currentVelocity = { - linear: {x: 0.0, y: 0.0, z: 0.0}, - angular: {x: 0.0, y: 0.0, z: 0.0} - }; - this.zeroVelocity = { - linear: {x: 0.0, y: 0.0, z: 0.0}, - angular: {x: 0.0, y: 0.0, z: 0.0} - }; - this.defaultVelocity = { - linear: {x: 0.10, y: 0.0, z: 0.0}, - angular: {x: 0.0, y: 0.0, z: 0.0} - }; - - this.pubVelTopicTimer = null; - this.pubVelTopicInterval = 10; - this.isRobotMoving = false; - this.velocityTopic = new ROSLIB.Topic({ - ros: this.ros, - name: '/cmd_vel', - messageType: 'geometry_msgs/Twist' - }); - - this.poseX = 0; - this.poseY = 0; - this.radius = 0; - this.rotation = 0; - this.startTime = new Date(); - this.endTime = new Date(); - - this.ros2dmap = ros2dmap; - this.logger = new Logger('log'); -} - -WebRosController.prototype.sendVelTopic = function(vel) { - console.log('send velocity topic'); - - this.shutdownTimer(); - this.pubVelTopicTimer = setInterval(() => { - - this.velocityTopic.publish(vel); - this.updateMap(vel); - this.logger.showTerminalLog(vel); - - this.startTime = new Date(); - }, this.pubVelTopicInterval); -}; - -WebRosController.prototype.updateMap = function(vel) { - this.endTime = new Date(); - - let dt = (this.endTime - this.startTime) / 1000; - - let vx = vel.linear.x; - let az = vel.angular.z; - - if (vx || az) { - console.log('dt: ', dt); - console.log('vx, az:', vx, ',', az); - } - let deltaX = (vx * Math.cos(this.radius)) * dt; - let deltaY = (vx * Math.sin(this.radius)) * dt; - let deltaRadius = az * dt; - - console.log(deltaX, deltaY, deltaRadius); - - if (deltaX || deltaY) { - console.log('deltaX, deltaY:', deltaX, deltaY); - this.poseX += deltaX; - this.poseY += deltaY; - } - - if (vx > 0) { - this.rotation = this.radius * 180 / Math.PI; - } - - if (az) { - this.radius -= deltaRadius; - this.rotation = this.radius * 180 / Math.PI; - } - - - if (deltaRadius > 0) { - console.log('radius: ', this.radius); - } - - if (vx || az) { - console.log(this.poseX, ',', this.poseY, ',', this.rotation); - } - - this.ros2dmap.update({ - y: this.poseX, x: this.poseY - }, this.rotation - 90); -}; - -WebRosController.prototype.shutdownTimer = function() { - if (this.pubVelTopicTimer) { - clearInterval(this.pubVelTopicTimer); - this.pubVelTopicTimer = null; - } -}; - -WebRosController.prototype.moveForward = function() { - console.log('web ros controller: move forward'); - console.log(this.currentVelocity); - console.log(this.defaultVelocity); - - this.startTime = new Date(); - if (this.currentVelocity.linear.x > 0) { - this.sendVelTopic(this.currentVelocity); - } else { - this.sendVelTopic(this.defaultVelocity); - } - this.isRobotMoving = true; -}; - -WebRosController.prototype.turnLeft = function() { - console.log('web ros controller: turn left'); - - let turnLeftMsg = { - linear: {x: 0.0, y: 0.0, z: 0.0}, - angular: {x: 0.0, y: 0.0, z: Math.PI / 6} - }; - - this.shutdownTimer(); - this.startTime = new Date(); - - this.sendVelTopic(turnLeftMsg); -}; - -WebRosController.prototype.turnRight = function() { - console.log('web ros controller: turn left'); - - let turnRightMsg = { - linear: {x: 0.0, y: 0.0, z: 0.0}, - angular: {x: 0.0, y: 0.0, z: -Math.PI / 6} - }; - this.shutdownTimer(); - this.startTime = new Date(); - - this.sendVelTopic(turnRightMsg); -}; - -WebRosController.prototype.moveBack = function() { - console.log('web ros controller: move back'); - - console.log(this.currentVelocity); - console.log(this.defaultVelocity); - - this.startTime = new Date(); - if (this.currentVelocity.linear.x) { - if (this.currentVelocity.linear.x > 0) { - this.currentVelocity.linear.x = -this.currentVelocity.linear.x; - } - this.sendVelTopic(this.currentVelocity); - } else { - let backVel = { - linear: {x: 0.0, y: 0.0, z: 0.0}, - angular: {x: 0.0, y: 0.0, z: 0.0} - }; - backVel.linear.x = -this.defaultVelocity.linear.x; - this.sendVelTopic(backVel); - } - this.isRobotMoving = true; -}; - -WebRosController.prototype.start = function() { - console.log('web ros controller: start'); - - if (this.currentVelocity.linear.x) { - this.sendVelTopic(this.currentVelocity); - } else { - this.currentVelocity.linear.x = -this.defaultVelocity.linear.x; - this.sendVelTopic(this.defaultVelocity); - } - - this.isRobotMoving = true; -}; - -WebRosController.prototype.stop = function() { - console.log('web ros controller: stop'); - - this.sendVelTopic(this.zeroVelocity); - this.isRobotMoving = false; -}; diff --git a/src/gui/demo/js/log.js b/src/gui/demo/js/log.js deleted file mode 100644 index 44dcb1cb..00000000 --- a/src/gui/demo/js/log.js +++ /dev/null @@ -1,57 +0,0 @@ -'use strict'; - -function Logger(logDivId) { - this.logDivId = logDivId; - this.lineNum = 40; - - this.showLogHead = true; - this.logArray = [ - '[ros2-web-bridge:Bridge] Web bridge 70325038-136b-4ecd-a633-f617676f1ff9 is created', - '[ros2-web-bridge:Bridge] JSON command received: {"op":"subscribe","id":"subscribe:/map:1",' + - '"type":"nav_msgs/OccupancyGrid","topic":"/map","compression":"png", ' + - '"throttle_rate":0,"queue_length":0}', - '[ros2-web-bridge:Bridge] subscribe a topic named /map', - '[rclnodejs:node] Finish creating subscription, topic = /map.', - '[ros2-web-bridge:SubscriptionManager] Subscription has been created, and the topic name is /map.', - '[ros2-web-bridge:Bridge] Response: {"op":"set_level","level":"none"}', - '[ros2-web-bridge:Bridge] JSON command received: {"op":"advertise","id":"advertise:/cmd_vel:2",' + - '"type":"geometry_msgs/Twist","topic":"/cmd_vel","latch":false,"queue_size":100}', - '[ros2-web-bridge:Bridge] advertise a topic: /cmd_vel', - '[rclnodejs:node] Finish creating publisher, topic = /cmd_vel.', - '[ros2-web-bridge:ResourceProvider] Publisher has been created, and the topic name is /cmd_vel.', - '[ros2-web-bridge:Bridge] Response: {"op":"set_level","level":"none"}' - ]; - this.count = 2; - this.msgArrayCount = 0; -}; - -Logger.prototype.showTerminalLog = function(msg) { - - let msgStr = JSON.stringify(msg); - let logMsgArray = [ - `[roslibjs] Publish sensor_msgs/Twist: ${msgStr}`, - '[ros2-web-bridge:Bridge] JSON command received: ' + - `{"op":"publish","id":"publish:/cmd_vel: ${this.count}","topic":"/cmd_vel", "msg": ${msgStr},"latch":false}`, - `[ros2-web-bridge:Bridge] Publish a topic named /cmd_vel with ${msgStr}`, - '[rclnodejs:publisher] Message of topic /cmd_vel has been published', - '[ros2-web-bridge:Bridge] Response: {"op":"set_level","level":"none"}' - ]; - - if (msg.linear.x || msg.angular.z) { - if (this.showLogHead) { - for (let i = 0; i < logMsgArray.length; i++) { - this.logArray.push(logMsgArray[i]); - } - this.showLogHead = false; - } else { - let popElement = logMsgArray[this.msgArrayCount % 5]; - this.msgArrayCount++; - - this.logArray.shift(); - this.logArray.push(popElement); - this.count++; - } - } - - document.getElementById(this.logDivId).innerHTML = this.logArray.join('<br />'); -}; diff --git a/src/gui/demo/js/ros2dmap.js b/src/gui/demo/js/ros2dmap.js deleted file mode 100644 index 0d173350..00000000 --- a/src/gui/demo/js/ros2dmap.js +++ /dev/null @@ -1,60 +0,0 @@ -'use strict'; - -function Ros2dMap(ros, options) { - - let divName = options.divName || 'ros2dmap'; - let width = options.width || 400; - let height = options.height || 400; - - let oldPose = {x: 0.0, y: 0.0}; - let center = {x: 0.5, y: 0.5}; - - // The ROS2D.Viewer is a 2D scene manager with additional ROS functionality. - let viewer2D = new ROS2D.Viewer({ - divID: divName, - width: width, - height: height, - background: '#99ffff' - }); - - this.gridClient = new ROS2D.OccupancyGridClient({ - ros: ros, - rootObject: viewer2D.scene - }); - - let grid = new ROS2D.Grid({ - size: 100, - cellSize: 0.10 - }); - this.gridClient.rootObject.addChild(grid); - - let robotMaker = new ROS2D.NavigationArrow({ - size: 4, - strokeSize: 0.5, - fillColor: createjs.Graphics.getRGB(0xcc, 0, 0xff, 0.62), - pulse: false - }); - this.gridClient.rootObject.addChild(robotMaker); - - viewer2D.scaleToDimensions(1, 1); - viewer2D.shift(-center.x, -center.y); - - robotMaker.x = 0; - robotMaker.y = 0; - robotMaker.scaleX = 0.01; - robotMaker.scaleY = 0.01; - robotMaker.rotation = -90; - robotMaker.visible = true; - - this.update = function(pose, rotation) { - robotMaker.x = pose.x; - robotMaker.y = -pose.y; - - // robotMaker.rotation = viewer2D.scene.rosQuaternionToGlobalTheta(orientation); - robotMaker.rotation = rotation; - if (oldPose.x !== pose.x || oldPose.y !== pose.y) { - viewer2D.shift(-oldPose.x + pose.x, -oldPose.y + pose.y); - oldPose = pose; - } - }; -} diff --git a/src/gui/examples/html/client.html b/src/gui/examples/html/client.html deleted file mode 100644 index 67219d6f..00000000 --- a/src/gui/examples/html/client.html +++ /dev/null @@ -1,85 +0,0 @@ -<!DOCTYPE html> -<html> -<head> -<meta charset="utf-8" /> -<script src="https://static.robotwebtools.org/EventEmitter2/current/eventemitter2.min.js"></script> -<script src="https://static.robotwebtools.org/roslibjs/current/roslib.js"></script> - -<script> - // Connecting to ROS - // ----------------- - var ros = new ROSLIB.Ros(); - - // If there is an error on the backend, an 'error' emit will be emitted. - ros.on('error', function(error) { - document.getElementById('connecting').style.display = 'none'; - document.getElementById('connected').style.display = 'none'; - document.getElementById('closed').style.display = 'none'; - document.getElementById('error').style.display = 'inline'; - console.log(error); - }); - - // Find out exactly when we made a connection. - ros.on('connection', function() { - console.log('Connection made!'); - document.getElementById('connecting').style.display = 'none'; - document.getElementById('error').style.display = 'none'; - document.getElementById('closed').style.display = 'none'; - document.getElementById('connected').style.display = 'inline'; - }); - - ros.on('close', function() { - console.log('Connection closed.'); - document.getElementById('connecting').style.display = 'none'; - document.getElementById('connected').style.display = 'none'; - document.getElementById('closed').style.display = 'inline'; - }); - - // Create a connection to the rosbridge WebSocket server. - ros.connect('ws://localhost:9090'); - - // Create a Service client with details of the service's name and service type. - var addTwoInts = new ROSLIB.Service({ - ros : ros, - name : '/add_two_ints', - serviceType : 'example_interfaces/AddTwoInts' - }); - - var request = new ROSLIB.ServiceRequest({ - a : 1, - b : 2 - }); - - // Send the request - addTwoInts.callService(request, function(result) { - document.getElementById("sum").innerText = result.sum; - console.log('Result for service call on ' + addTwoInts.name + ': ' + result.sum); - }); -</script> -</head> - -<body> - <h1>Simple Clinet Example</h1> - <p>This example will create a client to request a service named "add_two_ints" to calculate the sum of two values.</p> - <div id="statusIndicator"> - <p id="connecting"> - Connecting to rosbridge... - </p> - <p id="connected" style="color:#00D600; display:none"> - Connected - </p> - <p id="error" style="color:#FF0000; display:none"> - Error in the backend! - </p> - <p id="closed" style="display:none"> - Connection closed. - </p> - </div> - <p> - <div> - <b>1 + 2 = </b> - <span id="sum"></span> - </div> - </p> -</body> -</html> diff --git a/src/gui/examples/html/publisher.html b/src/gui/examples/html/publisher.html deleted file mode 100644 index d6d00da5..00000000 --- a/src/gui/examples/html/publisher.html +++ /dev/null @@ -1,81 +0,0 @@ -<!DOCTYPE html> -<html> -<head> -<meta charset="utf-8" /> -<script src="https://static.robotwebtools.org/EventEmitter2/current/eventemitter2.min.js"></script> -<script src="https://static.robotwebtools.org/roslibjs/current/roslib.js"></script> - -<script> - // Connecting to ROS - // ----------------- - var ros = new ROSLIB.Ros(); - - // If there is an error on the backend, an 'error' emit will be emitted. - ros.on('error', function(error) { - document.getElementById('connecting').style.display = 'none'; - document.getElementById('connected').style.display = 'none'; - document.getElementById('closed').style.display = 'none'; - document.getElementById('error').style.display = 'inline'; - console.log(error); - }); - - // Find out exactly when we made a connection. - ros.on('connection', function() { - console.log('Connection made!'); - document.getElementById('connecting').style.display = 'none'; - document.getElementById('error').style.display = 'none'; - document.getElementById('closed').style.display = 'none'; - document.getElementById('connected').style.display = 'inline'; - }); - - ros.on('close', function() { - console.log('Connection closed.'); - document.getElementById('connecting').style.display = 'none'; - document.getElementById('connected').style.display = 'none'; - document.getElementById('closed').style.display = 'inline'; - }); - - // Create a connection to the rosbridge WebSocket server. - ros.connect('ws://localhost:9090'); - - // Publish a Topic - var example = new ROSLIB.Topic({ - ros : ros, - name : '/example_topic', - messageType : 'std_msgs/String' - }); - - var count = 0; - setInterval(() => { - var message = 'hello from ros2bridge ' + count++; - example.publish({data: message}); - document.getElementById("publisher").innerText = message; - }, 1000); -</script> -</head> - -<body> - <h1>Simple Publisher Example</h1> - <p>This example will pubilish a topic named "example_topic".</p> - <div id="statusIndicator"> - <p id="connecting"> - Connecting to rosbridge... - </p> - <p id="connected" style="color:#00D600; display:none"> - Connected - </p> - <p id="error" style="color:#FF0000; display:none"> - Error in the backend! - </p> - <p id="closed" style="display:none"> - Connection closed. - </p> - </div> - <div> - <p> - <b>Publish message: </b> - <span id="publisher"></span> - </p> - </div> -</body> -</html> diff --git a/src/gui/examples/html/service.html b/src/gui/examples/html/service.html deleted file mode 100644 index 33fb41b5..00000000 --- a/src/gui/examples/html/service.html +++ /dev/null @@ -1,79 +0,0 @@ -<!DOCTYPE html> -<html> -<head> -<meta charset="utf-8" /> -<script src="https://static.robotwebtools.org/EventEmitter2/current/eventemitter2.min.js"></script> -<script src="https://static.robotwebtools.org/roslibjs/current/roslib.js"></script> - -<script> - // Connecting to ROS - // ----------------- - var ros = new ROSLIB.Ros(); - - // If there is an error on the backend, an 'error' emit will be emitted. - ros.on('error', function(error) { - document.getElementById('connecting').style.display = 'none'; - document.getElementById('connected').style.display = 'none'; - document.getElementById('closed').style.display = 'none'; - document.getElementById('error').style.display = 'inline'; - console.log(error); - }); - - // Find out exactly when we made a connection. - ros.on('connection', function() { - console.log('Connection made!'); - document.getElementById('connecting').style.display = 'none'; - document.getElementById('error').style.display = 'none'; - document.getElementById('closed').style.display = 'none'; - document.getElementById('connected').style.display = 'inline'; - }); - - ros.on('close', function() { - console.log('Connection closed.'); - document.getElementById('connecting').style.display = 'none'; - document.getElementById('connected').style.display = 'none'; - document.getElementById('closed').style.display = 'inline'; - }); - - // Create a connection to the rosbridge WebSocket server. - ros.connect('ws://localhost:9090'); - - // Create a Service client with details of the service's name and service type. - var addTwoInts = new ROSLIB.Service({ - ros : ros, - name : '/add_two_ints', - serviceType : 'example_interfaces/AddTwoInts' - }); - - addTwoInts.advertise((req, resp) => { - const request = `Receive request: a = ${req.a}; b = ${req.b}` - console.log(request); - document.getElementById('request').innerText = request; - resp.sum = req.a + req.b - return true; - }); -</script> -</head> - -<body> - <h1>Simple Service Example</h1> - <p>This example will create a service named "add_two_ints" to calculate the sum of two values.</p> - <div id="statusIndicator"> - <p id="connecting"> - Connecting to rosbridge... - </p> - <p id="connected" style="color:#00D600; display:none"> - Connected - </p> - <p id="error" style="color:#FF0000; display:none"> - Error in the backend! - </p> - <p id="closed" style="display:none"> - Connection closed. - </p> - </div> - <div> - <span id="request"></span> - </div> -</body> -</html> diff --git a/src/gui/examples/html/subscription.html b/src/gui/examples/html/subscription.html deleted file mode 100644 index 0c6cf98f..00000000 --- a/src/gui/examples/html/subscription.html +++ /dev/null @@ -1,78 +0,0 @@ -<!DOCTYPE html> -<html> -<head> -<meta charset="utf-8" /> -<script src="https://static.robotwebtools.org/EventEmitter2/current/eventemitter2.min.js"></script> -<script src="https://static.robotwebtools.org/roslibjs/current/roslib.js"></script> - -<script> - // Connecting to ROS - // ----------------- - var ros = new ROSLIB.Ros(); - - // If there is an error on the backend, an 'error' emit will be emitted. - ros.on('error', function(error) { - document.getElementById('connecting').style.display = 'none'; - document.getElementById('connected').style.display = 'none'; - document.getElementById('closed').style.display = 'none'; - document.getElementById('error').style.display = 'inline'; - console.log(error); - }); - - // Find out exactly when we made a connection. - ros.on('connection', function() { - console.log('Connection made!'); - document.getElementById('connecting').style.display = 'none'; - document.getElementById('error').style.display = 'none'; - document.getElementById('closed').style.display = 'none'; - document.getElementById('connected').style.display = 'inline'; - }); - - ros.on('close', function() { - console.log('Connection closed.'); - document.getElementById('connecting').style.display = 'none'; - document.getElementById('connected').style.display = 'none'; - document.getElementById('closed').style.display = 'inline'; - }); - - // Create a connection to the rosbridge WebSocket server. - ros.connect('ws://localhost:9090'); - - // Publish a Topic - var example = new ROSLIB.Topic({ - ros : ros, - name : '/example_topic', - messageType : 'std_msgs/String' - }); - - // Subscribe a Topic - example.subscribe(function(message) { - document.getElementById("subscription").innerText = message.data - }); - -</script> -</head> - -<body> - <h1>Simple Subscription Example</h1> - <p>This example will subscribe a topic named "example_topic".</p> - <div id="statusIndicator"> - <p id="connecting"> - Connecting to rosbridge... - </p> - <p id="connected" style="color:#00D600; display:none"> - Connected - </p> - <p id="error" style="color:#FF0000; display:none"> - Error in the backend! - </p> - <p id="closed" style="display:none"> - Connection closed. - </p> - </div> - <div> - <b>Receive message: </b> - <span id="subscription"></span> - </div> -</body> -</html> diff --git a/src/gui/lhw_gui/index.js b/src/gui/lhw_gui/index.js deleted file mode 100644 index 646a1bf4..00000000 --- a/src/gui/lhw_gui/index.js +++ /dev/null @@ -1,23 +0,0 @@ -// Copyright (c) 2017 Intel Corporation. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -'use strict'; - -const express = require('express'); -const app = express(); - -app.use(express.static('.')); - -app.listen(3000); -console.log('The web server started on http://localhost:3000'); diff --git a/src/gui/npm-pack.sh b/src/gui/npm-pack.sh deleted file mode 100755 index f7fed835..00000000 --- a/src/gui/npm-pack.sh +++ /dev/null @@ -1,36 +0,0 @@ -#!/bin/bash -# -# Copyright (c) 2018 Intel Corporation. All rights reserved. - -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at - -# http://www.apache.org/licenses/LICENSE-2.0 - -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -#Usage: npm-pack.sh - -WORKDIR=`mktemp -d` -RAWMODULEDIR="ros2-web-bridge/" -MODULEDIR="$WORKDIR/$RAWMODULEDIR" - -mkdir -p $MODULEDIR -rsync -a . $MODULEDIR --exclude dist --exclude node_modules --exclude Dockerfile --exclude appveyor.yml --exclude .travis.yml - -pushd . > /dev/null -cd $WORKDIR -FILENAME=`npm pack $RAWMODULEDIR` -TARFILENAME="$WORKDIR/$FILENAME" - -popd > /dev/null -mkdir -p dist -cp -f $TARFILENAME ./dist/ -rm -rf $WORKDIR - -echo "Generated ./dist/$FILENAME" diff --git a/src/gui/test/README.md b/src/gui/test/README.md deleted file mode 100644 index 1db618aa..00000000 --- a/src/gui/test/README.md +++ /dev/null @@ -1,14 +0,0 @@ -# Introduction -This directory contains the files for two kinds of tests: -* browser: tests that are running in the Google Chromium browser environment. `testharness.js` framework is used in these tests. -* node.js: tests that are running in Node.js runtime and `mocha` framework is used in these tests. - -## Run tests -* For nodejs tests, run - ``` - npm run test - ``` -* For browser tests, run - ``` - npm run browser - ``` diff --git a/src/gui/test/browser/html_list.json b/src/gui/test/browser/html_list.json deleted file mode 100644 index 3e3d15a7..00000000 --- a/src/gui/test/browser/html_list.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "htmls": [ - { - "suite": "test-example.html", - "waitingTime": 200 - }, - { - "suite": "test-goal.html", - "waitingTime": 200 - }, - { - "suite": "test-topic.html", - "waitingTime": 2000 - }, - { - "suite": "test-ros.html", - "waitingTime": 3000 - }, - { - "suite": "test-service.html", - "waitingTime": 2000 - } - ] -} diff --git a/src/gui/test/browser/resources/LICENSE b/src/gui/test/browser/resources/LICENSE deleted file mode 100644 index 45896e6b..00000000 --- a/src/gui/test/browser/resources/LICENSE +++ /dev/null @@ -1,30 +0,0 @@ -W3C 3-clause BSD License - -http://www.w3.org/Consortium/Legal/2008/03-bsd-license.html - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - -* Redistributions of works must retain the original copyright notice, - this list of conditions and the following disclaimer. - -* Redistributions in binary form must reproduce the original copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - -* Neither the name of the W3C nor the names of its contributors may be - used to endorse or promote products derived from this work without - specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/src/gui/test/browser/resources/testharness.css b/src/gui/test/browser/resources/testharness.css deleted file mode 100644 index e2ed5a04..00000000 --- a/src/gui/test/browser/resources/testharness.css +++ /dev/null @@ -1,102 +0,0 @@ -html { - font-family:DejaVu Sans, Bitstream Vera Sans, Arial, Sans; -} - -#log .warning, -#log .warning a { - color: black; - background: yellow; -} - -#log .error, -#log .error a { - color: white; - background: red; -} - -section#summary { - margin-bottom:1em; -} - -table#results { - border-collapse:collapse; - table-layout:fixed; - width:100%; -} - -table#results th:first-child, -table#results td:first-child { - width:4em; -} - -table#results th:last-child, -table#results td:last-child { - width:50%; -} - -table#results.assertions th:last-child, -table#results.assertions td:last-child { - width:35%; -} - -table#results th { - padding:0; - padding-bottom:0.5em; - border-bottom:medium solid black; -} - -table#results td { - padding:1em; - padding-bottom:0.5em; - border-bottom:thin solid black; -} - -tr.pass > td:first-child { - color:green; -} - -tr.fail > td:first-child { - color:red; -} - -tr.timeout > td:first-child { - color:red; -} - -tr.notrun > td:first-child { - color:blue; -} - -.pass > td:first-child, .fail > td:first-child, .timeout > td:first-child, .notrun > td:first-child { - font-variant:small-caps; -} - -table#results span { - display:block; -} - -table#results span.expected { - font-family:DejaVu Sans Mono, Bitstream Vera Sans Mono, Monospace; - white-space:pre; -} - -table#results span.actual { - font-family:DejaVu Sans Mono, Bitstream Vera Sans Mono, Monospace; - white-space:pre; -} - -span.ok { - color:green; -} - -tr.error { - color:red; -} - -span.timeout { - color:red; -} - -span.ok, span.timeout, span.error { - font-variant:small-caps; -} \ No newline at end of file diff --git a/src/gui/test/browser/resources/testharness.js b/src/gui/test/browser/resources/testharness.js deleted file mode 100644 index 08d97b57..00000000 --- a/src/gui/test/browser/resources/testharness.js +++ /dev/null @@ -1,2938 +0,0 @@ -/*global self*/ -/*jshint latedef: nofunc*/ -/* -Distributed under both the W3C Test Suite License [1] and the W3C -3-clause BSD License [2]. To contribute to a W3C Test Suite, see the -policies and contribution forms [3]. - -[1] http://www.w3.org/Consortium/Legal/2008/04-testsuite-license -[2] http://www.w3.org/Consortium/Legal/2008/03-bsd-license -[3] http://www.w3.org/2004/10/27-testcases -*/ - -/* Documentation: http://web-platform-tests.org/writing-tests/testharness-api.html - * (../docs/_writing-tests/testharness-api.md) */ - -(function () -{ - var debug = false; - // default timeout is 10 seconds, test can override if needed - var settings = { - output:true, - harness_timeout:{ - "normal":10000, - "long":60000 - }, - test_timeout:null, - message_events: ["start", "test_state", "result", "completion"] - }; - - var xhtml_ns = "http://www.w3.org/1999/xhtml"; - - /* - * TestEnvironment is an abstraction for the environment in which the test - * harness is used. Each implementation of a test environment has to provide - * the following interface: - * - * interface TestEnvironment { - * // Invoked after the global 'tests' object has been created and it's - * // safe to call add_*_callback() to register event handlers. - * void on_tests_ready(); - * - * // Invoked after setup() has been called to notify the test environment - * // of changes to the test harness properties. - * void on_new_harness_properties(object properties); - * - * // Should return a new unique default test name. - * DOMString next_default_test_name(); - * - * // Should return the test harness timeout duration in milliseconds. - * float test_timeout(); - * - * // Should return the global scope object. - * object global_scope(); - * }; - */ - - /* - * A test environment with a DOM. The global object is 'window'. By default - * test results are displayed in a table. Any parent windows receive - * callbacks or messages via postMessage() when test events occur. See - * apisample11.html and apisample12.html. - */ - function WindowTestEnvironment() { - this.name_counter = 0; - this.window_cache = null; - this.output_handler = null; - this.all_loaded = false; - var this_obj = this; - this.message_events = []; - this.dispatched_messages = []; - - this.message_functions = { - start: [add_start_callback, remove_start_callback, - function (properties) { - this_obj._dispatch("start_callback", [properties], - {type: "start", properties: properties}); - }], - - test_state: [add_test_state_callback, remove_test_state_callback, - function(test) { - this_obj._dispatch("test_state_callback", [test], - {type: "test_state", - test: test.structured_clone()}); - }], - result: [add_result_callback, remove_result_callback, - function (test) { - this_obj.output_handler.show_status(); - this_obj._dispatch("result_callback", [test], - {type: "result", - test: test.structured_clone()}); - }], - completion: [add_completion_callback, remove_completion_callback, - function (tests, harness_status) { - var cloned_tests = map(tests, function(test) { - return test.structured_clone(); - }); - this_obj._dispatch("completion_callback", [tests, harness_status], - {type: "complete", - tests: cloned_tests, - status: harness_status.structured_clone()}); - }] - } - - on_event(window, 'load', function() { - this_obj.all_loaded = true; - }); - - on_event(window, 'message', function(event) { - if (event.data && event.data.type === "getmessages" && event.source) { - // A window can post "getmessages" to receive a duplicate of every - // message posted by this environment so far. This allows subscribers - // from fetch_tests_from_window to 'catch up' to the current state of - // this environment. - for (var i = 0; i < this_obj.dispatched_messages.length; ++i) - { - event.source.postMessage(this_obj.dispatched_messages[i], "*"); - } - } - }); - } - - WindowTestEnvironment.prototype._dispatch = function(selector, callback_args, message_arg) { - this.dispatched_messages.push(message_arg); - this._forEach_windows( - function(w, same_origin) { - if (same_origin) { - try { - var has_selector = selector in w; - } catch(e) { - // If document.domain was set at some point same_origin can be - // wrong and the above will fail. - has_selector = false; - } - if (has_selector) { - try { - w[selector].apply(undefined, callback_args); - } catch (e) { - if (debug) { - throw e; - } - } - } - } - if (supports_post_message(w) && w !== self) { - w.postMessage(message_arg, "*"); - } - }); - }; - - WindowTestEnvironment.prototype._forEach_windows = function(callback) { - // Iterate of the the windows [self ... top, opener]. The callback is passed - // two objects, the first one is the windows object itself, the second one - // is a boolean indicating whether or not its on the same origin as the - // current window. - var cache = this.window_cache; - if (!cache) { - cache = [[self, true]]; - var w = self; - var i = 0; - var so; - while (w != w.parent) { - w = w.parent; - so = is_same_origin(w); - cache.push([w, so]); - i++; - } - w = window.opener; - if (w) { - cache.push([w, is_same_origin(w)]); - } - this.window_cache = cache; - } - - forEach(cache, - function(a) { - callback.apply(null, a); - }); - }; - - WindowTestEnvironment.prototype.on_tests_ready = function() { - var output = new Output(); - this.output_handler = output; - - var this_obj = this; - - add_start_callback(function (properties) { - this_obj.output_handler.init(properties); - }); - - add_test_state_callback(function(test) { - this_obj.output_handler.show_status(); - }); - - add_result_callback(function (test) { - this_obj.output_handler.show_status(); - }); - - add_completion_callback(function (tests, harness_status) { - this_obj.output_handler.show_results(tests, harness_status); - }); - this.setup_messages(settings.message_events); - }; - - WindowTestEnvironment.prototype.setup_messages = function(new_events) { - var this_obj = this; - forEach(settings.message_events, function(x) { - var current_dispatch = this_obj.message_events.indexOf(x) !== -1; - var new_dispatch = new_events.indexOf(x) !== -1; - if (!current_dispatch && new_dispatch) { - this_obj.message_functions[x][0](this_obj.message_functions[x][2]); - } else if (current_dispatch && !new_dispatch) { - this_obj.message_functions[x][1](this_obj.message_functions[x][2]); - } - }); - this.message_events = new_events; - } - - WindowTestEnvironment.prototype.next_default_test_name = function() { - //Don't use document.title to work around an Opera bug in XHTML documents - var title = document.getElementsByTagName("title")[0]; - var prefix = (title && title.firstChild && title.firstChild.data) || "Untitled"; - var suffix = this.name_counter > 0 ? " " + this.name_counter : ""; - this.name_counter++; - return prefix + suffix; - }; - - WindowTestEnvironment.prototype.on_new_harness_properties = function(properties) { - this.output_handler.setup(properties); - if (properties.hasOwnProperty("message_events")) { - this.setup_messages(properties.message_events); - } - }; - - WindowTestEnvironment.prototype.add_on_loaded_callback = function(callback) { - on_event(window, 'load', callback); - }; - - WindowTestEnvironment.prototype.test_timeout = function() { - var metas = document.getElementsByTagName("meta"); - for (var i = 0; i < metas.length; i++) { - if (metas[i].name == "timeout") { - if (metas[i].content == "long") { - return settings.harness_timeout.long; - } - break; - } - } - return settings.harness_timeout.normal; - }; - - WindowTestEnvironment.prototype.global_scope = function() { - return window; - }; - - /* - * Base TestEnvironment implementation for a generic web worker. - * - * Workers accumulate test results. One or more clients can connect and - * retrieve results from a worker at any time. - * - * WorkerTestEnvironment supports communicating with a client via a - * MessagePort. The mechanism for determining the appropriate MessagePort - * for communicating with a client depends on the type of worker and is - * implemented by the various specializations of WorkerTestEnvironment - * below. - * - * A client document using testharness can use fetch_tests_from_worker() to - * retrieve results from a worker. See apisample16.html. - */ - function WorkerTestEnvironment() { - this.name_counter = 0; - this.all_loaded = true; - this.message_list = []; - this.message_ports = []; - } - - WorkerTestEnvironment.prototype._dispatch = function(message) { - this.message_list.push(message); - for (var i = 0; i < this.message_ports.length; ++i) - { - this.message_ports[i].postMessage(message); - } - }; - - // The only requirement is that port has a postMessage() method. It doesn't - // have to be an instance of a MessagePort, and often isn't. - WorkerTestEnvironment.prototype._add_message_port = function(port) { - this.message_ports.push(port); - for (var i = 0; i < this.message_list.length; ++i) - { - port.postMessage(this.message_list[i]); - } - }; - - WorkerTestEnvironment.prototype.next_default_test_name = function() { - var suffix = this.name_counter > 0 ? " " + this.name_counter : ""; - this.name_counter++; - return "Untitled" + suffix; - }; - - WorkerTestEnvironment.prototype.on_new_harness_properties = function() {}; - - WorkerTestEnvironment.prototype.on_tests_ready = function() { - var this_obj = this; - add_start_callback( - function(properties) { - this_obj._dispatch({ - type: "start", - properties: properties, - }); - }); - add_test_state_callback( - function(test) { - this_obj._dispatch({ - type: "test_state", - test: test.structured_clone() - }); - }); - add_result_callback( - function(test) { - this_obj._dispatch({ - type: "result", - test: test.structured_clone() - }); - }); - add_completion_callback( - function(tests, harness_status) { - this_obj._dispatch({ - type: "complete", - tests: map(tests, - function(test) { - return test.structured_clone(); - }), - status: harness_status.structured_clone() - }); - }); - }; - - WorkerTestEnvironment.prototype.add_on_loaded_callback = function() {}; - - WorkerTestEnvironment.prototype.test_timeout = function() { - // Tests running in a worker don't have a default timeout. I.e. all - // worker tests behave as if settings.explicit_timeout is true. - return null; - }; - - WorkerTestEnvironment.prototype.global_scope = function() { - return self; - }; - - /* - * Dedicated web workers. - * https://html.spec.whatwg.org/multipage/workers.html#dedicatedworkerglobalscope - * - * This class is used as the test_environment when testharness is running - * inside a dedicated worker. - */ - function DedicatedWorkerTestEnvironment() { - WorkerTestEnvironment.call(this); - // self is an instance of DedicatedWorkerGlobalScope which exposes - // a postMessage() method for communicating via the message channel - // established when the worker is created. - this._add_message_port(self); - } - DedicatedWorkerTestEnvironment.prototype = Object.create(WorkerTestEnvironment.prototype); - - DedicatedWorkerTestEnvironment.prototype.on_tests_ready = function() { - WorkerTestEnvironment.prototype.on_tests_ready.call(this); - // In the absence of an onload notification, we a require dedicated - // workers to explicitly signal when the tests are done. - tests.wait_for_finish = true; - }; - - /* - * Shared web workers. - * https://html.spec.whatwg.org/multipage/workers.html#sharedworkerglobalscope - * - * This class is used as the test_environment when testharness is running - * inside a shared web worker. - */ - function SharedWorkerTestEnvironment() { - WorkerTestEnvironment.call(this); - var this_obj = this; - // Shared workers receive message ports via the 'onconnect' event for - // each connection. - self.addEventListener("connect", - function(message_event) { - this_obj._add_message_port(message_event.source); - }, false); - } - SharedWorkerTestEnvironment.prototype = Object.create(WorkerTestEnvironment.prototype); - - SharedWorkerTestEnvironment.prototype.on_tests_ready = function() { - WorkerTestEnvironment.prototype.on_tests_ready.call(this); - // In the absence of an onload notification, we a require shared - // workers to explicitly signal when the tests are done. - tests.wait_for_finish = true; - }; - - /* - * Service workers. - * http://www.w3.org/TR/service-workers/ - * - * This class is used as the test_environment when testharness is running - * inside a service worker. - */ - function ServiceWorkerTestEnvironment() { - WorkerTestEnvironment.call(this); - this.all_loaded = false; - this.on_loaded_callback = null; - var this_obj = this; - self.addEventListener("message", - function(event) { - if (event.data && event.data.type && event.data.type === "connect") { - if (event.ports && event.ports[0]) { - // If a MessageChannel was passed, then use it to - // send results back to the main window. This - // allows the tests to work even if the browser - // does not fully support MessageEvent.source in - // ServiceWorkers yet. - this_obj._add_message_port(event.ports[0]); - event.ports[0].start(); - } else { - // If there is no MessageChannel, then attempt to - // use the MessageEvent.source to send results - // back to the main window. - this_obj._add_message_port(event.source); - } - } - }, false); - - // The oninstall event is received after the service worker script and - // all imported scripts have been fetched and executed. It's the - // equivalent of an onload event for a document. All tests should have - // been added by the time this event is received, thus it's not - // necessary to wait until the onactivate event. However, tests for - // installed service workers need another event which is equivalent to - // the onload event because oninstall is fired only on installation. The - // onmessage event is used for that purpose since tests using - // testharness.js should ask the result to its service worker by - // PostMessage. If the onmessage event is triggered on the service - // worker's context, that means the worker's script has been evaluated. - on_event(self, "install", on_all_loaded); - on_event(self, "message", on_all_loaded); - function on_all_loaded() { - if (this_obj.all_loaded) - return; - this_obj.all_loaded = true; - if (this_obj.on_loaded_callback) { - this_obj.on_loaded_callback(); - } - } - } - - ServiceWorkerTestEnvironment.prototype = Object.create(WorkerTestEnvironment.prototype); - - ServiceWorkerTestEnvironment.prototype.add_on_loaded_callback = function(callback) { - if (this.all_loaded) { - callback(); - } else { - this.on_loaded_callback = callback; - } - }; - - function create_test_environment() { - if ('document' in self) { - return new WindowTestEnvironment(); - } - if ('DedicatedWorkerGlobalScope' in self && - self instanceof DedicatedWorkerGlobalScope) { - return new DedicatedWorkerTestEnvironment(); - } - if ('SharedWorkerGlobalScope' in self && - self instanceof SharedWorkerGlobalScope) { - return new SharedWorkerTestEnvironment(); - } - if ('ServiceWorkerGlobalScope' in self && - self instanceof ServiceWorkerGlobalScope) { - return new ServiceWorkerTestEnvironment(); - } - if ('WorkerGlobalScope' in self && - self instanceof WorkerGlobalScope) { - return new DedicatedWorkerTestEnvironment(); - } - - throw new Error("Unsupported test environment"); - } - - var test_environment = create_test_environment(); - - function is_shared_worker(worker) { - return 'SharedWorker' in self && worker instanceof SharedWorker; - } - - function is_service_worker(worker) { - // The worker object may be from another execution context, - // so do not use instanceof here. - return 'ServiceWorker' in self && - Object.prototype.toString.call(worker) == '[object ServiceWorker]'; - } - - /* - * API functions - */ - - function test(func, name, properties) - { - var test_name = name ? name : test_environment.next_default_test_name(); - properties = properties ? properties : {}; - var test_obj = new Test(test_name, properties); - test_obj.step(func, test_obj, test_obj); - if (test_obj.phase === test_obj.phases.STARTED) { - test_obj.done(); - } - } - - function async_test(func, name, properties) - { - if (typeof func !== "function") { - properties = name; - name = func; - func = null; - } - var test_name = name ? name : test_environment.next_default_test_name(); - properties = properties ? properties : {}; - var test_obj = new Test(test_name, properties); - if (func) { - test_obj.step(func, test_obj, test_obj); - } - return test_obj; - } - - function promise_test(func, name, properties) { - var test = async_test(name, properties); - // If there is no promise tests queue make one. - if (!tests.promise_tests) { - tests.promise_tests = Promise.resolve(); - } - tests.promise_tests = tests.promise_tests.then(function() { - var donePromise = new Promise(function(resolve) { - test._add_cleanup(resolve); - }); - var promise = test.step(func, test, test); - test.step(function() { - assert_not_equals(promise, undefined); - }); - Promise.resolve(promise).then( - function() { - test.done(); - }) - .catch(test.step_func( - function(value) { - if (value instanceof AssertionError) { - throw value; - } - assert(false, "promise_test", null, - "Unhandled rejection with value: ${value}", {value:value}); - })); - return donePromise; - }); - } - - function promise_rejects(test, expected, promise, description) { - return promise.then(test.unreached_func("Should have rejected: " + description)).catch(function(e) { - assert_throws(expected, function() { throw e }, description); - }); - } - - /** - * This constructor helper allows DOM events to be handled using Promises, - * which can make it a lot easier to test a very specific series of events, - * including ensuring that unexpected events are not fired at any point. - */ - function EventWatcher(test, watchedNode, eventTypes) - { - if (typeof eventTypes == 'string') { - eventTypes = [eventTypes]; - } - - var waitingFor = null; - - // This is null unless we are recording all events, in which case it - // will be an Array object. - var recordedEvents = null; - - var eventHandler = test.step_func(function(evt) { - assert_true(!!waitingFor, - 'Not expecting event, but got ' + evt.type + ' event'); - assert_equals(evt.type, waitingFor.types[0], - 'Expected ' + waitingFor.types[0] + ' event, but got ' + - evt.type + ' event instead'); - - if (Array.isArray(recordedEvents)) { - recordedEvents.push(evt); - } - - if (waitingFor.types.length > 1) { - // Pop first event from array - waitingFor.types.shift(); - return; - } - // We need to null out waitingFor before calling the resolve function - // since the Promise's resolve handlers may call wait_for() which will - // need to set waitingFor. - var resolveFunc = waitingFor.resolve; - waitingFor = null; - // Likewise, we should reset the state of recordedEvents. - var result = recordedEvents || evt; - recordedEvents = null; - resolveFunc(result); - }); - - for (var i = 0; i < eventTypes.length; i++) { - watchedNode.addEventListener(eventTypes[i], eventHandler, false); - } - - /** - * Returns a Promise that will resolve after the specified event or - * series of events has occured. - * - * @param options An optional options object. If the 'record' property - * on this object has the value 'all', when the Promise - * returned by this function is resolved, *all* Event - * objects that were waited for will be returned as an - * array. - * - * For example, - * - * ```js - * const watcher = new EventWatcher(t, div, [ 'animationstart', - * 'animationiteration', - * 'animationend' ]); - * return watcher.wait_for([ 'animationstart', 'animationend' ], - * { record: 'all' }).then(evts => { - * assert_equals(evts[0].elapsedTime, 0.0); - * assert_equals(evts[1].elapsedTime, 2.0); - * }); - * ``` - */ - this.wait_for = function(types, options) { - if (waitingFor) { - return Promise.reject('Already waiting for an event or events'); - } - if (typeof types == 'string') { - types = [types]; - } - if (options && options.record && options.record === 'all') { - recordedEvents = []; - } - return new Promise(function(resolve, reject) { - waitingFor = { - types: types, - resolve: resolve, - reject: reject - }; - }); - }; - - function stop_watching() { - for (var i = 0; i < eventTypes.length; i++) { - watchedNode.removeEventListener(eventTypes[i], eventHandler, false); - } - }; - - test._add_cleanup(stop_watching); - - return this; - } - expose(EventWatcher, 'EventWatcher'); - - function setup(func_or_properties, maybe_properties) - { - var func = null; - var properties = {}; - if (arguments.length === 2) { - func = func_or_properties; - properties = maybe_properties; - } else if (func_or_properties instanceof Function) { - func = func_or_properties; - } else { - properties = func_or_properties; - } - tests.setup(func, properties); - test_environment.on_new_harness_properties(properties); - } - - function done() { - if (tests.tests.length === 0) { - tests.set_file_is_test(); - } - if (tests.file_is_test) { - tests.tests[0].done(); - } - tests.end_wait(); - } - - function generate_tests(func, args, properties) { - forEach(args, function(x, i) - { - var name = x[0]; - test(function() - { - func.apply(this, x.slice(1)); - }, - name, - Array.isArray(properties) ? properties[i] : properties); - }); - } - - function on_event(object, event, callback) - { - object.addEventListener(event, callback, false); - } - - function step_timeout(f, t) { - var outer_this = this; - var args = Array.prototype.slice.call(arguments, 2); - return setTimeout(function() { - f.apply(outer_this, args); - }, t * tests.timeout_multiplier); - } - - expose(test, 'test'); - expose(async_test, 'async_test'); - expose(promise_test, 'promise_test'); - expose(promise_rejects, 'promise_rejects'); - expose(generate_tests, 'generate_tests'); - expose(setup, 'setup'); - expose(done, 'done'); - expose(on_event, 'on_event'); - expose(step_timeout, 'step_timeout'); - - /* - * Return a string truncated to the given length, with ... added at the end - * if it was longer. - */ - function truncate(s, len) - { - if (s.length > len) { - return s.substring(0, len - 3) + "..."; - } - return s; - } - - /* - * Return true if object is probably a Node object. - */ - function is_node(object) - { - // I use duck-typing instead of instanceof, because - // instanceof doesn't work if the node is from another window (like an - // iframe's contentWindow): - // http://www.w3.org/Bugs/Public/show_bug.cgi?id=12295 - try { - var has_node_properties = ("nodeType" in object && - "nodeName" in object && - "nodeValue" in object && - "childNodes" in object); - } catch (e) { - // We're probably cross-origin, which means we aren't a node - return false; - } - - if (has_node_properties) { - try { - object.nodeType; - } catch (e) { - // The object is probably Node.prototype or another prototype - // object that inherits from it, and not a Node instance. - return false; - } - return true; - } - return false; - } - - var replacements = { - "0": "0", - "1": "x01", - "2": "x02", - "3": "x03", - "4": "x04", - "5": "x05", - "6": "x06", - "7": "x07", - "8": "b", - "9": "t", - "10": "n", - "11": "v", - "12": "f", - "13": "r", - "14": "x0e", - "15": "x0f", - "16": "x10", - "17": "x11", - "18": "x12", - "19": "x13", - "20": "x14", - "21": "x15", - "22": "x16", - "23": "x17", - "24": "x18", - "25": "x19", - "26": "x1a", - "27": "x1b", - "28": "x1c", - "29": "x1d", - "30": "x1e", - "31": "x1f", - "0xfffd": "ufffd", - "0xfffe": "ufffe", - "0xffff": "uffff", - }; - - /* - * Convert a value to a nice, human-readable string - */ - function format_value(val, seen) - { - if (!seen) { - seen = []; - } - if (typeof val === "object" && val !== null) { - if (seen.indexOf(val) >= 0) { - return "[...]"; - } - seen.push(val); - } - if (Array.isArray(val)) { - return "[" + val.map(function(x) {return format_value(x, seen);}).join(", ") + "]"; - } - - switch (typeof val) { - case "string": - val = val.replace("\\", "\\\\"); - for (var p in replacements) { - var replace = "\\" + replacements[p]; - val = val.replace(RegExp(String.fromCharCode(p), "g"), replace); - } - return '"' + val.replace(/"/g, '\\"') + '"'; - case "boolean": - case "undefined": - return String(val); - case "number": - // In JavaScript, -0 === 0 and String(-0) == "0", so we have to - // special-case. - if (val === -0 && 1/val === -Infinity) { - return "-0"; - } - return String(val); - case "object": - if (val === null) { - return "null"; - } - - // Special-case Node objects, since those come up a lot in my tests. I - // ignore namespaces. - if (is_node(val)) { - switch (val.nodeType) { - case Node.ELEMENT_NODE: - var ret = "<" + val.localName; - for (var i = 0; i < val.attributes.length; i++) { - ret += " " + val.attributes[i].name + '="' + val.attributes[i].value + '"'; - } - ret += ">" + val.innerHTML + "</" + val.localName + ">"; - return "Element node " + truncate(ret, 60); - case Node.TEXT_NODE: - return 'Text node "' + truncate(val.data, 60) + '"'; - case Node.PROCESSING_INSTRUCTION_NODE: - return "ProcessingInstruction node with target " + format_value(truncate(val.target, 60)) + " and data " + format_value(truncate(val.data, 60)); - case Node.COMMENT_NODE: - return "Comment node <!--" + truncate(val.data, 60) + "-->"; - case Node.DOCUMENT_NODE: - return "Document node with " + val.childNodes.length + (val.childNodes.length == 1 ? " child" : " children"); - case Node.DOCUMENT_TYPE_NODE: - return "DocumentType node"; - case Node.DOCUMENT_FRAGMENT_NODE: - return "DocumentFragment node with " + val.childNodes.length + (val.childNodes.length == 1 ? " child" : " children"); - default: - return "Node object of unknown type"; - } - } - - /* falls through */ - default: - try { - return typeof val + ' "' + truncate(String(val), 1000) + '"'; - } catch(e) { - return ("[stringifying object threw " + String(e) + - " with type " + String(typeof e) + "]"); - } - } - } - expose(format_value, "format_value"); - - /* - * Assertions - */ - - function assert_true(actual, description) - { - assert(actual === true, "assert_true", description, - "expected true got ${actual}", {actual:actual}); - } - expose(assert_true, "assert_true"); - - function assert_false(actual, description) - { - assert(actual === false, "assert_false", description, - "expected false got ${actual}", {actual:actual}); - } - expose(assert_false, "assert_false"); - - function same_value(x, y) { - if (y !== y) { - //NaN case - return x !== x; - } - if (x === 0 && y === 0) { - //Distinguish +0 and -0 - return 1/x === 1/y; - } - return x === y; - } - - function assert_equals(actual, expected, description) - { - /* - * Test if two primitives are equal or two objects - * are the same object - */ - if (typeof actual != typeof expected) { - assert(false, "assert_equals", description, - "expected (" + typeof expected + ") ${expected} but got (" + typeof actual + ") ${actual}", - {expected:expected, actual:actual}); - return; - } - assert(same_value(actual, expected), "assert_equals", description, - "expected ${expected} but got ${actual}", - {expected:expected, actual:actual}); - } - expose(assert_equals, "assert_equals"); - - function assert_not_equals(actual, expected, description) - { - /* - * Test if two primitives are unequal or two objects - * are different objects - */ - assert(!same_value(actual, expected), "assert_not_equals", description, - "got disallowed value ${actual}", - {actual:actual}); - } - expose(assert_not_equals, "assert_not_equals"); - - function assert_in_array(actual, expected, description) - { - assert(expected.indexOf(actual) != -1, "assert_in_array", description, - "value ${actual} not in array ${expected}", - {actual:actual, expected:expected}); - } - expose(assert_in_array, "assert_in_array"); - - function assert_object_equals(actual, expected, description) - { - //This needs to be improved a great deal - function check_equal(actual, expected, stack) - { - stack.push(actual); - - var p; - for (p in actual) { - assert(expected.hasOwnProperty(p), "assert_object_equals", description, - "unexpected property ${p}", {p:p}); - - if (typeof actual[p] === "object" && actual[p] !== null) { - if (stack.indexOf(actual[p]) === -1) { - check_equal(actual[p], expected[p], stack); - } - } else { - assert(same_value(actual[p], expected[p]), "assert_object_equals", description, - "property ${p} expected ${expected} got ${actual}", - {p:p, expected:expected, actual:actual}); - } - } - for (p in expected) { - assert(actual.hasOwnProperty(p), - "assert_object_equals", description, - "expected property ${p} missing", {p:p}); - } - stack.pop(); - } - check_equal(actual, expected, []); - } - expose(assert_object_equals, "assert_object_equals"); - - function assert_array_equals(actual, expected, description) - { - assert(typeof actual === "object" && actual !== null && "length" in actual, - "assert_array_equals", description, - "value is ${actual}, expected array", - {actual:actual}); - assert(actual.length === expected.length, - "assert_array_equals", description, - "lengths differ, expected ${expected} got ${actual}", - {expected:expected.length, actual:actual.length}); - - for (var i = 0; i < actual.length; i++) { - assert(actual.hasOwnProperty(i) === expected.hasOwnProperty(i), - "assert_array_equals", description, - "property ${i}, property expected to be ${expected} but was ${actual}", - {i:i, expected:expected.hasOwnProperty(i) ? "present" : "missing", - actual:actual.hasOwnProperty(i) ? "present" : "missing"}); - assert(same_value(expected[i], actual[i]), - "assert_array_equals", description, - "property ${i}, expected ${expected} but got ${actual}", - {i:i, expected:expected[i], actual:actual[i]}); - } - } - expose(assert_array_equals, "assert_array_equals"); - - function assert_array_approx_equals(actual, expected, epsilon, description) - { - /* - * Test if two primitive arrays are equal withing +/- epsilon - */ - assert(actual.length === expected.length, - "assert_array_approx_equals", description, - "lengths differ, expected ${expected} got ${actual}", - {expected:expected.length, actual:actual.length}); - - for (var i = 0; i < actual.length; i++) { - assert(actual.hasOwnProperty(i) === expected.hasOwnProperty(i), - "assert_array_approx_equals", description, - "property ${i}, property expected to be ${expected} but was ${actual}", - {i:i, expected:expected.hasOwnProperty(i) ? "present" : "missing", - actual:actual.hasOwnProperty(i) ? "present" : "missing"}); - assert(typeof actual[i] === "number", - "assert_array_approx_equals", description, - "property ${i}, expected a number but got a ${type_actual}", - {i:i, type_actual:typeof actual[i]}); - assert(Math.abs(actual[i] - expected[i]) <= epsilon, - "assert_array_approx_equals", description, - "property ${i}, expected ${expected} +/- ${epsilon}, expected ${expected} but got ${actual}", - {i:i, expected:expected[i], actual:actual[i]}); - } - } - expose(assert_array_approx_equals, "assert_array_approx_equals"); - - function assert_approx_equals(actual, expected, epsilon, description) - { - /* - * Test if two primitive numbers are equal withing +/- epsilon - */ - assert(typeof actual === "number", - "assert_approx_equals", description, - "expected a number but got a ${type_actual}", - {type_actual:typeof actual}); - - assert(Math.abs(actual - expected) <= epsilon, - "assert_approx_equals", description, - "expected ${expected} +/- ${epsilon} but got ${actual}", - {expected:expected, actual:actual, epsilon:epsilon}); - } - expose(assert_approx_equals, "assert_approx_equals"); - - function assert_less_than(actual, expected, description) - { - /* - * Test if a primitive number is less than another - */ - assert(typeof actual === "number", - "assert_less_than", description, - "expected a number but got a ${type_actual}", - {type_actual:typeof actual}); - - assert(actual < expected, - "assert_less_than", description, - "expected a number less than ${expected} but got ${actual}", - {expected:expected, actual:actual}); - } - expose(assert_less_than, "assert_less_than"); - - function assert_greater_than(actual, expected, description) - { - /* - * Test if a primitive number is greater than another - */ - assert(typeof actual === "number", - "assert_greater_than", description, - "expected a number but got a ${type_actual}", - {type_actual:typeof actual}); - - assert(actual > expected, - "assert_greater_than", description, - "expected a number greater than ${expected} but got ${actual}", - {expected:expected, actual:actual}); - } - expose(assert_greater_than, "assert_greater_than"); - - function assert_between_exclusive(actual, lower, upper, description) - { - /* - * Test if a primitive number is between two others - */ - assert(typeof actual === "number", - "assert_between_exclusive", description, - "expected a number but got a ${type_actual}", - {type_actual:typeof actual}); - - assert(actual > lower && actual < upper, - "assert_between_exclusive", description, - "expected a number greater than ${lower} " + - "and less than ${upper} but got ${actual}", - {lower:lower, upper:upper, actual:actual}); - } - expose(assert_between_exclusive, "assert_between_exclusive"); - - function assert_less_than_equal(actual, expected, description) - { - /* - * Test if a primitive number is less than or equal to another - */ - assert(typeof actual === "number", - "assert_less_than_equal", description, - "expected a number but got a ${type_actual}", - {type_actual:typeof actual}); - - assert(actual <= expected, - "assert_less_than_equal", description, - "expected a number less than or equal to ${expected} but got ${actual}", - {expected:expected, actual:actual}); - } - expose(assert_less_than_equal, "assert_less_than_equal"); - - function assert_greater_than_equal(actual, expected, description) - { - /* - * Test if a primitive number is greater than or equal to another - */ - assert(typeof actual === "number", - "assert_greater_than_equal", description, - "expected a number but got a ${type_actual}", - {type_actual:typeof actual}); - - assert(actual >= expected, - "assert_greater_than_equal", description, - "expected a number greater than or equal to ${expected} but got ${actual}", - {expected:expected, actual:actual}); - } - expose(assert_greater_than_equal, "assert_greater_than_equal"); - - function assert_between_inclusive(actual, lower, upper, description) - { - /* - * Test if a primitive number is between to two others or equal to either of them - */ - assert(typeof actual === "number", - "assert_between_inclusive", description, - "expected a number but got a ${type_actual}", - {type_actual:typeof actual}); - - assert(actual >= lower && actual <= upper, - "assert_between_inclusive", description, - "expected a number greater than or equal to ${lower} " + - "and less than or equal to ${upper} but got ${actual}", - {lower:lower, upper:upper, actual:actual}); - } - expose(assert_between_inclusive, "assert_between_inclusive"); - - function assert_regexp_match(actual, expected, description) { - /* - * Test if a string (actual) matches a regexp (expected) - */ - assert(expected.test(actual), - "assert_regexp_match", description, - "expected ${expected} but got ${actual}", - {expected:expected, actual:actual}); - } - expose(assert_regexp_match, "assert_regexp_match"); - - function assert_class_string(object, class_string, description) { - assert_equals({}.toString.call(object), "[object " + class_string + "]", - description); - } - expose(assert_class_string, "assert_class_string"); - - - function _assert_own_property(name) { - return function(object, property_name, description) - { - assert(object.hasOwnProperty(property_name), - name, description, - "expected property ${p} missing", {p:property_name}); - }; - } - expose(_assert_own_property("assert_exists"), "assert_exists"); - expose(_assert_own_property("assert_own_property"), "assert_own_property"); - - function assert_not_exists(object, property_name, description) - { - assert(!object.hasOwnProperty(property_name), - "assert_not_exists", description, - "unexpected property ${p} found", {p:property_name}); - } - expose(assert_not_exists, "assert_not_exists"); - - function _assert_inherits(name) { - return function (object, property_name, description) - { - assert(typeof object === "object" || typeof object === "function", - name, description, - "provided value is not an object"); - - assert("hasOwnProperty" in object, - name, description, - "provided value is an object but has no hasOwnProperty method"); - - assert(!object.hasOwnProperty(property_name), - name, description, - "property ${p} found on object expected in prototype chain", - {p:property_name}); - - assert(property_name in object, - name, description, - "property ${p} not found in prototype chain", - {p:property_name}); - }; - } - expose(_assert_inherits("assert_inherits"), "assert_inherits"); - expose(_assert_inherits("assert_idl_attribute"), "assert_idl_attribute"); - - function assert_readonly(object, property_name, description) - { - var initial_value = object[property_name]; - try { - //Note that this can have side effects in the case where - //the property has PutForwards - object[property_name] = initial_value + "a"; //XXX use some other value here? - assert(same_value(object[property_name], initial_value), - "assert_readonly", description, - "changing property ${p} succeeded", - {p:property_name}); - } finally { - object[property_name] = initial_value; - } - } - expose(assert_readonly, "assert_readonly"); - - function assert_throws(code, func, description) - { - try { - func.call(this); - assert(false, "assert_throws", description, - "${func} did not throw", {func:func}); - } catch (e) { - if (e instanceof AssertionError) { - throw e; - } - if (code === null) { - throw new AssertionError('Test bug: need to pass exception to assert_throws()'); - } - if (typeof code === "object") { - assert(typeof e == "object" && "name" in e && e.name == code.name, - "assert_throws", description, - "${func} threw ${actual} (${actual_name}) expected ${expected} (${expected_name})", - {func:func, actual:e, actual_name:e.name, - expected:code, - expected_name:code.name}); - return; - } - - var code_name_map = { - INDEX_SIZE_ERR: 'IndexSizeError', - HIERARCHY_REQUEST_ERR: 'HierarchyRequestError', - WRONG_DOCUMENT_ERR: 'WrongDocumentError', - INVALID_CHARACTER_ERR: 'InvalidCharacterError', - NO_MODIFICATION_ALLOWED_ERR: 'NoModificationAllowedError', - NOT_FOUND_ERR: 'NotFoundError', - NOT_SUPPORTED_ERR: 'NotSupportedError', - INUSE_ATTRIBUTE_ERR: 'InUseAttributeError', - INVALID_STATE_ERR: 'InvalidStateError', - SYNTAX_ERR: 'SyntaxError', - INVALID_MODIFICATION_ERR: 'InvalidModificationError', - NAMESPACE_ERR: 'NamespaceError', - INVALID_ACCESS_ERR: 'InvalidAccessError', - TYPE_MISMATCH_ERR: 'TypeMismatchError', - SECURITY_ERR: 'SecurityError', - NETWORK_ERR: 'NetworkError', - ABORT_ERR: 'AbortError', - URL_MISMATCH_ERR: 'URLMismatchError', - QUOTA_EXCEEDED_ERR: 'QuotaExceededError', - TIMEOUT_ERR: 'TimeoutError', - INVALID_NODE_TYPE_ERR: 'InvalidNodeTypeError', - DATA_CLONE_ERR: 'DataCloneError' - }; - - var name = code in code_name_map ? code_name_map[code] : code; - - var name_code_map = { - IndexSizeError: 1, - HierarchyRequestError: 3, - WrongDocumentError: 4, - InvalidCharacterError: 5, - NoModificationAllowedError: 7, - NotFoundError: 8, - NotSupportedError: 9, - InUseAttributeError: 10, - InvalidStateError: 11, - SyntaxError: 12, - InvalidModificationError: 13, - NamespaceError: 14, - InvalidAccessError: 15, - TypeMismatchError: 17, - SecurityError: 18, - NetworkError: 19, - AbortError: 20, - URLMismatchError: 21, - QuotaExceededError: 22, - TimeoutError: 23, - InvalidNodeTypeError: 24, - DataCloneError: 25, - - EncodingError: 0, - NotReadableError: 0, - UnknownError: 0, - ConstraintError: 0, - DataError: 0, - TransactionInactiveError: 0, - ReadOnlyError: 0, - VersionError: 0, - OperationError: 0, - NotAllowedError: 0 - }; - - if (!(name in name_code_map)) { - throw new AssertionError('Test bug: unrecognized DOMException code "' + code + '" passed to assert_throws()'); - } - - var required_props = { code: name_code_map[name] }; - - if (required_props.code === 0 || - (typeof e == "object" && - "name" in e && - e.name !== e.name.toUpperCase() && - e.name !== "DOMException")) { - // New style exception: also test the name property. - required_props.name = name; - } - - //We'd like to test that e instanceof the appropriate interface, - //but we can't, because we don't know what window it was created - //in. It might be an instanceof the appropriate interface on some - //unknown other window. TODO: Work around this somehow? - - assert(typeof e == "object", - "assert_throws", description, - "${func} threw ${e} with type ${type}, not an object", - {func:func, e:e, type:typeof e}); - - for (var prop in required_props) { - assert(typeof e == "object" && prop in e && e[prop] == required_props[prop], - "assert_throws", description, - "${func} threw ${e} that is not a DOMException " + code + ": property ${prop} is equal to ${actual}, expected ${expected}", - {func:func, e:e, prop:prop, actual:e[prop], expected:required_props[prop]}); - } - } - } - expose(assert_throws, "assert_throws"); - - function assert_unreached(description) { - assert(false, "assert_unreached", description, - "Reached unreachable code"); - } - expose(assert_unreached, "assert_unreached"); - - function assert_any(assert_func, actual, expected_array) - { - var args = [].slice.call(arguments, 3); - var errors = []; - var passed = false; - forEach(expected_array, - function(expected) - { - try { - assert_func.apply(this, [actual, expected].concat(args)); - passed = true; - } catch (e) { - errors.push(e.message); - } - }); - if (!passed) { - throw new AssertionError(errors.join("\n\n")); - } - } - expose(assert_any, "assert_any"); - - function Test(name, properties) - { - if (tests.file_is_test && tests.tests.length) { - throw new Error("Tried to create a test with file_is_test"); - } - this.name = name; - - this.phase = tests.phase === tests.phases.ABORTED ? - this.phases.COMPLETE : this.phases.INITIAL; - - this.status = this.NOTRUN; - this.timeout_id = null; - this.index = null; - - this.properties = properties; - var timeout = properties.timeout ? properties.timeout : settings.test_timeout; - if (timeout !== null) { - this.timeout_length = timeout * tests.timeout_multiplier; - } else { - this.timeout_length = null; - } - - this.message = null; - this.stack = null; - - this.steps = []; - - this.cleanup_callbacks = []; - this._user_defined_cleanup_count = 0; - - tests.push(this); - } - - Test.statuses = { - PASS:0, - FAIL:1, - TIMEOUT:2, - NOTRUN:3 - }; - - Test.prototype = merge({}, Test.statuses); - - Test.prototype.phases = { - INITIAL:0, - STARTED:1, - HAS_RESULT:2, - COMPLETE:3 - }; - - Test.prototype.structured_clone = function() - { - if (!this._structured_clone) { - var msg = this.message; - msg = msg ? String(msg) : msg; - this._structured_clone = merge({ - name:String(this.name), - properties:merge({}, this.properties), - phases:merge({}, this.phases) - }, Test.statuses); - } - this._structured_clone.status = this.status; - this._structured_clone.message = this.message; - this._structured_clone.stack = this.stack; - this._structured_clone.index = this.index; - this._structured_clone.phase = this.phase; - return this._structured_clone; - }; - - Test.prototype.step = function(func, this_obj) - { - if (this.phase > this.phases.STARTED) { - return; - } - this.phase = this.phases.STARTED; - //If we don't get a result before the harness times out that will be a test timout - this.set_status(this.TIMEOUT, "Test timed out"); - - tests.started = true; - tests.notify_test_state(this); - - if (this.timeout_id === null) { - this.set_timeout(); - } - - this.steps.push(func); - - if (arguments.length === 1) { - this_obj = this; - } - - try { - return func.apply(this_obj, Array.prototype.slice.call(arguments, 2)); - } catch (e) { - if (this.phase >= this.phases.HAS_RESULT) { - return; - } - var message = String((typeof e === "object" && e !== null) ? e.message : e); - var stack = e.stack ? e.stack : null; - - this.set_status(this.FAIL, message, stack); - this.phase = this.phases.HAS_RESULT; - this.done(); - } - }; - - Test.prototype.step_func = function(func, this_obj) - { - var test_this = this; - - if (arguments.length === 1) { - this_obj = test_this; - } - - return function() - { - return test_this.step.apply(test_this, [func, this_obj].concat( - Array.prototype.slice.call(arguments))); - }; - }; - - Test.prototype.step_func_done = function(func, this_obj) - { - var test_this = this; - - if (arguments.length === 1) { - this_obj = test_this; - } - - return function() - { - if (func) { - test_this.step.apply(test_this, [func, this_obj].concat( - Array.prototype.slice.call(arguments))); - } - test_this.done(); - }; - }; - - Test.prototype.unreached_func = function(description) - { - return this.step_func(function() { - assert_unreached(description); - }); - }; - - Test.prototype.step_timeout = function(f, timeout) { - var test_this = this; - var args = Array.prototype.slice.call(arguments, 2); - return setTimeout(this.step_func(function() { - return f.apply(test_this, args); - }), timeout * tests.timeout_multiplier); - } - - /* - * Private method for registering cleanup functions. `testharness.js` - * internals should use this method instead of the public `add_cleanup` - * method in order to hide implementation details from the harness status - * message in the case errors. - */ - Test.prototype._add_cleanup = function(callback) { - this.cleanup_callbacks.push(callback); - }; - - /* - * Schedule a function to be run after the test result is known, regardless - * of passing or failing state. The behavior of this function will not - * influence the result of the test, but if an exception is thrown, the - * test harness will report an error. - */ - Test.prototype.add_cleanup = function(callback) { - this._user_defined_cleanup_count += 1; - this._add_cleanup(callback); - }; - - Test.prototype.set_timeout = function() - { - if (this.timeout_length !== null) { - var this_obj = this; - this.timeout_id = setTimeout(function() - { - this_obj.timeout(); - }, this.timeout_length); - } - }; - - Test.prototype.set_status = function(status, message, stack) - { - this.status = status; - this.message = message; - this.stack = stack ? stack : null; - }; - - Test.prototype.timeout = function() - { - this.timeout_id = null; - this.set_status(this.TIMEOUT, "Test timed out"); - this.phase = this.phases.HAS_RESULT; - this.done(); - }; - - Test.prototype.force_timeout = Test.prototype.timeout; - - Test.prototype.done = function() - { - if (this.phase == this.phases.COMPLETE) { - return; - } - - if (this.phase <= this.phases.STARTED) { - this.set_status(this.PASS, null); - } - - this.phase = this.phases.COMPLETE; - - clearTimeout(this.timeout_id); - tests.result(this); - this.cleanup(); - }; - - /* - * Invoke all specified cleanup functions. If one or more produce an error, - * the context is in an unpredictable state, so all further testing should - * be cancelled. - */ - Test.prototype.cleanup = function() { - var error_count = 0; - var total; - - forEach(this.cleanup_callbacks, - function(cleanup_callback) { - try { - cleanup_callback(); - } catch (e) { - // Set test phase immediately so that tests declared - // within subsequent cleanup functions are not run. - tests.phase = tests.phases.ABORTED; - error_count += 1; - } - }); - - if (error_count > 0) { - total = this._user_defined_cleanup_count; - tests.status.status = tests.status.ERROR; - tests.status.message = "Test named '" + this.name + - "' specified " + total + " 'cleanup' function" + - (total > 1 ? "s" : "") + ", and " + error_count + " failed."; - tests.status.stack = null; - } - }; - - /* - * A RemoteTest object mirrors a Test object on a remote worker. The - * associated RemoteWorker updates the RemoteTest object in response to - * received events. In turn, the RemoteTest object replicates these events - * on the local document. This allows listeners (test result reporting - * etc..) to transparently handle local and remote events. - */ - function RemoteTest(clone) { - var this_obj = this; - Object.keys(clone).forEach( - function(key) { - this_obj[key] = clone[key]; - }); - this.index = null; - this.phase = this.phases.INITIAL; - this.update_state_from(clone); - tests.push(this); - } - - RemoteTest.prototype.structured_clone = function() { - var clone = {}; - Object.keys(this).forEach( - (function(key) { - var value = this[key]; - - if (typeof value === "object" && value !== null) { - clone[key] = merge({}, value); - } else { - clone[key] = value; - } - }).bind(this)); - clone.phases = merge({}, this.phases); - return clone; - }; - - RemoteTest.prototype.cleanup = function() {}; - RemoteTest.prototype.phases = Test.prototype.phases; - RemoteTest.prototype.update_state_from = function(clone) { - this.status = clone.status; - this.message = clone.message; - this.stack = clone.stack; - if (this.phase === this.phases.INITIAL) { - this.phase = this.phases.STARTED; - } - }; - RemoteTest.prototype.done = function() { - this.phase = this.phases.COMPLETE; - } - - /* - * A RemoteContext listens for test events from a remote test context, such - * as another window or a worker. These events are then used to construct - * and maintain RemoteTest objects that mirror the tests running in the - * remote context. - * - * An optional third parameter can be used as a predicate to filter incoming - * MessageEvents. - */ - function RemoteContext(remote, message_target, message_filter) { - this.running = true; - this.tests = new Array(); - - var this_obj = this; - // If remote context is cross origin assigning to onerror is not - // possible, so silently catch those errors. - try { - remote.onerror = function(error) { this_obj.remote_error(error); }; - } catch (e) { - // Ignore. - } - - // Keeping a reference to the remote object and the message handler until - // remote_done() is seen prevents the remote object and its message channel - // from going away before all the messages are dispatched. - this.remote = remote; - this.message_target = message_target; - this.message_handler = function(message) { - var passesFilter = !message_filter || message_filter(message); - if (this_obj.running && message.data && passesFilter && - (message.data.type in this_obj.message_handlers)) { - this_obj.message_handlers[message.data.type].call(this_obj, message.data); - } - }; - - this.message_target.addEventListener("message", this.message_handler); - } - - RemoteContext.prototype.remote_error = function(error) { - var message = error.message || String(error); - var filename = (error.filename ? " " + error.filename: ""); - // FIXME: Display remote error states separately from main document - // error state. - this.remote_done({ - status: { - status: tests.status.ERROR, - message: "Error in remote" + filename + ": " + message, - stack: error.stack - } - }); - - if (error.preventDefault) { - error.preventDefault(); - } - }; - - RemoteContext.prototype.test_state = function(data) { - var remote_test = this.tests[data.test.index]; - if (!remote_test) { - remote_test = new RemoteTest(data.test); - this.tests[data.test.index] = remote_test; - } - remote_test.update_state_from(data.test); - tests.notify_test_state(remote_test); - }; - - RemoteContext.prototype.test_done = function(data) { - var remote_test = this.tests[data.test.index]; - remote_test.update_state_from(data.test); - remote_test.done(); - tests.result(remote_test); - }; - - RemoteContext.prototype.remote_done = function(data) { - if (tests.status.status === null && - data.status.status !== data.status.OK) { - tests.status.status = data.status.status; - tests.status.message = data.status.message; - tests.status.stack = data.status.stack; - } - this.message_target.removeEventListener("message", this.message_handler); - this.running = false; - this.remote = null; - this.message_target = null; - if (tests.all_done()) { - tests.complete(); - } - }; - - RemoteContext.prototype.message_handlers = { - test_state: RemoteContext.prototype.test_state, - result: RemoteContext.prototype.test_done, - complete: RemoteContext.prototype.remote_done - }; - - /* - * Harness - */ - - function TestsStatus() - { - this.status = null; - this.message = null; - this.stack = null; - } - - TestsStatus.statuses = { - OK:0, - ERROR:1, - TIMEOUT:2 - }; - - TestsStatus.prototype = merge({}, TestsStatus.statuses); - - TestsStatus.prototype.structured_clone = function() - { - if (!this._structured_clone) { - var msg = this.message; - msg = msg ? String(msg) : msg; - this._structured_clone = merge({ - status:this.status, - message:msg, - stack:this.stack - }, TestsStatus.statuses); - } - return this._structured_clone; - }; - - function Tests() - { - this.tests = []; - this.num_pending = 0; - - this.phases = { - INITIAL:0, - SETUP:1, - HAVE_TESTS:2, - HAVE_RESULTS:3, - COMPLETE:4, - ABORTED:5 - }; - this.phase = this.phases.INITIAL; - - this.properties = {}; - - this.wait_for_finish = false; - this.processing_callbacks = false; - - this.allow_uncaught_exception = false; - - this.file_is_test = false; - - this.timeout_multiplier = 1; - this.timeout_length = test_environment.test_timeout(); - this.timeout_id = null; - - this.start_callbacks = []; - this.test_state_callbacks = []; - this.test_done_callbacks = []; - this.all_done_callbacks = []; - - this.pending_remotes = []; - - this.status = new TestsStatus(); - - var this_obj = this; - - test_environment.add_on_loaded_callback(function() { - if (this_obj.all_done()) { - this_obj.complete(); - } - }); - - this.set_timeout(); - } - - Tests.prototype.setup = function(func, properties) - { - if (this.phase >= this.phases.HAVE_RESULTS) { - return; - } - - if (this.phase < this.phases.SETUP) { - this.phase = this.phases.SETUP; - } - - this.properties = properties; - - for (var p in properties) { - if (properties.hasOwnProperty(p)) { - var value = properties[p]; - if (p == "allow_uncaught_exception") { - this.allow_uncaught_exception = value; - } else if (p == "explicit_done" && value) { - this.wait_for_finish = true; - } else if (p == "explicit_timeout" && value) { - this.timeout_length = null; - if (this.timeout_id) - { - clearTimeout(this.timeout_id); - } - } else if (p == "timeout_multiplier") { - this.timeout_multiplier = value; - } - } - } - - if (func) { - try { - func(); - } catch (e) { - this.status.status = this.status.ERROR; - this.status.message = String(e); - this.status.stack = e.stack ? e.stack : null; - } - } - this.set_timeout(); - }; - - Tests.prototype.set_file_is_test = function() { - if (this.tests.length > 0) { - throw new Error("Tried to set file as test after creating a test"); - } - this.wait_for_finish = true; - this.file_is_test = true; - // Create the test, which will add it to the list of tests - async_test(); - }; - - Tests.prototype.set_timeout = function() { - var this_obj = this; - clearTimeout(this.timeout_id); - if (this.timeout_length !== null) { - this.timeout_id = setTimeout(function() { - this_obj.timeout(); - }, this.timeout_length); - } - }; - - Tests.prototype.timeout = function() { - if (this.status.status === null) { - this.status.status = this.status.TIMEOUT; - } - this.complete(); - }; - - Tests.prototype.end_wait = function() - { - this.wait_for_finish = false; - if (this.all_done()) { - this.complete(); - } - }; - - Tests.prototype.push = function(test) - { - if (this.phase < this.phases.HAVE_TESTS) { - this.start(); - } - this.num_pending++; - test.index = this.tests.push(test); - this.notify_test_state(test); - }; - - Tests.prototype.notify_test_state = function(test) { - var this_obj = this; - forEach(this.test_state_callbacks, - function(callback) { - callback(test, this_obj); - }); - }; - - Tests.prototype.all_done = function() { - return this.phase === this.phases.ABORTED || - (this.tests.length > 0 && test_environment.all_loaded && - this.num_pending === 0 && !this.wait_for_finish && - !this.processing_callbacks && - !this.pending_remotes.some(function(w) { return w.running; })); - }; - - Tests.prototype.start = function() { - this.phase = this.phases.HAVE_TESTS; - this.notify_start(); - }; - - Tests.prototype.notify_start = function() { - var this_obj = this; - forEach (this.start_callbacks, - function(callback) - { - callback(this_obj.properties); - }); - }; - - Tests.prototype.result = function(test) - { - if (this.phase > this.phases.HAVE_RESULTS) { - return; - } - this.phase = this.phases.HAVE_RESULTS; - this.num_pending--; - this.notify_result(test); - }; - - Tests.prototype.notify_result = function(test) { - var this_obj = this; - this.processing_callbacks = true; - forEach(this.test_done_callbacks, - function(callback) - { - callback(test, this_obj); - }); - this.processing_callbacks = false; - if (this_obj.all_done()) { - this_obj.complete(); - } - }; - - Tests.prototype.complete = function() { - if (this.phase === this.phases.COMPLETE) { - return; - } - this.phase = this.phases.COMPLETE; - var this_obj = this; - this.tests.forEach( - function(x) - { - if (x.phase < x.phases.COMPLETE) { - this_obj.notify_result(x); - x.cleanup(); - x.phase = x.phases.COMPLETE; - } - } - ); - this.notify_complete(); - }; - - /* - * Determine if any tests share the same `name` property. Return an array - * containing the names of any such duplicates. - */ - Tests.prototype.find_duplicates = function() { - var names = Object.create(null); - var duplicates = []; - - forEach (this.tests, - function(test) - { - if (test.name in names && duplicates.indexOf(test.name) === -1) { - duplicates.push(test.name); - } - names[test.name] = true; - }); - - return duplicates; - }; - - Tests.prototype.notify_complete = function() { - var this_obj = this; - var duplicates; - - if (this.status.status === null) { - duplicates = this.find_duplicates(); - - // Test names are presumed to be unique within test files--this - // allows consumers to use them for identification purposes. - // Duplicated names violate this expectation and should therefore - // be reported as an error. - if (duplicates.length) { - this.status.status = this.status.ERROR; - this.status.message = - duplicates.length + ' duplicate test name' + - (duplicates.length > 1 ? 's' : '') + ': "' + - duplicates.join('", "') + '"'; - } else { - this.status.status = this.status.OK; - } - } - - forEach (this.all_done_callbacks, - function(callback) - { - callback(this_obj.tests, this_obj.status); - }); - }; - - /* - * Constructs a RemoteContext that tracks tests from a specific worker. - */ - Tests.prototype.create_remote_worker = function(worker) { - var message_port; - - if (is_service_worker(worker)) { - if (window.MessageChannel) { - // The ServiceWorker's implicit MessagePort is currently not - // reliably accessible from the ServiceWorkerGlobalScope due to - // Blink setting MessageEvent.source to null for messages sent - // via ServiceWorker.postMessage(). Until that's resolved, - // create an explicit MessageChannel and pass one end to the - // worker. - var message_channel = new MessageChannel(); - message_port = message_channel.port1; - message_port.start(); - worker.postMessage({type: "connect"}, [message_channel.port2]); - } else { - // If MessageChannel is not available, then try the - // ServiceWorker.postMessage() approach using MessageEvent.source - // on the other end. - message_port = navigator.serviceWorker; - worker.postMessage({type: "connect"}); - } - } else if (is_shared_worker(worker)) { - message_port = worker.port; - message_port.start(); - } else { - message_port = worker; - } - - return new RemoteContext(worker, message_port); - }; - - /* - * Constructs a RemoteContext that tracks tests from a specific window. - */ - Tests.prototype.create_remote_window = function(remote) { - remote.postMessage({type: "getmessages"}, "*"); - return new RemoteContext( - remote, - window, - function(msg) { - return msg.source === remote; - } - ); - }; - - Tests.prototype.fetch_tests_from_worker = function(worker) { - if (this.phase >= this.phases.COMPLETE) { - return; - } - - this.pending_remotes.push(this.create_remote_worker(worker)); - }; - - function fetch_tests_from_worker(port) { - tests.fetch_tests_from_worker(port); - } - expose(fetch_tests_from_worker, 'fetch_tests_from_worker'); - - Tests.prototype.fetch_tests_from_window = function(remote) { - if (this.phase >= this.phases.COMPLETE) { - return; - } - - this.pending_remotes.push(this.create_remote_window(remote)); - }; - - function fetch_tests_from_window(window) { - tests.fetch_tests_from_window(window); - } - expose(fetch_tests_from_window, 'fetch_tests_from_window'); - - function timeout() { - if (tests.timeout_length === null) { - tests.timeout(); - } - } - expose(timeout, 'timeout'); - - function add_start_callback(callback) { - tests.start_callbacks.push(callback); - } - - function add_test_state_callback(callback) { - tests.test_state_callbacks.push(callback); - } - - function add_result_callback(callback) { - tests.test_done_callbacks.push(callback); - } - - function add_completion_callback(callback) { - tests.all_done_callbacks.push(callback); - } - - expose(add_start_callback, 'add_start_callback'); - expose(add_test_state_callback, 'add_test_state_callback'); - expose(add_result_callback, 'add_result_callback'); - expose(add_completion_callback, 'add_completion_callback'); - - function remove(array, item) { - var index = array.indexOf(item); - if (index > -1) { - array.splice(index, 1); - } - } - - function remove_start_callback(callback) { - remove(tests.start_callbacks, callback); - } - - function remove_test_state_callback(callback) { - remove(tests.test_state_callbacks, callback); - } - - function remove_result_callback(callback) { - remove(tests.test_done_callbacks, callback); - } - - function remove_completion_callback(callback) { - remove(tests.all_done_callbacks, callback); - } - - /* - * Output listener - */ - - function Output() { - this.output_document = document; - this.output_node = null; - this.enabled = settings.output; - this.phase = this.INITIAL; - } - - Output.prototype.INITIAL = 0; - Output.prototype.STARTED = 1; - Output.prototype.HAVE_RESULTS = 2; - Output.prototype.COMPLETE = 3; - - Output.prototype.setup = function(properties) { - if (this.phase > this.INITIAL) { - return; - } - - //If output is disabled in testharnessreport.js the test shouldn't be - //able to override that - this.enabled = this.enabled && (properties.hasOwnProperty("output") ? - properties.output : settings.output); - }; - - Output.prototype.init = function(properties) { - if (this.phase >= this.STARTED) { - return; - } - if (properties.output_document) { - this.output_document = properties.output_document; - } else { - this.output_document = document; - } - this.phase = this.STARTED; - }; - - Output.prototype.resolve_log = function() { - var output_document; - if (typeof this.output_document === "function") { - output_document = this.output_document.apply(undefined); - } else { - output_document = this.output_document; - } - if (!output_document) { - return; - } - var node = output_document.getElementById("log"); - if (!node) { - if (!document.readyState == "loading") { - return; - } - node = output_document.createElementNS("http://www.w3.org/1999/xhtml", "div"); - node.id = "log"; - if (output_document.body) { - output_document.body.appendChild(node); - } else { - var is_svg = false; - var output_window = output_document.defaultView; - if (output_window && "SVGSVGElement" in output_window) { - is_svg = output_document.documentElement instanceof output_window.SVGSVGElement; - } - if (is_svg) { - var foreignObject = output_document.createElementNS("http://www.w3.org/2000/svg", "foreignObject"); - foreignObject.setAttribute("width", "100%"); - foreignObject.setAttribute("height", "100%"); - output_document.documentElement.appendChild(foreignObject); - foreignObject.appendChild(node); - } else { - output_document.documentElement.appendChild(node); - } - } - } - this.output_document = output_document; - this.output_node = node; - }; - - Output.prototype.show_status = function() { - if (this.phase < this.STARTED) { - this.init(); - } - if (!this.enabled) { - return; - } - if (this.phase < this.HAVE_RESULTS) { - this.resolve_log(); - this.phase = this.HAVE_RESULTS; - } - var done_count = tests.tests.length - tests.num_pending; - if (this.output_node) { - if (done_count < 100 || - (done_count < 1000 && done_count % 100 === 0) || - done_count % 1000 === 0) { - this.output_node.textContent = "Running, " + - done_count + " complete, " + - tests.num_pending + " remain"; - } - } - }; - - Output.prototype.show_results = function (tests, harness_status) { - if (this.phase >= this.COMPLETE) { - return; - } - if (!this.enabled) { - return; - } - if (!this.output_node) { - this.resolve_log(); - } - this.phase = this.COMPLETE; - - var log = this.output_node; - if (!log) { - return; - } - var output_document = this.output_document; - - while (log.lastChild) { - log.removeChild(log.lastChild); - } - - var harness_url = get_harness_url(); - if (harness_url !== undefined) { - var stylesheet = output_document.createElementNS(xhtml_ns, "link"); - stylesheet.setAttribute("rel", "stylesheet"); - stylesheet.setAttribute("href", harness_url + "testharness.css"); - var heads = output_document.getElementsByTagName("head"); - if (heads.length) { - heads[0].appendChild(stylesheet); - } - } - - var status_text_harness = {}; - status_text_harness[harness_status.OK] = "OK"; - status_text_harness[harness_status.ERROR] = "Error"; - status_text_harness[harness_status.TIMEOUT] = "Timeout"; - - var status_text = {}; - status_text[Test.prototype.PASS] = "Pass"; - status_text[Test.prototype.FAIL] = "Fail"; - status_text[Test.prototype.TIMEOUT] = "Timeout"; - status_text[Test.prototype.NOTRUN] = "Not Run"; - - var status_number = {}; - forEach(tests, - function(test) { - var status = status_text[test.status]; - if (status_number.hasOwnProperty(status)) { - status_number[status] += 1; - } else { - status_number[status] = 1; - } - }); - - function status_class(status) - { - return status.replace(/\s/g, '').toLowerCase(); - } - - var summary_template = ["section", {"id":"summary"}, - ["h2", {}, "Summary"], - function() - { - - var status = status_text_harness[harness_status.status]; - var rv = [["section", {}, - ["p", {}, - "Harness status: ", - ["span", {"class":status_class(status)}, - status - ], - ] - ]]; - - if (harness_status.status === harness_status.ERROR) { - rv[0].push(["pre", {}, harness_status.message]); - if (harness_status.stack) { - rv[0].push(["pre", {}, harness_status.stack]); - } - } - return rv; - }, - ["p", {}, "Found ${num_tests} tests"], - function() { - var rv = [["div", {}]]; - var i = 0; - while (status_text.hasOwnProperty(i)) { - if (status_number.hasOwnProperty(status_text[i])) { - var status = status_text[i]; - rv[0].push(["div", {"class":status_class(status)}, - ["label", {}, - ["input", {type:"checkbox", checked:"checked"}], - status_number[status] + " " + status]]); - } - i++; - } - return rv; - }, - ]; - - log.appendChild(render(summary_template, {num_tests:tests.length}, output_document)); - - forEach(output_document.querySelectorAll("section#summary label"), - function(element) - { - on_event(element, "click", - function(e) - { - if (output_document.getElementById("results") === null) { - e.preventDefault(); - return; - } - var result_class = element.parentNode.getAttribute("class"); - var style_element = output_document.querySelector("style#hide-" + result_class); - var input_element = element.querySelector("input"); - if (!style_element && !input_element.checked) { - style_element = output_document.createElementNS(xhtml_ns, "style"); - style_element.id = "hide-" + result_class; - style_element.textContent = "table#results > tbody > tr."+result_class+"{display:none}"; - output_document.body.appendChild(style_element); - } else if (style_element && input_element.checked) { - style_element.parentNode.removeChild(style_element); - } - }); - }); - - // This use of innerHTML plus manual escaping is not recommended in - // general, but is necessary here for performance. Using textContent - // on each individual <td> adds tens of seconds of execution time for - // large test suites (tens of thousands of tests). - function escape_html(s) - { - return s.replace(/\&/g, "&") - .replace(/</g, "<") - .replace(/"/g, """) - .replace(/'/g, "'"); - } - - function has_assertions() - { - for (var i = 0; i < tests.length; i++) { - if (tests[i].properties.hasOwnProperty("assert")) { - return true; - } - } - return false; - } - - function get_assertion(test) - { - if (test.properties.hasOwnProperty("assert")) { - if (Array.isArray(test.properties.assert)) { - return test.properties.assert.join(' '); - } - return test.properties.assert; - } - return ''; - } - - log.appendChild(document.createElementNS(xhtml_ns, "section")); - var assertions = has_assertions(); - var html = "<h2>Details</h2><table id='results' " + (assertions ? "class='assertions'" : "" ) + ">" + - "<thead><tr><th>Result</th><th>Test Name</th>" + - (assertions ? "<th>Assertion</th>" : "") + - "<th>Message</th></tr></thead>" + - "<tbody>"; - for (var i = 0; i < tests.length; i++) { - html += '<tr class="' + - escape_html(status_class(status_text[tests[i].status])) + - '"><td>' + - escape_html(status_text[tests[i].status]) + - "</td><td>" + - escape_html(tests[i].name) + - "</td><td>" + - (assertions ? escape_html(get_assertion(tests[i])) + "</td><td>" : "") + - escape_html(tests[i].message ? tests[i].message : " ") + - (tests[i].stack ? "<pre>" + - escape_html(tests[i].stack) + - "</pre>": "") + - "</td></tr>"; - } - html += "</tbody></table>"; - try { - log.lastChild.innerHTML = html; - } catch (e) { - log.appendChild(document.createElementNS(xhtml_ns, "p")) - .textContent = "Setting innerHTML for the log threw an exception."; - log.appendChild(document.createElementNS(xhtml_ns, "pre")) - .textContent = html; - } - }; - - /* - * Template code - * - * A template is just a javascript structure. An element is represented as: - * - * [tag_name, {attr_name:attr_value}, child1, child2] - * - * the children can either be strings (which act like text nodes), other templates or - * functions (see below) - * - * A text node is represented as - * - * ["{text}", value] - * - * String values have a simple substitution syntax; ${foo} represents a variable foo. - * - * It is possible to embed logic in templates by using a function in a place where a - * node would usually go. The function must either return part of a template or null. - * - * In cases where a set of nodes are required as output rather than a single node - * with children it is possible to just use a list - * [node1, node2, node3] - * - * Usage: - * - * render(template, substitutions) - take a template and an object mapping - * variable names to parameters and return either a DOM node or a list of DOM nodes - * - * substitute(template, substitutions) - take a template and variable mapping object, - * make the variable substitutions and return the substituted template - * - */ - - function is_single_node(template) - { - return typeof template[0] === "string"; - } - - function substitute(template, substitutions) - { - if (typeof template === "function") { - var replacement = template(substitutions); - if (!replacement) { - return null; - } - - return substitute(replacement, substitutions); - } - - if (is_single_node(template)) { - return substitute_single(template, substitutions); - } - - return filter(map(template, function(x) { - return substitute(x, substitutions); - }), function(x) {return x !== null;}); - } - - function substitute_single(template, substitutions) - { - var substitution_re = /\$\{([^ }]*)\}/g; - - function do_substitution(input) { - var components = input.split(substitution_re); - var rv = []; - for (var i = 0; i < components.length; i += 2) { - rv.push(components[i]); - if (components[i + 1]) { - rv.push(String(substitutions[components[i + 1]])); - } - } - return rv; - } - - function substitute_attrs(attrs, rv) - { - rv[1] = {}; - for (var name in template[1]) { - if (attrs.hasOwnProperty(name)) { - var new_name = do_substitution(name).join(""); - var new_value = do_substitution(attrs[name]).join(""); - rv[1][new_name] = new_value; - } - } - } - - function substitute_children(children, rv) - { - for (var i = 0; i < children.length; i++) { - if (children[i] instanceof Object) { - var replacement = substitute(children[i], substitutions); - if (replacement !== null) { - if (is_single_node(replacement)) { - rv.push(replacement); - } else { - extend(rv, replacement); - } - } - } else { - extend(rv, do_substitution(String(children[i]))); - } - } - return rv; - } - - var rv = []; - rv.push(do_substitution(String(template[0])).join("")); - - if (template[0] === "{text}") { - substitute_children(template.slice(1), rv); - } else { - substitute_attrs(template[1], rv); - substitute_children(template.slice(2), rv); - } - - return rv; - } - - function make_dom_single(template, doc) - { - var output_document = doc || document; - var element; - if (template[0] === "{text}") { - element = output_document.createTextNode(""); - for (var i = 1; i < template.length; i++) { - element.data += template[i]; - } - } else { - element = output_document.createElementNS(xhtml_ns, template[0]); - for (var name in template[1]) { - if (template[1].hasOwnProperty(name)) { - element.setAttribute(name, template[1][name]); - } - } - for (var i = 2; i < template.length; i++) { - if (template[i] instanceof Object) { - var sub_element = make_dom(template[i]); - element.appendChild(sub_element); - } else { - var text_node = output_document.createTextNode(template[i]); - element.appendChild(text_node); - } - } - } - - return element; - } - - function make_dom(template, substitutions, output_document) - { - if (is_single_node(template)) { - return make_dom_single(template, output_document); - } - - return map(template, function(x) { - return make_dom_single(x, output_document); - }); - } - - function render(template, substitutions, output_document) - { - return make_dom(substitute(template, substitutions), output_document); - } - - /* - * Utility funcions - */ - function assert(expected_true, function_name, description, error, substitutions) - { - if (tests.tests.length === 0) { - tests.set_file_is_test(); - } - if (expected_true !== true) { - var msg = make_message(function_name, description, - error, substitutions); - throw new AssertionError(msg); - } - } - - function AssertionError(message) - { - this.message = message; - this.stack = this.get_stack(); - } - expose(AssertionError, "AssertionError"); - - AssertionError.prototype = Object.create(Error.prototype); - - AssertionError.prototype.get_stack = function() { - var stack = new Error().stack; - // IE11 does not initialize 'Error.stack' until the object is thrown. - if (!stack) { - try { - throw new Error(); - } catch (e) { - stack = e.stack; - } - } - - // 'Error.stack' is not supported in all browsers/versions - if (!stack) { - return "(Stack trace unavailable)"; - } - - var lines = stack.split("\n"); - - // Create a pattern to match stack frames originating within testharness.js. These include the - // script URL, followed by the line/col (e.g., '/resources/testharness.js:120:21'). - // Escape the URL per http://stackoverflow.com/questions/3561493/is-there-a-regexp-escape-function-in-javascript - // in case it contains RegExp characters. - var script_url = get_script_url(); - var re_text = script_url ? script_url.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&') : "\\btestharness.js"; - var re = new RegExp(re_text + ":\\d+:\\d+"); - - // Some browsers include a preamble that specifies the type of the error object. Skip this by - // advancing until we find the first stack frame originating from testharness.js. - var i = 0; - while (!re.test(lines[i]) && i < lines.length) { - i++; - } - - // Then skip the top frames originating from testharness.js to begin the stack at the test code. - while (re.test(lines[i]) && i < lines.length) { - i++; - } - - // Paranoid check that we didn't skip all frames. If so, return the original stack unmodified. - if (i >= lines.length) { - return stack; - } - - return lines.slice(i).join("\n"); - } - - function make_message(function_name, description, error, substitutions) - { - for (var p in substitutions) { - if (substitutions.hasOwnProperty(p)) { - substitutions[p] = format_value(substitutions[p]); - } - } - var node_form = substitute(["{text}", "${function_name}: ${description}" + error], - merge({function_name:function_name, - description:(description?description + " ":"")}, - substitutions)); - return node_form.slice(1).join(""); - } - - function filter(array, callable, thisObj) { - var rv = []; - for (var i = 0; i < array.length; i++) { - if (array.hasOwnProperty(i)) { - var pass = callable.call(thisObj, array[i], i, array); - if (pass) { - rv.push(array[i]); - } - } - } - return rv; - } - - function map(array, callable, thisObj) - { - var rv = []; - rv.length = array.length; - for (var i = 0; i < array.length; i++) { - if (array.hasOwnProperty(i)) { - rv[i] = callable.call(thisObj, array[i], i, array); - } - } - return rv; - } - - function extend(array, items) - { - Array.prototype.push.apply(array, items); - } - - function forEach(array, callback, thisObj) - { - for (var i = 0; i < array.length; i++) { - if (array.hasOwnProperty(i)) { - callback.call(thisObj, array[i], i, array); - } - } - } - - function merge(a,b) - { - var rv = {}; - var p; - for (p in a) { - rv[p] = a[p]; - } - for (p in b) { - rv[p] = b[p]; - } - return rv; - } - - function expose(object, name) - { - var components = name.split("."); - var target = test_environment.global_scope(); - for (var i = 0; i < components.length - 1; i++) { - if (!(components[i] in target)) { - target[components[i]] = {}; - } - target = target[components[i]]; - } - target[components[components.length - 1]] = object; - } - - function is_same_origin(w) { - try { - 'random_prop' in w; - return true; - } catch (e) { - return false; - } - } - - /** Returns the 'src' URL of the first <script> tag in the page to include the file 'testharness.js'. */ - function get_script_url() - { - if (!('document' in self)) { - return undefined; - } - - var scripts = document.getElementsByTagName("script"); - for (var i = 0; i < scripts.length; i++) { - var src; - if (scripts[i].src) { - src = scripts[i].src; - } else if (scripts[i].href) { - //SVG case - src = scripts[i].href.baseVal; - } - - var matches = src && src.match(/^(.*\/|)testharness\.js$/); - if (matches) { - return src; - } - } - return undefined; - } - - /** Returns the URL path at which the files for testharness.js are assumed to reside (e.g., '/resources/'). - The path is derived from inspecting the 'src' of the <script> tag that included 'testharness.js'. */ - function get_harness_url() - { - var script_url = get_script_url(); - - // Exclude the 'testharness.js' file from the returned path, but '+ 1' to include the trailing slash. - return script_url ? script_url.slice(0, script_url.lastIndexOf('/') + 1) : undefined; - } - - function supports_post_message(w) - { - var supports; - var type; - // Given IE implements postMessage across nested iframes but not across - // windows or tabs, you can't infer cross-origin communication from the presence - // of postMessage on the current window object only. - // - // Touching the postMessage prop on a window can throw if the window is - // not from the same origin AND post message is not supported in that - // browser. So just doing an existence test here won't do, you also need - // to wrap it in a try..cacth block. - try { - type = typeof w.postMessage; - if (type === "function") { - supports = true; - } - - // IE8 supports postMessage, but implements it as a host object which - // returns "object" as its `typeof`. - else if (type === "object") { - supports = true; - } - - // This is the case where postMessage isn't supported AND accessing a - // window property across origins does NOT throw (e.g. old Safari browser). - else { - supports = false; - } - } catch (e) { - // This is the case where postMessage isn't supported AND accessing a - // window property across origins throws (e.g. old Firefox browser). - supports = false; - } - return supports; - } - - /** - * Setup globals - */ - - var tests = new Tests(); - - var error_handler = function(e) { - if (tests.tests.length === 0 && !tests.allow_uncaught_exception) { - tests.set_file_is_test(); - } - - var stack; - if (e.error && e.error.stack) { - stack = e.error.stack; - } else { - stack = e.filename + ":" + e.lineno + ":" + e.colno; - } - - if (tests.file_is_test) { - var test = tests.tests[0]; - if (test.phase >= test.phases.HAS_RESULT) { - return; - } - test.set_status(test.FAIL, e.message, stack); - test.phase = test.phases.HAS_RESULT; - test.done(); - } else if (!tests.allow_uncaught_exception) { - tests.status.status = tests.status.ERROR; - tests.status.message = e.message; - tests.status.stack = stack; - } - done(); - }; - - addEventListener("error", error_handler, false); - addEventListener("unhandledrejection", function(e){ error_handler(e.reason); }, false); - - test_environment.on_tests_ready(); - -})(); -// vim: set expandtab shiftwidth=4 tabstop=4: diff --git a/src/gui/test/browser/resources/testharnessreport.js b/src/gui/test/browser/resources/testharnessreport.js deleted file mode 100644 index e5cb40fe..00000000 --- a/src/gui/test/browser/resources/testharnessreport.js +++ /dev/null @@ -1,57 +0,0 @@ -/* global add_completion_callback */ -/* global setup */ - -/* - * This file is intended for vendors to implement code needed to integrate - * testharness.js tests with their own test systems. - * - * Typically test system integration will attach callbacks when each test has - * run, using add_result_callback(callback(test)), or when the whole test file - * has completed, using - * add_completion_callback(callback(tests, harness_status)). - * - * For more documentation about the callback functions and the - * parameters they are called with see testharness.js - */ - -function dump_test_results(tests, status) { - var results_element = document.createElement("script"); - results_element.type = "text/json"; - results_element.id = "__testharness__results__"; - var test_results = tests.map(function(x) { - return {name:x.name, status:x.status, message:x.message, stack:x.stack} - }); - var data = {test:window.location.href, - tests:test_results, - status: status.status, - message: status.message, - stack: status.stack}; - results_element.textContent = JSON.stringify(data); - - // To avoid a HierarchyRequestError with XML documents, ensure that 'results_element' - // is inserted at a location that results in a valid document. - var parent = document.body - ? document.body // <body> is required in XHTML documents - : document.documentElement; // fallback for optional <body> in HTML5, SVG, etc. - - parent.appendChild(results_element); -} - -add_completion_callback(dump_test_results); - -/* If the parent window has a testharness_properties object, - * we use this to provide the test settings. This is used by the - * default in-browser runner to configure the timeout and the - * rendering of results - */ -try { - if (window.opener && "testharness_properties" in window.opener) { - /* If we pass the testharness_properties object as-is here without - * JSON stringifying and reparsing it, IE fails & emits the message - * "Could not complete the operation due to error 80700019". - */ - setup(JSON.parse(JSON.stringify(window.opener.testharness_properties))); - } -} catch (e) { -} -// vim: set expandtab shiftwidth=4 tabstop=4: diff --git a/src/gui/test/browser/server.js b/src/gui/test/browser/server.js deleted file mode 100644 index 3117e5e5..00000000 --- a/src/gui/test/browser/server.js +++ /dev/null @@ -1,22 +0,0 @@ -// Copyright (c) 2017 Intel Corporation. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -'use strict'; - -const express = require('express'); -const app = express(); - -app.use(express.static('.')); - -app.listen(8080); diff --git a/src/gui/test/browser/test-example.html b/src/gui/test/browser/test-example.html deleted file mode 100644 index 9d805444..00000000 --- a/src/gui/test/browser/test-example.html +++ /dev/null @@ -1,27 +0,0 @@ -<!DOCTYPE html> -<html> -<head> - <meta charset="UTF-8"> - <title>Example tests with testharness.js for Travis CI</title> - <script src="resources/testharness.js"></script> - <script src="resources/testharnessreport.js"></script> - <script src="https://static.robotwebtools.org/EventEmitter2/current/eventemitter2.min.js"></script> - <script src="https://static.robotwebtools.org/roslibjs/current/roslib.js"></script> -</head> -<body> - <div id="log"></div> - <script> - test(function(t) { - var ros = new ROSLIB.Ros(); - var example = new ROSLIB.Topic({ - ros : ros, - name : '/example_topic', - messageType : 'std_msgs/String' - }); - - assert_true(true, "Nothing wrong happened."); - }, "Simple test"); - - </script> -</body> -</html> diff --git a/src/gui/test/browser/test-goal.html b/src/gui/test/browser/test-goal.html deleted file mode 100644 index 52226088..00000000 --- a/src/gui/test/browser/test-goal.html +++ /dev/null @@ -1,27 +0,0 @@ -<!DOCTYPE html> -<html> -<head> - <meta charset="UTF-8"> - <title>Example tests with testharness.js for Travis CI</title> - <script src="resources/testharness.js"></script> - <script src="resources/testharnessreport.js"></script> - <script src="https://static.robotwebtools.org/EventEmitter2/current/eventemitter2.min.js"></script> - <script src="https://static.robotwebtools.org/roslibjs/current/roslib.js"></script> -</head> -<body> - <div id="log"></div> - <script> - test(function(t) { - var ros = new ROSLIB.Ros(); - var example = new ROSLIB.Topic({ - ros : ros, - name : '/example_topic', - messageType : 'std_msgs/String' - }); - - assert_true(true, "Nothing wrong happened."); - }, "Goal sample test"); - - </script> -</body> -</html> diff --git a/src/gui/test/browser/test-html.js b/src/gui/test/browser/test-html.js deleted file mode 100644 index 49c0704e..00000000 --- a/src/gui/test/browser/test-html.js +++ /dev/null @@ -1,94 +0,0 @@ -// Copyright (c) 2017 Intel Corporation. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -'use strict'; - -const assert = require('assert'); -const fs = require('fs'); -const path = require('path'); -const child = require('child_process'); -const puppeteer = require('puppeteer'); -const jsdom = require('jsdom'); -const async = require('async'); -const Mocha = require('mocha'); -const htmlTests = require('./html_list.json').htmls; - -let bridgePath = path.join(`{__dirname}/../`, 'bin', 'rosbridge.js'); -let bridge = child.fork(bridgePath); -let server = child.fork(`${__dirname}/server.js`, {cwd: `${__dirname}`}); - -let browserTestResults = []; -async.each(htmlTests, async function (html, callback) { - let browser = await puppeteer.launch({args: ['--no-sandbox']}); - let page = await browser.newPage(); - await page.setViewport({width: 1280, height: 960}); - await page.goto('http://127.0.0.1:8080/' + html.suite, {waitUntil: 'load'}); - await page.waitFor(html.waitingTime); - - let results = await page.evaluate(() => { - return document.querySelector('#results').outerHTML; - }); - - let dom = new jsdom.JSDOM(results, { contentType: 'text/html'}); - let testSuite = {}; - testSuite['suite'] = html.suite; - testSuite['results'] = []; - for (let i = 0; i < dom.window.document.querySelector('tbody').rows.length; i++) { - let testResult = {}; - testResult['caseId'] = dom.window.document.querySelector('tbody').rows[i].cells[1].textContent; - testResult['result'] = dom.window.document.querySelector('tbody').rows[i].cells[0].textContent; - testResult['message'] = dom.window.document.querySelector('tbody').rows[i].cells[2].textContent; - - testResult['component'] = 'roslibjs'; - testResult['purpose'] = ''; - testResult['type'] = 'auto'; - testResult['comment'] = ''; - - testSuite['results'].push(testResult); - } - - browserTestResults.push(testSuite); - await browser.close(); -}, function () { - server.kill('SIGINT'); - bridge.kill('SIGINT'); - - let testBrowser = "'use strict';\n"; - testBrowser += "const assert = require('assert');\n\n"; - testBrowser += "describe('Roslibjs API testing over ros2-web-bridge', function() {\n"; - browserTestResults.forEach((thisSuite, index) => { - testBrowser += " describe('" + thisSuite.suite + "', function() {\n"; - thisSuite['results'].forEach((thisResult, index) => { - testBrowser += " it('" + thisResult.caseId + "', function() {\n"; - testBrowser += " assert.strictEqual('" + thisResult.result - + "', 'Pass', String.raw`" - + thisResult.message + "`);\n"; - testBrowser += " });\n"; - }); - testBrowser += " });\n\n"; - }); - testBrowser += "});\n"; - - fs.writeFile(path.join(`${__dirname}`, 'test-browser.js'), testBrowser, 'utf8', (err) => { - if (err) throw err; - - let mocha = new Mocha(); - mocha.addFile(path.join(`${__dirname}`, 'test-browser.js')); - mocha.run(function(failures){ - process.on('exit', function () { - process.exit(failures); - }); - }); - }); -}); diff --git a/src/gui/test/browser/test-ros.html b/src/gui/test/browser/test-ros.html deleted file mode 100644 index a8806a7d..00000000 --- a/src/gui/test/browser/test-ros.html +++ /dev/null @@ -1,161 +0,0 @@ -<!DOCTYPE html> -<html> -<head> - <meta charset="UTF-8"> - <title>Example tests with testharness.js for Travis CI</title> - <script src="resources/testharness.js"></script> - <script src="resources/testharnessreport.js"></script> - <script src="https://static.robotwebtools.org/EventEmitter2/current/eventemitter2.min.js"></script> - <script src="https://static.robotwebtools.org/roslibjs/current/roslib.js"></script> -</head> -<body> - <div id="log"></div> - <script> - async_test(function(t) { - var ros = new ROSLIB.Ros({url: 'ws://127.0.0.1:9090'}); - - ros.on('connection', t.step_func_done(function() { - assert_true(true, 'Connection event triggered.'); - })); - - }, 'Ros class constructor positive case 1'); - - test(function() { - var ros = new ROSLIB.Ros(); - - ros.on('connection', function() { - assert_unreached('Connection event not triggered.'); - }); - }, 'Ros class constructor positive case 2'); - - async_test(function(t) { - var ros = new ROSLIB.Ros({url: 'ws://127.0.0.1:9090'}); - - ros.on('connection', t.step_func_done(function() { - assert_true(true, 'Connection event triggered.'); - })); - - ros.callOnConnection(); - - }, 'Ros.callOnConnection() positive test case 1'); - - async_test(function(t) { - var ros = new ROSLIB.Ros({url: 'ws://127.0.0.1:9090'}); - - ros.on('connection', t.step_func_done(function() { - assert_true(true, 'Connection event triggered.'); - })); - - const adMsg = {op: 'advertise', topic: '/callOnConn_topic', type: 'std_msgs/String'}; - ros.callOnConnection(adMsg); - - }, 'Ros.callOnConnection() positive test case 2'); - - test(function() { - var ros = new ROSLIB.Ros(); - - ros.on('connection', function() { - assert_unreached('Connection event should never be triggered.'); - }); - const adMsg = {op: 'advertise', topic: '/callOnConn_neg_topic', type: 'std_msgs/String'}; - ros.callOnConnection(adMsg); - - }, 'Ros.callOnConnection() negative test case'); - - async_test(function(t) { - var ros = new ROSLIB.Ros({url: 'ws://127.0.0.1:9090'}); - - ros.on('connection', t.step_func(function() { - assert_true(true, 'Connected.'); - ros.close(); - })); - ros.on('close', t.step_func_done(function() { - assert_true(true, 'Closed.'); - })); - - }, 'Ros.close() positive test case 1'); - - test(function() { - var ros = new ROSLIB.Ros(); - - ros.on('connection', function() { - assert_unreached('Not connected.'); - }) - ros.on('close', function() { - assert_unreached('Not closed.'); - }); - - ros.close(); - - }, 'Ros.close() negative test case 1'); - - async_test(function(t) { - var ros = new ROSLIB.Ros(); - - ros.on('connection', t.step_func_done(function() { - assert_true(true, 'Connected'); - })); - - ros.connect('ws://127.0.0.1:9090'); - - }, 'Ros.connect() positive test case 1'); - - async_test(function(t) { - var ros = new ROSLIB.Ros(); - - ros.on('connection', t.step_func_done(function() { - assert_true(true, 'Connected.'); - })); - - ros.connect('ws://localhost:9090'); - - }, 'Ros.connect() positive test case 2'); - - test(function() { - var ros = new ROSLIB.Ros(); - - assert_throws(new SyntaxError(), function() { - ros.connect(); - }); - - }, 'Ros.connect() negative test case 1'); - - async_test(function(t) { - var ros = new ROSLIB.Ros(); - - t.step_func_done(function() { - try { - assert_throws(new Error(), function() { - ros.connect('wss://127.0.0.1:9090'); - }); - } catch(e) { - assert_true(true); - } - }); - t.step_timeout(function() { - t.done(); - }, 1000); - - }, 'Ros.connect() negative test case 2'); - - async_test(function(t) { - var ros = new ROSLIB.Ros(); - - t.step_func_done(function() { - try { - assert_throws(new Error(), function() { - ros.connect('ws://127.0.0.1:9091'); - }); - } catch(e) { - assert_true(true); - } - }); - - t.step_timeout(function() { - t.done(); - }, 1000); - - }, 'Ros.connect() negative test case 3'); - </script> -</body> -</html> diff --git a/src/gui/test/browser/test-service.html b/src/gui/test/browser/test-service.html deleted file mode 100644 index fcfd147b..00000000 --- a/src/gui/test/browser/test-service.html +++ /dev/null @@ -1,218 +0,0 @@ -<!DOCTYPE html> -<html> -<head> - <meta charset="UTF-8"> - <title>Example tests with testharness.js for Travis CI</title> - <script src="resources/testharness.js"></script> - <script src="resources/testharnessreport.js"></script> - <script src="https://static.robotwebtools.org/EventEmitter2/current/eventemitter2.min.js"></script> - <script src="https://static.robotwebtools.org/roslibjs/current/roslib.js"></script> -</head> -<body> - <div id="log"></div> - <script> - async_test(function(t) { - var ros = new ROSLIB.Ros({url: 'ws://127.0.0.1:9090'}); - - var svrService = new ROSLIB.Service({ - ros: ros, - name: '/add_two_ints1', - serviceType: 'example_interfaces/AddTwoInts' - }); - svrService.advertise(function(req, resp) { - resp.sum = req.a + req.b; - assert_equals(resp.sum, 3); - assert_true(svrService.isAdvertised); - t.done(); - return true; - }); - - var reqService = new ROSLIB.Service({ - ros: ros, - name: '/add_two_ints1', - serviceType: 'example_interfaces/AddTwoInts' - }); - var request = new ROSLIB.ServiceRequest({ - a: 1, - b: 2 - }); - reqService.callService(request, function(result) { - }); - - }, 'Service.advertise() positive case 1'); - - test(function() { - var ros = new ROSLIB.Ros({url: 'ws://127.0.0.1:9090'}); - - var service = new ROSLIB.Service({ - ros: ros, - name: '/add_two_ints2', - serviceType: 'example_interfaces/AddTwoInts' - }); - - service.advertise(); - assert_false(service.isAdvertised); - - service.advertise('Any objects but a function'); - assert_false(service.isAdvertised); - }, 'Service.advertise() negative case 1'); - - async_test(function(t) { - var ros = new ROSLIB.Ros({url: 'ws://127.0.0.1:9090'}); - - var svrService = new ROSLIB.Service({ - ros: ros, - name: '/add_two_ints3', - serviceType: 'example_interfaces/AddTwoInts' - }); - svrService.advertise(function(req, resp) { - resp.sum = req.a + req.b; - assert_equals(resp.sum, 7); - assert_true(svrService.isAdvertised); - return true; - }); - - var reqService = new ROSLIB.Service({ - ros: ros, - name: '/add_two_ints3', - serviceType: 'example_interfaces/AddTwoInts' - }); - var request = new ROSLIB.ServiceRequest({ - a: 3, - b: 4 - }); - reqService.callService(request, function(result) { - assert_equals(result.sum, 7); - t.done(); - }); - }, 'Service.callService() positive case 1'); - - // async_test(function(t) { - // var ros = new ROSLIB.Ros({url: 'ws://127.0.0.1:9090'}); - - // var svrService = new ROSLIB.Service({ - // ros: ros, - // name: '/add_two_ints4', - // serviceType: 'example_interfaces/AddTwoInts' - // }); - // svrService.advertise(function(req, resp) { - // resp.sum = req.a + req.b; - // assert_equals(resp.sum, 11); - // assert_true(svrService.isAdvertised); - // return true; - // }); - - // var reqService = new ROSLIB.Service({ - // ros: ros, - // name: '/add_two_ints4', - // serviceType: 'example_interfaces/AddTwoInts' - // }); - // var request = new ROSLIB.ServiceRequest({ - // a: 5, - // b: 6 - // }); - // var args = {request: request}; - // reqService.callService(args, function(result) { - // assert_equals(result.sum, 11); - // t.done(); - // }); - - // }, 'Service.callService() positive case 2'); - - async_test(function(t) { - var ros = new ROSLIB.Ros({url: 'ws://127.0.0.1:9090'}); - - var svrService = new ROSLIB.Service({ - ros: ros, - name: '/add_two_ints5', - serviceType: 'example_interfaces/AddTwoInts' - }); - svrService.advertise(function(req, resp) { - resp.sum = req.a + req.b; - assert_equals(resp.sum, 19); - assert_true(svrService.isAdvertised); - return true; - }); - - var reqService = new ROSLIB.Service({ - ros: ros, - name: '/add_two_ints5', - serviceType: 'example_interfaces/AddTwoInts' - }); - reqService.callService({a: 9, b: 10}, function(result) { - assert_equals(result.sum, 19); - t.done(); - }); - - }, 'Service.callService() positive case 3'); - - async_test(function(t) { - var ros = new ROSLIB.Ros({url: 'ws://127.0.0.1:9090'}); - - var svrService = new ROSLIB.Service({ - ros: ros, - name: '/add_two_ints6', - serviceType: 'example_interfaces/AddTwoInts' - }); - svrService.advertise(function(req, resp) { - resp.sum = req.a + req.b; - assert_unreached(); - return true; - }); - - var reqService = new ROSLIB.Service({ - ros: ros, - name: '/add_two_ints6', - serviceType: 'example_interfaces/AddTwoInts' - }); - var request = new ROSLIB.ServiceRequest({ - c: 9, d: 10 - }); - reqService.callService(request, function(result) { - assert_unreached('Never go to here as callService() failed.'); - }); - setTimeout(function() { - t.done(); - }, 1000); - - }, 'Service.callService() negative case 1'); - - test(function() { - var request = new ROSLIB.ServiceRequest({ - a: 1, b: 2 - }); - assert_equals(request.a, 1); - assert_equals(request.b, 2); - }, 'ROSLIB.ServiceRequest object'); - - async_test(function(t) { - var ros = new ROSLIB.Ros({url: 'ws://127.0.0.1:9090'}); - - var svrService = new ROSLIB.Service({ - ros: ros, - name: '/add_two_ints7', - serviceType: 'example_interfaces/AddTwoInts' - }); - svrService.advertise(function(req, resp) { - resp.sum = req.a + req.b; - return true; - }); - - var reqService = new ROSLIB.Service({ - ros: ros, - name: '/add_two_ints7', - serviceType: 'example_interfaces/AddTwoInts' - }); - var request = new ROSLIB.ServiceRequest({ - a: 11, - b: 12 - }); - reqService.callService(request, function(result) { - assert_true(result instanceof ROSLIB.ServiceResponse); - assert_equals(result.sum, 23); - t.done(); - }); - }, 'ROSLIB.ServiceResponse object'); - </script> -</body> -</html> diff --git a/src/gui/test/browser/test-topic.html b/src/gui/test/browser/test-topic.html deleted file mode 100644 index f1a56387..00000000 --- a/src/gui/test/browser/test-topic.html +++ /dev/null @@ -1,192 +0,0 @@ -<!DOCTYPE html> -<html> -<head> - <meta charset="UTF-8"> - <title>Example tests with testharness.js for Travis CI</title> - <script src="resources/testharness.js"></script> - <script src="resources/testharnessreport.js"></script> - <script src="https://static.robotwebtools.org/EventEmitter2/current/eventemitter2.min.js"></script> - <script src="https://static.robotwebtools.org/roslibjs/current/roslib.js"></script> -</head> -<body> - <div id="log"></div> - <script> - test(function(t) { - var ros = new ROSLIB.Ros(); - ros.connect('ws://127.0.0.1:9090'); - - var example = new ROSLIB.Topic({ - ros : ros, - name : '/example_topic1', - messageType : 'std_msgs/String' - }); - example.advertise(); - }, "Topic.advertise() postiive case 1"); - - test(function(t) { - var ros = new ROSLIB.Ros(); - ros.connect('ws://127.0.0.1:9090'); - - var example = new ROSLIB.Topic({ - ros : ros, - name : '/example_topic_neg1', - messageType : 'std_msgs/Foo' - }); - example.advertise(); - }, "Topic.advertise() negative case 2"); - - test(function(t) { - var ros = new ROSLIB.Ros(); - - ros.connect('ws://127.0.0.1:9090'); - var example = new ROSLIB.Topic({ - ros : ros, - name : '/example_topic2', - messageType : 'std_msgs/String' - }); - example.advertise(); - example.publish('hello world'); - }, "Topic.publish() positive case 1"); - - test(function(t) { - var ros = new ROSLIB.Ros(); - - ros.connect('ws://127.0.0.1:9090'); - var example = new ROSLIB.Topic({ - ros : ros, - name : '/example_topic_neg2', - messageType : 'std_msgs/String' - }); - - example.publish('hello world'); - }, "Topic.publish() postive case 2"); - - async_test(function(t) { - var ros = new ROSLIB.Ros(); - ros.connect('ws://127.0.0.1:9090'); - - var example = new ROSLIB.Topic({ - ros : ros, - name : '/example_topic3', - messageType : 'std_msgs/String' - }); - example.subscribe(function(message) { - assert_equals(message.data, 'hello world!'); - t.done(); - }); - example.publish('hello world!'); - }, "Topic.subscribe() positive case 1"); - - async_test(function(t) { - var ros = new ROSLIB.Ros(); - ros.connect('ws://127.0.0.1:9090'); - - var example = new ROSLIB.Topic({ - ros : ros, - name : '/example_topic_neg3', - messageType : 'std_msgs/String' - }); - example.subscribe(function(message) { - assert_unreached('never received message as no publisher'); - }); - setTimeout(function() { - t.done(); - }, 500); - - }, "Topic.subscribe() negative case 1"); - - // test(function(t) { - // var ros = new ROSLIB.Ros(); - // ros.connect('ws://127.0.0.1:9090'); - - // var example = new ROSLIB.Topic({ - // ros : ros, - // name : '/example_topic_read4', - // messageType : 'std_msgs/String' - // }); - // example.toStream().read(); - // example.publish('hello world!'); - // }, "Topic.toStream() read"); - - // test(function(t) { - // var ros = new ROSLIB.Ros(); - // ros.connect('ws://127.0.0.1:9090'); - - // var example = new ROSLIB.Topic({ - // ros : ros, - // name : '/example_topic_write4', - // messageType : 'std_msgs/String' - // }); - // example.toStream().write('again'); - // example.publish('hello world!'); - // }, "Topic.toStream() write"); - - test(function(t) { - var ros = new ROSLIB.Ros(); - ros.connect('ws://127.0.0.1:9090'); - - var example = new ROSLIB.Topic({ - ros : ros, - name : '/example_topic5', - messageType : 'std_msgs/String' - }); - example.advertise(); - example.unadvertise(); - }, "Topic.unadvertise() positive case 1"); - - test(function(t) { - var ros = new ROSLIB.Ros(); - ros.connect('ws://127.0.0.1:9090'); - - var example = new ROSLIB.Topic({ - ros : ros, - name : '/example_topic_neg5', - messageType : 'std_msgs/String' - }); - - example.unadvertise(); - }, "Topic.unadvertise() negative case 1"); - - async_test(function(t) { - var ros = new ROSLIB.Ros(); - ros.connect('ws://127.0.0.1:9090'); - - var example = new ROSLIB.Topic({ - ros : ros, - name : '/example_topic6', - messageType : 'std_msgs/String' - }); - - example.subscribe(function(message) { - assert_equals(message.data, 'hello world!'); - example.unsubscribe(); - t.done(); - }); - example.publish('hello world!'); - }, "Topic.unsubscribe() positive case 1"); - - async_test(function(t) { - var ros = new ROSLIB.Ros(); - ros.connect('ws://127.0.0.1:9090'); - - var example = new ROSLIB.Topic({ - ros : ros, - name : '/example_topic_neg6', - messageType : 'std_msgs/String' - }); - - example.subscribe(function(message) { - assert_equals(message.data, 'hello world!'); - example.unsubscribe(function() { - assert_unreached('unable to reach'); - }); - - setTimeout(function() { - t.done(); - }, 500); - }); - example.publish('hello world!'); - }, "Topic.unsubscribe() negative case 1"); - </script> -</body> -</html> diff --git a/src/gui/test/nodejs/protocol/entry-client-mode.js b/src/gui/test/nodejs/protocol/entry-client-mode.js deleted file mode 100644 index e73d9213..00000000 --- a/src/gui/test/nodejs/protocol/entry-client-mode.js +++ /dev/null @@ -1,77 +0,0 @@ -// Copyright (c) 2017 Intel Corporation. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -'use strict'; - -const assert = require('assert'); -const child = require('child_process'); -const path = require('path'); -const WebSocket = require('ws'); -const TEST_PORT = 9091; - -var rosbridge = path.resolve(__dirname, '../../../bin/rosbridge.js'); - -describe('Rosbridge client mode', function() { - var server; - var bridgeClient; - this.timeout(5 * 1000); - - function startBridge() { - bridgeClient = child.fork(rosbridge, - ['--address=ws://localhost:'+TEST_PORT], - {silent: true} - ); - } - - after(function() { - if (bridgeClient) { - bridgeClient.kill(); - } - server.close(); - }); - - it('can connect to ws server and run command', function() { - return new Promise((resolve, reject) => { - server = new WebSocket.Server({port: TEST_PORT}, function() { - server.on('error', (err) => { - console.log(err); - }); - server.on('connection', function(ws) { - let msg = { - op: 'publish', - id: 'publish:/example_topic:1', - topic: '/example_topic', - msg: { - data: 'hello from ros2bridge 0' - }, - latch: false - }; - ws.on('message', function(data) { - var response = JSON.parse(data); - assert.deepStrictEqual(response.level, 'error'); - ws.close(); - resolve(); - }); - // A long-standing race condition in WS handling of - // new connections prevents us from sending messages - // immediately after startup - // More details at https://github.com/websockets/ws/issues/1393 - setTimeout(() => ws.send(JSON.stringify(msg)), 10); - }); - startBridge(); - }); - }); - }); -}); - diff --git a/src/gui/test/nodejs/protocol/entry.js b/src/gui/test/nodejs/protocol/entry.js deleted file mode 100644 index 7a18cccf..00000000 --- a/src/gui/test/nodejs/protocol/entry.js +++ /dev/null @@ -1,102 +0,0 @@ -// Copyright (c) 2017 Intel Corporation. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -'use strict'; - -const assert = require('assert'); -const child = require('child_process'); -const path = require('path'); -const WebSocket = require('ws'); - -var rosbridge = path.resolve(__dirname, '../../../bin/rosbridge.js'); - -describe('Rosbridge v2.0 protocol testing', function() { - var webSocketServer; - this.timeout(5 * 1000); - - before(function(done) { - webSocketServer = child.fork(rosbridge, ['-l', 'none'], {silent: true}); - webSocketServer.stdout.on('data', function(data) { - done(); - }); - }); - - after(function() { - webSocketServer.kill(); - }); - - describe('sanity', function() { - require('./test-ros2-protocol-workflow.js')(); - }); - - describe('advertise operation', function() { - require('./test-advertise.js')(); - }); - - describe('advertise topic with message types', function() { - require('./test-advertise-msg.js')(); - }); - - describe('unadvertise operation', function() { - require('./test-unadvertise.js')(); - }); - - describe('publish operation', function() { - require('./test-publish.js')(); - }); - - describe('publish message with types', function() { - require('./test-publish-msg.js')(); - }); - - describe('subscribe operation', function() { - require('./test-subscribe.js')(); - }); - - describe('subscribe message with types', function() { - require('./test-subscribe-msg.js')(); - }); - - describe('unsubscribe operation', function() { - require('./test-unsubscribe.js')(); - }); - describe('call_service operation', function() { - require('./test-call-service.js')(); - }); - - describe('advertise_service operation', function() { - require('./test-advertise-service.js')(); - }); - - describe('unadvertise_service operation', function() { - require('./test-unadvertise-service.js')(); - }); - - describe('set_level operation', function() { - require('./test-set-level.js')(); - }); - - // Disable this case temporarily, sine it gets stuck on Windows CI. - // describe('response operations', function() { - // require('./test-response-op.js')(); - // }); - - describe('fuzzing operations', function() { - require('./test-op-neg.js')(); - }); - describe('service_response operation', function() { - require('./test-service-response.js')(); - }); -}); - diff --git a/src/gui/test/nodejs/protocol/test-advertise-msg.js b/src/gui/test/nodejs/protocol/test-advertise-msg.js deleted file mode 100644 index c285c175..00000000 --- a/src/gui/test/nodejs/protocol/test-advertise-msg.js +++ /dev/null @@ -1,115 +0,0 @@ -// Copyright (c) 2017 Intel Corporation. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -'use strict'; - -const assert = require('assert'); -const WebSocket = require('ws'); - -module.exports = function() { - let finalStatus = 'none'; - let testCasesData = [ - { - title: 'advertise topic with message type: Bool', - advertiseMsg: {op: 'advertise', id: 'advertise_bool', topic: 'advertise_bool_topic', type: 'std_msgs/Bool'} - }, - { - title: 'advertise topic with message type: Byte', - advertiseMsg: {op: 'advertise', id: 'advertise_byte', topic: 'advertise_byte_topic', type: 'std_msgs/Byte'} - }, - { - title: 'advertise topic with message type: Char', - advertiseMsg: {op: 'advertise', id: 'advertise_char', topic: 'advertise_char_topic', type: 'std_msgs/Char'} - }, - { - title: 'advertise topic with message type: String', - advertiseMsg: {op: 'advertise', id: 'advertise_string', topic: 'advertise_string_topic', type: 'std_msgs/String'} - }, - { - title: 'advertise topic with message type: Int8', - advertiseMsg: {op: 'advertise', id: 'advertise_int8', topic: 'advertise_int8_topic', type: 'std_msgs/Int8'} - }, - { - title: 'advertise topic with message type: UInt8', - advertiseMsg: {op: 'advertise', id: 'advertise_uint8', topic: 'advertise_uint8_topic', type: 'std_msgs/UInt8'} - }, - { - title: 'advertise topic with message type: Int16', - advertiseMsg: {op: 'advertise', id: 'advertise_int16', topic: 'advertise_int16_topic', type: 'std_msgs/Int16'} - }, - { - title: 'advertise topic with message type: UInt16', - advertiseMsg: {op: 'advertise', id: 'advertise_uint16', topic: 'advertise_uint16_topic', type: 'std_msgs/UInt16'} - }, - { - title: 'advertise topic with message type: Int32', - advertiseMsg: {op: 'advertise', id: 'advertise_int32', topic: 'advertise_int32_topic', type: 'std_msgs/Int32'} - }, - { - title: 'advertise topic with message type: UInt32', - advertiseMsg: {op: 'advertise', id: 'advertise_uint32', topic: 'advertise_uint32_topic', type: 'std_msgs/UInt32'} - }, - { - title: 'advertise topic with message type: Int64', - advertiseMsg: {op: 'advertise', id: 'advertise_int64', topic: 'advertise_int64_topic', type: 'std_msgs/Int64'} - }, - { - title: 'advertise topic with message type: UInt64', - advertiseMsg: {op: 'advertise', id: 'advertise_uint64', topic: 'advertise_uint64_topic', type: 'std_msgs/UInt64'} - }, - { - title: 'advertise topic with message type: Float32', - advertiseMsg: - {op: 'advertise', id: 'advertise_float32', topic: 'advertise_float32_topic', type: 'std_msgs/Float32'} - }, - { - title: 'advertise topic with message type: Float64', - advertiseMsg: - {op: 'advertise', id: 'advertise_float64', topic: 'advertise_float64_topic', type: 'std_msgs/Float64'} - }, - { - title: 'advertise topic with message type: ColorRGBA', - advertiseMsg: - {op: 'advertise', id: 'advertise_colorrgba', topic: 'advertise_colorrgba_topic', type: 'std_msgs/ColorRGBA'} - }, - { - title: 'advertise topic with message type: Header', - advertiseMsg: {op: 'advertise', id: 'advertise_header', topic: 'advertise_header_topic', type: 'std_msgs/Header'} - }, - { - title: 'advertise topic with message type: JointState', - advertiseMsg: - { op: 'advertise', id: 'advertise_jointstate', - topic: 'advertise_jointstate_topic', type: 'sensor_msgs/JointState'} - } - ]; - - testCasesData.forEach((testData, index) => { - it(testData.title, function() { - return new Promise((resolve, reject) => { - let ws = new WebSocket('ws://127.0.0.1:9090'); - - ws.on('open', function() { - ws.send(JSON.stringify(testData.advertiseMsg)); - }); - ws.on('message', function(data) { - let response = JSON.parse(data); - assert.deepStrictEqual(response.level, finalStatus); - ws.close(); - resolve(); - }); - }); - }); - }); -}; diff --git a/src/gui/test/nodejs/protocol/test-advertise-service.js b/src/gui/test/nodejs/protocol/test-advertise-service.js deleted file mode 100644 index 697b7a76..00000000 --- a/src/gui/test/nodejs/protocol/test-advertise-service.js +++ /dev/null @@ -1,128 +0,0 @@ -// Copyright (c) 2017 Intel Corporation. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -'use strict'; - -const assert = require('assert'); -const rclnodejs = require('rclnodejs'); -const WebSocket = require('ws'); - -module.exports = function() { - - before(function() { - return rclnodejs.init().then(() => { - var node = rclnodejs.createNode('service'); - var wsservice = node.createService('example_interfaces/srv/AddTwoInts', 'add_two_ints', - (request, response) => { - let result = response.template; - result.sum = request.a + request.b; - response.send(result); - }); - rclnodejs.spin(node); - }); - }); - - after(function() { - rclnodejs.shutdown(); - }); - - let testCasesData = [ - { - title: 'advertise_service positive case 1', - advertiseServiceMsg: { - op: 'advertise_service', type: 'example_interfaces/AddTwoInts', service: 'add_two_ints'}, - opCount: 1, - finalStatus: 'none' - }, - { - title: 'advertise_service positive case 2', - advertiseServiceMsg: { - op: 'advertise_service', type: 'example_interfaces/AddTwoInts', service: '/add_two_ints'}, - opCount: 1, - finalStatus: 'none' - }, - { - title: 'advertise_service positive case 3: ROS2 interface type format', - advertiseServiceMsg: { - op: 'advertise_service', type: 'example_interfaces/srv/AddTwoInts', service: 'add_two_ints'}, - opCount: 1, - finalStatus: 'none' - }, - { - title: 'advertise_service negative case 1: unknown type', - advertiseServiceMsg: { - op: 'advertise_service', type: 'example_interfaces/Foo', service: 'add_two_ints'}, - opCount: 1, - finalStatus: 'error' - }, - { - title: 'advertise_service field checking: invalid type', - advertiseServiceMsg: { - op: 'advertise_service', type: 42, service: 'add_two_ints'}, - opCount: 1, - finalStatus: 'error' - }, - { - title: 'advertise_service field checking: invalid service', - advertiseServiceMsg: { - op: 'advertise_service', type: 'example_interfaces/AddTwoInts', service: true}, - opCount: 1, - finalStatus: 'error' - }, - { - title: 'advertise_service field checking: empty service', - advertiseServiceMsg: { - op: 'advertise_service', type: 'example_interfaces/AddTwoInts', service: ''}, - opCount: 1, - finalStatus: 'error' - }, - { - title: 'advertise_service field checking: invalid service: with single quote', - advertiseServiceMsg: { - op: 'advertise_service', type: 'example_interfaces/AddTwoInts', service: "'add_two_ints'"}, - opCount: 1, - finalStatus: 'error' - }, - { - title: 'advertise_service field checking: invalid service: with double quotes', - advertiseServiceMsg: { - op: 'advertise_service', type: 'example_interfaces/AddTwoInts', service: '"add_two_ints"'}, - opCount: 1, - finalStatus: 'error' - }, - { - title: 'advertise_service field checking: invalid service: unicode', - advertiseServiceMsg: { - op: 'advertise_service', type: 'example_interfaces/AddTwoInts', service: '\u8bdd\u9898'}, - opCount: 1, - finalStatus: 'error' - } - ]; - - testCasesData.forEach((testData, index) => { - it(testData.title, function(done) { - let ws = new WebSocket('ws://127.0.0.1:9090'); - - ws.on('open', function() { - ws.send(JSON.stringify(testData.advertiseServiceMsg)); - }); - ws.on('message', function(data) { - let response = JSON.parse(data); - assert.deepStrictEqual(response.level, testData.finalStatus); - ws.close(); - done(); - }); - }); - }); -}; diff --git a/src/gui/test/nodejs/protocol/test-advertise.js b/src/gui/test/nodejs/protocol/test-advertise.js deleted file mode 100644 index 773a790c..00000000 --- a/src/gui/test/nodejs/protocol/test-advertise.js +++ /dev/null @@ -1,131 +0,0 @@ -// Copyright (c) 2017 Intel Corporation. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -'use strict'; - -const assert = require('assert'); -const WebSocket = require('ws'); - -module.exports = function() { - let testCasesData = [ - { - title: 'advertise positive case 1', - advertiseMsg1: {op: 'advertise', id: 'advertise_id1', topic: 'advertise_topic1', type: 'std_msgs/String'}, - opCount: 1, - finalStatus: 'none' - }, - { - title: 'advertise positive case 2', - advertiseMsg1: {op: 'advertise', topic: 'advertise_topic2', type: 'std_msgs/String'}, - opCount: 1, - finalStatus: 'none' - }, - { - title: 'advertise positive case 3', - advertiseMsg1: {op: 'advertise', id: 'advertise_id3', topic: 'advertise_topic3', type: 'std_msgs/String'}, - advertiseMsg2: {op: 'advertise', id: 'advertise_id4', topic: 'advertise_topic3', type: 'std_msgs/String'}, - opCount: 2, - finalStatus: 'none' - }, - { - title: 'advertise positive case 4: ROS2 message type format', - advertiseMsg1: { - op: 'advertise', id: 'advertise_ros2_msg', topic: 'advertise_ros2_msg_topic', type: 'std_msgs/msg/Byte'}, - opCount: 1, - finalStatus: 'none' - }, - { - title: 'advertise negative case 1', - advertiseMsg1: {op: 'advertise', id: 'advertise_id5', topic: 'advertise_topic5', type: 'std_msgs/String'}, - advertiseMsg2: {op: 'advertise', id: 'advertise_id6', topic: 'advertise_topic5', type: 'std_msgs/Char'}, - opCount: 2, - finalStatus: 'error' - }, - { - title: 'advertise negative case 2', - advertiseMsg1: {op: 'advertise', id: 'advertise_id7', topic: 'advertise_topic7', type: 'std_msgs/Foo'}, - opCount: 1, - finalStatus: 'error' - }, - { - title: 'advertise field checking case 1: invalid topic', - advertiseMsg1: {op: 'advertise', id: 'advertise_id8', topic: 42, type: 'std_msgs/String'}, - opCount: 1, - finalStatus: 'error' - }, - { - title: 'advertise field checking case 2: invalid type', - advertiseMsg1: {op: 'advertise', id: 'advertise_id9', topic: 'advertise_topic9', type: true}, - opCount: 1, - finalStatus: 'error' - }, - { - title: 'advertise field checking case 3: topic cannot be empty', - advertiseMsg1: {op: 'advertise', id: 'advertise_id10', topic: '', type: 'std_msgs/String'}, - opCount: 1, - finalStatus: 'error' - }, - { - title: 'advertise field checking case 4: topic cannot contain single quote', - advertiseMsg1: {op: 'advertise', id: 'advertise_id11', topic: "'single_advertise_topic11'", - type: 'std_msgs/String'}, - opCount: 1, - finalStatus: 'error' - }, - { - title: 'advertise field checking case 5: topic cannot contain double quotes', - advertiseMsg1: {op: 'advertise', id: 'advertise_id12', topic: '"double_advertise_topic12"', - type: 'std_msgs/String'}, - opCount: 1, - finalStatus: 'error' - }, - { - title: 'advertise field checking case 6: topic does not support unicode', - advertiseMsg1: {op: 'advertise', id: 'advertise_id12', topic: '\u8bdd\u9898', - type: 'std_msgs/String'}, - opCount: 1, - finalStatus: 'error' - } - ]; - - testCasesData.forEach((testData, index) => { - it(testData.title, function() { - return new Promise((resolve, reject) => { - let ws = new WebSocket('ws://127.0.0.1:9090'); - let counter = 0; - - ws.on('open', function() { - ws.send(JSON.stringify(testData.advertiseMsg1)); - counter++; - }); - ws.on('message', function(data) { - if (counter === testData.opCount) { - let response = JSON.parse(data); - assert.deepStrictEqual(response.level, testData.finalStatus); - counter++; - ws.close(); - resolve(); - } - - if (counter === 1) { - if (testData.advertiseMsg2 !== undefined) { - ws.send(JSON.stringify(testData.advertiseMsg2)); - } - counter++; - } - }); - }); - }); - }); -}; diff --git a/src/gui/test/nodejs/protocol/test-call-service.js b/src/gui/test/nodejs/protocol/test-call-service.js deleted file mode 100644 index 34f8d941..00000000 --- a/src/gui/test/nodejs/protocol/test-call-service.js +++ /dev/null @@ -1,157 +0,0 @@ -// Copyright (c) 2017 Intel Corporation. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -'use strict'; - -/* eslint-disable camelcase */ - -const assert = require('assert'); -const rclnodejs = require('rclnodejs'); -const WebSocket = require('ws'); - -module.exports = function() { - - before(function() { - return rclnodejs.init().then(() => { - var node = rclnodejs.createNode('service'); - var wsservice = node.createService('example_interfaces/srv/AddTwoInts', 'add_two_ints', - (request, response) => { - let result = response.template; - result.sum = request.a + request.b; - response.send(result); - }); - rclnodejs.spin(node); - }); - }); - - after(function() { - rclnodejs.shutdown(); - }); - - let testCasesData = [ - { - title: 'call_service positive case 1: full fields', - callServiceMsg: { op: 'call_service', id: 'call_service_id1', service: 'add_two_ints', - args: {a: 1, b: 2}, - type: 'example_interfaces/AddTwoInts', - fragment_size: 1, compression: 'none' - }, - responseCount: 2, - opStatus: 'none', - expectedResponse: {op: 'service_response', result: true, sum: 3} - }, - { - title: 'call_service positive case 2: full fields with full service name', - callServiceMsg: { op: 'call_service', id: 'call_service_id2', service: '/add_two_ints', - args: {a: 1, b: 2}, - type: 'example_interfaces/AddTwoInts', - fragment_size: 1, compression: 'none' - }, - responseCount: 2, - opStatus: 'none', - expectedResponse: {op: 'service_response', result: true, sum: 3} - }, - { - title: 'call_service positive case 3: no id field', - callServiceMsg: { op: 'call_service', service: 'add_two_ints', - args: {a: 3, b: 4}, - type: 'example_interfaces/AddTwoInts', - fragment_size: 1, compression: 'none' - }, - responseCount: 2, - opStatus: 'none', - expectedResponse: {op: 'service_response', result: true, sum: 7} - }, - { - title: 'call_service positive case 4: no fragment_size field', - callServiceMsg: { op: 'call_service', id: 'call_service_id4', service: 'add_two_ints', - args: {a: 5, b: 6}, type: 'example_interfaces/AddTwoInts', compression: 'none' - }, - responseCount: 2, - opStatus: 'none', - expectedResponse: {op: 'service_response', result: true, sum: 11} - }, - { - title: 'call_service positive case 5: no compression field', - callServiceMsg: { op: 'call_service', id: 'call_service_id5', service: 'add_two_ints', - args: {a: 7, b: 8}, type: 'example_interfaces/AddTwoInts', fragment_size: 1 - }, - responseCount: 2, - opStatus: 'none', - expectedResponse: {op: 'service_response', result: true, sum: 15} - }, - { - title: 'call_service negative case 1: args without type information', - callServiceMsg: { op: 'call_service', id: 'call_service_id6', service: 'add_two_ints', - args: {a: 9, b: 10}, fragment_size: 1, compression: 'none'}, - responseCount: 1, - opStatus: 'error' - }, - { - title: 'call_service negative case 2: unknown service', - callServiceMsg: { op: 'call_service', id: 'call_service_id7', service: 'add_two_float', - args: {a: 11, b: 12}, type: 'example_interfaces/AddTwoInts', - fragment_size: 1, compression: 'none' - }, - responseCount: 1, - opStatus: 'none' - }, - { - title: 'call_service field checking: invalid service', - callServiceMsg: { op: 'call_service', id: 'call_service_id8', service: 42, - args: {a: 13, b: 14}, type: 'example_interfaces/AddTwoInts', - fragment_size: 1, compression: 'none' - }, - responseCount: 1, - opStatus: 'error' - }, - { - title: 'call_service field checking: invalid args', - callServiceMsg: { op: 'call_service', id: 'call_service_id9', service: 'add_two_ints', - args: 'invalid arguments', fragment_size: 1, compression: 'none' - }, - responseCount: 1, - opStatus: 'error' - } - ]; - - testCasesData.forEach((testData, index) => { - it(testData.title, function(done) { - let ws = new WebSocket('ws://127.0.0.1:9090'); - - ws.on('open', function() { - ws.send(JSON.stringify(testData.callServiceMsg)); - }); - ws.on('message', function(data) { - console.log(data); - let response = JSON.parse(data); - - if (response.op === 'status') { - assert.deepStrictEqual(response.level, testData.opStatus); - if (testData.responseCount === 1) { - ws.close(); - done(); - } - } - if (testData.expectedResponse && response.op === testData.expectedResponse.op) { - assert.deepStrictEqual(response.result, testData.expectedResponse.result); - assert.deepEqual(response.values.sum, testData.expectedResponse.sum); - ws.close(); - done(); - } - }); - }); - }); -}; - diff --git a/src/gui/test/nodejs/protocol/test-op-neg.js b/src/gui/test/nodejs/protocol/test-op-neg.js deleted file mode 100644 index f91c705c..00000000 --- a/src/gui/test/nodejs/protocol/test-op-neg.js +++ /dev/null @@ -1,59 +0,0 @@ -// Copyright (c) 2017 Intel Corporation. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -'use strict'; - - -const assert = require('assert'); -const rclnodejs = require('rclnodejs'); -const WebSocket = require('ws'); - -module.exports = function() { - - let testCasesData = [ - { - title: 'Negative operation case 1: unknown operation', - msg: { op: 'foo'}, - finalStatus: 'error' - }, - { - title: 'Negative operation case 2: no necessary operation', - msg: { op: 'advertise', bar: 'bar'}, - finalStatus: 'error' - }, - { - title: 'Negative operation case 3: no op field', - msg: { baz: 'baz'}, - finalStatus: 'error' - } - ]; - - testCasesData.forEach((testData, index) => { - it(testData.title, function(done) { - let ws = new WebSocket('ws://127.0.0.1:9090'); - let counter = 0; - - ws.on('open', function() { - ws.send(JSON.stringify(testData.msg)); - }); - ws.on('message', function(data) { - let response = JSON.parse(data); - - assert.deepStrictEqual(response.level, 'error'); - ws.close(); - done(); - }); - }); - }); -}; diff --git a/src/gui/test/nodejs/protocol/test-publish-msg.js b/src/gui/test/nodejs/protocol/test-publish-msg.js deleted file mode 100644 index 51227070..00000000 --- a/src/gui/test/nodejs/protocol/test-publish-msg.js +++ /dev/null @@ -1,295 +0,0 @@ -// Copyright (c) 2017 Intel Corporation. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -'use strict'; - -const assert = require('assert'); -const WebSocket = require('ws'); - -module.exports = function() { - let testCasesData = [ - { - title: 'publish message with type: Bool', - advertiseMsg: {op: 'advertise', id: 'advertise_bool_setup', topic: 'publish_bool_topic', type: 'std_msgs/Bool'}, - publishMsg: {op: 'publish', id: 'publish_bool', topic: 'publish_bool_topic', msg: {data: true}} - }, - { - title: 'publish message with type: Byte', - advertiseMsg: {op: 'advertise', id: 'advertise_byte_setup', topic: 'publish_byte_topic', type: 'std_msgs/Byte'}, - publishMsg: {op: 'publish', id: 'publish_byte', topic: 'publish_byte_topic', msg: {data: 0xff}} - }, - { - title: 'publish message with type: Char', - advertiseMsg: {op: 'advertise', id: 'advertise_char_setup', topic: 'publish_char_topic', type: 'std_msgs/Char'}, - publishMsg: {op: 'publish', id: 'publish_char', topic: 'publish_char_topic', msg: {data: 'A'}} - }, - { - title: 'publish message with type: String', - advertiseMsg: { - op: 'advertise', id: 'advertise_string_setup', topic: 'publish_string_topic', type: 'std_msgs/String'}, - publishMsg: {op: 'publish', id: 'publish_string', topic: 'publish_string_topic', msg: {data: 'hello world!'}} - }, - { - title: 'publish message with type: Int8', - advertiseMsg: {op: 'advertise', id: 'advertise_int8_setup', topic: 'publish_int8_topic', type: 'std_msgs/Int8'}, - publishMsg: {op: 'publish', id: 'publish_int8', topic: 'publish_int8_topic', msg: {data: 0x7f}} - }, - { - title: 'publish message with type: UInt8', - advertiseMsg: { - op: 'advertise', id: 'advertise_uint8_setup', topic: 'publish_uint8_topic', type: 'std_msgs/UInt8'}, - publishMsg: {op: 'publish', id: 'publish_uint8', topic: 'publish_uint8_topic', msg: {data: 0xff}} - }, - { - title: 'publish message with type: Int16', - advertiseMsg: { - op: 'advertise', id: 'advertise_int16_setup', topic: 'publish_int16_topic', type: 'std_msgs/Int16'}, - publishMsg: {op: 'publish', id: 'publish_int16', topic: 'publish_int16_topic', msg: {data: 0x7fff}} - }, - { - title: 'publish message with type: UInt16', - advertiseMsg: { - op: 'advertise', id: 'advertise_uint16_setup', topic: 'publish_uint16_topic', type: 'std_msgs/UInt16'}, - publishMsg: {op: 'publish', id: 'publish_uint16', topic: 'publish_uint16_topic', msg: {data: 0xffff}} - }, - { - title: 'publish message with type: Int32', - advertiseMsg: { - op: 'advertise', id: 'advertise_int32_setup', topic: 'publish_int32_topic', type: 'std_msgs/Int32'}, - publishMsg: {op: 'publish', id: 'publish_int32', topic: 'publish_int32_topic', msg: {data: 0x7fffffff}} - }, - { - title: 'publish message with type: UInt32', - advertiseMsg: { - op: 'advertise', id: 'advertise_uint32_setup', topic: 'publish_uint32_topic', type: 'std_msgs/UInt32'}, - publishMsg: {op: 'publish', id: 'publish_uint32', topic: 'publish_uint32_topic', msg: {data: 0xffffffff}} - }, - { - title: 'publish message with type: Int64', - advertiseMsg: { - op: 'advertise', id: 'advertise_int64_setup', topic: 'publish_int64_topic', type: 'std_msgs/Int64'}, - publishMsg: { - op: 'publish', id: 'publish_int64', topic: 'publish_int64_topic', msg: {data: Number.MIN_SAFE_INTEGER}} - }, - { - title: 'publish message with type: UInt64', - advertiseMsg: { - op: 'advertise', id: 'advertise_uint64_setup', topic: 'publish_uint64_topic', type: 'std_msgs/UInt64'}, - publishMsg: { - op: 'publish', id: 'publish_uint64', topic: 'publish_uint64_topic', msg: {data: Number.MAX_SAFE_INTEGER}} - }, - { - title: 'publish message with type: Float32', - advertiseMsg: { - op: 'advertise', id: 'advertise_float32_setup', topic: 'publish_float32_topic', type: 'std_msgs/Float32'}, - publishMsg: {op: 'publish', id: 'publish_float32', topic: 'publish_float32_topic', msg: {data: 3.14}} - }, - { - title: 'publish message with type: Float64', - advertiseMsg: { - op: 'advertise', id: 'advertise_float64_setup', topic: 'publish_float64_topic', type: 'std_msgs/Float64'}, - publishMsg: {op: 'publish', id: 'publish_float64', topic: 'publish_float64_topic', msg: {data: Number.MAX_VALUE}} - }, - { - title: 'publish message with type: ColorRGBA', - advertiseMsg: { - op: 'advertise', id: 'advertise_colorrgba_setup', topic: 'publish_colorrgba_topic', - type: 'std_msgs/ColorRGBA'}, - publishMsg: { - op: 'publish', id: 'publish_colorrgba', topic: 'publish_colorrgba_topic', - msg: {a: 0.5, r: 255, g: 255, b: 255}} - }, - { - title: 'publish message with type: Header', - advertiseMsg: { - op: 'advertise', id: 'advertise_header_setup', topic: 'publish_header_topic', type: 'std_msgs/Header'}, - publishMsg: { - op: 'publish', id: 'publish_header', topic: 'publish_header_topic', - /* eslint-disable camelcase */ - msg: {stamp: {sec: 123456, nanosec: 789}, frame_id: 'main frame'}} - }, - { - title: 'publish message with type: JointState', - advertiseMsg: { - op: 'advertise', id: 'advertise_jointstate_setup', topic: 'publish_jointstate_topic', - type: 'sensor_msgs/JointState'}, - publishMsg: { - op: 'publish', id: 'publish_jointstate', topic: 'publish_jointstate_topic', - msg: {header: {stamp: {sec: 123456, nanosec: 789}, frame_id: 'main frame'}, - name: ['Tom', 'Jerry'], position: [1, 2], velocity: [2, 3]}, - } - } - ]; - let testResults = {opCount: 2, finalStatus: 'none'}; - - testCasesData.forEach((testData, index) => { - it(testData.title, function() { - return new Promise((resolve, reject) => { - let ws = new WebSocket('ws://127.0.0.1:9090'); - let counter = 0; - - ws.on('open', function() { - ws.send(JSON.stringify(testData.advertiseMsg)); - counter++; - }); - ws.on('message', function(data) { - let response = JSON.parse(data); - assert.deepStrictEqual(response.level, testResults.finalStatus); - - if (counter === testResults.opCount) { - ws.close(); - resolve(); - } - if (counter === 1) { - ws.send(JSON.stringify(testData.publishMsg)); - counter++; - } - }); - }); - }); - }); - - let testCasesNegData = [ - { - title: 'publish message negatively with type: Byte', - advertiseMsg: { - op: 'advertise', id: 'advertise_byte_setup_neg', topic: 'publish_byte_neg_topic', type: 'std_msgs/Byte', - }, - publishNegMsg1: { - op: 'publish', id: 'publish_byte_neg1', topic: 'publish_byte_neg_topic', msg: {data: -1} - }, - publishNegMsg2: { - op: 'publish', id: 'publish_byte_neg2', topic: 'publish_byte_neg_topic', msg: {data: 0x100} - } - }, - { - title: 'publish message negatively with type: Char', - advertiseMsg: { - op: 'advertise', id: 'advertise_char_setup_neg', topic: 'publish_char_neg_topic', type: 'std_msgs/Char' - }, - publishNegMsg1: { - op: 'publish', id: 'publish_char_neg1', topic: 'publish_char_neg_topic', msg: {data: -0x81} - }, - publishNegMsg2: { - op: 'publish', id: 'publish_char_neg2', topic: 'publish_char_neg_topic', msg: {data: 0x80} - } - }, - { - title: 'publish message negatively with type: Int8', - advertiseMsg: { - op: 'advertise', id: 'advertise_int8_setup_neg', topic: 'publish_int8_neg_topic', type: 'std_msgs/Int8' - }, - publishNegMsg1: { - op: 'publish', id: 'publish_int8_neg1', topic: 'publish_int8_neg_topic', msg: {data: -0x81} - }, - publishNegMsg2: { - op: 'publish', id: 'publish_int8_neg2', topic: 'publish_int8_neg_topic', msg: {data: 0x80} - } - }, - { - title: 'publish message negatively with type: UInt8', - advertiseMsg: { - op: 'advertise', id: 'advertise_uint8_setup_neg', topic: 'publish_uint8_neg_topic', type: 'std_msgs/UInt8' - }, - publishNegMsg1: { - op: 'publish', id: 'publish_uint8_neg1', topic: 'publish_uint8_neg_topic', msg: {data: -0x1} - }, - publishNegMsg2: { - op: 'publish', id: 'publish_uint8_neg2', topic: 'publish_uint8_neg_topic', msg: {data: 0x100} - } - }, - { - title: 'publish message negatively with type: Int16', - advertiseMsg: { - op: 'advertise', id: 'advertise_int16_setup_neg', topic: 'publish_int16_neg_topic', type: 'std_msgs/Int16' - }, - publishNegMsg1: { - op: 'publish', id: 'publish_int16_neg1', topic: 'publish_int16_neg_topic', msg: {data: -0x8001} - }, - publishNegMsg2: { - op: 'publish', id: 'publish_int16_neg2', topic: 'publish_int16_neg_topic', msg: {data: 0x8000} - } - }, - { - title: 'publish message negatively with type: UInt16', - advertiseMsg: { - op: 'advertise', id: 'advertise_uint16_setup_neg', topic: 'publish_uint16_neg_topic', type: 'std_msgs/UInt16' - }, - publishNegMsg1: { - op: 'publish', id: 'publish_uint16_neg1', topic: 'publish_uint16_neg_topic', msg: {data: -0x1} - }, - publishNegMsg2: { - op: 'publish', id: 'publish_uint16_neg2', topic: 'publish_uint16_neg_topic', msg: {data: 0x10000} - } - }, - { - title: 'publish message negatively with type: Int32', - advertiseMsg: { - op: 'advertise', id: 'advertise_int32_setup_neg', topic: 'publish_int32_neg_topic', type: 'std_msgs/Int32' - }, - publishNegMsg1: { - op: 'publish', id: 'publish_int32_neg1', topic: 'publish_int32_neg_topic', msg: {data: -0x80000001} - }, - publishNegMsg2: { - op: 'publish', id: 'publish_int32_neg2', topic: 'publish_int32_neg_topic', msg: {data: 0x80000000} - } - }, - { - title: 'publish message negatively with type: UInt32', - advertiseMsg: { - op: 'advertise', id: 'advertise_uint32_setup_neg', topic: 'publish_uint32_neg_topic', type: 'std_msgs/UInt32' - }, - publishNegMsg1: { - op: 'publish', id: 'publish_uint32_neg1', topic: 'publish_uint32_neg_topic', msg: {data: -0x1} - }, - publishNegMsg2: { - op: 'publish', id: 'publish_uint32_neg2', topic: 'publish_uint32_neg_topic', msg: {data: 0x100000000} - } - } - ]; - let testNegResults = {opCount: 3, finalStatus: 'error'}; - - testCasesNegData.forEach((testNegData, index) => { - it(testNegData.title, function() { - return new Promise((resolve, reject) => { - let ws = new WebSocket('ws://127.0.0.1:9090'); - var counter = 0; - - ws.on('open', function() { - ws.send(JSON.stringify(testNegData.advertiseMsg)); - counter++; - }); - ws.on('message', function(data) { - let response = JSON.parse(data); - - if (counter === testNegResults.opCount) { - assert.deepStrictEqual(response.level, testNegResults.finalStatus); - ws.close(); - resolve(); - } - if (counter === 2) { - assert.deepStrictEqual(response.level, testNegResults.finalStatus); - ws.send(JSON.stringify(testNegData.publishNegMsg2)); - counter++; - } - if (counter === 1) { - assert.deepStrictEqual(response.level, 'none'); - ws.send(JSON.stringify(testNegData.publishNegMsg1)); - counter++; - } - }); - }); - }); - }); -}; diff --git a/src/gui/test/nodejs/protocol/test-publish.js b/src/gui/test/nodejs/protocol/test-publish.js deleted file mode 100644 index 590a49f7..00000000 --- a/src/gui/test/nodejs/protocol/test-publish.js +++ /dev/null @@ -1,123 +0,0 @@ -// Copyright (c) 2017 Intel Corporation. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the 'License'); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an 'AS IS' BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -'use strict'; - -const assert = require('assert'); -const WebSocket = require('ws'); - -module.exports = function() { - let testCasesData = [ - { - title: 'publish positive case 1', - advertiseMsg: {op: 'advertise', id: 'publish_advertise_setup1', topic: 'publish_topic1', type: 'std_msgs/String'}, - publishMsg: {op: 'publish', id: 'publish_id1', topic: 'publish_topic1', msg: {data: 'hello world!'}}, - opCount: 2, - finalStatus: 'none' - }, - { - title: 'publish positive case 2', - advertiseMsg: {op: 'advertise', topic: 'publish_topic2', type: 'std_msgs/String'}, - publishMsg: {op: 'publish', topic: 'publish_topic2', msg: {data: 'hello world!'}}, - opCount: 2, - finalStatus: 'none' - }, - { - title: 'publish positive case 3: ROS2 message type format', - advertiseMsg: {op: 'advertise', topic: 'publish_ros2_msg_topic', type: 'std_msgs/msg/String'}, - publishMsg: {op: 'publish', topic: 'publish_ros2_msg_topic', msg: {data: 'hello world!'}}, - opCount: 2, - finalStatus: 'none' - }, - { - title: 'publish negative case 1: topic not exist', - publishMsg: {op: 'publish', id: 'publish_id3', topic: 'publish_topic3', msg: {data: 'Hello World!'}}, - opCount: 1, - finalStatus: 'error' - }, - { - title: 'publish negative case 2: inconsistent message type', - advertiseMsg: - {op: 'advertise', id: 'publish_advertise_setup4', topic: 'publish_topic4', type: 'std_msgs/String'}, - publishMsg: {op: 'publish', id: 'publish_id4', topic: 'publish_topic4', msg: {data: 42}}, - opCount: 2, - finalStatus: 'error' - }, - { - title: 'publish negative case 3: msg is subset of type', - advertiseMsg: {op: 'advertise', id: 'publish_advertise_setup5', topic: 'publish_topic5', type: 'std_msgs/Header'}, - publishMsg: {op: 'publish', id: 'publish_id5', topic: 'publish_topic5', msg: { - stamp: {sec: 123456, nanosec: 789} - }}, - opCount: 2, - // incompatible with the spec - finalStatus: 'error' - }, - { - title: 'publish field checking case 1: invalid id', - advertiseMsg: - {op: 'advertise', id: 'publish_advertise_setup6', topic: 'publish_topic6', type: 'std_msgs/String'}, - publishMsg: {op: 'publish', id: 42, topic: 'publish_topic6', msg: {data: 'Hello World!'}}, - opCount: 2, - finalStatus: 'none' - }, - { - title: 'publish field checking case 1: invalid topic', - advertiseMsg: {op: 'advertise', id: 'publish_advertise_setup7', topic: 'publish_topic7', type: 'std_msgs/String'}, - publishMsg: {op: 'publish', id: 'publish_id7', topic: 42, msg: {data: 'Hello World!'}}, - opCount: 2, - finalStatus: 'error' - }, - { - title: 'publish field checking case 2: msg is not a JSON object', - advertiseMsg: - { op: 'advertise', id: 'publish_advertise_setup8', topic: 'publish_topic8', type: 'std_msgs/String'}, - publishMsg: {op: 'publish', id: 'publish_id8', topic: 'publish_topic8', msg: 42}, - opCount: 2, - finalStatus: 'error' - } - ]; - - testCasesData.forEach((testData, index) => { - it(testData.title, function() { - return new Promise((resolve, reject) => { - let ws = new WebSocket('ws://127.0.0.1:9090'); - var counter = 0; - - ws.on('open', function() { - if (testData.advertiseMsg !== undefined) { - ws.send(JSON.stringify(testData.advertiseMsg)); - } - counter++; - if (testData.opCount === 1) { - ws.send(JSON.stringify(testData.publishMsg)); - counter++; - } - }); - ws.on('message', function(data) { - if (counter === 2) { - let response = JSON.parse(data); - assert.deepStrictEqual(response.level, testData.finalStatus); - ws.close(); - resolve(); - } - if (counter === 1) { - ws.send(JSON.stringify(testData.publishMsg)); - counter++; - } - }); - }); - }); - }); -}; diff --git a/src/gui/test/nodejs/protocol/test-response-op.js b/src/gui/test/nodejs/protocol/test-response-op.js deleted file mode 100644 index e390a049..00000000 --- a/src/gui/test/nodejs/protocol/test-response-op.js +++ /dev/null @@ -1,90 +0,0 @@ -// Copyright (c) 2017 Intel Corporation. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -'use strict'; - -const assert = require('assert'); -const rclnodejs = require('rclnodejs'); -const WebSocket = require('ws'); - -module.exports = function() { - before(function() { - return new Promise((resolve, reject) => { - rclnodejs.init().then(() => { - var node = rclnodejs.createNode('service'); - var wsservice = node.createService('example_interfaces/srv/AddTwoInts', 'add_two_ints_resp', - (request, response) => { - let result = response.template; - result.sum = request.a + request.b; - response.send(result); - }); - rclnodejs.spin(node); - setTimeout(() => { - resolve(); - }, 2000); - }); - }); - }); - - after(function() { - rclnodejs.shutdown(); - }); - - let testCasesData = [ - { - title: 'Common responses should contain set_level field', - msg: { - op: 'advertise', id: 'advertise_topic_resp_id1', topic: 'advertise_topic_resp', type: 'std_msgs/String'}, - opType: 'common', - respCount: 1, - finalStatus: 'none' - }, - { - title: 'service_response status field checking', - msg: {op: 'call_service', service: 'add_two_ints_resp', id: 'call_service_id1', - args: {a: 1, b: 2}, type: 'example_interfaces/AddTwoInts'}, - opType: 'service', - respCount: 2, - expectedResponse: {op: 'service_response', result: true, sum: 3} - } - ]; - - testCasesData.forEach((testData, index) => { - it(testData.title, function(done) { - let ws = new WebSocket('ws://127.0.0.1:9090'); - let count = 0; - ws.on('open', function() { - ws.send(JSON.stringify(testData.msg)); - count++; - }); - ws.on('message', function(data) { - let response = JSON.parse(data); - if (testData.opType === 'common' && testData.respCount === 1) { - assert.deepStrictEqual(response.op, 'set_level'); - assert.deepStrictEqual(typeof response.level, 'string'); - ws.close(); - done(); - } - - if (testData.opType === 'service' && response.op === testData.expectedResponse.op) { - assert.deepStrictEqual(response.op, 'service_response'); - assert.deepStrictEqual(typeof response.service, 'string'); - assert.deepStrictEqual(typeof response.result, 'boolean'); - ws.close(); - done(); - } - }); - }); - }); -}; diff --git a/src/gui/test/nodejs/protocol/test-ros2-protocol-workflow.js b/src/gui/test/nodejs/protocol/test-ros2-protocol-workflow.js deleted file mode 100644 index 58d994d3..00000000 --- a/src/gui/test/nodejs/protocol/test-ros2-protocol-workflow.js +++ /dev/null @@ -1,44 +0,0 @@ -// Copyright (c) 2017 Intel Corporation. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -'use strict'; - -const assert = require('assert'); -const WebSocket = require('ws'); - -module.exports = function() { - it('Protocol testing general workflow', function() { - return new Promise((resolve, reject) => { - let ws = new WebSocket('ws://127.0.0.1:9090'); - ws.on('open', function() { - let msg = { - op: 'publish', - id: 'publish:/example_topic:1', - topic: '/example_topic', - msg: { - data: 'hello from ros2bridge 0' - }, - latch: false - }; - ws.send(JSON.stringify(msg)); - }); - ws.on('message', function(data) { - var response = JSON.parse(data); - assert.deepStrictEqual(response.level, 'error'); - ws.close(); - resolve(); - }); - }); - }); -}; diff --git a/src/gui/test/nodejs/protocol/test-service-response.js b/src/gui/test/nodejs/protocol/test-service-response.js deleted file mode 100644 index 272058b3..00000000 --- a/src/gui/test/nodejs/protocol/test-service-response.js +++ /dev/null @@ -1,122 +0,0 @@ -// Copyright (c) 2017 Intel Corporation. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the 'License'); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an 'AS IS' BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -'use strict'; - -const assert = require('assert'); -const rclnodejs = require('rclnodejs'); -const WebSocket = require('ws'); - -module.exports = function() { - before(function() { - return rclnodejs.init().then(() => { - var node = rclnodejs.createNode('service'); - var wsservice = node.createService('example_interfaces/srv/AddTwoInts', 'add_two_ints', - (request, response) => { - let result = response.template; - result.sum = request.a + request.b; - response.send(result); - }); - rclnodejs.spin(node); - }); - }); - - after(function() { - rclnodejs.shutdown(); - }); - - let testCasesData = [ - { - title: 'service_response positive case 1', - serviceResponseMsg: { - op: 'service_response', id: 'service_response_id1', service: '/add_two_ints', - values: {sum: 1}, result: true}, - opCount: 1, - finalStatus: 'none' - }, - { - title: 'service_response positive case 2', - serviceResponseMsg: { - op: 'service_response', id: 'service_response_id2', service: 'add_two_ints', - values: {sum: 2}, result: true}, - opCount: 1, - finalStatus: 'none' - }, - { - title: 'service_response positive case 3', - serviceResponseMsg: { - op: 'service_response', service: 'add_two_ints', values: {sum: 3}, result: true}, - opCount: 1, - finalStatus: 'none' - }, - { - title: 'service_response positive case 4', - serviceResponseMsg: { - op: 'service_response', id: 'service_response_id4', service: 'add_two_ints', result: true}, - opCount: 1, - finalStatus: 'none' - }, - { - title: 'service_response positive case 5', - serviceResponseMsg: { - op: 'service_response', service: 'add_two_ints', result: true}, - opCount: 1, - finalStatus: 'none' - }, - { - title: 'service_response positive case 6', - serviceResponseMsg: { - op: 'service_response', service: '/add_two_ints', result: true}, - opCount: 1, - finalStatus: 'none' - }, - { - title: 'service_response negative case 1', - serviceResponseMsg: { - op: 'service_response', values: {sum: 6}, result: false}, - opCount: 1, - finalStatus: 'none' - }, - { - title: 'service_response negative case 2', - serviceResponseMsg: { - op: 'service_response', service: 'add_two_ints', values: {sum: 7}}, - opCount: 1, - finalStatus: 'none' - } - ]; - - testCasesData.forEach((testData, index) => { - it(testData.title, function(done) { - let ws = new WebSocket('ws://127.0.0.1:9090'); - let count = 0; - - ws.on('open', function() { - ws.send(JSON.stringify(testData.serviceResponseMsg)); - count++; - }); - ws.on('message', function(data) { - // console.log(`${count}`, data); - let response = JSON.parse(data); - - if (testData.opCount === 1) { - assert.deepStrictEqual(response.level, testData.finalStatus); - ws.close(); - done(); - } - count++; - }); - }); - }); -}; diff --git a/src/gui/test/nodejs/protocol/test-set-level.js b/src/gui/test/nodejs/protocol/test-set-level.js deleted file mode 100644 index baf74dfe..00000000 --- a/src/gui/test/nodejs/protocol/test-set-level.js +++ /dev/null @@ -1,105 +0,0 @@ -// Copyright (c) 2017 Intel Corporation. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -'use strict'; - -const assert = require('assert'); -const WebSocket = require('ws'); - -module.exports = function() { - let testCasesData = [ - { - title: 'set_level to error', - ops: [ - { - payload: {op: 'set_level', id: 'id1', level: 'error'}, - status: null - } - ], - }, - { - title: 'set_level to warning', - ops: [ - { - payload: {op: 'set_level', id: 'id1', level: 'warning'}, - status: null - } - ], - }, - { - title: 'set_level to info', - ops: [ - { - payload: {op: 'set_level', id: 'id1', level: 'info'}, - status: null - } - ], - }, - { - title: 'set_level to none', - ops: [ - { - payload: {op: 'set_level', id: 'id1', level: 'none'}, - status: 'none' - } - ], - }, - { - title: 'set_level to invalid', - ops: [ - { - payload: {op: 'set_level', id: 'id1', level: 'invalid'}, - status: 'error' - } - ], - }, - ]; - - testCasesData.forEach((testData, index) => { - it(testData.title, function() { - return new Promise((resolve, reject) => { - let ws = new WebSocket('ws://127.0.0.1:9090'); - let counter = 0; - let timeout = null; - - function handleMessage(data) { - if (timeout !== null) { - clearTimeout(timeout); - timeout = null; - } - if (data !== null || testData.ops[counter].status !== null) { - let response = JSON.parse(data); - assert.deepStrictEqual(response.level, testData.ops[counter].status); - } - - counter++; - if (counter === testData.ops.length) { - ws.close(); - resolve(); - } else { - ws.send(JSON.stringify(testData.ops[counter].payload)); - } - } - ws.on('message', handleMessage); - - ws.on('open', function() { - ws.send(JSON.stringify(testData.ops[0].payload)); - if (testData.ops[0].status === null) { - timeout = setTimeout(() => handleMessage(null), 100); - } - }); - }); - }); - }); -}; diff --git a/src/gui/test/nodejs/protocol/test-subscribe-msg.js b/src/gui/test/nodejs/protocol/test-subscribe-msg.js deleted file mode 100644 index d79a52fd..00000000 --- a/src/gui/test/nodejs/protocol/test-subscribe-msg.js +++ /dev/null @@ -1,215 +0,0 @@ -// Copyright (c) 2017 Intel Corporation. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -'use strict'; - -/* eslint-disable camelcase */ - -const assert = require('assert'); -const WebSocket = require('ws'); - -module.exports = function() { - - let testCasesData = [ - { - title: 'subscribe message with type: Bool', - msg0: {op: 'subscribe', id: 'subscribe_bool', topic: 'subscribe_bool_topic', type: 'std_msgs/Bool'}, - msg1: {op: 'advertise', id: 'advertise_setup_bool', topic: 'subscribe_bool_topic', type: 'std_msgs/Bool'}, - msg2: {op: 'publish', id: 'publish_setup_bool', topic: 'subscribe_bool_topic', msg: {data: true}}, - expectedData: true - }, - { - title: 'subscribe message with type: Byte', - msg0: {op: 'subscribe', id: 'subscribe_byte', topic: 'subscribe_byte_topic', type: 'std_msgs/Byte'}, - msg1: {op: 'advertise', id: 'advertise_setup_byte', topic: 'subscribe_byte_topic', type: 'std_msgs/Byte'}, - msg2: {op: 'publish', id: 'publish_setup_byte', topic: 'subscribe_byte_topic', msg: {data: 0xff}}, - expectedData: 255 - }, - { - title: 'subscribe message with type: Char', - msg0: {op: 'subscribe', id: 'subscribe_char', topic: 'subscribe_char_topic', type: 'std_msgs/Char'}, - msg1: {op: 'advertise', id: 'advertise_setup_char', topic: 'subscribe_char_topic', type: 'std_msgs/Char'}, - msg2: {op: 'publish', id: 'publish_setup_char', topic: 'subscribe_char_topic', msg: {data: 'A'}}, - expectedData: 65 - }, - { - title: 'subscribe message with type: String', - msg0: {op: 'subscribe', id: 'subscribe_string', topic: 'subscribe_string_topic', type: 'std_msgs/String'}, - msg1: {op: 'advertise', id: 'advertise_setup_string', topic: 'subscribe_string_topic', type: 'std_msgs/String'}, - msg2: {op: 'publish', id: 'publish_setup_string', topic: 'subscribe_string_topic', msg: {data: 'hello world!'}}, - expectedData: 'hello world!' - }, - { - title: 'subscribe message with type: Int8', - msg0: {op: 'subscribe', id: 'advertise_int8', topic: 'subscribe_int8_topic', type: 'std_msgs/Int8'}, - msg1: {op: 'advertise', id: 'advertise_setup_int8', topic: 'subscribe_int8_topic', type: 'std_msgs/Int8'}, - msg2: {op: 'publish', id: 'publish_setup_int8', topic: 'subscribe_int8_topic', msg: {data: -0x80}}, - expectedData: -128 - }, - { - title: 'subscribe message with type: UInt8', - msg0: {op: 'subscribe', id: 'subscribe_uint8', topic: 'subscribe_uint8_topic', type: 'std_msgs/UInt8'}, - msg1: {op: 'advertise', id: 'advertise_setup_uint8', topic: 'subscribe_uint8_topic', type: 'std_msgs/UInt8'}, - msg2: {op: 'publish', id: 'publish_setup_uint8', topic: 'subscribe_uint8_topic', msg: {data: 0xff}}, - expectedData: 255 - }, - { - title: 'subscribe message with type: Int16', - msg0: {op: 'subscribe', id: 'subscribe_int16', topic: 'subscribe_int16_topic', type: 'std_msgs/Int16'}, - msg1: {op: 'advertise', id: 'advertise_setup_int16', topic: 'subscribe_int16_topic', type: 'std_msgs/Int16'}, - msg2: {op: 'publish', id: 'publish_setup_int16', topic: 'subscribe_int16_topic', msg: {data: -0x8000}}, - expectedData: -0x8000 - }, - { - title: 'subscribe message with type: UInt16', - msg0: {op: 'subscribe', id: 'subscribe_uint16', topic: 'subscribe_uint16_topic', type: 'std_msgs/UInt16'}, - msg1: {op: 'advertise', id: 'advertise_setup_uint16', topic: 'subscribe_uint16_topic', type: 'std_msgs/UInt16'}, - msg2: {op: 'publish', id: 'publish_setup_uint16', topic: 'subscribe_uint16_topic', msg: {data: 0xffff}}, - expectedData: 0xffff - }, - { - title: 'subscribe message with type: Int32', - msg0: {op: 'subscribe', id: 'subscribe_int32', topic: 'subscribe_int32_topic', type: 'std_msgs/Int32'}, - msg1: {op: 'advertise', id: 'advertise_setup_int32', topic: 'subscribe_int32_topic', type: 'std_msgs/Int32'}, - msg2: {op: 'publish', id: 'publish_setup_int32', topic: 'subscribe_int32_topic', msg: {data: -0x80000000}}, - expectedData: -0x80000000 - }, - { - title: 'subscribe message with type: UInt32', - msg0: {op: 'subscribe', id: 'subscribe_uint32', topic: 'subscribe_uint32_topic', type: 'std_msgs/UInt32'}, - msg1: {op: 'advertise', id: 'advertise_setup_uint32', topic: 'subscribe_uint32_topic', type: 'std_msgs/UInt32'}, - msg2: {op: 'publish', id: 'publish_setup_uint32', topic: 'subscribe_uint32_topic', msg: {data: 0xffffffff}}, - expectedData: 0xffffffff - }, - { - title: 'subscribe message with type: Int64', - msg0: {op: 'subscribe', id: 'subscribe_int64', topic: 'subscribe_int64_topic', type: 'std_msgs/Int64'}, - msg1: {op: 'advertise', id: 'advertise_setup_int64', topic: 'subscribe_int64_topic', type: 'std_msgs/Int64'}, - msg2: { - op: 'publish', id: 'publish_setup_int64', topic: 'subscribe_int64_topic', - msg: {data: Number.MIN_SAFE_INTEGER}}, - expectedData: Number.MIN_SAFE_INTEGER - }, - { - title: 'subscribe message with type: UInt64', - msg0: {op: 'subscribe', id: 'subscribe_uint64', topic: 'subscribe_uint64_topic', type: 'std_msgs/UInt64'}, - msg1: {op: 'advertise', id: 'advertise_setup_uint64', topic: 'subscribe_uint64_topic', type: 'std_msgs/UInt64'}, - msg2: { - op: 'publish', id: 'publish_setup_uint64', topic: 'subscribe_uint64_topic', - msg: {data: Number.MAX_SAFE_INTEGER} - }, - expectedData: Number.MAX_SAFE_INTEGER - }, - { - title: 'subscribe message with type: Float32', - msg0: {op: 'subscribe', id: 'subscribe_float32', topic: 'subscribe_float32_topic', type: 'std_msgs/Float32'}, - msg1: { - op: 'advertise', id: 'advertise_setup_float32', topic: 'subscribe_float32_topic', type: 'std_msgs/Float32'}, - msg2: {op: 'publish', id: 'publish_setup_float32', topic: 'subscribe_float32_topic', msg: {data: 3.14}}, - msgType: 'float', - expectedData: 3.14, - precision: 0.01 - }, - { - title: 'subscribe message with type: Float64', - msg0: {op: 'subscribe', id: 'subscribe_float64', topic: 'subscribe_float64_topic', type: 'std_msgs/Float64'}, - msg1: { - op: 'advertise', id: 'advertise_setup_float64', topic: 'subscribe_float64_topic', type: 'std_msgs/Float64'}, - msg2: {op: 'publish', id: 'publish_setup_float64', topic: 'subscribe_float64_topic', msg: {data: 3.1415926}}, - msgType: 'float', - expectedData: 3.1415926, - precision: 0.0000001 - }, - { - title: 'subscribe message with type: ColorRGBA', - msg0: { - op: 'subscribe', id: 'subscribe_colorrgba', topic: 'subscribe_colorrgba_topic', type: 'std_msgs/ColorRGBA'}, - msg1: { - op: 'advertise', id: 'advertise_setup_colorrgba', topic: 'subscribe_colorrgba_topic', - type: 'std_msgs/ColorRGBA'}, - msg2: { - op: 'publish', id: 'publish_setup_colorrgba', topic: 'subscribe_colorrgba_topic', - msg: {a: 0.5, r: 255, g: 255, b: 255}}, - msgType: 'compound', - expectedData: {a: 0.5, r: 255, g: 255, b: 255} - }, - { - title: 'subscribe message with type: Header', - msg0: {op: 'subscribe', id: 'subscribe_header', topic: 'subscribe_header_topic', type: 'std_msgs/Header'}, - msg1: {op: 'advertise', id: 'advertise_setup_header', topic: 'subscribe_header_topic', type: 'std_msgs/Header'}, - msg2: {op: 'publish', id: 'publish_setup_header', topic: 'subscribe_header_topic', - msg: {stamp: {sec: 123456, nanosec: 789}, frame_id: 'main frame'}}, - msgType: 'compound', - expectedData: {stamp: {sec: 123456, nanosec: 789}, frame_id: 'main frame'} - }, - { - title: 'subscribe message with type: JointState', - msg0: { - op: 'subscribe', id: 'subscribe_jointstate', topic: 'subscribe_jointstate_topic', - type: 'sensor_msgs/JointState'}, - msg1: {op: 'advertise', id: 'advertise_setup_jointstate', topic: 'subscribe_jointstate_topic', - type: 'sensor_msgs/JointState'}, - msg2: {op: 'publish', id: 'publish_setup_jointstate', topic: 'subscribe_jointstate_topic', - msg: {header: {stamp: {sec: 123456, nanosec: 789}, frame_id: 'main frame'}, - name: ['Tom', 'Jerry'], position: [1, 2], velocity: [2, 3], effort: [4, 5, 6]}}, - msgType: 'compound', - expectedData: {header: {stamp: {sec: 123456, nanosec: 789}, frame_id: 'main frame'}, - name: ['Tom', 'Jerry'], position: [1, 2], velocity: [2, 3], effort: [4, 5, 6]} - } - ]; - let testResults = {respCount: 4, finalStatus: 'none'}; - - testCasesData.forEach((testData, index) => { - it(testData.title, function() { - return new Promise((resolve, reject) => { - let ws = new WebSocket('ws://127.0.0.1:9090'); - let counter = 0; - - ws.on('open', function() { - ws.send(JSON.stringify(testData.msg0)); - counter++; - }); - - ws.on('message', function(data) { - let response = JSON.parse(data); - if (counter < testResults.respCount) { - assert.deepStrictEqual(response.level, testResults.finalStatus); - } - if (counter === testResults.respCount) { - if (testData.msgType === 'float') { - assert.ok(Math.abs(response.msg.data - testData.expectedData) < testData.precision); - } else if (testData.msgType === 'compound') { - assert.deepEqual(response.msg, testData.expectedData); - } else { - assert.deepStrictEqual(response.msg.data, testData.expectedData); - } - ws.close(); - resolve(); - } - if (counter === 3) { - counter++; - } - if (counter === 2) { - ws.send(JSON.stringify(testData.msg2)); - counter++; - } - if (counter === 1) { - ws.send(JSON.stringify(testData.msg1)); - counter++; - } - }); - }); - }); - }); -}; diff --git a/src/gui/test/nodejs/protocol/test-subscribe.js b/src/gui/test/nodejs/protocol/test-subscribe.js deleted file mode 100644 index f9a32f69..00000000 --- a/src/gui/test/nodejs/protocol/test-subscribe.js +++ /dev/null @@ -1,147 +0,0 @@ -// Copyright (c) 2017 Intel Corporation. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -'use strict'; - -/* eslint-disable camelcase */ - -const assert = require('assert'); -const WebSocket = require('ws'); - -module.exports = function() { - - let testCasesData = [ - { - title: 'subscribe positive case 1: full fields', - msg0: {op: 'subscribe', id: 'subscribe_id1', topic: 'subscribe_topic1', type: 'std_msgs/String', - throttle_rate: 0, queue_length: 0, fragment_size: 1, compression: 'none'}, - msg1: {op: 'advertise', id: 'advertise_setup_id1', topic: 'subscribe_topic1', type: 'std_msgs/String'}, - msg2: {op: 'publish', id: 'publish_setup_id1', topic: 'subscribe_topic1', msg: {data: 'subscribe operation'}}, - }, - { - title: 'subscribe positive case 2: no field id', - msg0: {op: 'subscribe', topic: 'subscribe_topic2', type: 'std_msgs/String', - throttle_rate: 0, queue_length: 0, fragment_size: 1, compression: 'none'}, - msg1: {op: 'advertise', id: 'advertise_setup_id2', topic: 'subscribe_topic2', type: 'std_msgs/String'}, - msg2: {op: 'publish', id: 'publish_setup_id2', topic: 'subscribe_topic2', msg: {data: 'subscribe operation'}}, - }, - { - title: 'subscribe positive case 3: no field throttle_rate', - msg0: {op: 'subscribe', id: 'subscribe_id3', topic: 'subscribe_topic3', type: 'std_msgs/String', - queue_length: 0, fragment_size: 1, compression: 'none'}, - msg1: {op: 'advertise', id: 'advertise_setup_id3', topic: 'subscribe_topic3', type: 'std_msgs/String'}, - msg2: {op: 'publish', id: 'publish_setup_id3', topic: 'subscribe_topic3', msg: {data: 'subscribe operation'}}, - }, - { - title: 'subscribe positive case 4: no field queue_length', - msg0: {op: 'subscribe', id: 'subscribe_id4', topic: 'subscribe_topic4', type: 'std_msgs/String', - throttle_rate: 0, fragment_size: 1, compression: 'none'}, - msg1: {op: 'advertise', id: 'advertise_setup_id4', topic: 'subscribe_topic4', type: 'std_msgs/String'}, - msg2: {op: 'publish', id: 'publish_setup_id4', topic: 'subscribe_topic4', msg: {data: 'subscribe operation'}}, - }, - { - title: 'subscribe positive case 5: no field fragment_size', - msg0: {op: 'subscribe', id: 'advertise_id5', topic: 'subscribe_topic5', type: 'std_msgs/String', - throttle_rate: 0, queue_length: 0, compression: 'none'}, - msg1: {op: 'advertise', id: 'advertise_setup_id5', topic: 'subscribe_topic5', type: 'std_msgs/String'}, - msg2: {op: 'publish', id: 'publish_setup_id5', topic: 'subscribe_topic5', msg: {data: 'subscribe operation'}}, - }, - { - title: 'subscribe positive case 6: no field compression', - msg0: {op: 'subscribe', id: 'subscribe_id6', topic: 'subscribe_topic6', type: 'std_msgs/String', - throttle_rate: 0, queue_length: 0, fragment_size: 1}, - msg1: {op: 'advertise', id: 'advertise_setup_id6', topic: 'subscribe_topic6', type: 'std_msgs/String'}, - msg2: {op: 'publish', id: 'publish_setup_id6', topic: 'subscribe_topic6', msg: {data: 'subscribe operation'}}, - } - ]; - let testResults = {respCount: 4, finalStatus: 'none', data: 'subscribe operation'}; - - testCasesData.forEach((testData, index) => { - it(testData.title, function() { - return new Promise((resolve, reject) => { - let ws = new WebSocket('ws://127.0.0.1:9090'); - let counter = 0; - - ws.on('open', function() { - ws.send(JSON.stringify(testData.msg0)); - counter++; - }); - - ws.on('message', function(data) { - let response = JSON.parse(data); - if (counter === testResults.respCount) { - assert.deepStrictEqual(response.msg.data, testResults.data); - ws.close(); - resolve(); - } - if (counter === 3) { - counter++; - } - if (counter === 2) { - ws.send(JSON.stringify(testData.msg2)); - counter++; - } - if (counter === 1) { - assert.deepStrictEqual(response.level, testResults.finalStatus); - ws.send(JSON.stringify(testData.msg1)); - counter++; - } - }); - }); - }); - }); - - let testCasesNegData = [ - { - title: 'subscribe negative case 1: topic not exist', - subscribeMsg: {op: 'subscribe', id: 'subscribe_neg_id1', topic: 'subscribe_neg_topic1', type: 'std_msgs/Foo'}, - finalStatus: 'error' - }, - { - // Incompatible with rosbridge v2 protocol - title: 'subscribe negative case 2: type cannot be inferred', - subscribeMsg: {op: 'subscribe', id: 'subscribe_neg_id2', topic: 'subscribe_neg_topic2'}, - finalStatus: 'error' - }, - { - title: 'subscribe field checking case 1: invalid topic', - subscribeMsg: {op: 'subscribe', id: 'subscribe_neg_id3', topic: 42, type: 'std_msgs/String'}, - finalStatus: 'error' - }, - { - title: 'subscribe field checking case 1: invalid type', - subscribeMsg: {op: 'subscribe', id: 'subscribe_neg_id3', topic: 'subscribe_neg_topic4', type: true}, - finalStatus: 'error' - } - ]; - - testCasesNegData.forEach((testNegData, index) => { - it(testNegData.title, function() { - return new Promise((resolve, reject) => { - let ws = new WebSocket('ws://127.0.0.1:9090'); - - ws.on('open', function() { - ws.send(JSON.stringify(testNegData.subscribeMsg)); - }); - - ws.on('message', function(data) { - let response = JSON.parse(data); - assert.deepStrictEqual(response.level, testNegData.finalStatus); - ws.close(); - resolve(); - }); - }); - }); - }); -}; diff --git a/src/gui/test/nodejs/protocol/test-unadvertise-service.js b/src/gui/test/nodejs/protocol/test-unadvertise-service.js deleted file mode 100644 index c6f8e585..00000000 --- a/src/gui/test/nodejs/protocol/test-unadvertise-service.js +++ /dev/null @@ -1,123 +0,0 @@ -// Copyright (c) 2017 Intel Corporation. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -'use strict'; - -const assert = require('assert'); -const rclnodejs = require('rclnodejs'); -const WebSocket = require('ws'); - -module.exports = function() { - - before(function() { - return rclnodejs.init().then(() => { - var node = rclnodejs.createNode('service'); - var wsservice = node.createService('example_interfaces/srv/AddTwoInts', 'add_two_ints', - (request, response) => { - let result = response.template; - result.sum = request.a + request.b; - response.send(result); - }); - rclnodejs.spin(node); - }); - }); - - after(function() { - rclnodejs.shutdown(); - }); - - let testCasesData = [ - { - title: 'unadvertise_service positive case 1', - advertiseServiceMsg: { - op: 'advertise_service', type: 'example_interfaces/AddTwoInts', service: 'add_two_ints'}, - unadvertiseServiceMsg: {op: 'unadvertise_service', service: 'add_two_ints'}, - opCount: 2, - finalStatus: 'none' - }, - { - title: 'unadvertise_service positive case 2', - advertiseServiceMsg: { - op: 'advertise_service', type: 'example_interfaces/AddTwoInts', service: '/add_two_ints'}, - unadvertiseServiceMsg: {op: 'unadvertise_service', service: '/add_two_ints'}, - opCount: 2, - finalStatus: 'none' - }, - { - title: 'unadvertise_service negative case 1: invalid service type', - advertiseServiceMsg: { - op: 'advertise_service', type: 'example_interfaces/AddTwoInts', service: 'add_two_ints'}, - unadvertiseServiceMsg: {op: 'unadvertise_service', service: 42}, - opCount: 2, - finalStatus: 'error' - }, - { - title: 'unadvertise_service field checking case 1: empty service', - advertiseServiceMsg: { - op: 'advertise_service', type: 'example_interfaces/AddTwoInts', service: 'add_two_ints'}, - unadvertiseServiceMsg: {op: 'unadvertise_service', service: ''}, - opCount: 2, - finalStatus: 'error' - }, - { - title: 'unadvertise_service field checking case 1: with single quote', - advertiseServiceMsg: { - op: 'advertise_service', type: 'example_interfaces/AddTwoInts', service: 'add_two_ints'}, - unadvertiseServiceMsg: {op: 'unadvertise_service', service: "'add_two_ints'"}, - opCount: 2, - finalStatus: 'error' - }, - { - title: 'unadvertise_service field checking case 1: with double quote', - advertiseServiceMsg: { - op: 'advertise_service', type: 'example_interfaces/AddTwoInts', service: 'add_two_ints'}, - unadvertiseServiceMsg: {op: 'unadvertise_service', service: '"add_two_ints"'}, - opCount: 2, - finalStatus: 'error' - }, - { - title: 'unadvertise_service field checking case 1: unicode', - advertiseServiceMsg: { - op: 'advertise_service', type: 'example_interfaces/AddTwoInts', service: 'add_two_ints'}, - unadvertiseServiceMsg: {op: 'unadvertise_service', service: '\u8bdd\u9898'}, - opCount: 2, - finalStatus: 'error' - } - ]; - - testCasesData.forEach((testData, index) => { - it(testData.title, function(done) { - let ws = new WebSocket('ws://127.0.0.1:9090'); - let count = 0; - - ws.on('open', function() { - ws.send(JSON.stringify(testData.advertiseServiceMsg)); - count++; - }); - ws.on('message', function(data) { - let response = JSON.parse(data); - - if (count === testData.opCount) { - assert.deepStrictEqual(response.level, testData.finalStatus); - ws.close(); - done(); - } - if (count === 1) { - ws.send(JSON.stringify(testData.unadvertiseServiceMsg)); - count++; - } - }); - }); - }); -}; diff --git a/src/gui/test/nodejs/protocol/test-unadvertise.js b/src/gui/test/nodejs/protocol/test-unadvertise.js deleted file mode 100644 index 2a701772..00000000 --- a/src/gui/test/nodejs/protocol/test-unadvertise.js +++ /dev/null @@ -1,117 +0,0 @@ -// Copyright (c) 2017 Intel Corporation. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -'use strict'; - -const assert = require('assert'); -const WebSocket = require('ws'); - -module.exports = function() { - let testCasesData = [ - { - title: 'unadvertise positive case 1', - advertiseMsg: {op: 'advertise', id: 'advertise_setup1', topic: 'unadvertise_topic1', type: 'std_msgs/String'}, - unadvertiseMsg: {op: 'unadvertise', id: 'unadvertise_id1', topic: 'unadvertise_topic1'}, - opCount: 2, - finalStatus: 'none' - }, - { - title: 'unadvertise positive case 2', - advertiseMsg: {op: 'advertise', id: 'advertise_setup2', topic: 'unadvertise_topic2', type: 'std_msgs/String'}, - unadvertiseMsg: {op: 'unadvertise', id: 'unadvertise_id2', topic: 'unadvertise_topic2'}, - opCount: 2, - finalStatus: 'none' - }, - { - title: 'unadvertise positive case 3: ROS2 message type format', - advertiseMsg: {op: 'advertise', id: 'advertise_ros2_msg_setup', topic: 'unadvertise_ros2_msg_topic', - type: 'std_msgs/msg/String'}, - unadvertiseMsg: {op: 'unadvertise', id: 'unadvertise_ros2_msg_setup', topic: 'unadvertise_ros2_msg_topic'}, - opCount: 2, - finalStatus: 'none' - }, - { - title: 'unadvertise negative case 1', - unadvertiseMsg: {op: 'unadvertise', id: 'unadvertise_id3', topic: 'unadvertise_topic3'}, - opCount: 1, - finalStatus: 'warning' - }, - { - title: 'unadvertise field checking case 1: invalid topic', - advertiseMsg: {op: 'advertise', id: 'advertise_setup4', topic: 'unadvertise_topic4', type: 'std_msgs/String'}, - unadvertiseMsg: {op: 'unadvertise', id: 'unadvertise_id4', topic: true}, - opCount: 2, - finalStatus: 'error' - }, - { - title: 'unadvertise field checking case 2: topic cannot be empty', - advertiseMsg: {op: 'advertise', id: 'advertise_setup5', topic: 'unadvertise_topic5', type: 'std_msgs/String'}, - unadvertiseMsg: {op: 'unadvertise', id: 'unadvertise_id5', topic: ''}, - opCount: 2, - finalStatus: 'error' - }, - { - title: 'unadvertise field checking case 3: topic cannot contain single quote', - advertiseMsg: {op: 'advertise', id: 'advertise_setup6', topic: 'unadvertise_topic6', type: 'std_msgs/String'}, - unadvertiseMsg: {op: 'unadvertise', id: 'unadvertise_id6', topic: "'single_advertise_topic'"}, - opCount: 2, - finalStatus: 'error' - }, - { - title: 'unadvertise field checking case 3: topic cannot contain double quotes', - advertiseMsg: {op: 'advertise', id: 'advertise_setup7', topic: 'unadvertise_topic7', type: 'std_msgs/String'}, - unadvertiseMsg: {op: 'unadvertise', id: 'unadvertise_id7', topic: '"double_advertise_topic"'}, - opCount: 2, - finalStatus: 'error' - }, - { - title: 'unadvertise field checking case 3: topic does not support unicode', - advertiseMsg: {op: 'advertise', id: 'advertise_setup8', topic: 'unadvertise_topic8', type: 'std_msgs/String'}, - unadvertiseMsg: {op: 'unadvertise', id: 'unadvertise_id8', topic: '\u8bdd\u9898'}, - opCount: 2, - finalStatus: 'error' - } - ]; - - testCasesData.forEach((testData, index) => { - it(testData.title, function() { - return new Promise((resolve, reject) => { - let ws = new WebSocket('ws://127.0.0.1:9090'); - let counter = 0; - - ws.on('open', function() { - if (testData.advertiseMsg !== undefined) { - ws.send(JSON.stringify(testData.advertiseMsg)); - } else { - ws.send(JSON.stringify(testData.unadvertiseMsg)); - } - counter++; - }); - ws.on('message', function(data) { - if (counter === testData.opCount) { - let response = JSON.parse(data); - assert.deepStrictEqual(response.level, testData.finalStatus); - counter++; - ws.close(); - resolve(); - } - if (counter === 1) { - ws.send(JSON.stringify(testData.unadvertiseMsg)); - counter++; - } - }); - }); - }); - }); -}; diff --git a/src/gui/test/nodejs/protocol/test-unsubscribe.js b/src/gui/test/nodejs/protocol/test-unsubscribe.js deleted file mode 100644 index 9cb27e58..00000000 --- a/src/gui/test/nodejs/protocol/test-unsubscribe.js +++ /dev/null @@ -1,104 +0,0 @@ -// Copyright (c) 2017 Intel Corporation. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -'use strict'; - -/* eslint-disable camelcase */ - -const assert = require('assert'); -const WebSocket = require('ws'); - -module.exports = function() { - let testCasesData = [ - { - title: 'unsubscribe positive case 1', - subscribeMsg1: {op: 'subscribe', id: 'subscribe_setup_id1', topic: 'unsubscribe_topic1', type: 'std_msgs/String'}, - unsubscribeMsg: {op: 'unsubscribe', id: 'subscribe_setup_id1', topic: 'unsubscribe_topic1'}, - opCount: 2, - finalStatus: 'none' - }, - { - title: 'unsubscribe positive case 2', - subscribeMsg1: {op: 'subscribe', id: 'subscribe_setup_id2', topic: 'unsubscribe_topic2', type: 'std_msgs/Bool'}, - subscribeMsg2: {op: 'subscribe', id: 'subscribe_setup_id3', topic: 'unsubscribe_topic2', type: 'std_msgs/Bool'}, - unsubscribeMsg: {op: 'unsubscribe', topic: 'unsubscribe_topic2'}, - opCount: 3, - finalStatus: 'none' - }, - { - title: 'unbscribe negative case 1: unknown topic', - subscribeMsg1: {op: 'subscribe', id: 'subscribe_setup_id4', topic: 'unsubscribe_topic4', type: 'std_msgs/Byte'}, - unsubscribeMsg: {op: 'unsubscribe', id: 'subscribe_setup_id4', topic: 'unsubscribe_topic4x'}, - opCount: 2, - finalStatus: 'warning' - }, - { - title: 'unsubscribe negative case 2: unknown id', - subscribeMsg1: {op: 'subscribe', id: 'subscribe_setup_id5', topic: 'unsubscribe_topic5', type: 'std_msgs/Char'}, - unsubscribeMsg: {op: 'unsubscribe', id: 'subscribe_setup_id5x', topic: 'unsubscribe_topic5'}, - opCount: 2, - finalStatus: 'none' - }, - { - title: 'unsubscribe field checking case 1: invalid id', - subscribeMsg1: {op: 'subscribe', id: 'subscribe_setup_id6', topic: 'subscribe_topic6', type: 'std_msgs/Header'}, - unsubscribeMsg: {op: 'unsubscribe', id: 42, topic: 'subscribe_topic6'}, - opCount: 2, - finalStatus: 'none' - }, - { - title: 'unsubscribe field checking case 2: invalid topic', - subscribeMsg1: { - op: 'subscribe', id: 'subscribe_setup_id7', topic: 'subscribe_topic7', type: 'std_msgs/ColorRGBA'}, - unsubscribeMsg: {op: 'unsubscribe', id: 'subscribe_setup_id7', topic: 42}, - opCount: 2, - finalStatus: 'error' - } - ]; - - testCasesData.forEach((testData, index) => { - it(testData.title, function() { - return new Promise((resolve, reject) => { - let ws = new WebSocket('ws://127.0.0.1:9090'); - let counter = 0; - - ws.on('open', function() { - ws.send(JSON.stringify(testData.subscribeMsg1)); - counter++; - }); - ws.on('message', function(data) { - let response = JSON.parse(data); - - if (counter === testData.opCount) { - assert.deepStrictEqual(response.level, testData.finalStatus); - ws.close(); - resolve(); - } - if (counter === 2 && testData.opCount > 2) { - ws.send(JSON.stringify(testData.unsubscribeMsg)); - counter++; - } - if (counter === 1) { - if (testData.opCount === 2) { - ws.send(JSON.stringify(testData.unsubscribeMsg)); - } else if (testData.opCount === 3) { - ws.send(JSON.stringify(testData.subscribeMsg2)); - } - counter++; - } - }); - }); - }); - }); -}; diff --git a/src/gui/test/nodejs/test-rosauth-internal.js b/src/gui/test/nodejs/test-rosauth-internal.js deleted file mode 100644 index 88284a61..00000000 --- a/src/gui/test/nodejs/test-rosauth-internal.js +++ /dev/null @@ -1,187 +0,0 @@ -// Copyright (c) 2017 Intel Corporation. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -'use strict'; - -const assert = require('assert'); -const rosauth = require('../../lib/rosauth.js'); -const {sha512} = require('js-sha512'); - -function getJavaScriptTime() { - const t = new Date().getTime(); - return {sec: Math.floor(t / 1000), nanosec: (t % 1000) * 1000 * 1000}; -} - -describe('Test rosauth module internally/directly', function() { - this.timeout(60 * 1000); - - before(function() { - rosauth.setSecretFile('../data/example.secret'); - }); - - after(function() { - }); - - it('Test authenticate() method directly, correct MAC', function() { - const t = getJavaScriptTime(); - let msg = { - mac: '', - client: '192.168.1.101', - dest: '192.168.1.111', - rand: 'xyzabc', - t: {sec: t.sec, nanosec: t.nanosec}, - level: 'admin', - end: {sec: t.sec + 120, nanosec: t.nanosec}, - }; - - msg.mac = sha512('relaxthisain\'tmyfirstrodeo' + - msg.client + msg.dest + msg.rand + msg.t.sec + msg.level + msg.end.sec); - - assert.ok(rosauth.authenticate(msg), 'Should return true for correct MAC'); - }); - - it('Test authenticate() method directly, no MAC', function() { - const t = getJavaScriptTime(); - let msg = { - mac: '', - client: '192.168.1.101', - dest: '192.168.1.111', - rand: 'xyzabc', - t: {sec: t.sec, nanosec: t.nanosec}, - level: 'admin', - end: {sec: t.sec + 120, nanosec: t.nanosec}, - }; - - assert(!rosauth.authenticate(msg), 'Should NOT return true for incorrect MAC'); - }); - - it('Test authenticate() method directly, wrong MAC', function() { - const t = getJavaScriptTime(); - let msg = { - mac: '', - client: '192.168.1.101', - dest: '192.168.1.111', - rand: 'xyzabc', - t: {sec: t.sec, nanosec: t.nanosec}, - level: 'admin', - end: {sec: t.sec + 120, nanosec: t.nanosec}, - }; - - msg.mac = sha512('relaxthisain\'tmyfirstrodeo--' + - msg.client + msg.dest + msg.rand + msg.t.sec + msg.level + msg.end.sec); - - assert(!rosauth.authenticate(msg), 'Should NOT return true for incorrect MAC'); - }); - - [ - {secDelta: -Number.MAX_VALUE, nanosecDelta: 0, secDeltaEnd: 120, nanosecDeltaEnd: 0}, - {secDelta: -Number.MAX_SAFE_INTEGER, nanosecDelta: 0, secDeltaEnd: 120, nanosecDeltaEnd: 0}, - {secDelta: -6, nanosecDelta: 0, secDeltaEnd: 120, nanosecDeltaEnd: 0}, - {secDelta: -7, nanosecDelta: 0, secDeltaEnd: 120, nanosecDeltaEnd: 0}, - {secDelta: -5, nanosecDelta: 0, secDeltaEnd: 120, nanosecDeltaEnd: 0}, - - {secDelta: 5, nanosecDelta: 0, secDeltaEnd: 120, nanosecDeltaEnd: 0}, - {secDelta: 6, nanosecDelta: 0, secDeltaEnd: 120, nanosecDeltaEnd: 0}, - {secDelta: 7, nanosecDelta: 0, secDeltaEnd: 120, nanosecDeltaEnd: 0}, - {secDelta: Number.MAX_SAFE_INTEGER, nanosecDelta: 0, secDeltaEnd: 120, nanosecDeltaEnd: 0}, - {secDelta: Number.MAX_VALUE, nanosecDelta: 0, secDeltaEnd: 120, nanosecDeltaEnd: 0}, - - {secDelta: Number.NaN, nanosecDelta: 0, secDeltaEnd: 0, nanosecDeltaEnd: 0}, - {secDelta: 0, nanosecDelta: Number.NaN, secDeltaEnd: 0, nanosecDeltaEnd: 0}, - {secDelta: 0, nanosecDelta: 0, secDeltaEnd: Number.NaN, nanosecDeltaEnd: 0}, - {secDelta: 0, nanosecDelta: 0, secDeltaEnd: 0, nanosecDeltaEnd: Number.NaN}, - - {secDelta: 0, nanosecDelta: 1000 * 1000 * 1000, secDeltaEnd: 10, nanosecDeltaEnd: 0}, - {secDelta: 0, nanosecDelta: Number.MAX_VALUE, secDeltaEnd: 10, nanosecDeltaEnd: 0}, - {secDelta: 0, nanosecDelta: 0, secDeltaEnd: 10, nanosecDeltaEnd: 1000 * 1000 * 1000}, - {secDelta: 0, nanosecDelta: 0, secDeltaEnd: 10, nanosecDeltaEnd: Number.MAX_VALUE}, - - {secDelta: -getJavaScriptTime().sec - 10, nanosecDelta: 0, secDeltaEnd: 10, nanosecDeltaEnd: 0}, - {secDelta: -Number.MAX_VALUE, nanosecDelta: 0, secDeltaEnd: 10, nanosecDeltaEnd: 0}, - {secDelta: 0, nanosecDelta: 0, secDeltaEnd: -Number.MAX_VALUE, nanosecDeltaEnd: 0}, - {secDelta: 0, nanosecDelta: 0, secDeltaEnd: -getJavaScriptTime().sec - 10, nanosecDeltaEnd: 0}, - - {secDelta: 0, nanosecDelta: 0, secDeltaEnd: -0, nanosecDeltaEnd: 0}, - {secDelta: 0, nanosecDelta: 0, secDeltaEnd: -1, nanosecDeltaEnd: 0}, - {secDelta: 0, nanosecDelta: 0, secDeltaEnd: -2, nanosecDeltaEnd: 0}, - {secDelta: 0, nanosecDelta: 0, secDeltaEnd: -3, nanosecDeltaEnd: 0}, - {secDelta: 0, nanosecDelta: 0, secDeltaEnd: -4, nanosecDeltaEnd: 0}, - {secDelta: 0, nanosecDelta: 0, secDeltaEnd: -100, nanosecDeltaEnd: 0}, - {secDelta: 0, nanosecDelta: 0, secDeltaEnd: -100000, nanosecDeltaEnd: 0}, - {secDelta: 0, nanosecDelta: 0, secDeltaEnd: -Number.MAX_SAFE_INTEGER, nanosecDeltaEnd: 0}, - {secDelta: 0, nanosecDelta: 0, secDeltaEnd: -Number.MAX_VALUE, nanosecDeltaEnd: 0}, - - {secDelta: 0, nanosecDelta: 0, secDeltaEnd: 0, nanosecDeltaEnd: -0}, - {secDelta: 0, nanosecDelta: 0, secDeltaEnd: 0, nanosecDeltaEnd: -1}, - {secDelta: 0, nanosecDelta: 0, secDeltaEnd: 0, nanosecDeltaEnd: -2}, - {secDelta: 0, nanosecDelta: 0, secDeltaEnd: 0, nanosecDeltaEnd: -1000}, - {secDelta: 0, nanosecDelta: 0, secDeltaEnd: 0, nanosecDeltaEnd: -2000}, - {secDelta: 0, nanosecDelta: 0, secDeltaEnd: 0, nanosecDeltaEnd: -3000}, - ].forEach((testData, index) => { - it('Test authenticate() method directly, correct MAC, wrong timestamp, case#' + index, function() { - const t = getJavaScriptTime(); - let msg = { - mac: '', - client: '192.168.1.101', - dest: '192.168.1.111', - rand: 'xyzabc', - t: {sec: t.sec + testData.secDelta, nanosec: t.nanosec + testData.nanosecDelta}, - level: 'admin', - end: {sec: t.sec + testData.secDeltaEnd, nanosec: t.nanosec + testData.nanosecDeltaEnd}, - }; - - msg.mac = sha512('relaxthisain\'tmyfirstrodeo' + - msg.client + msg.dest + msg.rand + msg.t.sec + msg.level + msg.end.sec); - - assert(!rosauth.authenticate(msg), 'Should return false for correct MAC + wrong timestamp'); - }); - }); - - [ - {secDelta: 0, nanosecDelta: 0, secDeltaEnd: 10, nanosecDeltaEnd: 0}, - {secDelta: -1, nanosecDelta: 0, secDeltaEnd: 10, nanosecDeltaEnd: 0}, - {secDelta: -2, nanosecDelta: 0, secDeltaEnd: 10, nanosecDeltaEnd: 0}, - {secDelta: -3, nanosecDelta: 0, secDeltaEnd: 10, nanosecDeltaEnd: 0}, - {secDelta: -4, nanosecDelta: 0, secDeltaEnd: 10, nanosecDeltaEnd: 0}, - - {secDelta: 1, nanosecDelta: 0, secDeltaEnd: 10, nanosecDeltaEnd: 0}, - {secDelta: 2, nanosecDelta: 0, secDeltaEnd: 10, nanosecDeltaEnd: 0}, - {secDelta: 3, nanosecDelta: 0, secDeltaEnd: 10, nanosecDeltaEnd: 0}, - {secDelta: 4, nanosecDelta: 0, secDeltaEnd: 10, nanosecDeltaEnd: 0}, - - {secDelta: 0, nanosecDelta: 0, secDeltaEnd: 5, nanosecDeltaEnd: 0}, - {secDelta: 0, nanosecDelta: 0, secDeltaEnd: 10, nanosecDeltaEnd: 0}, - {secDelta: 0, nanosecDelta: 0, secDeltaEnd: Number.MAX_SAFE_INTEGER, nanosecDeltaEnd: 0}, - {secDelta: 0, nanosecDelta: 0, secDeltaEnd: Number.MAX_VALUE, nanosecDeltaEnd: 0}, - ].forEach((testData, index) => { - it('Test authenticate() method directly, correct MAC, correct timestamp, case#' + index, function() { - const t = getJavaScriptTime(); - let msg = { - mac: '', - client: '192.168.1.101', - dest: '192.168.1.111', - rand: 'xyzabc', - t: {sec: t.sec, nanosec: t.nanosec}, - level: 'admin', - end: {sec: t.sec + 120, nanosec: t.nanosec}, - }; - - msg.mac = sha512('relaxthisain\'tmyfirstrodeo' + - msg.client + msg.dest + msg.rand + msg.t.sec + msg.level + msg.end.sec); - - assert.ok(rosauth.authenticate(msg), 'Should return true for correct MAC'); - }); - }); - -}); diff --git a/src/gui/.gitignore b/src/lhw_gui/.gitignore similarity index 100% rename from src/gui/.gitignore rename to src/lhw_gui/.gitignore diff --git a/src/gui/.travis.yml b/src/lhw_gui/.travis.yml similarity index 100% rename from src/gui/.travis.yml rename to src/lhw_gui/.travis.yml diff --git a/src/gui/Dockerfile b/src/lhw_gui/Dockerfile similarity index 100% rename from src/gui/Dockerfile rename to src/lhw_gui/Dockerfile diff --git a/src/gui/README.md b/src/lhw_gui/README.md similarity index 100% rename from src/gui/README.md rename to src/lhw_gui/README.md diff --git a/src/gui/appveyor.yml b/src/lhw_gui/appveyor.yml similarity index 100% rename from src/gui/appveyor.yml rename to src/lhw_gui/appveyor.yml diff --git a/src/gui/index.js b/src/lhw_gui/index.js similarity index 100% rename from src/gui/index.js rename to src/lhw_gui/index.js diff --git a/src/gui/lhw_gui/html/room_navigation.html b/src/lhw_gui/lhw_gui/html/room_navigation.html similarity index 86% rename from src/gui/lhw_gui/html/room_navigation.html rename to src/lhw_gui/lhw_gui/html/room_navigation.html index 6a50d651..2acdc256 100644 --- a/src/gui/lhw_gui/html/room_navigation.html +++ b/src/lhw_gui/lhw_gui/html/room_navigation.html @@ -73,10 +73,6 @@ clicked_room_publisher.publish({x: y_px, y: x_px, z: 0}); } - - - - // Subscribe a Topic rooms_info_subscriber.subscribe(function(message) { var new_room = document.getElementById("new_room"); @@ -100,6 +96,11 @@ }); + + + + + </script> </head> @@ -130,9 +131,13 @@ <button id="new_room_button"> Update </button> </form> <div> - <figure> - <img id="rooms_image" src="../../maps/simple_map_rooms.png" alt="Rooms map" width="100%"/> - </figure> + Choose map: + <input type="file" id="chooseMap" > + + <figure> + <!--img id="rooms_image" src="../../../lhw_motion/maps/simple_map_rooms.png" alt="Can't find rooms map" width="100%"/--> + <img src="#" id="rooms_image" alt=" " width="100%"> + </figure> </div> <script> @@ -166,6 +171,22 @@ new_room.value = "" }); + document.getElementById('chooseMap').onchange = function (evt) { + var tgt = evt.target || window.event.srcElement, + files = tgt.files; + + // FileReader support + if (FileReader && files && files.length) { + var fr = new FileReader(); + fr.onload = function () { + document.getElementById("rooms_image").src = fr.result; + } + fr.readAsDataURL(files[0]); + + document.getElementById('chooseMap').style.display = "none" + } +} + diff --git a/src/gui/examples/index.js b/src/lhw_gui/lhw_gui/index.js similarity index 100% rename from src/gui/examples/index.js rename to src/lhw_gui/lhw_gui/index.js diff --git a/src/lhw_gui/package-lock.json b/src/lhw_gui/package-lock.json new file mode 100644 index 00000000..22bf95ce --- /dev/null +++ b/src/lhw_gui/package-lock.json @@ -0,0 +1,7876 @@ +{ + "name": "ros2-web-bridge", + "version": "0.3.1", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "ros2-web-bridge", + "version": "0.3.1", + "license": "Apache-2.0", + "dependencies": { + "commander": "^5.0.0", + "debug": "^4.1.1", + "rclnodejs": "^0.x.1", + "uuid": "^7.0.2", + "ws": "^7.1.1" + }, + "bin": { + "rosbridge": "bin/rosbridge.js" + }, + "devDependencies": { + "async": "^3.2.0", + "eslint": "^6.8.0", + "express": "^4.16.2", + "js-sha512": "^0.8.0", + "jsdom": "^16.2.1", + "mocha": "^7.1.1", + "puppeteer": "^2.1.1" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", + "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.12.13" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.0.tgz", + "integrity": "sha512-V3ts7zMSu5lfiwWDVWzRDGIN+lnCEUdaXgtVHJgLb1rGaA6jMrtB9EmE7L18foXJIE8Un/A/h6NJfGQp/e1J4A==", + "dev": true + }, + "node_modules/@babel/highlight": { + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.0.tgz", + "integrity": "sha512-YSCOwxvTYEIMSGaBQb5kDDsCopDdiUGsqpatp3fOlI4+2HQSkTmEVWnVuySdAC5EWCqSWWTv0ib63RjR7dTBdg==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.14.0", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "node_modules/@types/mime-types": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@types/mime-types/-/mime-types-2.1.0.tgz", + "integrity": "sha1-nKUs2jY/aZxpRmwqbM2q2RPqenM=", + "dev": true + }, + "node_modules/abab": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz", + "integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==", + "dev": true + }, + "node_modules/accepts": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "dev": true, + "dependencies": { + "mime-types": "~2.1.24", + "negotiator": "0.6.2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-globals": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", + "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", + "dev": true, + "dependencies": { + "acorn": "^7.1.1", + "acorn-walk": "^7.1.1" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz", + "integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==", + "dev": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/acorn-walk": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/agent-base": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-5.1.1.tgz", + "integrity": "sha512-TMeqbNl2fMW0nMjTEPOwe3J/PRFP4vqeoNuQMG0HlMrtm5QxKqdvAkZ1pRBQ/ulIyDD5Yq0nJ7YbdD8ey0TO3g==", + "dev": true, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-colors": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.3.tgz", + "integrity": "sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-escapes/node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=" + }, + "node_modules/anymatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", + "dev": true + }, + "node_modules/array-index": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-index/-/array-index-1.0.0.tgz", + "integrity": "sha1-7FanSe4QPk4Ix5C5w1PfFgVbl/k=", + "dependencies": { + "debug": "^2.2.0", + "es6-symbol": "^3.0.2" + }, + "engines": { + "node": "*" + } + }, + "node_modules/array-index/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/array-index/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "node_modules/array.prototype.flat": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.4.tgz", + "integrity": "sha512-4470Xi3GAPAjZqFcljX2xzckv1qeKPizoNkiS0+O4IoPR2ZNpcjE0pkhdihlDouK+x6QOast26B4Q/O9DJnwSg==", + "dependencies": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "dev": true, + "dependencies": { + "safer-buffer": "~2.1.0" + } + }, + "node_modules/assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/astral-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", + "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/async": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.0.tgz", + "integrity": "sha512-TR2mEZFVOj2pLStYxLht7TyfuRzaydfpxr3k9RpHIzMgw7A64dzsdqCxH1WJyQdoe8T10nDXd9wnEigmiuHIZw==", + "dev": true + }, + "node_modules/async-limiter": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", + "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", + "dev": true + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true + }, + "node_modules/at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/aws4": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", + "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==", + "dev": true + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "dev": true, + "dependencies": { + "tweetnacl": "^0.14.3" + } + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "dependencies": { + "file-uri-to-path": "1.0.0" + } + }, + "node_modules/body-parser": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "dev": true, + "dependencies": { + "bytes": "3.1.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "on-finished": "~2.3.0", + "qs": "6.7.0", + "raw-body": "2.4.0", + "type-is": "~1.6.17" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browser-process-hrtime": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", + "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", + "dev": true + }, + "node_modules/browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", + "dev": true + }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", + "dev": true + }, + "node_modules/bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "dev": true + }, + "node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "dev": true + }, + "node_modules/chokidar": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.3.0.tgz", + "integrity": "sha512-dGmKLDdT3Gdl7fBUe8XK+gAtGmzy5Fn0XkkWQuYxGIgWVPPse2CxFA5mtrlD0TOHaHjEUqkWNyP1XdHoJES/4A==", + "dev": true, + "dependencies": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.2.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.1.1" + } + }, + "node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-width": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", + "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "dev": true, + "dependencies": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + } + }, + "node_modules/cliui/node_modules/emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "node_modules/cliui/node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/cliui/node_modules/string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "dependencies": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", + "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/compare-versions": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-3.6.0.tgz", + "integrity": "sha512-W6Af2Iw1z4CB7q4uU4hv646dW9GQuBM+YpC0UvUCWSD8w90SJjp+ujJuXaEMtAXBtSqGfMPuFOVn4/+FlaqfBA==" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "node_modules/concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "dev": true, + "engines": [ + "node >= 0.8" + ], + "dependencies": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "node_modules/content-disposition": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", + "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "dev": true, + "dependencies": { + "safe-buffer": "5.1.2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", + "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", + "dev": true + }, + "node_modules/core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "node_modules/cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "dependencies": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "engines": { + "node": ">=4.8" + } + }, + "node_modules/cross-spawn/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/cssom": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", + "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==", + "dev": true + }, + "node_modules/cssstyle": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", + "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", + "dev": true, + "dependencies": { + "cssom": "~0.3.6" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cssstyle/node_modules/cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", + "dev": true + }, + "node_modules/d": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", + "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", + "dependencies": { + "es5-ext": "^0.10.50", + "type": "^1.0.1" + } + }, + "node_modules/dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dev": true, + "dependencies": { + "assert-plus": "^1.0.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/data-urls": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", + "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", + "dev": true, + "dependencies": { + "abab": "^2.0.3", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decimal.js": { + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.2.1.tgz", + "integrity": "sha512-KaL7+6Fw6i5A2XSnsbhm/6B+NuEA7TZ4vqxnd5tXz9sbKtrN9Srj8ab4vKVdK8YAqZO9P1kg45Y6YLoduPf+kw==", + "dev": true + }, + "node_modules/deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true + }, + "node_modules/define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dependencies": { + "object-keys": "^1.0.12" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", + "dev": true + }, + "node_modules/diff": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/domexception": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", + "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", + "dev": true, + "dependencies": { + "webidl-conversions": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/domexception/node_modules/webidl-conversions": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", + "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/dot": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dot/-/dot-1.1.3.tgz", + "integrity": "sha512-/nt74Rm+PcfnirXGEdhZleTwGC2LMnuKTeeTIlI82xb5loBBoXNYzr2ezCroPSMtilK8EZIfcNZwOcHN+ib1Lg==", + "engines": [ + "node >=0.2.6" + ], + "bin": { + "dottojs": "bin/dot-packer" + } + }, + "node_modules/ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "dev": true, + "dependencies": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", + "dev": true + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/es-abstract": { + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0.tgz", + "integrity": "sha512-LJzK7MrQa8TS0ja2w3YNLzUgJCGPdPOV1yVvezjNnS89D+VR08+Szt2mz3YB2Dck/+w5tfIq/RoUAFqJJGM2yw==", + "dependencies": { + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "get-intrinsic": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.2", + "is-callable": "^1.2.3", + "is-negative-zero": "^2.0.1", + "is-regex": "^1.1.2", + "is-string": "^1.0.5", + "object-inspect": "^1.9.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.2", + "string.prototype.trimend": "^1.0.4", + "string.prototype.trimstart": "^1.0.4", + "unbox-primitive": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-abstract/node_modules/object.assign": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "dependencies": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es5-ext": { + "version": "0.10.53", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.53.tgz", + "integrity": "sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q==", + "dependencies": { + "es6-iterator": "~2.0.3", + "es6-symbol": "~3.1.3", + "next-tick": "~1.0.0" + } + }, + "node_modules/es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", + "dependencies": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, + "node_modules/es6-symbol": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", + "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", + "dependencies": { + "d": "^1.0.1", + "ext": "^1.1.2" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", + "dev": true + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/escodegen": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz", + "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==", + "dev": true, + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=6.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "node_modules/escodegen/node_modules/estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/eslint": { + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.8.0.tgz", + "integrity": "sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "ajv": "^6.10.0", + "chalk": "^2.1.0", + "cross-spawn": "^6.0.5", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "eslint-scope": "^5.0.0", + "eslint-utils": "^1.4.3", + "eslint-visitor-keys": "^1.1.0", + "espree": "^6.1.2", + "esquery": "^1.0.1", + "esutils": "^2.0.2", + "file-entry-cache": "^5.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^5.0.0", + "globals": "^12.1.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "inquirer": "^7.0.0", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.3.0", + "lodash": "^4.17.14", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.1", + "natural-compare": "^1.4.0", + "optionator": "^0.8.3", + "progress": "^2.0.0", + "regexpp": "^2.0.1", + "semver": "^6.1.2", + "strip-ansi": "^5.2.0", + "strip-json-comments": "^3.0.1", + "table": "^5.2.3", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/eslint-utils": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", + "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^1.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/espree": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-6.2.1.tgz", + "integrity": "sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==", + "dev": true, + "dependencies": { + "acorn": "^7.1.1", + "acorn-jsx": "^5.2.0", + "eslint-visitor-keys": "^1.1.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esquery": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", + "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "dev": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esquery/node_modules/estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", + "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", + "dev": true, + "dependencies": { + "accepts": "~1.3.7", + "array-flatten": "1.1.1", + "body-parser": "1.19.0", + "content-disposition": "0.5.3", + "content-type": "~1.0.4", + "cookie": "0.4.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.1.2", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.5", + "qs": "6.7.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.1.2", + "send": "0.17.1", + "serve-static": "1.14.1", + "setprototypeof": "1.1.1", + "statuses": "~1.5.0", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "node_modules/ext": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ext/-/ext-1.4.0.tgz", + "integrity": "sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A==", + "dependencies": { + "type": "^2.0.0" + } + }, + "node_modules/ext/node_modules/type": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/type/-/type-2.5.0.tgz", + "integrity": "sha512-180WMDQaIMm3+7hGXWf12GtdniDEy7nYcyFMKJn/eZz/6tSLXrUN9V0wKSbMjej0I1WHWbpREDEKHtqPQa9NNw==" + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "node_modules/external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "dev": true, + "dependencies": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/extract-zip": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.7.0.tgz", + "integrity": "sha512-xoh5G1W/PB0/27lXgMQyIhP5DSY/LhoCsOyZgb+6iMmRtCwVBo55uKaMoEYrDCKQhWvqEip5ZPKAc6eFNyf/MA==", + "dev": true, + "dependencies": { + "concat-stream": "^1.6.2", + "debug": "^2.6.9", + "mkdirp": "^0.5.4", + "yauzl": "^2.10.0" + }, + "bin": { + "extract-zip": "cli.js" + } + }, + "node_modules/extract-zip/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/extract-zip/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "node_modules/extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "dev": true, + "engines": [ + "node >=0.6.0" + ] + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, + "node_modules/fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=", + "dev": true, + "dependencies": { + "pend": "~1.2.0" + } + }, + "node_modules/figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/file-entry-cache": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", + "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", + "dev": true, + "dependencies": { + "flat-cache": "^2.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==" + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/flat": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/flat/-/flat-4.1.1.tgz", + "integrity": "sha512-FmTtBsHskrU6FJ2VxCnsDb84wu9zhmO3cUX2kGFb5tuwhfXxGciiT0oRY+cck35QmG+NmGh5eLz6lLCpWTqwpA==", + "dev": true, + "dependencies": { + "is-buffer": "~2.0.3" + }, + "bin": { + "flat": "cli.js" + } + }, + "node_modules/flat-cache": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", + "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", + "dev": true, + "dependencies": { + "flatted": "^2.0.0", + "rimraf": "2.6.3", + "write": "1.0.3" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/flatted": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", + "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", + "dev": true + }, + "node_modules/foreachasync": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/foreachasync/-/foreachasync-3.0.0.tgz", + "integrity": "sha1-VQKYfchxS+M5IJfzLgBxyd7gfPY=" + }, + "node_modules/forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dev": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 0.12" + } + }, + "node_modules/forwarded": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", + "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", + "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", + "deprecated": "\"Please update to latest v2.3 or v2.2\"", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "node_modules/functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "dev": true + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-symbol-from-current-process-h": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-symbol-from-current-process-h/-/get-symbol-from-current-process-h-1.0.2.tgz", + "integrity": "sha512-syloC6fsCt62ELLrr1VKBM1ggOpMdetX9hTrdW77UQdcApPHLmf7CI7OKcN1c9kYuNxKcDe4iJ4FY9sX3aw2xw==" + }, + "node_modules/getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dev": true, + "dependencies": { + "assert-plus": "^1.0.0" + } + }, + "node_modules/glob": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/globals": { + "version": "12.4.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", + "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", + "dev": true, + "dependencies": { + "type-fest": "^0.8.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", + "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==" + }, + "node_modules/growl": { + "version": "1.10.5", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", + "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", + "dev": true, + "engines": { + "node": ">=4.x" + } + }, + "node_modules/har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/har-validator": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", + "deprecated": "this library is no longer supported", + "dev": true, + "dependencies": { + "ajv": "^6.12.3", + "har-schema": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-bigints": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", + "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/has-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", + "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true, + "bin": { + "he": "bin/he" + } + }, + "node_modules/html-encoding-sniffer": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", + "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==", + "dev": true, + "dependencies": { + "whatwg-encoding": "^1.0.5" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/http-errors": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", + "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "dev": true, + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "dev": true, + "dependencies": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + }, + "engines": { + "node": ">=0.8", + "npm": ">=1.3.7" + } + }, + "node_modules/https-proxy-agent": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-4.0.0.tgz", + "integrity": "sha512-zoDhWrkR3of1l9QAL8/scJZyLu8j/gBkcwcaQOZh7Gyh/+uJQzGVETdgT30akuwkpL8HTRfssqI3BZuV18teDg==", + "dev": true, + "dependencies": { + "agent-base": "5", + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "node_modules/inquirer": { + "version": "7.3.3", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.3.3.tgz", + "integrity": "sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==", + "dev": true, + "dependencies": { + "ansi-escapes": "^4.2.1", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-width": "^3.0.0", + "external-editor": "^3.0.3", + "figures": "^3.0.0", + "lodash": "^4.17.19", + "mute-stream": "0.0.8", + "run-async": "^2.4.0", + "rxjs": "^6.6.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", + "through": "^2.3.6" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/inquirer/node_modules/ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/inquirer/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/inquirer/node_modules/chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/inquirer/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/inquirer/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/inquirer/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/inquirer/node_modules/strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/inquirer/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/int64-napi": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/int64-napi/-/int64-napi-1.0.1.tgz", + "integrity": "sha512-UPprIixcZdhdLobpKgHm6/HJD9VIR53JE5Fx93nJzgnX10hCxUd8nzOukxL2WDmjT2SWfz/VzDvk6qfPBLnEVg==", + "hasInstallScript": true, + "dependencies": { + "bindings": "^1.3.0" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-bigint": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.1.tgz", + "integrity": "sha512-J0ELF4yHFxHy0cmSxZuheDOz2luOdVvqjwmEcj8H/L1JHeuEDSDbeRP+Dk9kFVk5RTFzbucJ2Kb9F7ixY2QaCg==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-boolean-object": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.0.tgz", + "integrity": "sha512-a7Uprx8UtD+HWdyYwnD1+ExtTgqQtD2k/1yJgtXP6wnMm8byhkoTZRl+95LLThpzNZJ5aEvi46cdH+ayMFRwmA==", + "dependencies": { + "call-bind": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-buffer": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", + "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "engines": { + "node": ">=4" + } + }, + "node_modules/is-callable": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.3.tgz", + "integrity": "sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-close": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/is-close/-/is-close-1.3.3.tgz", + "integrity": "sha512-Q8pmIuDS2BUAj9NElFDxKNv11JXWqXNVa5+i3kjWmT0r2SVxVkXmBCexBuooPS4r59C5F3STMi5thXKP56/FIg==" + }, + "node_modules/is-date-object": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", + "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", + "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.4.tgz", + "integrity": "sha512-zohwelOAur+5uXtk8O3GPQ1eAcu4ZX3UwxQhUlfFFMNpUd83gXgjbhJh6HmB6LUNV/ieOLQuDwJO3dWJosUeMw==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-potential-custom-element-name": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", + "dev": true + }, + "node_modules/is-regex": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.2.tgz", + "integrity": "sha512-axvdhb5pdhEVThqJzYXwMlVuZwC+FF2DpcOhTS+y/8jVq4trxyPgfcwIxIKiyeuLlSQYKkmUaPQJ8ZE4yNKXDg==", + "dependencies": { + "call-bind": "^1.0.2", + "has-symbols": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-string": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz", + "integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", + "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", + "dependencies": { + "has-symbols": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "node_modules/isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "dev": true + }, + "node_modules/js-sha512": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/js-sha512/-/js-sha512-0.8.0.tgz", + "integrity": "sha512-PWsmefG6Jkodqt+ePTvBZCSMFgN7Clckjd0O7su3I0+BW2QWUTJNzjktHsztGLhncP2h8mcF9V9Y2Ha59pAViQ==", + "dev": true + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "dev": true + }, + "node_modules/jsdom": { + "version": "16.5.3", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.5.3.tgz", + "integrity": "sha512-Qj1H+PEvUsOtdPJ056ewXM4UJPCi4hhLA8wpiz9F2YvsRBhuFsXxtrIFAgGBDynQA9isAMGE91PfUYbdMPXuTA==", + "dev": true, + "dependencies": { + "abab": "^2.0.5", + "acorn": "^8.1.0", + "acorn-globals": "^6.0.0", + "cssom": "^0.4.4", + "cssstyle": "^2.3.0", + "data-urls": "^2.0.0", + "decimal.js": "^10.2.1", + "domexception": "^2.0.1", + "escodegen": "^2.0.0", + "html-encoding-sniffer": "^2.0.1", + "is-potential-custom-element-name": "^1.0.0", + "nwsapi": "^2.2.0", + "parse5": "6.0.1", + "request": "^2.88.2", + "request-promise-native": "^1.0.9", + "saxes": "^5.0.1", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.0.0", + "w3c-hr-time": "^1.0.2", + "w3c-xmlserializer": "^2.0.0", + "webidl-conversions": "^6.1.0", + "whatwg-encoding": "^1.0.5", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.5.0", + "ws": "^7.4.4", + "xml-name-validator": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "canvas": "^2.5.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "node_modules/jsdom/node_modules/acorn": { + "version": "8.2.4", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.2.4.tgz", + "integrity": "sha512-Ibt84YwBDDA890eDiDCEqcbwvHlBvzzDkU2cGBBDDI1QWT12jTiXIOn2CIw5KK4i6N5Z2HUxwYjzriDyqaqqZg==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "dev": true + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true + }, + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "dev": true, + "engines": [ + "node >=0.6.0" + ], + "dependencies": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "node_modules/levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "dev": true, + "dependencies": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "node_modules/log-symbols": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz", + "integrity": "sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", + "dev": true + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.5.2.tgz", + "integrity": "sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg==", + "dev": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/mime-db": { + "version": "1.47.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.47.0.tgz", + "integrity": "sha512-QBmA/G2y+IfeS4oktet3qRZ+P5kPhCKRXxXnQEudYqUaEioAU1/Lq2us3D/t1Jfo4hE9REQPrbB7K5sOczJVIw==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.30", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.30.tgz", + "integrity": "sha512-crmjA4bLtR8m9qLpHvgxSChT+XoSlZi8J4n/aIdn3z92e/U47Z0V/yl+Wh9W046GgFVAmoNR/fmdbZYcSSIUeg==", + "dev": true, + "dependencies": { + "mime-db": "1.47.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + }, + "node_modules/mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dev": true, + "dependencies": { + "minimist": "^1.2.5" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/mocha": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-7.2.0.tgz", + "integrity": "sha512-O9CIypScywTVpNaRrCAgoUnJgozpIofjKUYmJhiCIJMiuYnLI6otcb1/kpW9/n/tJODHGZ7i8aLQoDVsMtOKQQ==", + "dev": true, + "dependencies": { + "ansi-colors": "3.2.3", + "browser-stdout": "1.3.1", + "chokidar": "3.3.0", + "debug": "3.2.6", + "diff": "3.5.0", + "escape-string-regexp": "1.0.5", + "find-up": "3.0.0", + "glob": "7.1.3", + "growl": "1.10.5", + "he": "1.2.0", + "js-yaml": "3.13.1", + "log-symbols": "3.0.0", + "minimatch": "3.0.4", + "mkdirp": "0.5.5", + "ms": "2.1.1", + "node-environment-flags": "1.0.6", + "object.assign": "4.1.0", + "strip-json-comments": "2.0.1", + "supports-color": "6.0.0", + "which": "1.3.1", + "wide-align": "1.1.3", + "yargs": "13.3.2", + "yargs-parser": "13.1.2", + "yargs-unparser": "1.6.0" + }, + "bin": { + "_mocha": "bin/_mocha", + "mocha": "bin/mocha" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mochajs" + } + }, + "node_modules/mocha/node_modules/debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "deprecated": "Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/mocha/node_modules/js-yaml": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/mocha/node_modules/ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + }, + "node_modules/mocha/node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mocha/node_modules/supports-color": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.0.0.tgz", + "integrity": "sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", + "dev": true + }, + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "node_modules/nan": { + "version": "2.14.2", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.2.tgz", + "integrity": "sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ==" + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, + "node_modules/negotiator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/next-tick": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", + "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=" + }, + "node_modules/nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true + }, + "node_modules/node-addon-api": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.2.tgz", + "integrity": "sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==" + }, + "node_modules/node-environment-flags": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/node-environment-flags/-/node-environment-flags-1.0.6.tgz", + "integrity": "sha512-5Evy2epuL+6TM0lCQGpFIj6KwiEsGh1SrHUhTbNX+sLbBtjidPZFAnVK9y5yU1+h//RitLbRHTIMyxQPtxMdHw==", + "dev": true, + "dependencies": { + "object.getownpropertydescriptors": "^2.0.3", + "semver": "^5.7.0" + } + }, + "node_modules/node-environment-flags/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/node-gyp-build": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.2.3.tgz", + "integrity": "sha512-MN6ZpzmfNCRM+3t57PTJHgHyw/h4OWnZ6mR8P5j/uZtqQr46RRuDE/P+g3n0YR/AiYXeWixZZzaip77gdICfRg==", + "bin": { + "node-gyp-build": "bin.js", + "node-gyp-build-optional": "optional.js", + "node-gyp-build-test": "build-test.js" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nwsapi": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", + "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==", + "dev": true + }, + "node_modules/oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.10.2.tgz", + "integrity": "sha512-gz58rdPpadwztRrPjZE9DZLOABUpTGdcANUgOwBFO1C+HZZhePoP83M65WGDmbpwFYJSWqavbl4SgDn4k8RYTA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", + "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.2", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.0", + "object-keys": "^1.0.11" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.getownpropertydescriptors": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.2.tgz", + "integrity": "sha512-WtxeKSzfBjlzL+F9b7M7hewDzMwy+C8NRssHd1YrNlzHzIDrXcXiNOMrezdAEM4UXixgV+vvnyBeN7Rygl2ttQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.2" + }, + "engines": { + "node": ">= 0.8" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "dev": true, + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "dev": true, + "dependencies": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", + "dev": true + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", + "dev": true + }, + "node_modules/pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=", + "dev": true + }, + "node_modules/performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.3.tgz", + "integrity": "sha512-KpELjfwcCDUb9PeigTs2mBJzXUPzAuP2oPcA989He8Rte0+YUAjw1JVedDhuTKPkHjSYzMN3npC9luThGYEKdg==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/proxy-addr": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz", + "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==", + "dev": true, + "dependencies": { + "forwarded": "~0.1.2", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "dev": true + }, + "node_modules/psl": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", + "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", + "dev": true + }, + "node_modules/punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/puppeteer": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-2.1.1.tgz", + "integrity": "sha512-LWzaDVQkk1EPiuYeTOj+CZRIjda4k2s5w4MK4xoH2+kgWV/SDlkYHmxatDdtYrciHUKSXTsGgPgPP8ILVdBsxg==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "@types/mime-types": "^2.1.0", + "debug": "^4.1.0", + "extract-zip": "^1.6.6", + "https-proxy-agent": "^4.0.0", + "mime": "^2.0.3", + "mime-types": "^2.1.25", + "progress": "^2.0.1", + "proxy-from-env": "^1.0.0", + "rimraf": "^2.6.1", + "ws": "^6.1.0" + }, + "engines": { + "node": ">=8.16.0" + } + }, + "node_modules/puppeteer/node_modules/ws": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz", + "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==", + "dev": true, + "dependencies": { + "async-limiter": "~1.0.0" + } + }, + "node_modules/qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", + "dev": true, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", + "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", + "dev": true, + "dependencies": { + "bytes": "3.1.0", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/rclnodejs": { + "version": "0.18.2", + "resolved": "https://registry.npmjs.org/rclnodejs/-/rclnodejs-0.18.2.tgz", + "integrity": "sha512-1wfodCiQDQDnUPWn3Eboprn9LBrjAoTo2GkCvGs0ekEU5y1e5nrM4r5f/50FluyKI+t4/nw7fgHxu8iKpHOhgA==", + "hasInstallScript": true, + "dependencies": { + "array.prototype.flat": "^1.2.4", + "bindings": "^1.5.0", + "compare-versions": "^3.6.0", + "debug": "^4.1.1", + "dot": "^1.1.3", + "fs-extra": "^9.1.0", + "int64-napi": "^1.0.1", + "is-close": "^1.3.3", + "mkdirp": "^1.0.4", + "mz": "^2.7.0", + "nan": "^2.14.2", + "ref-array-di": "^1.2.2", + "ref-napi": "^3.0.0", + "ref-struct-di": "^1.1.1", + "uuid": "^8.2.0", + "walk": "^2.3.14" + }, + "bin": { + "generate-ros-messages": "scripts/generate_messages.js" + }, + "engines": { + "node": ">= 10.23.1 <13.0.0" + } + }, + "node_modules/rclnodejs/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/rclnodejs/node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/readdirp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.2.0.tgz", + "integrity": "sha512-crk4Qu3pmXwgxdSgGhgA/eXiJAPQiX4GMOZZMXnqKxHX7TaoL+3gQVo/WeuAiogr07DpnfjIMpXXa+PAIvwPGQ==", + "dev": true, + "dependencies": { + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/ref-array-di": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/ref-array-di/-/ref-array-di-1.2.2.tgz", + "integrity": "sha512-jhCmhqWa7kvCVrWhR/d7RemkppqPUdxEil1CtTtm7FkZV8LcHHCK3Or9GinUiFP5WY3k0djUkMvhBhx49Jb2iA==", + "dependencies": { + "array-index": "^1.0.0", + "debug": "^3.1.0" + } + }, + "node_modules/ref-array-di/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/ref-napi": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/ref-napi/-/ref-napi-3.0.2.tgz", + "integrity": "sha512-5YE0XrvWteoTr5DR2sEqxefL06aml7c6qS7hGv3u27do4HlGQphwvB+zD1NYep9utMKScvwOZsSs9EPYdGBVsg==", + "hasInstallScript": true, + "dependencies": { + "debug": "^4.1.1", + "get-symbol-from-current-process-h": "^1.0.2", + "node-addon-api": "^2.0.0", + "node-gyp-build": "^4.2.1" + }, + "engines": { + "node": ">= 10.0" + } + }, + "node_modules/ref-struct-di": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ref-struct-di/-/ref-struct-di-1.1.1.tgz", + "integrity": "sha512-2Xyn/0Qgz89VT+++WP0sTosdm9oeowLP23wRJYhG4BFdMUrLj3jhwHZNEytYNYgtPKLNTP3KJX4HEgBvM1/Y2g==", + "dependencies": { + "debug": "^3.1.0" + } + }, + "node_modules/ref-struct-di/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/regexpp": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", + "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", + "dev": true, + "engines": { + "node": ">=6.5.0" + } + }, + "node_modules/request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", + "dev": true, + "dependencies": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/request-promise-core": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.4.tgz", + "integrity": "sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==", + "dev": true, + "dependencies": { + "lodash": "^4.17.19" + }, + "engines": { + "node": ">=0.10.0" + }, + "peerDependencies": { + "request": "^2.34" + } + }, + "node_modules/request-promise-native": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.9.tgz", + "integrity": "sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g==", + "deprecated": "request-promise-native has been deprecated because it extends the now deprecated request package, see https://github.com/request/request/issues/3142", + "dev": true, + "dependencies": { + "request-promise-core": "1.1.4", + "stealthy-require": "^1.1.1", + "tough-cookie": "^2.3.3" + }, + "engines": { + "node": ">=0.12.0" + }, + "peerDependencies": { + "request": "^2.34" + } + }, + "node_modules/request-promise-native/node_modules/tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dev": true, + "dependencies": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/request/node_modules/qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "dev": true, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/request/node_modules/tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dev": true, + "dependencies": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/request/node_modules/uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "dev": true, + "bin": { + "uuid": "bin/uuid" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/run-async": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/rxjs": { + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "dev": true, + "dependencies": { + "tslib": "^1.9.0" + }, + "engines": { + "npm": ">=2.0.0" + } + }, + "node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "node_modules/saxes": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", + "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", + "dev": true, + "dependencies": { + "xmlchars": "^2.2.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", + "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.7.2", + "mime": "1.6.0", + "ms": "2.1.1", + "on-finished": "~2.3.0", + "range-parser": "~1.2.1", + "statuses": "~1.5.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "node_modules/send/node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + }, + "node_modules/serve-static": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", + "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", + "dev": true, + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.17.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true + }, + "node_modules/setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", + "dev": true + }, + "node_modules/shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "dependencies": { + "shebang-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/signal-exit": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", + "dev": true + }, + "node_modules/slice-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", + "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.0", + "astral-regex": "^1.0.0", + "is-fullwidth-code-point": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/slice-ansi/node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "node_modules/sshpk": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "dev": true, + "dependencies": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + }, + "bin": { + "sshpk-conv": "bin/sshpk-conv", + "sshpk-sign": "bin/sshpk-sign", + "sshpk-verify": "bin/sshpk-verify" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/stealthy-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", + "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/string-width": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", + "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width/node_modules/ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width/node_modules/strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", + "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", + "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", + "dev": true + }, + "node_modules/table": { + "version": "5.4.6", + "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", + "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", + "dev": true, + "dependencies": { + "ajv": "^6.10.2", + "lodash": "^4.17.14", + "slice-ansi": "^2.1.0", + "string-width": "^3.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/table/node_modules/emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "node_modules/table/node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/table/node_modules/string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "dependencies": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true + }, + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha1-GhkY1ALY/D+Y+/I02wvMjMEOlyY=", + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true + }, + "node_modules/tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "dependencies": { + "os-tmpdir": "~1.0.2" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", + "dev": true, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/tough-cookie": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.0.0.tgz", + "integrity": "sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg==", + "dev": true, + "dependencies": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.1.2" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tough-cookie/node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/tr46": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.0.2.tgz", + "integrity": "sha512-3n1qG+/5kg+jrbTzwAykB5yRYtQCTqOGKq5U5PE3b0a1/mzo6snDhjGS0zJVJunO0NrT3Dg1MLy5TjWP/UJppg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dev": true, + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, + "node_modules/tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "dev": true + }, + "node_modules/type": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", + "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==" + }, + "node_modules/type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "dev": true, + "dependencies": { + "prelude-ls": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dev": true, + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "dev": true + }, + "node_modules/unbox-primitive": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", + "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", + "dependencies": { + "function-bind": "^1.1.1", + "has-bigints": "^1.0.1", + "has-symbols": "^1.0.2", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", + "dev": true, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-7.0.3.tgz", + "integrity": "sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg==", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/v8-compile-cache": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", + "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", + "dev": true + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "dev": true, + "engines": [ + "node >=0.6.0" + ], + "dependencies": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "node_modules/w3c-hr-time": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", + "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", + "dev": true, + "dependencies": { + "browser-process-hrtime": "^1.0.0" + } + }, + "node_modules/w3c-xmlserializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", + "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==", + "dev": true, + "dependencies": { + "xml-name-validator": "^3.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/walk": { + "version": "2.3.14", + "resolved": "https://registry.npmjs.org/walk/-/walk-2.3.14.tgz", + "integrity": "sha512-5skcWAUmySj6hkBdH6B6+3ddMjVQYH5Qy9QGbPmN8kVmLteXk+yVXg+yfk1nbX30EYakahLrr8iPcCxJQSCBeg==", + "dependencies": { + "foreachasync": "^3.0.0" + } + }, + "node_modules/webidl-conversions": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", + "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", + "dev": true, + "engines": { + "node": ">=10.4" + } + }, + "node_modules/whatwg-encoding": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", + "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", + "dev": true, + "dependencies": { + "iconv-lite": "0.4.24" + } + }, + "node_modules/whatwg-mimetype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", + "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==", + "dev": true + }, + "node_modules/whatwg-url": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.5.0.tgz", + "integrity": "sha512-fy+R77xWv0AiqfLl4nuGUlQ3/6b5uNfQ4WAbGQVMYshCTCCPK9psC1nWh3XHuxGVCtlcDDQPQW1csmmIQo+fwg==", + "dev": true, + "dependencies": { + "lodash": "^4.7.0", + "tr46": "^2.0.2", + "webidl-conversions": "^6.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true + }, + "node_modules/wide-align": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "dev": true, + "dependencies": { + "string-width": "^1.0.2 || 2" + } + }, + "node_modules/wide-align/node_modules/ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/wide-align/node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/wide-align/node_modules/string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "dependencies": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/wide-align/node_modules/strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "dependencies": { + "ansi-regex": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/wrap-ansi/node_modules/emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "node_modules/wrap-ansi/node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/wrap-ansi/node_modules/string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "dependencies": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "node_modules/write": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", + "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", + "dev": true, + "dependencies": { + "mkdirp": "^0.5.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/ws": { + "version": "7.4.5", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.5.tgz", + "integrity": "sha512-xzyu3hFvomRfXKH8vOFMU3OguG6oOvhXMo3xsGy3xWExqaM2dxBbVxuD99O7m3ZUFMvvscsZDqxfgMaRr/Nr1g==", + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xml-name-validator": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", + "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", + "dev": true + }, + "node_modules/xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", + "dev": true + }, + "node_modules/y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "dev": true + }, + "node_modules/yargs": { + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", + "dev": true, + "dependencies": { + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.2" + } + }, + "node_modules/yargs-parser": { + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", + "dev": true, + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + }, + "node_modules/yargs-unparser": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.6.0.tgz", + "integrity": "sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw==", + "dev": true, + "dependencies": { + "flat": "^4.1.0", + "lodash": "^4.17.15", + "yargs": "^13.3.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/yargs/node_modules/emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "node_modules/yargs/node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/yargs/node_modules/string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "dependencies": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=", + "dev": true, + "dependencies": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + } + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", + "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", + "dev": true, + "requires": { + "@babel/highlight": "^7.12.13" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.0.tgz", + "integrity": "sha512-V3ts7zMSu5lfiwWDVWzRDGIN+lnCEUdaXgtVHJgLb1rGaA6jMrtB9EmE7L18foXJIE8Un/A/h6NJfGQp/e1J4A==", + "dev": true + }, + "@babel/highlight": { + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.0.tgz", + "integrity": "sha512-YSCOwxvTYEIMSGaBQb5kDDsCopDdiUGsqpatp3fOlI4+2HQSkTmEVWnVuySdAC5EWCqSWWTv0ib63RjR7dTBdg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.14.0", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@types/mime-types": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@types/mime-types/-/mime-types-2.1.0.tgz", + "integrity": "sha1-nKUs2jY/aZxpRmwqbM2q2RPqenM=", + "dev": true + }, + "abab": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz", + "integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==", + "dev": true + }, + "accepts": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "dev": true, + "requires": { + "mime-types": "~2.1.24", + "negotiator": "0.6.2" + } + }, + "acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true + }, + "acorn-globals": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", + "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", + "dev": true, + "requires": { + "acorn": "^7.1.1", + "acorn-walk": "^7.1.1" + } + }, + "acorn-jsx": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz", + "integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==", + "dev": true, + "requires": {} + }, + "acorn-walk": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", + "dev": true + }, + "agent-base": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-5.1.1.tgz", + "integrity": "sha512-TMeqbNl2fMW0nMjTEPOwe3J/PRFP4vqeoNuQMG0HlMrtm5QxKqdvAkZ1pRBQ/ulIyDD5Yq0nJ7YbdD8ey0TO3g==", + "dev": true + }, + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ansi-colors": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.3.tgz", + "integrity": "sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw==", + "dev": true + }, + "ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "requires": { + "type-fest": "^0.21.3" + }, + "dependencies": { + "type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true + } + } + }, + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=" + }, + "anymatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", + "dev": true + }, + "array-index": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-index/-/array-index-1.0.0.tgz", + "integrity": "sha1-7FanSe4QPk4Ix5C5w1PfFgVbl/k=", + "requires": { + "debug": "^2.2.0", + "es6-symbol": "^3.0.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "array.prototype.flat": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.4.tgz", + "integrity": "sha512-4470Xi3GAPAjZqFcljX2xzckv1qeKPizoNkiS0+O4IoPR2ZNpcjE0pkhdihlDouK+x6QOast26B4Q/O9DJnwSg==", + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.1" + } + }, + "asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "dev": true, + "requires": { + "safer-buffer": "~2.1.0" + } + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + }, + "astral-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", + "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", + "dev": true + }, + "async": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.0.tgz", + "integrity": "sha512-TR2mEZFVOj2pLStYxLht7TyfuRzaydfpxr3k9RpHIzMgw7A64dzsdqCxH1WJyQdoe8T10nDXd9wnEigmiuHIZw==", + "dev": true + }, + "async-limiter": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", + "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", + "dev": true + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true + }, + "at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==" + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "dev": true + }, + "aws4": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", + "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==", + "dev": true + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "dev": true, + "requires": { + "tweetnacl": "^0.14.3" + } + }, + "binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true + }, + "bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "requires": { + "file-uri-to-path": "1.0.0" + } + }, + "body-parser": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "dev": true, + "requires": { + "bytes": "3.1.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "on-finished": "~2.3.0", + "qs": "6.7.0", + "raw-body": "2.4.0", + "type-is": "~1.6.17" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "browser-process-hrtime": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", + "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", + "dev": true + }, + "browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", + "dev": true + }, + "buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", + "dev": true + }, + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", + "dev": true + }, + "bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", + "dev": true + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "dev": true + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "dev": true + }, + "chokidar": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.3.0.tgz", + "integrity": "sha512-dGmKLDdT3Gdl7fBUe8XK+gAtGmzy5Fn0XkkWQuYxGIgWVPPse2CxFA5mtrlD0TOHaHjEUqkWNyP1XdHoJES/4A==", + "dev": true, + "requires": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "fsevents": "~2.1.1", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.2.0" + } + }, + "cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "requires": { + "restore-cursor": "^3.1.0" + } + }, + "cli-width": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", + "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", + "dev": true + }, + "cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "dev": true, + "requires": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + }, + "dependencies": { + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + } + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "commander": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", + "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==" + }, + "compare-versions": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-3.6.0.tgz", + "integrity": "sha512-W6Af2Iw1z4CB7q4uU4hv646dW9GQuBM+YpC0UvUCWSD8w90SJjp+ujJuXaEMtAXBtSqGfMPuFOVn4/+FlaqfBA==" + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "content-disposition": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", + "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "dev": true, + "requires": { + "safe-buffer": "5.1.2" + } + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", + "dev": true + }, + "cookie": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", + "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==", + "dev": true + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "cssom": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", + "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==", + "dev": true + }, + "cssstyle": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", + "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", + "dev": true, + "requires": { + "cssom": "~0.3.6" + }, + "dependencies": { + "cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", + "dev": true + } + } + }, + "d": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", + "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", + "requires": { + "es5-ext": "^0.10.50", + "type": "^1.0.1" + } + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "data-urls": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", + "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", + "dev": true, + "requires": { + "abab": "^2.0.3", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.0.0" + } + }, + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "requires": { + "ms": "2.1.2" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true + }, + "decimal.js": { + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.2.1.tgz", + "integrity": "sha512-KaL7+6Fw6i5A2XSnsbhm/6B+NuEA7TZ4vqxnd5tXz9sbKtrN9Srj8ab4vKVdK8YAqZO9P1kg45Y6YLoduPf+kw==", + "dev": true + }, + "deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true + }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "requires": { + "object-keys": "^1.0.12" + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "dev": true + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", + "dev": true + }, + "diff": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "dev": true + }, + "doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "domexception": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", + "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", + "dev": true, + "requires": { + "webidl-conversions": "^5.0.0" + }, + "dependencies": { + "webidl-conversions": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", + "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", + "dev": true + } + } + }, + "dot": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dot/-/dot-1.1.3.tgz", + "integrity": "sha512-/nt74Rm+PcfnirXGEdhZleTwGC2LMnuKTeeTIlI82xb5loBBoXNYzr2ezCroPSMtilK8EZIfcNZwOcHN+ib1Lg==" + }, + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "dev": true, + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", + "dev": true + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "dev": true + }, + "es-abstract": { + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0.tgz", + "integrity": "sha512-LJzK7MrQa8TS0ja2w3YNLzUgJCGPdPOV1yVvezjNnS89D+VR08+Szt2mz3YB2Dck/+w5tfIq/RoUAFqJJGM2yw==", + "requires": { + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "get-intrinsic": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.2", + "is-callable": "^1.2.3", + "is-negative-zero": "^2.0.1", + "is-regex": "^1.1.2", + "is-string": "^1.0.5", + "object-inspect": "^1.9.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.2", + "string.prototype.trimend": "^1.0.4", + "string.prototype.trimstart": "^1.0.4", + "unbox-primitive": "^1.0.0" + }, + "dependencies": { + "object.assign": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + } + } + } + }, + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "es5-ext": { + "version": "0.10.53", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.53.tgz", + "integrity": "sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q==", + "requires": { + "es6-iterator": "~2.0.3", + "es6-symbol": "~3.1.3", + "next-tick": "~1.0.0" + } + }, + "es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", + "requires": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, + "es6-symbol": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", + "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", + "requires": { + "d": "^1.0.1", + "ext": "^1.1.2" + } + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "escodegen": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz", + "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==", + "dev": true, + "requires": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.6.1" + }, + "dependencies": { + "estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true + } + } + }, + "eslint": { + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.8.0.tgz", + "integrity": "sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "ajv": "^6.10.0", + "chalk": "^2.1.0", + "cross-spawn": "^6.0.5", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "eslint-scope": "^5.0.0", + "eslint-utils": "^1.4.3", + "eslint-visitor-keys": "^1.1.0", + "espree": "^6.1.2", + "esquery": "^1.0.1", + "esutils": "^2.0.2", + "file-entry-cache": "^5.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^5.0.0", + "globals": "^12.1.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "inquirer": "^7.0.0", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.3.0", + "lodash": "^4.17.14", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.1", + "natural-compare": "^1.4.0", + "optionator": "^0.8.3", + "progress": "^2.0.0", + "regexpp": "^2.0.1", + "semver": "^6.1.2", + "strip-ansi": "^5.2.0", + "strip-json-comments": "^3.0.1", + "table": "^5.2.3", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + } + }, + "eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + } + }, + "eslint-utils": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", + "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^1.1.0" + } + }, + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true + }, + "espree": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-6.2.1.tgz", + "integrity": "sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==", + "dev": true, + "requires": { + "acorn": "^7.1.1", + "acorn-jsx": "^5.2.0", + "eslint-visitor-keys": "^1.1.0" + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + }, + "esquery": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", + "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "dev": true, + "requires": { + "estraverse": "^5.1.0" + }, + "dependencies": { + "estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true + } + } + }, + "esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "requires": { + "estraverse": "^5.2.0" + }, + "dependencies": { + "estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true + } + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", + "dev": true + }, + "express": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", + "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", + "dev": true, + "requires": { + "accepts": "~1.3.7", + "array-flatten": "1.1.1", + "body-parser": "1.19.0", + "content-disposition": "0.5.3", + "content-type": "~1.0.4", + "cookie": "0.4.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.1.2", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.5", + "qs": "6.7.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.1.2", + "send": "0.17.1", + "serve-static": "1.14.1", + "setprototypeof": "1.1.1", + "statuses": "~1.5.0", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "ext": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ext/-/ext-1.4.0.tgz", + "integrity": "sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A==", + "requires": { + "type": "^2.0.0" + }, + "dependencies": { + "type": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/type/-/type-2.5.0.tgz", + "integrity": "sha512-180WMDQaIMm3+7hGXWf12GtdniDEy7nYcyFMKJn/eZz/6tSLXrUN9V0wKSbMjej0I1WHWbpREDEKHtqPQa9NNw==" + } + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "dev": true, + "requires": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + } + }, + "extract-zip": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.7.0.tgz", + "integrity": "sha512-xoh5G1W/PB0/27lXgMQyIhP5DSY/LhoCsOyZgb+6iMmRtCwVBo55uKaMoEYrDCKQhWvqEip5ZPKAc6eFNyf/MA==", + "dev": true, + "requires": { + "concat-stream": "^1.6.2", + "debug": "^2.6.9", + "mkdirp": "^0.5.4", + "yauzl": "^2.10.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "dev": true + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, + "fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=", + "dev": true, + "requires": { + "pend": "~1.2.0" + } + }, + "figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "file-entry-cache": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", + "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", + "dev": true, + "requires": { + "flat-cache": "^2.0.1" + } + }, + "file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==" + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "dev": true, + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "flat": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/flat/-/flat-4.1.1.tgz", + "integrity": "sha512-FmTtBsHskrU6FJ2VxCnsDb84wu9zhmO3cUX2kGFb5tuwhfXxGciiT0oRY+cck35QmG+NmGh5eLz6lLCpWTqwpA==", + "dev": true, + "requires": { + "is-buffer": "~2.0.3" + } + }, + "flat-cache": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", + "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", + "dev": true, + "requires": { + "flatted": "^2.0.0", + "rimraf": "2.6.3", + "write": "1.0.3" + } + }, + "flatted": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", + "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", + "dev": true + }, + "foreachasync": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/foreachasync/-/foreachasync-3.0.0.tgz", + "integrity": "sha1-VQKYfchxS+M5IJfzLgBxyd7gfPY=" + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "dev": true + }, + "form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "forwarded": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", + "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=", + "dev": true + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", + "dev": true + }, + "fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "requires": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "fsevents": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", + "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", + "dev": true, + "optional": true + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "dev": true + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true + }, + "get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + } + }, + "get-symbol-from-current-process-h": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-symbol-from-current-process-h/-/get-symbol-from-current-process-h-1.0.2.tgz", + "integrity": "sha512-syloC6fsCt62ELLrr1VKBM1ggOpMdetX9hTrdW77UQdcApPHLmf7CI7OKcN1c9kYuNxKcDe4iJ4FY9sX3aw2xw==" + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "glob": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "globals": { + "version": "12.4.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", + "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", + "dev": true, + "requires": { + "type-fest": "^0.8.1" + } + }, + "graceful-fs": { + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", + "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==" + }, + "growl": { + "version": "1.10.5", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", + "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", + "dev": true + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "dev": true + }, + "har-validator": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", + "dev": true, + "requires": { + "ajv": "^6.12.3", + "har-schema": "^2.0.0" + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-bigints": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", + "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==" + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "has-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", + "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==" + }, + "he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true + }, + "html-encoding-sniffer": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", + "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==", + "dev": true, + "requires": { + "whatwg-encoding": "^1.0.5" + } + }, + "http-errors": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", + "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + } + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "https-proxy-agent": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-4.0.0.tgz", + "integrity": "sha512-zoDhWrkR3of1l9QAL8/scJZyLu8j/gBkcwcaQOZh7Gyh/+uJQzGVETdgT30akuwkpL8HTRfssqI3BZuV18teDg==", + "dev": true, + "requires": { + "agent-base": "5", + "debug": "4" + } + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true + }, + "import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "inquirer": { + "version": "7.3.3", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.3.3.tgz", + "integrity": "sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==", + "dev": true, + "requires": { + "ansi-escapes": "^4.2.1", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-width": "^3.0.0", + "external-editor": "^3.0.3", + "figures": "^3.0.0", + "lodash": "^4.17.19", + "mute-stream": "0.0.8", + "run-async": "^2.4.0", + "rxjs": "^6.6.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", + "through": "^2.3.6" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "int64-napi": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/int64-napi/-/int64-napi-1.0.1.tgz", + "integrity": "sha512-UPprIixcZdhdLobpKgHm6/HJD9VIR53JE5Fx93nJzgnX10hCxUd8nzOukxL2WDmjT2SWfz/VzDvk6qfPBLnEVg==", + "requires": { + "bindings": "^1.3.0" + } + }, + "ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "dev": true + }, + "is-bigint": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.1.tgz", + "integrity": "sha512-J0ELF4yHFxHy0cmSxZuheDOz2luOdVvqjwmEcj8H/L1JHeuEDSDbeRP+Dk9kFVk5RTFzbucJ2Kb9F7ixY2QaCg==" + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-boolean-object": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.0.tgz", + "integrity": "sha512-a7Uprx8UtD+HWdyYwnD1+ExtTgqQtD2k/1yJgtXP6wnMm8byhkoTZRl+95LLThpzNZJ5aEvi46cdH+ayMFRwmA==", + "requires": { + "call-bind": "^1.0.0" + } + }, + "is-buffer": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", + "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", + "dev": true + }, + "is-callable": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.3.tgz", + "integrity": "sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ==" + }, + "is-close": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/is-close/-/is-close-1.3.3.tgz", + "integrity": "sha512-Q8pmIuDS2BUAj9NElFDxKNv11JXWqXNVa5+i3kjWmT0r2SVxVkXmBCexBuooPS4r59C5F3STMi5thXKP56/FIg==" + }, + "is-date-object": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", + "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==" + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-negative-zero": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", + "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==" + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "is-number-object": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.4.tgz", + "integrity": "sha512-zohwelOAur+5uXtk8O3GPQ1eAcu4ZX3UwxQhUlfFFMNpUd83gXgjbhJh6HmB6LUNV/ieOLQuDwJO3dWJosUeMw==" + }, + "is-potential-custom-element-name": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", + "dev": true + }, + "is-regex": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.2.tgz", + "integrity": "sha512-axvdhb5pdhEVThqJzYXwMlVuZwC+FF2DpcOhTS+y/8jVq4trxyPgfcwIxIKiyeuLlSQYKkmUaPQJ8ZE4yNKXDg==", + "requires": { + "call-bind": "^1.0.2", + "has-symbols": "^1.0.1" + } + }, + "is-string": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz", + "integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==" + }, + "is-symbol": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", + "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", + "requires": { + "has-symbols": "^1.0.1" + } + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "dev": true + }, + "js-sha512": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/js-sha512/-/js-sha512-0.8.0.tgz", + "integrity": "sha512-PWsmefG6Jkodqt+ePTvBZCSMFgN7Clckjd0O7su3I0+BW2QWUTJNzjktHsztGLhncP2h8mcF9V9Y2Ha59pAViQ==", + "dev": true + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "dev": true + }, + "jsdom": { + "version": "16.5.3", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.5.3.tgz", + "integrity": "sha512-Qj1H+PEvUsOtdPJ056ewXM4UJPCi4hhLA8wpiz9F2YvsRBhuFsXxtrIFAgGBDynQA9isAMGE91PfUYbdMPXuTA==", + "dev": true, + "requires": { + "abab": "^2.0.5", + "acorn": "^8.1.0", + "acorn-globals": "^6.0.0", + "cssom": "^0.4.4", + "cssstyle": "^2.3.0", + "data-urls": "^2.0.0", + "decimal.js": "^10.2.1", + "domexception": "^2.0.1", + "escodegen": "^2.0.0", + "html-encoding-sniffer": "^2.0.1", + "is-potential-custom-element-name": "^1.0.0", + "nwsapi": "^2.2.0", + "parse5": "6.0.1", + "request": "^2.88.2", + "request-promise-native": "^1.0.9", + "saxes": "^5.0.1", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.0.0", + "w3c-hr-time": "^1.0.2", + "w3c-xmlserializer": "^2.0.0", + "webidl-conversions": "^6.1.0", + "whatwg-encoding": "^1.0.5", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.5.0", + "ws": "^7.4.4", + "xml-name-validator": "^3.0.0" + }, + "dependencies": { + "acorn": { + "version": "8.2.4", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.2.4.tgz", + "integrity": "sha512-Ibt84YwBDDA890eDiDCEqcbwvHlBvzzDkU2cGBBDDI1QWT12jTiXIOn2CIw5KK4i6N5Z2HUxwYjzriDyqaqqZg==", + "dev": true + } + } + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true + }, + "jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" + } + }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "log-symbols": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz", + "integrity": "sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==", + "dev": true, + "requires": { + "chalk": "^2.4.2" + } + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", + "dev": true + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", + "dev": true + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", + "dev": true + }, + "mime": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.5.2.tgz", + "integrity": "sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg==", + "dev": true + }, + "mime-db": { + "version": "1.47.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.47.0.tgz", + "integrity": "sha512-QBmA/G2y+IfeS4oktet3qRZ+P5kPhCKRXxXnQEudYqUaEioAU1/Lq2us3D/t1Jfo4hE9REQPrbB7K5sOczJVIw==", + "dev": true + }, + "mime-types": { + "version": "2.1.30", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.30.tgz", + "integrity": "sha512-crmjA4bLtR8m9qLpHvgxSChT+XoSlZi8J4n/aIdn3z92e/U47Z0V/yl+Wh9W046GgFVAmoNR/fmdbZYcSSIUeg==", + "dev": true, + "requires": { + "mime-db": "1.47.0" + } + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + }, + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "mocha": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-7.2.0.tgz", + "integrity": "sha512-O9CIypScywTVpNaRrCAgoUnJgozpIofjKUYmJhiCIJMiuYnLI6otcb1/kpW9/n/tJODHGZ7i8aLQoDVsMtOKQQ==", + "dev": true, + "requires": { + "ansi-colors": "3.2.3", + "browser-stdout": "1.3.1", + "chokidar": "3.3.0", + "debug": "3.2.6", + "diff": "3.5.0", + "escape-string-regexp": "1.0.5", + "find-up": "3.0.0", + "glob": "7.1.3", + "growl": "1.10.5", + "he": "1.2.0", + "js-yaml": "3.13.1", + "log-symbols": "3.0.0", + "minimatch": "3.0.4", + "mkdirp": "0.5.5", + "ms": "2.1.1", + "node-environment-flags": "1.0.6", + "object.assign": "4.1.0", + "strip-json-comments": "2.0.1", + "supports-color": "6.0.0", + "which": "1.3.1", + "wide-align": "1.1.3", + "yargs": "13.3.2", + "yargs-parser": "13.1.2", + "yargs-unparser": "1.6.0" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "js-yaml": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "dev": true + }, + "supports-color": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.0.0.tgz", + "integrity": "sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", + "dev": true + }, + "mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "requires": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "nan": { + "version": "2.14.2", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.2.tgz", + "integrity": "sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ==" + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, + "negotiator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", + "dev": true + }, + "next-tick": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", + "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=" + }, + "nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true + }, + "node-addon-api": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.2.tgz", + "integrity": "sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==" + }, + "node-environment-flags": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/node-environment-flags/-/node-environment-flags-1.0.6.tgz", + "integrity": "sha512-5Evy2epuL+6TM0lCQGpFIj6KwiEsGh1SrHUhTbNX+sLbBtjidPZFAnVK9y5yU1+h//RitLbRHTIMyxQPtxMdHw==", + "dev": true, + "requires": { + "object.getownpropertydescriptors": "^2.0.3", + "semver": "^5.7.0" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "node-gyp-build": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.2.3.tgz", + "integrity": "sha512-MN6ZpzmfNCRM+3t57PTJHgHyw/h4OWnZ6mR8P5j/uZtqQr46RRuDE/P+g3n0YR/AiYXeWixZZzaip77gdICfRg==" + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, + "nwsapi": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", + "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==", + "dev": true + }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + }, + "object-inspect": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.10.2.tgz", + "integrity": "sha512-gz58rdPpadwztRrPjZE9DZLOABUpTGdcANUgOwBFO1C+HZZhePoP83M65WGDmbpwFYJSWqavbl4SgDn4k8RYTA==" + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" + }, + "object.assign": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", + "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.0", + "object-keys": "^1.0.11" + } + }, + "object.getownpropertydescriptors": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.2.tgz", + "integrity": "sha512-WtxeKSzfBjlzL+F9b7M7hewDzMwy+C8NRssHd1YrNlzHzIDrXcXiNOMrezdAEM4UXixgV+vvnyBeN7Rygl2ttQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.2" + } + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "dev": true, + "requires": { + "ee-first": "1.1.1" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "dev": true, + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + } + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "dev": true + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "requires": { + "callsites": "^3.0.0" + } + }, + "parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", + "dev": true + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", + "dev": true + }, + "pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=", + "dev": true + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "dev": true + }, + "picomatch": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.3.tgz", + "integrity": "sha512-KpELjfwcCDUb9PeigTs2mBJzXUPzAuP2oPcA989He8Rte0+YUAjw1JVedDhuTKPkHjSYzMN3npC9luThGYEKdg==", + "dev": true + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "dev": true + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true + }, + "proxy-addr": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz", + "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==", + "dev": true, + "requires": { + "forwarded": "~0.1.2", + "ipaddr.js": "1.9.1" + } + }, + "proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "dev": true + }, + "psl": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", + "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", + "dev": true + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true + }, + "puppeteer": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-2.1.1.tgz", + "integrity": "sha512-LWzaDVQkk1EPiuYeTOj+CZRIjda4k2s5w4MK4xoH2+kgWV/SDlkYHmxatDdtYrciHUKSXTsGgPgPP8ILVdBsxg==", + "dev": true, + "requires": { + "@types/mime-types": "^2.1.0", + "debug": "^4.1.0", + "extract-zip": "^1.6.6", + "https-proxy-agent": "^4.0.0", + "mime": "^2.0.3", + "mime-types": "^2.1.25", + "progress": "^2.0.1", + "proxy-from-env": "^1.0.0", + "rimraf": "^2.6.1", + "ws": "^6.1.0" + }, + "dependencies": { + "ws": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz", + "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==", + "dev": true, + "requires": { + "async-limiter": "~1.0.0" + } + } + } + }, + "qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", + "dev": true + }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true + }, + "raw-body": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", + "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", + "dev": true, + "requires": { + "bytes": "3.1.0", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + } + }, + "rclnodejs": { + "version": "0.18.2", + "resolved": "https://registry.npmjs.org/rclnodejs/-/rclnodejs-0.18.2.tgz", + "integrity": "sha512-1wfodCiQDQDnUPWn3Eboprn9LBrjAoTo2GkCvGs0ekEU5y1e5nrM4r5f/50FluyKI+t4/nw7fgHxu8iKpHOhgA==", + "requires": { + "array.prototype.flat": "^1.2.4", + "bindings": "^1.5.0", + "compare-versions": "^3.6.0", + "debug": "^4.1.1", + "dot": "^1.1.3", + "fs-extra": "^9.1.0", + "int64-napi": "^1.0.1", + "is-close": "^1.3.3", + "mkdirp": "^1.0.4", + "mz": "^2.7.0", + "nan": "^2.14.2", + "ref-array-di": "^1.2.2", + "ref-napi": "^3.0.0", + "ref-struct-di": "^1.1.1", + "uuid": "^8.2.0", + "walk": "^2.3.14" + }, + "dependencies": { + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" + }, + "uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" + } + } + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "readdirp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.2.0.tgz", + "integrity": "sha512-crk4Qu3pmXwgxdSgGhgA/eXiJAPQiX4GMOZZMXnqKxHX7TaoL+3gQVo/WeuAiogr07DpnfjIMpXXa+PAIvwPGQ==", + "dev": true, + "requires": { + "picomatch": "^2.0.4" + } + }, + "ref-array-di": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/ref-array-di/-/ref-array-di-1.2.2.tgz", + "integrity": "sha512-jhCmhqWa7kvCVrWhR/d7RemkppqPUdxEil1CtTtm7FkZV8LcHHCK3Or9GinUiFP5WY3k0djUkMvhBhx49Jb2iA==", + "requires": { + "array-index": "^1.0.0", + "debug": "^3.1.0" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "ref-napi": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/ref-napi/-/ref-napi-3.0.2.tgz", + "integrity": "sha512-5YE0XrvWteoTr5DR2sEqxefL06aml7c6qS7hGv3u27do4HlGQphwvB+zD1NYep9utMKScvwOZsSs9EPYdGBVsg==", + "requires": { + "debug": "^4.1.1", + "get-symbol-from-current-process-h": "^1.0.2", + "node-addon-api": "^2.0.0", + "node-gyp-build": "^4.2.1" + } + }, + "ref-struct-di": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ref-struct-di/-/ref-struct-di-1.1.1.tgz", + "integrity": "sha512-2Xyn/0Qgz89VT+++WP0sTosdm9oeowLP23wRJYhG4BFdMUrLj3jhwHZNEytYNYgtPKLNTP3KJX4HEgBvM1/Y2g==", + "requires": { + "debug": "^3.1.0" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "regexpp": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", + "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", + "dev": true + }, + "request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "dev": true, + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + }, + "dependencies": { + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "dev": true + }, + "tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dev": true, + "requires": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + } + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "dev": true + } + } + }, + "request-promise-core": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.4.tgz", + "integrity": "sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==", + "dev": true, + "requires": { + "lodash": "^4.17.19" + } + }, + "request-promise-native": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.9.tgz", + "integrity": "sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g==", + "dev": true, + "requires": { + "request-promise-core": "1.1.4", + "stealthy-require": "^1.1.1", + "tough-cookie": "^2.3.3" + }, + "dependencies": { + "tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dev": true, + "requires": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + } + } + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true + }, + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true + }, + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true + }, + "restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "requires": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + } + }, + "rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "run-async": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", + "dev": true + }, + "rxjs": { + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "saxes": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", + "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", + "dev": true, + "requires": { + "xmlchars": "^2.2.0" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + }, + "send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", + "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "dev": true, + "requires": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.7.2", + "mime": "1.6.0", + "ms": "2.1.1", + "on-finished": "~2.3.0", + "range-parser": "~1.2.1", + "statuses": "~1.5.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + }, + "dependencies": { + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + } + } + }, + "serve-static": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", + "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", + "dev": true, + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.17.1" + } + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true + }, + "setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", + "dev": true + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true + }, + "signal-exit": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", + "dev": true + }, + "slice-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", + "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "astral-regex": "^1.0.0", + "is-fullwidth-code-point": "^2.0.0" + }, + "dependencies": { + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + } + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "optional": true + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "sshpk": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "dev": true, + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + } + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "dev": true + }, + "stealthy-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", + "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=", + "dev": true + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "string-width": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", + "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + } + } + }, + "string.prototype.trimend": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", + "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "string.prototype.trimstart": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", + "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + }, + "strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", + "dev": true + }, + "table": { + "version": "5.4.6", + "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", + "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", + "dev": true, + "requires": { + "ajv": "^6.10.2", + "lodash": "^4.17.14", + "slice-ansi": "^2.1.0", + "string-width": "^3.0.0" + }, + "dependencies": { + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + } + } + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true + }, + "thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "requires": { + "any-promise": "^1.0.0" + } + }, + "thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha1-GhkY1ALY/D+Y+/I02wvMjMEOlyY=", + "requires": { + "thenify": ">= 3.1.0 < 4" + } + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true + }, + "tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "requires": { + "os-tmpdir": "~1.0.2" + } + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + }, + "toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", + "dev": true + }, + "tough-cookie": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.0.0.tgz", + "integrity": "sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg==", + "dev": true, + "requires": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.1.2" + }, + "dependencies": { + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true + } + } + }, + "tr46": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.0.2.tgz", + "integrity": "sha512-3n1qG+/5kg+jrbTzwAykB5yRYtQCTqOGKq5U5PE3b0a1/mzo6snDhjGS0zJVJunO0NrT3Dg1MLy5TjWP/UJppg==", + "dev": true, + "requires": { + "punycode": "^2.1.1" + } + }, + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dev": true, + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "dev": true + }, + "type": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", + "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==" + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2" + } + }, + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true + }, + "type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dev": true, + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "dev": true + }, + "unbox-primitive": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", + "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", + "requires": { + "function-bind": "^1.1.1", + "has-bigints": "^1.0.1", + "has-symbols": "^1.0.2", + "which-boxed-primitive": "^1.0.2" + } + }, + "universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==" + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "dev": true + }, + "uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", + "dev": true + }, + "uuid": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-7.0.3.tgz", + "integrity": "sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg==" + }, + "v8-compile-cache": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", + "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", + "dev": true + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", + "dev": true + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "w3c-hr-time": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", + "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", + "dev": true, + "requires": { + "browser-process-hrtime": "^1.0.0" + } + }, + "w3c-xmlserializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", + "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==", + "dev": true, + "requires": { + "xml-name-validator": "^3.0.0" + } + }, + "walk": { + "version": "2.3.14", + "resolved": "https://registry.npmjs.org/walk/-/walk-2.3.14.tgz", + "integrity": "sha512-5skcWAUmySj6hkBdH6B6+3ddMjVQYH5Qy9QGbPmN8kVmLteXk+yVXg+yfk1nbX30EYakahLrr8iPcCxJQSCBeg==", + "requires": { + "foreachasync": "^3.0.0" + } + }, + "webidl-conversions": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", + "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", + "dev": true + }, + "whatwg-encoding": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", + "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", + "dev": true, + "requires": { + "iconv-lite": "0.4.24" + } + }, + "whatwg-mimetype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", + "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==", + "dev": true + }, + "whatwg-url": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.5.0.tgz", + "integrity": "sha512-fy+R77xWv0AiqfLl4nuGUlQ3/6b5uNfQ4WAbGQVMYshCTCCPK9psC1nWh3XHuxGVCtlcDDQPQW1csmmIQo+fwg==", + "dev": true, + "requires": { + "lodash": "^4.7.0", + "tr46": "^2.0.2", + "webidl-conversions": "^6.1.0" + } + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "requires": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + } + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true + }, + "wide-align": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "dev": true, + "requires": { + "string-width": "^1.0.2 || 2" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true + }, + "wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + }, + "dependencies": { + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + } + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "write": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", + "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", + "dev": true, + "requires": { + "mkdirp": "^0.5.1" + } + }, + "ws": { + "version": "7.4.5", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.5.tgz", + "integrity": "sha512-xzyu3hFvomRfXKH8vOFMU3OguG6oOvhXMo3xsGy3xWExqaM2dxBbVxuD99O7m3ZUFMvvscsZDqxfgMaRr/Nr1g==", + "requires": {} + }, + "xml-name-validator": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", + "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", + "dev": true + }, + "xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", + "dev": true + }, + "y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "dev": true + }, + "yargs": { + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", + "dev": true, + "requires": { + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.2" + }, + "dependencies": { + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + } + } + }, + "yargs-parser": { + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + }, + "yargs-unparser": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.6.0.tgz", + "integrity": "sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw==", + "dev": true, + "requires": { + "flat": "^4.1.0", + "lodash": "^4.17.15", + "yargs": "^13.3.0" + } + }, + "yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=", + "dev": true, + "requires": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + } + } +} diff --git a/src/gui/package.json b/src/lhw_gui/package.json similarity index 100% rename from src/gui/package.json rename to src/lhw_gui/package.json index 10428cbf..e5531183 100644 --- a/src/gui/package.json +++ b/src/lhw_gui/package.json @@ -33,11 +33,11 @@ ], "devDependencies": { "async": "^3.2.0", - "express": "^4.16.2", "eslint": "^6.8.0", + "express": "^4.16.2", "js-sha512": "^0.8.0", - "mocha": "^7.1.1", "jsdom": "^16.2.1", + "mocha": "^7.1.1", "puppeteer": "^2.1.1" }, "dependencies": { diff --git a/src/lhw_motion/Dockerfile b/src/lhw_motion/Dockerfile index 42284580..cf5b3be7 100644 --- a/src/lhw_motion/Dockerfile +++ b/src/lhw_motion/Dockerfile @@ -10,6 +10,9 @@ COPY src/lhw_interfaces src/lhw_interfaces COPY src/lhw_motion src/lhw_motion RUN rosdep install --from-paths src --ignore-src -r -y +#Add python packages +RUN pip3 install sympy + # Add sourcing script RUN echo "\nsource /workspace/liu-home-wreckers/src/lhw_motion/activate" >> /etc/zsh/zshrc diff --git a/src/lhw_motion/lhw_motion/room_navigation.py b/src/lhw_motion/lhw_motion/room_navigation.py index 944cabed..33f6343d 100644 --- a/src/lhw_motion/lhw_motion/room_navigation.py +++ b/src/lhw_motion/lhw_motion/room_navigation.py @@ -42,7 +42,6 @@ class RoomNavigation(Node): def __init__(self, rooms=[], rooms_map_file = None): super().__init__('room_navigation') self.log = self.get_logger() - self.log.warn(self.__class__.__name__+" has not yet been implemented.") # TODO self.rooms = rooms self.rooms_map = None @@ -118,7 +117,7 @@ class RoomNavigation(Node): def main(args=None): rclpy.init(args=args) - room_navigation_node = RoomNavigation(rooms_map_file='src/lhw_intelligence/lhw_intelligence/maps/simple_map_rooms.png') + room_navigation_node = RoomNavigation(rooms_map_file='src/lhw_motion/maps/simple_map_rooms.png') rclpy.spin(room_navigation_node) diff --git a/src/gui/lhw_gui/maps/simple_map.png b/src/lhw_motion/maps/simple_map.png similarity index 100% rename from src/gui/lhw_gui/maps/simple_map.png rename to src/lhw_motion/maps/simple_map.png diff --git a/src/gui/lhw_gui/maps/simple_map_rooms.png b/src/lhw_motion/maps/simple_map_rooms.png similarity index 100% rename from src/gui/lhw_gui/maps/simple_map_rooms.png rename to src/lhw_motion/maps/simple_map_rooms.png diff --git a/src/gui/lhw_gui/maps/simple_map_with_goals.png b/src/lhw_motion/maps/simple_map_with_goals.png similarity index 100% rename from src/gui/lhw_gui/maps/simple_map_with_goals.png rename to src/lhw_motion/maps/simple_map_with_goals.png -- GitLab