From 3ec9555cd3f5ffefa0ab05d826187f5b00279d92 Mon Sep 17 00:00:00 2001 From: chahatsagarmain Date: Tue, 4 Feb 2025 22:30:19 +0530 Subject: [PATCH] make file commands to test locally and workflow changes Signed-off-by: chahatsagarmain --- .github/actions/kfp-cluster/action.yml | 4 +- .github/actions/kfp-tekton-cluster/action.yml | 4 +- .../manifests/argo/kustomization.yaml | 6 +- .../manifests/tekton/kustomization.yaml | 6 +- .github/resources/scripts/build-images.sh | 10 +- .../scripts/kfp-readiness/wait_for_pods.py | 13 + .github/workflows/backend-visualization.yml | 2 +- .github/workflows/backend.yml | 19 +- .github/workflows/ci-checks.yml | 2 +- .github/workflows/e2e-test.yml | 60 +- .github/workflows/frontend.yml | 15 +- .github/workflows/gcpc-modules-tests.yml | 34 +- .github/workflows/image-builds.yml | 25 +- .../kfp-kubernetes-execution-tests.yml | 47 +- .../workflows/kfp-kubernetes-library-test.yml | 2 +- .github/workflows/kfp-samples.yml | 7 +- .github/workflows/kfp-sdk-runtime-tests.yml | 2 +- .github/workflows/kfp-sdk-tests.yml | 3 +- .../kubeflow-pipelines-manifests.yml | 2 +- .github/workflows/periodic.yml | 11 +- .github/workflows/presubmit-backend.yml | 3 +- .github/workflows/sdk-component-yaml.yml | 29 +- .github/workflows/sdk-docformatter.yml | 2 +- .github/workflows/sdk-execution.yml | 38 +- .github/workflows/sdk-isort.yml | 2 +- .github/workflows/sdk-upgrade.yml | 2 +- .github/workflows/sdk-yapf.yml | 6 +- .github/workflows/upgrade-test.yml | 11 +- .gitignore | 3 + CHANGELOG.md | 77 + Makefile | 176 + Makefile.setup.mk | 170 + OWNERS | 1 - README.md | 24 +- VERSION | 2 +- ...e-architecture-decision-records-for-kfp.md | 96 - adrs/OWNERS | 4 - adrs/README.md | 16 - adrs/template.md | 69 - api/Makefile | 4 +- .../go/pipelinespec/pipeline_spec.pb.go | 36 +- api/v2alpha1/pipeline_spec.proto | 6 +- backend/Dockerfile | 4 +- backend/OWNERS | 3 + backend/README.md | 127 +- backend/api/Dockerfile | 2 +- backend/api/Makefile | 8 +- backend/api/README.md | 10 +- backend/api/v1beta1/job.proto | 4 +- .../api/v1beta1/python_http_client/README.md | 4 +- .../kfp_server_api/__init__.py | 2 +- .../kfp_server_api/api_client.py | 2 +- .../kfp_server_api/configuration.py | 4 +- .../api/v1beta1/python_http_client/setup.py | 2 +- .../swagger/kfp_api_single_file.swagger.json | 2 +- .../api/v2beta1/go_client/experiment.pb.go | 291 +- .../api/v2beta1/go_client/recurring_run.pb.go | 2 +- backend/api/v2beta1/go_client/run.pb.go | 4 +- .../experiment_model/v2beta1_experiment.go | 2 +- .../v2beta1_pipeline_version_reference.go | 2 +- .../v2beta1_pipeline_version_reference.go | 2 +- .../go_http_client/run_model/v2beta1_run.go | 2 +- .../api/v2beta1/python_http_client/README.md | 4 +- .../docs/V2beta1Experiment.md | 1 + .../kfp_server_api/__init__.py | 2 +- .../kfp_server_api/api_client.py | 2 +- .../kfp_server_api/configuration.py | 4 +- .../models/v2beta1_experiment.py | 34 +- .../api/v2beta1/python_http_client/setup.py | 2 +- .../test/test_v2beta1_experiment.py | 3 +- .../test_v2beta1_list_experiments_response.py | 3 +- backend/api/v2beta1/recurring_run.proto | 2 +- backend/api/v2beta1/run.proto | 4 +- .../v2beta1/swagger/experiment.swagger.json | 2 +- .../swagger/kfp_api_single_file.swagger.json | 8 +- .../swagger/recurring_run.swagger.json | 2 +- backend/api/v2beta1/swagger/run.swagger.json | 4 +- backend/src/apiserver/client/sql.go | 5 +- .../client_manager/client_manager.go | 6 + backend/src/apiserver/config/config.go | 212 + backend/src/apiserver/config/config_test.go | 230 + .../src/apiserver/config/sample_config.json | 27 +- .../config/testdata/sample_pipeline.yaml | 49 + backend/src/apiserver/main.go | 114 +- backend/src/apiserver/model/pipeline_spec.go | 3 +- .../apiserver/resource/resource_manager.go | 92 +- .../resource/resource_manager_test.go | 41 +- backend/src/apiserver/server/api_converter.go | 12 +- backend/src/apiserver/server/api_util_test.go | 4 +- backend/src/apiserver/server/job_server.go | 13 + .../src/apiserver/server/job_server_test.go | 14 +- .../apiserver/server/pipeline_server_test.go | 4 +- backend/src/apiserver/server/util.go | 5 +- backend/src/apiserver/server/util_test.go | 39 +- .../apiserver/server/visualization_server.go | 4 +- .../src/apiserver/storage/pipeline_store.go | 24 +- .../src/apiserver/template/argo_template.go | 28 +- backend/src/apiserver/template/template.go | 2 +- .../src/apiserver/template/template_test.go | 4 +- backend/src/apiserver/template/v2_template.go | 73 +- .../src/apiserver/visualization/exporter.py | 3 +- .../apiserver/visualization/requirements.in | 7 +- .../apiserver/visualization/requirements.txt | 407 +- .../snapshots/snap_test_exporter.py | 32 +- .../visualization/templates/basic.tpl | 2 +- backend/src/cache/server/admission.go | 4 +- backend/src/common/client/api_server/util.go | 3 +- backend/src/common/util/service.go | 11 + backend/src/common/util/tgz.go | 3 +- .../scheduledworkflow/controller.go | 81 +- .../crd/controller/scheduledworkflow/main.go | 53 +- .../util/scheduled_workflow.go | 3 +- .../apis/scheduledworkflow/v1beta1/types.go | 4 + backend/src/v2/README.md | 8 +- backend/src/v2/cmd/compiler/main.go | 5 +- backend/src/v2/cmd/driver/main.go | 3 +- .../src/v2/compiler/argocompiler/argo_test.go | 10 +- .../src/v2/compiler/argocompiler/container.go | 4 +- .../v2/compiler/tektoncompiler/tekton_test.go | 14 +- backend/src/v2/compiler/visitor_test.go | 4 +- backend/src/v2/component/launcher_v2.go | 5 +- backend/src/v2/config/env.go | 11 +- backend/src/v2/driver/driver.go | 16 +- backend/src/v2/objectstore/object_store.go | 3 +- backend/test/integration/db_test.go | 4 +- backend/test/integration/job_api_test.go | 4 +- backend/test/integration/pipeline_api_test.go | 6 +- .../integration/pipeline_version_api_test.go | 6 +- backend/test/integration/run_api_test.go | 6 +- backend/test/integration/upgrade_test.go | 4 +- .../integration/pipeline_version_api_test.go | 6 +- .../v2/integration/recurring_run_api_test.go | 71 +- backend/test/v2/integration/run_api_test.go | 6 +- backend/test/v2/integration/upgrade_test.go | 4 +- backend/third_party_licenses/apiserver.csv | 2 +- backend/third_party_licenses/cache_server.csv | 2 +- backend/third_party_licenses/driver.csv | 2 +- backend/third_party_licenses/launcher.csv | 2 +- .../persistence_agent.csv | 2 +- backend/third_party_licenses/swf.csv | 2 +- backend/third_party_licenses/viewer.csv | 2 +- .../ovms-deployer/containers/requirements.txt | 2 +- docs/Architecture.md | 7 + frontend/Dockerfile | 4 +- frontend/mock-backend/package-lock.json | 504 +- frontend/package-lock.json | 36 +- frontend/package.json | 6 + frontend/server/package-lock.json | 17344 +++++++++------- frontend/server/package.json | 8 +- .../src/components/NewRunParametersV2.tsx | 2 +- frontend/src/pages/GettingStarted.test.tsx | 2 +- frontend/src/pages/NewRun.test.tsx | 2 +- frontend/src/pages/PipelineDetails.test.tsx | 2 +- frontend/src/pages/PipelineDetailsV2.tsx | 21 +- frontend/src/pages/RunDetailsV2.tsx | 27 +- frontend/src/pages/v2/DagCanvas.tsx | 9 +- go.mod | 2 +- go.sum | 4 +- hack/update-requirements.sh | 2 +- hack/update-toc.sh | 32 + images/README.md | 8 + .../kfp-cluster-wide-architecture.drawio.xml | 270 + images/kfp-cluster-wide-architecture.png | Bin 0 -> 247490 bytes kubernetes_platform/Makefile | 2 +- .../templates/application.yaml | 2 +- manifests/gcp_marketplace/schema.yaml | 4 +- .../cache-deployer-deployment.yaml | 2 +- .../base/cache-deployer/kustomization.yaml | 4 +- .../base/cache/cache-deployment.yaml | 2 +- .../kustomize/base/cache/kustomization.yaml | 4 +- .../generic/pipeline-install-config.yaml | 2 +- .../pipelines-profile-controller/sync.py | 8 +- .../pipelines-profile-controller/test_sync.py | 4 +- .../scheduled-workflow/cluster-role.yaml | 6 + .../base/metadata/base/kustomization.yaml | 4 +- .../base/metadata-envoy-deployment.yaml | 2 +- .../base/pipeline/kustomization.yaml | 24 +- .../metadata-writer/kustomization.yaml | 4 +- .../metadata-writer-deployment.yaml | 2 +- .../ml-pipeline-apiserver-deployment.yaml | 2 +- ...-pipeline-persistenceagent-deployment.yaml | 2 +- ...pipeline-scheduledworkflow-deployment.yaml | 13 +- .../ml-pipeline-scheduledworkflow-role.yaml | 6 + .../pipeline/ml-pipeline-ui-deployment.yaml | 6 +- .../ml-pipeline-viewer-crd-deployment.yaml | 2 +- .../ml-pipeline-visualization-deployment.yaml | 2 +- .../env/gcp/inverse-proxy/kustomization.yaml | 4 +- .../gcp/inverse-proxy/proxy-deployment.yaml | 2 +- proposals/0000-kep-process/README.md | 150 + proposals/NNNN-kep-template/README.md | 237 + samples/test/utils/kfp/samples/test/utils.py | 3 +- samples/v2/Makefile | 6 +- samples/v2/pipeline_with_volume_no_cache.py | 68 + .../v2/pipeline_with_volume_no_cache_test.py | 37 + sdk/python/kfp/cli/utils/parsing_test.py | 2 +- sdk/python/kfp/client/client.py | 2 +- sdk/python/kfp/dsl/component_decorator.py | 2 +- sdk/python/requirements.in | 2 +- sdk/python/requirements.txt | 32 +- sdk/python/test_data/test_data_config.yaml | 2 + test/README.md | 6 +- .../package-lock.json | 142 +- test/frontend-integration-test/package.json | 2 +- test/release/Dockerfile.release | 2 +- test/release/Makefile | 2 +- test/release/README.md | 2 +- test/release/bump-version-docker.sh | 2 +- test/release/release.sh | 2 +- .../sdk_execution_tests.py | 4 +- test/tools/project-cleaner/go.mod | 24 +- test/tools/project-cleaner/go.sum | 15 +- test/tools/project-cleaner/main.go | 3 +- third_party/ml-metadata/go.mod | 6 +- third_party/ml-metadata/go.sum | 12 +- 214 files changed, 13753 insertions(+), 8862 deletions(-) create mode 100644 Makefile create mode 100644 Makefile.setup.mk delete mode 100644 adrs/KFP-ADR-0001-use-architecture-decision-records-for-kfp.md delete mode 100644 adrs/OWNERS delete mode 100644 adrs/README.md delete mode 100644 adrs/template.md create mode 100644 backend/src/apiserver/config/config.go create mode 100644 backend/src/apiserver/config/config_test.go create mode 100644 backend/src/apiserver/config/testdata/sample_pipeline.yaml create mode 100644 docs/Architecture.md create mode 100644 hack/update-toc.sh create mode 100644 images/README.md create mode 100644 images/kfp-cluster-wide-architecture.drawio.xml create mode 100644 images/kfp-cluster-wide-architecture.png create mode 100644 proposals/0000-kep-process/README.md create mode 100644 proposals/NNNN-kep-template/README.md create mode 100644 samples/v2/pipeline_with_volume_no_cache.py create mode 100644 samples/v2/pipeline_with_volume_no_cache_test.py diff --git a/.github/actions/kfp-cluster/action.yml b/.github/actions/kfp-cluster/action.yml index b0942133cdb4..fdcb7dbc2f28 100644 --- a/.github/actions/kfp-cluster/action.yml +++ b/.github/actions/kfp-cluster/action.yml @@ -19,8 +19,8 @@ runs: - name: Build images shell: bash - run: ./.github/resources/scripts/build-images.sh + run: make build-images - name: Deploy KFP shell: bash - run: ./.github/resources/scripts/deploy-kfp.sh + run: make deploy-kfp diff --git a/.github/actions/kfp-tekton-cluster/action.yml b/.github/actions/kfp-tekton-cluster/action.yml index 4c396305e434..47c15b867329 100644 --- a/.github/actions/kfp-tekton-cluster/action.yml +++ b/.github/actions/kfp-tekton-cluster/action.yml @@ -14,8 +14,8 @@ runs: - name: Build images shell: bash - run: ./.github/resources/scripts/build-images.sh + run: make build-images - name: Deploy KFP shell: bash - run: ./.github/resources/scripts/deploy-kfp-tekton.sh + run: make deploy-kfp-tekton diff --git a/.github/resources/manifests/argo/kustomization.yaml b/.github/resources/manifests/argo/kustomization.yaml index cd2c6bdb0b35..825e2695db81 100644 --- a/.github/resources/manifests/argo/kustomization.yaml +++ b/.github/resources/manifests/argo/kustomization.yaml @@ -5,13 +5,13 @@ resources: - ../../../../manifests/kustomize/env/platform-agnostic images: -- name: gcr.io/ml-pipeline/api-server +- name: ghcr.io/kubeflow/kfp-api-server newName: kind-registry:5000/apiserver newTag: latest -- name: gcr.io/ml-pipeline/persistenceagent +- name: ghcr.io/kubeflow/kfp-persistence-agent newName: kind-registry:5000/persistenceagent newTag: latest -- name: gcr.io/ml-pipeline/scheduledworkflow +- name: ghcr.io/kubeflow/kfp-scheduled-workflow-controller newName: kind-registry:5000/scheduledworkflow newTag: latest diff --git a/.github/resources/manifests/tekton/kustomization.yaml b/.github/resources/manifests/tekton/kustomization.yaml index a86686a70b1d..391a26b93672 100644 --- a/.github/resources/manifests/tekton/kustomization.yaml +++ b/.github/resources/manifests/tekton/kustomization.yaml @@ -14,13 +14,13 @@ resources: # when application is deleted. images: -- name: gcr.io/ml-pipeline/api-server +- name: ghcr.io/kubeflow/kfp-api-server newName: kind-registry:5000/apiserver newTag: latest -- name: gcr.io/ml-pipeline/persistenceagent +- name: ghcr.io/kubeflow/kfp-persistence-agent newName: kind-registry:5000/persistenceagent newTag: latest -- name: gcr.io/ml-pipeline/scheduledworkflow +- name: ghcr.io/kubeflow/kfp-scheduled-workflow-controller newName: kind-registry:5000/scheduledworkflow newTag: latest - name: '*/aipipeline/tekton-exithandler-controller' diff --git a/.github/resources/scripts/build-images.sh b/.github/resources/scripts/build-images.sh index a70d295c2910..7cb06b3a037e 100755 --- a/.github/resources/scripts/build-images.sh +++ b/.github/resources/scripts/build-images.sh @@ -25,35 +25,35 @@ EXIT_CODE=0 docker system prune -a -f -docker build -q -t "${REGISTRY}/apiserver:${TAG}" -f backend/Dockerfile . && docker push "${REGISTRY}/apiserver:${TAG}" || EXIT_CODE=$? +docker build --progress=plain -t "${REGISTRY}/apiserver:${TAG}" -f backend/Dockerfile . && docker push "${REGISTRY}/apiserver:${TAG}" || EXIT_CODE=$? if [[ $EXIT_CODE -ne 0 ]] then echo "Failed to build apiserver image." exit $EXIT_CODE fi -docker build -q -t "${REGISTRY}/persistenceagent:${TAG}" -f backend/Dockerfile.persistenceagent . && docker push "${REGISTRY}/persistenceagent:${TAG}" || EXIT_CODE=$? +docker build --progress=plain -t "${REGISTRY}/persistenceagent:${TAG}" -f backend/Dockerfile.persistenceagent . && docker push "${REGISTRY}/persistenceagent:${TAG}" || EXIT_CODE=$? if [[ $EXIT_CODE -ne 0 ]] then echo "Failed to build persistenceagent image." exit $EXIT_CODE fi -docker build -q -t "${REGISTRY}/scheduledworkflow:${TAG}" -f backend/Dockerfile.scheduledworkflow . && docker push "${REGISTRY}/scheduledworkflow:${TAG}" || EXIT_CODE=$? +docker build --progress=plain -t "${REGISTRY}/scheduledworkflow:${TAG}" -f backend/Dockerfile.scheduledworkflow . && docker push "${REGISTRY}/scheduledworkflow:${TAG}" || EXIT_CODE=$? if [[ $EXIT_CODE -ne 0 ]] then echo "Failed to build scheduledworkflow image." exit $EXIT_CODE fi -docker build -q -t "${REGISTRY}/driver:${TAG}" -f backend/Dockerfile.driver . && docker push "${REGISTRY}/driver:${TAG}" || EXIT_CODE=$? +docker build --progress=plain -t "${REGISTRY}/driver:${TAG}" -f backend/Dockerfile.driver . && docker push "${REGISTRY}/driver:${TAG}" || EXIT_CODE=$? if [[ $EXIT_CODE -ne 0 ]] then echo "Failed to build driver image." exit $EXIT_CODE fi -docker build -q -t "${REGISTRY}/launcher:${TAG}" -f backend/Dockerfile.launcher . && docker push "${REGISTRY}/launcher:${TAG}" || EXIT_CODE=$? +docker build --progress=plain -t "${REGISTRY}/launcher:${TAG}" -f backend/Dockerfile.launcher . && docker push "${REGISTRY}/launcher:${TAG}" || EXIT_CODE=$? if [[ $EXIT_CODE -ne 0 ]] then echo "Failed to build launcher image." diff --git a/.github/resources/scripts/kfp-readiness/wait_for_pods.py b/.github/resources/scripts/kfp-readiness/wait_for_pods.py index ebc7546a300f..cc405bcbe213 100644 --- a/.github/resources/scripts/kfp-readiness/wait_for_pods.py +++ b/.github/resources/scripts/kfp-readiness/wait_for_pods.py @@ -13,6 +13,17 @@ config.load_kube_config() v1 = client.CoreV1Api() +def log_pods(): + pods = v1.list_namespaced_pod(namespace=namespace) + + for pod in pods.items: + try: + logging.info( + f"---- Pod {namespace}/{pod.metadata.name} logs ----\n" + + v1.read_namespaced_pod_log(pod.metadata.name, namespace) + ) + except client.exceptions.ApiException: + continue def get_pod_statuses(): pods = v1.list_namespaced_pod(namespace=namespace) @@ -74,6 +85,8 @@ def check_pods(calm_time=10, timeout=600, retries_after_ready=5): logging.info(f"Pods are still stabilizing. Retrying in {calm_time} seconds...") time.sleep(calm_time) else: + log_pods() + raise Exception("Pods did not stabilize within the timeout period.") logging.info("Final pod statuses:") diff --git a/.github/workflows/backend-visualization.yml b/.github/workflows/backend-visualization.yml index 7038278f6195..ac0879ce4ee2 100644 --- a/.github/workflows/backend-visualization.yml +++ b/.github/workflows/backend-visualization.yml @@ -23,4 +23,4 @@ jobs: python-version: '3.9' - name: Run tests - run: ./test/presubmit-backend-visualization.sh + run: make test-backend-visualization-test diff --git a/.github/workflows/backend.yml b/.github/workflows/backend.yml index c17ef0e33a7e..41a0ba026511 100644 --- a/.github/workflows/backend.yml +++ b/.github/workflows/backend.yml @@ -40,31 +40,24 @@ jobs: python-version: '3.9' - name: Install sdk run: | - python3 -m venv .venv - . .venv/bin/activate - pip install -e sdk/python + make setup-backend-test - name: Create KFP cluster uses: ./.github/actions/kfp-tekton-cluster - name: "flip coin test" run: | - . .venv/bin/activate - TEST_SCRIPT="test-flip-coin.sh" ./.github/resources/scripts/e2e-test.sh + make test-backend-test-flip-coin - name: "static loop test" run: | - . .venv/bin/activate - TEST_SCRIPT="test-static-loop.sh" ./.github/resources/scripts/e2e-test.sh + make test-backend-test-static-loop - name: "dynamic loop test" run: | - . .venv/bin/activate - TEST_SCRIPT="test-dynamic-loop.sh" ./.github/resources/scripts/e2e-test.sh + make test-backend-test-dynamic-loop - name: "use env" run: | - . .venv/bin/activate - TEST_SCRIPT="test-env.sh" ./.github/resources/scripts/e2e-test.sh + make test-backend-test-env - name: "use volume" run: | - . .venv/bin/activate - TEST_SCRIPT="test-volume.sh" ./.github/resources/scripts/e2e-test.sh + make test-backend-test-volume - name: Collect test results if: always() uses: actions/upload-artifact@v4 diff --git a/.github/workflows/ci-checks.yml b/.github/workflows/ci-checks.yml index ead67bdb011f..9b488e09d61e 100644 --- a/.github/workflows/ci-checks.yml +++ b/.github/workflows/ci-checks.yml @@ -46,7 +46,7 @@ jobs: mkdir -p ./pr echo ${{ github.event.pull_request.number }} >> ./pr/pr_number echo ${{ github.event.action }} >> ./pr/event_action - - uses: actions/upload-artifact@v3.1.0 + - uses: actions/upload-artifact@v4 with: name: pr path: pr/ diff --git a/.github/workflows/e2e-test.yml b/.github/workflows/e2e-test.yml index 2a89d87a97de..c68dac20b79d 100644 --- a/.github/workflows/e2e-test.yml +++ b/.github/workflows/e2e-test.yml @@ -37,12 +37,8 @@ jobs: with: k8s_version: ${{ matrix.k8s_version }} - - name: Forward API port - run: ./.github/resources/scripts/forward-port.sh "kubeflow" "ml-pipeline" 8888 8888 - - - name: Initialization tests v1 - working-directory: ./backend/test/initialization - run: go test -v ./... -namespace kubeflow -args -runIntegrationTests=true + - name: Forward Port and initialize tests v1 + run: make test-e2e-initialization-tests-v1 - name: Collect test results if: always() @@ -71,13 +67,8 @@ jobs: with: k8s_version: ${{ matrix.k8s_version }} - - - name: Forward API port - run: ./.github/resources/scripts/forward-port.sh "kubeflow" "ml-pipeline" 8888 8888 - - name: Initialization tests v2 - working-directory: ./backend/test/v2/initialization - run: go test -v ./... -namespace kubeflow -args -runIntegrationTests=true + run: make test-e2e-initialization-tests-v2 - name: Collect test results if: always() @@ -106,12 +97,8 @@ jobs: with: k8s_version: ${{ matrix.k8s_version }} - - name: Forward API port - run: ./.github/resources/scripts/forward-port.sh "kubeflow" "ml-pipeline" 8888 8888 - - name: API integration tests v1 - working-directory: ./backend/test/integration - run: go test -v ./... -namespace ${NAMESPACE} -args -runIntegrationTests=true + run: make test-e2e-api-integration-tests-v1 - name: Collect test results if: always() @@ -140,13 +127,9 @@ jobs: with: k8s_version: ${{ matrix.k8s_version }} - - name: Forward API port - run: ./.github/resources/scripts/forward-port.sh "kubeflow" "ml-pipeline" 8888 8888 - - name: API integration tests v2 - working-directory: ./backend/test/v2/integration - run: go test -v ./... -namespace ${NAMESPACE} -args -runIntegrationTests=true - + run: make test-e2e-api-integration-tests-v2 + - name: Collect test results if: always() uses: actions/upload-artifact@v4 @@ -174,19 +157,9 @@ jobs: with: k8s_version: ${{ matrix.k8s_version }} - - name: Forward API port - run: ./.github/resources/scripts/forward-port.sh "kubeflow" "ml-pipeline" 8888 8888 - - - name: Forward Frontend port - run: ./.github/resources/scripts/forward-port.sh "kubeflow" "ml-pipeline-ui" 3000 3000 - - - name: Build frontend integration tests image - working-directory: ./test/frontend-integration-test - run: docker build . -t kfp-frontend-integration-test:local - - - name: Frontend integration tests - run: docker run --net=host kfp-frontend-integration-test:local --remote-run true - + - name: Forward API port and run integration test + run: make test-e2e-frontend-integration-test + - name: Collect test results if: always() uses: actions/upload-artifact@v4 @@ -214,18 +187,9 @@ jobs: with: k8s_version: ${{ matrix.k8s_version }} - - name: Forward API port - run: ./.github/resources/scripts/forward-port.sh "kubeflow" "ml-pipeline" 8888 8888 - - - name: Install prerequisites - run: pip3 install -r ./test/sample-test/requirements.txt - - - name: Basic sample tests - sequential - run: python3 ./test/sample-test/sample_test_launcher.py sample_test run_test --namespace kubeflow --test-name sequential --results-gcs-dir output - - - name: Basic sample tests - exit_handler - run: python3 ./test/sample-test/sample_test_launcher.py sample_test run_test --namespace kubeflow --test-name exit_handler --expected-result failed --results-gcs-dir output - + - name: Forward API port and run integration tests + run: make test-e2e-basic-sample-tests + - name: Collect test results if: always() uses: actions/upload-artifact@v4 diff --git a/.github/workflows/frontend.yml b/.github/workflows/frontend.yml index 3e4d8eebe017..4f6d048ee321 100644 --- a/.github/workflows/frontend.yml +++ b/.github/workflows/frontend.yml @@ -20,16 +20,13 @@ jobs: uses: actions/checkout@v2 - name: Set up Node.js - uses: actions/setup-node@v3 + uses: actions/setup-node@v4 with: - node-version: '14' - - - name: Clean npm cache - run: npm cache clean --force - - - name: Install dependencies - run: cd ./frontend && npm ci + node-version: '22' + + - name: Setup frontend test + run: make setup-frontend-test - name: Run Frontend Tests - run: cd ./frontend && npm run test:ci + run: make test-frontend diff --git a/.github/workflows/gcpc-modules-tests.yml b/.github/workflows/gcpc-modules-tests.yml index 7ce9f4145e33..4ca856c1aa7b 100644 --- a/.github/workflows/gcpc-modules-tests.yml +++ b/.github/workflows/gcpc-modules-tests.yml @@ -21,36 +21,8 @@ jobs: with: python-version: 3.9 - - name: apt-get update - run: sudo apt-get update - - - name: Install protobuf-compiler - run: sudo apt-get install protobuf-compiler -y - - - name: Install setuptools - run: | - pip3 install setuptools - pip3 freeze - - - name: Install Wheel - run: pip3 install wheel==0.42.0 - - - name: Install python sdk - run: pip install sdk/python - - - name: Generate API proto files - working-directory: ./api - run: make clean python - - - name: Install kfp-pipeline-spec from source - run: | - python3 -m pip install api/v2alpha1/python - - - name: Install google-cloud component - run: pip install components/google-cloud - - - name: Install Pytest - run: pip install $(grep 'pytest==' sdk/python/requirements-dev.txt) + - name: Install requirements + run: make setup-grpc-modules-test - name: Run test - run: pytest ./test/gcpc-tests/run_all_gcpc_modules.py + run: make test-grpc-modules diff --git a/.github/workflows/image-builds.yml b/.github/workflows/image-builds.yml index 008dbfccf8b7..dce7a492385a 100644 --- a/.github/workflows/image-builds.yml +++ b/.github/workflows/image-builds.yml @@ -77,20 +77,43 @@ jobs: include: - image: kfp-api-server dockerfile: backend/Dockerfile + context: . - image: kfp-frontend dockerfile: frontend/Dockerfile + context: . - image: kfp-persistence-agent dockerfile: backend/Dockerfile.persistenceagent + context: . - image: kfp-scheduled-workflow-controller dockerfile: backend/Dockerfile.scheduledworkflow + context: . - image: kfp-viewer-crd-controller dockerfile: backend/Dockerfile.viewercontroller + context: . - image: kfp-visualization-server dockerfile: backend/Dockerfile.visualization + context: . - image: kfp-launcher dockerfile: backend/Dockerfile.launcher + context: . - image: kfp-driver dockerfile: backend/Dockerfile.driver + context: . + - image: kfp-cache-deployer + dockerfile: backend/src/cache/deployer/Dockerfile + context: . + - image: kfp-cache-server + dockerfile: backend/Dockerfile.cacheserver + context: . + - image: kfp-metadata-writer + dockerfile: backend/metadata_writer/Dockerfile + context: . + - image: kfp-metadata-envoy + dockerfile: third_party/metadata_envoy/Dockerfile + context: . + - image: kfp-inverse-proxy-agent + dockerfile: proxy/Dockerfile + context: ./proxy steps: - name: Checkout repository uses: actions/checkout@v4 @@ -144,7 +167,7 @@ jobs: uses: docker/build-push-action@v6 if: steps.check_tag.outcome == 'success' with: - context: . + context: ${{ matrix.context }} file: ${{ matrix.dockerfile }} push: true tags: ${{ steps.meta.outputs.tags }} diff --git a/.github/workflows/kfp-kubernetes-execution-tests.yml b/.github/workflows/kfp-kubernetes-execution-tests.yml index 9e6c3a402911..53f61efd34fe 100644 --- a/.github/workflows/kfp-kubernetes-execution-tests.yml +++ b/.github/workflows/kfp-kubernetes-execution-tests.yml @@ -33,47 +33,8 @@ jobs: with: k8s_version: ${{ matrix.k8s_version }} - - name: Forward API port - run: ./.github/resources/scripts/forward-port.sh "kubeflow" "ml-pipeline" 8888 8888 + - name: Install requirements + run: make setup-kfp-kubernetes-execution-tests-without-kfp - - name: apt-get update - run: sudo apt-get update - - - name: Install protobuf-compiler - run: sudo apt-get install protobuf-compiler -y - - - name: Install setuptools - run: | - pip3 install setuptools - pip3 freeze - - - name: Install Wheel - run: pip3 install wheel==0.42.0 - - - name: Install protobuf - run: pip3 install protobuf==4.25.3 - - - name: Generate API proto files - working-directory: ./api - run: make clean python - - - name: Install kfp-pipeline-spec from source - run: | - python3 -m pip install api/v2alpha1/python - - - name: Generate kfp-kubernetes proto files from source - working-directory: ./kubernetes_platform - run: make clean python - - - name: Install kfp-kubernetes from source - run: | - pip install -e ./kubernetes_platform/python[dev] - - - name: Install requirements - run: pip install -r ./test/kfp-kubernetes-execution-tests/requirements.txt - - - name: Run tests - run: | - export KFP_ENDPOINT="http://localhost:8888" - export TIMEOUT_SECONDS=2700 - pytest ./test/kfp-kubernetes-execution-tests/sdk_execution_tests.py --asyncio-task-timeout $TIMEOUT_SECONDS + - name: Forward port and run tests + run: make test-kfp-kubernetes-execution-tests diff --git a/.github/workflows/kfp-kubernetes-library-test.yml b/.github/workflows/kfp-kubernetes-library-test.yml index f1a7d103cebe..4cd1bd5f2b03 100644 --- a/.github/workflows/kfp-kubernetes-library-test.yml +++ b/.github/workflows/kfp-kubernetes-library-test.yml @@ -33,4 +33,4 @@ jobs: python-version: ${{matrix.python.version}} - name: Run tests - run: ./test/presubmit-test-kfp-kubernetes-library.sh + run: make test-kfp-kubernetes-library-test diff --git a/.github/workflows/kfp-samples.yml b/.github/workflows/kfp-samples.yml index 98fb96f899ae..c1af8c19fca7 100644 --- a/.github/workflows/kfp-samples.yml +++ b/.github/workflows/kfp-samples.yml @@ -36,9 +36,6 @@ jobs: with: k8s_version: ${{ matrix.k8s_version }} - - name: Forward API port - run: ./.github/resources/scripts/forward-port.sh "kubeflow" "ml-pipeline" 8888 8888 - - - name: Run Samples Tests + - name: Forward port and run samples tests run: | - ./backend/src/v2/test/sample-test.sh + make test-kfp-samples diff --git a/.github/workflows/kfp-sdk-runtime-tests.yml b/.github/workflows/kfp-sdk-runtime-tests.yml index 3403936c1614..ded0be8b4e79 100644 --- a/.github/workflows/kfp-sdk-runtime-tests.yml +++ b/.github/workflows/kfp-sdk-runtime-tests.yml @@ -28,4 +28,4 @@ jobs: - name: Run KFP Runtime Code Tests run: | export PULL_NUMBER="${{ github.event.inputs.pull_number || github.event.pull_request.number }}" - ./test/presubmit-test-kfp-runtime-code.sh + make test-kfp-sdk-runtime-tests diff --git a/.github/workflows/kfp-sdk-tests.yml b/.github/workflows/kfp-sdk-tests.yml index 0fb6f85dae6e..993240219ac4 100644 --- a/.github/workflows/kfp-sdk-tests.yml +++ b/.github/workflows/kfp-sdk-tests.yml @@ -27,5 +27,4 @@ jobs: python-version: ${{ matrix.python }} - name: Run SDK Tests - run: | - ./test/presubmit-tests-sdk.sh + run: make test-kfp-sdk-tests diff --git a/.github/workflows/kubeflow-pipelines-manifests.yml b/.github/workflows/kubeflow-pipelines-manifests.yml index d494e2e0d0aa..2fe20e7b51c6 100644 --- a/.github/workflows/kubeflow-pipelines-manifests.yml +++ b/.github/workflows/kubeflow-pipelines-manifests.yml @@ -16,4 +16,4 @@ jobs: uses: actions/checkout@v4 - name: Run tests - run: ./manifests/kustomize/hack/presubmit.sh + run: make test-kubeflow-pipelines-manifests diff --git a/.github/workflows/periodic.yml b/.github/workflows/periodic.yml index 44bc1e5f25a3..54a681f07394 100644 --- a/.github/workflows/periodic.yml +++ b/.github/workflows/periodic.yml @@ -22,13 +22,10 @@ jobs: uses: ./.github/actions/kfp-cluster with: k8s_version: ${{ matrix.k8s_version }} - - name: Port forward kfp apiserver - run: | - nohup kubectl port-forward --namespace kubeflow svc/ml-pipeline 8888:8888 & - - name: Run Functional Tests - run: | - log_dir=$(mktemp -d) - ./test/kfp-functional-test/kfp-functional-test.sh > $log_dir/periodic_tests.txt + + - name: Port forward and run Functional Tests + run: make test-periodic-test + - name: Collect test results if: always() uses: actions/upload-artifact@v4 diff --git a/.github/workflows/presubmit-backend.yml b/.github/workflows/presubmit-backend.yml index 5ca27fb6aaf4..5c96f986e4ed 100644 --- a/.github/workflows/presubmit-backend.yml +++ b/.github/workflows/presubmit-backend.yml @@ -10,6 +10,7 @@ on: paths: - 'backend/**' - 'test/presubmit-backend-test.sh' + - '.github/workflows/presubmit-backend.yml' jobs: backend-tests: @@ -25,4 +26,4 @@ jobs: go-version-file: go.mod - name: Run Backend Tests - run: ./test/presubmit-backend-test.sh + run: make test-presubmit-backend diff --git a/.github/workflows/sdk-component-yaml.yml b/.github/workflows/sdk-component-yaml.yml index 11adbcfe1f34..a416b077f863 100644 --- a/.github/workflows/sdk-component-yaml.yml +++ b/.github/workflows/sdk-component-yaml.yml @@ -24,33 +24,8 @@ jobs: with: python-version: 3.9 - - name: apt-get update - run: sudo apt-get update - - - name: Install protobuf-compiler - run: sudo apt-get install protobuf-compiler -y - - - name: Install setuptools - run: | - pip3 install setuptools - pip3 freeze - - - name: Install Wheel - run: pip3 install wheel==0.42.0 - - - name: Install protobuf - run: pip3 install protobuf==4.25.3 - - - name: Generate API proto files - working-directory: ./api - run: make clean python - - - name: Install kfp-pipeline-spec from source - run: | - python3 -m pip install api/v2alpha1/python - - name: Install requirements - run: pip install -r ./test/sdk-execution-tests/requirements.txt + run: make setup-sdk-component-yaml - name: Run component YAML tests - run: ./test/presubmit-component-yaml.sh + run: make test-sdk-component-yaml diff --git a/.github/workflows/sdk-docformatter.yml b/.github/workflows/sdk-docformatter.yml index 12b1c29d7051..9fe15a120ebe 100644 --- a/.github/workflows/sdk-docformatter.yml +++ b/.github/workflows/sdk-docformatter.yml @@ -23,4 +23,4 @@ jobs: python-version: 3.9 - name: Run docformatter tests - run: ./test/presubmit-docformatter-sdk.sh + run: make test-sdk-docformatter diff --git a/.github/workflows/sdk-execution.yml b/.github/workflows/sdk-execution.yml index 11f0eb95ba5f..6942ea2c1baf 100644 --- a/.github/workflows/sdk-execution.yml +++ b/.github/workflows/sdk-execution.yml @@ -10,6 +10,7 @@ on: - '.github/resources/**' - 'sdk/python/**' - 'api/v2alpha1/**' + - 'backend/src/v2/compiler/**' jobs: sdk-execution-tests: @@ -32,39 +33,10 @@ jobs: with: k8s_version: ${{ matrix.k8s_version }} - - name: Forward API port - run: ./.github/resources/scripts/forward-port.sh "kubeflow" "ml-pipeline" 8888 8888 - - - name: apt-get update - run: sudo apt-get update - - - name: Install protobuf-compiler - run: sudo apt-get install protobuf-compiler -y - - - name: Install setuptools - run: | - pip3 install setuptools - pip3 freeze - - - name: Install Wheel - run: pip3 install wheel==0.42.0 - - - name: Install protobuf - run: pip3 install protobuf==4.25.3 - - - name: Generate API proto files - working-directory: ./api - run: make clean python - - - name: Install kfp-pipeline-spec from source - run: | - python3 -m pip install api/v2alpha1/python - + # Same as sdk-component requirements - name: Install requirements - run: pip install -r ./test/sdk-execution-tests/requirements.txt + run: make setup-sdk-component-yaml - - name: Run tests + - name: Forward API port and run tests run: | - export KFP_ENDPOINT="http://localhost:8888" - export TIMEOUT_SECONDS=2700 - pytest ./test/sdk-execution-tests/sdk_execution_tests.py --asyncio-task-timeout $TIMEOUT_SECONDS + make test-sdk-execution diff --git a/.github/workflows/sdk-isort.yml b/.github/workflows/sdk-isort.yml index 527cff1096aa..6edf0909ff57 100644 --- a/.github/workflows/sdk-isort.yml +++ b/.github/workflows/sdk-isort.yml @@ -23,4 +23,4 @@ jobs: python-version: 3.9 - name: Run isort tests - run: ./test/presubmit-isort-sdk.sh + run: make test-sdk-isort diff --git a/.github/workflows/sdk-upgrade.yml b/.github/workflows/sdk-upgrade.yml index e35b7358ceb6..f36f6cefa120 100644 --- a/.github/workflows/sdk-upgrade.yml +++ b/.github/workflows/sdk-upgrade.yml @@ -23,4 +23,4 @@ jobs: python-version: 3.9 - name: Run SDK upgrade tests - run: ./test/presubmit-test-sdk-upgrade.sh + run: make test-sdk-upgrade diff --git a/.github/workflows/sdk-yapf.yml b/.github/workflows/sdk-yapf.yml index b1c46085ea30..c93b451710df 100644 --- a/.github/workflows/sdk-yapf.yml +++ b/.github/workflows/sdk-yapf.yml @@ -29,8 +29,8 @@ jobs: with: python-version: '3.9' - - name: Install dependencies - run: pip install yapf + - name: Install requirements + run: make setup-sdk-yapf - name: Run YAPF SDK Tests - run: ./test/presubmit-yapf-sdk.sh + run: make test-sdk-yapf \ No newline at end of file diff --git a/.github/workflows/upgrade-test.yml b/.github/workflows/upgrade-test.yml index dbc329f33fd0..717c388b5fc6 100644 --- a/.github/workflows/upgrade-test.yml +++ b/.github/workflows/upgrade-test.yml @@ -33,18 +33,21 @@ jobs: with: k8s_version: ${{ matrix.k8s_version }} + - name: Forward API port + run: ./.github/resources/scripts/forward-port.sh "kubeflow" "ml-pipeline" 8888 8888 + - name: Prepare upgrade tests working-directory: backend/test/integration - run: go test -v ./... -namespace ${NAMESPACE} -args -runUpgradeTests=true -testify.m=Prepare + run: go test -v ./... -namespace kubeflow -args -runUpgradeTests=true -testify.m=Prepare - name: Prepare verification tests working-directory: backend/test/integration - run: go test -v ./... -namespace ${NAMESPACE} -args -runUpgradeTests=true -testify.m=Verify + run: go test -v ./... -namespace kubeflow -args -runUpgradeTests=true -testify.m=Verify - name: Prepare upgrade tests v2 working-directory: backend/test/v2/integration/ - run: go test -v ./... -namespace ${NAMESPACE} -args -runUpgradeTests=true -testify.m=Prepare + run: go test -v ./... -namespace kubeflow -args -runUpgradeTests=true -testify.m=Prepare - name: Prepare verification tests v2 working-directory: backend/test/v2/integration - run: go test -v ./... -namespace ${NAMESPACE} -args -runUpgradeTests=true -testify.m=Verify + run: go test -v ./... -namespace kubeflow -args -runUpgradeTests=true -testify.m=Verify diff --git a/.gitignore b/.gitignore index f221dec7bb38..95936b34f3d0 100644 --- a/.gitignore +++ b/.gitignore @@ -86,5 +86,8 @@ __pycache__ # kfp local execution default directory local_outputs/ +# Ignore the Kind cluster kubeconfig +kubeconfig_dev-pipelines-api + # Ignore debug Driver Dockerfile produced from `make -C backend image_driver_debug` backend/Dockerfile.driver-debug diff --git a/CHANGELOG.md b/CHANGELOG.md index 2ad9eaebd03f..f78b804333e3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,82 @@ # Changelog +## [2.4.0](https://github.com/kubeflow/pipelines/compare/2.3.0...2.4.0) (2025-01-16) + + +### ⚠ BREAKING CHANGES + +* **sdk:** stop auto-populating metrics as dag output ([\#11362](https://github.com/kubeflow/pipelines/issues/11362)) +* **components:** Deprecate preview.custom_job module +* **sdk:** Pin kfp-pipeline-spec==0.4.0, kfp-server-api>=2.1.0,<2.4.0 ([\#11192](https://github.com/kubeflow/pipelines/issues/11192)) + +### Features + +* **sdk/backend:** Add support for placeholders in resource limits ([\#11501](https://github.com/kubeflow/pipelines/issues/11501)) ([7c931ae](https://github.com/kubeflow/pipelines/commit/7c931ae20197b2309d7a8462f6ce099882a8f915)) +* Introduce cache_key for cache key customization ([\#11434](https://github.com/kubeflow/pipelines/issues/11434)) ([50b367f](https://github.com/kubeflow/pipelines/commit/50b367f232b2d37b762745c8b4296a29c9d8fd45)) +* **api:** add PipelineConfig to api to re-implement pipeline-level config ([\#11333](https://github.com/kubeflow/pipelines/issues/11333)) ([c2f5649](https://github.com/kubeflow/pipelines/commit/c2f56495b9b1e9eda1b44b6106e12d5290a89ed7)) +* **backend:** add configurable S3 path style support ([\#11246](https://github.com/kubeflow/pipelines/issues/11246)) ([85fdd73](https://github.com/kubeflow/pipelines/commit/85fdd73ae0bb1c2ce01da6311807b37cfc589710)) +* **backend:** Add Parallelism Limit to ParallelFor tasks. Fixes [\#8718](https://github.com/kubeflow/pipelines/issues/8718) ([\#10798](https://github.com/kubeflow/pipelines/issues/10798)) ([b7d8c97](https://github.com/kubeflow/pipelines/commit/b7d8c97d65af575b71efe6755eb67b0bb9126f01)) +* **backend:** implement subdag output resolution ([\#11196](https://github.com/kubeflow/pipelines/issues/11196)) ([c5b787a](https://github.com/kubeflow/pipelines/commit/c5b787aacc4fddeeb1ebc526a83159540cd7b311)) +* **backend:** Remove PipelineSpec Template storage from ObjStore responsibilies. Fixes [\#10509](https://github.com/kubeflow/pipelines/issues/10509) ([\#10790](https://github.com/kubeflow/pipelines/issues/10790)) ([374b18b](https://github.com/kubeflow/pipelines/commit/374b18bc3366a51f4b92821cdb3a942bc12343a0)) +* **cli:** expose existing_token client property ([\#11400](https://github.com/kubeflow/pipelines/issues/11400)) ([35793be](https://github.com/kubeflow/pipelines/commit/35793be4168584b1084169b723bfb216aa4a03b6)) +* **component:** Created Snowflake data unload component ([\#11349](https://github.com/kubeflow/pipelines/issues/11349)) ([22e7780](https://github.com/kubeflow/pipelines/commit/22e77805ed41a72837f7cd15a9d679f42169b253)) +* **component:** execute in a virtual env ([\#11326](https://github.com/kubeflow/pipelines/issues/11326)) ([df28e89](https://github.com/kubeflow/pipelines/commit/df28e891c4374f7eac98cc6a4892b6e6c35a43f2)) +* **components:** Add reservation_affinity support in v1.create_custom_training_job_from_component ([c84241b](https://github.com/kubeflow/pipelines/commit/c84241b7362c0351109bc0ddbc2f697479ff8675)) +* **components:** add strategy to v1 GCPC custom job components/utils ([1cdd648](https://github.com/kubeflow/pipelines/commit/1cdd648239ff850bf5baae48e4e7bd1b24330dd5)) +* **components:** Deprecate preview.custom_job module ([abbd915](https://github.com/kubeflow/pipelines/commit/abbd915a2ac32b22151efef662b937601602ba9d)) +* **frontend/backend:** Allow the ability to sort experiments by last run creation. Fixes [\#10884](https://github.com/kubeflow/pipelines/issues/10884) ([\#11163](https://github.com/kubeflow/pipelines/issues/11163)) ([db8669c](https://github.com/kubeflow/pipelines/commit/db8669c33e60bb8910710359c0638d21ec27ac7c)) +* **sdk:** add PipelineConfig to DSL to re-implement pipeline-level config ([\#11112](https://github.com/kubeflow/pipelines/issues/11112)) ([df4d787](https://github.com/kubeflow/pipelines/commit/df4d7878c4ce25c801a916351bcbce1266a9daf1)) +* **sdk:** Allow disabling default caching via a CLI flag and env var ([\#11222](https://github.com/kubeflow/pipelines/issues/11222)) ([3f49522](https://github.com/kubeflow/pipelines/commit/3f495229f26ef08360048d050dfe014ca4b57b4f)) +* **sdk:** Pin kfp-pipeline-spec==0.4.0, kfp-server-api>=2.1.0,<2.4.0 ([\#11192](https://github.com/kubeflow/pipelines/issues/11192)) ([dfd4cc1](https://github.com/kubeflow/pipelines/commit/dfd4cc1e537523b04b01b6e209b5760bd2a007d5)) +* **sdk:** stop auto-populating metrics as dag output ([\#11362](https://github.com/kubeflow/pipelines/issues/11362)) ([8d018af](https://github.com/kubeflow/pipelines/commit/8d018aff6ed14b5bed7b3f90d9f450b3144ae18e)) +* **sdk/backend:** enable parameterization of container images ([\#11404](https://github.com/kubeflow/pipelines/issues/11404)) ([22e85de](https://github.com/kubeflow/pipelines/commit/22e85de2bcbd2ff5ed2a099e4f11a39ff27e4190)) +* **testing:** use kustomize to patch deployments before deploy ([\#11294](https://github.com/kubeflow/pipelines/issues/11294)) ([be863a8](https://github.com/kubeflow/pipelines/commit/be863a852997718701a1ee548d9db86dca7ffc33)) +* add fields in SinglePlatformSpec ([\#11299](https://github.com/kubeflow/pipelines/issues/11299)) ([a0d313e](https://github.com/kubeflow/pipelines/commit/a0d313e095c2b5fc1a32809c38cf96b13e5772b2)) +* **sdk:** support dynamic machine type parameters in pipeline task setters ([\#11097](https://github.com/kubeflow/pipelines/issues/11097)) ([70aaf8a](https://github.com/kubeflow/pipelines/commit/70aaf8a9a469607dc6e4aad58d40b39c75363b99)) +* **workflows:** use built images in Github workflows ([\#11284](https://github.com/kubeflow/pipelines/issues/11284)) ([1550b36](https://github.com/kubeflow/pipelines/commit/1550b363aed3745b476d2b3798725432329e8cea)) + + +### Bug Fixes + +* **backend:** Allow initializing the Kubernetes client with a kubeconfig ([\#11443](https://github.com/kubeflow/pipelines/issues/11443)) ([87bdb7c](https://github.com/kubeflow/pipelines/commit/87bdb7c3b1126ae5e899826be0834c11764edbae)) +* **backend:** handle client side HTTP timeouts to fix crashes of metadata-writer. Fixes [\#8200](https://github.com/kubeflow/pipelines/issues/8200) ([\#11361](https://github.com/kubeflow/pipelines/issues/11361)) ([94a21cc](https://github.com/kubeflow/pipelines/commit/94a21cc7e27a3824732e7f4c09a4d8b826dde5b8)) +* **backend:** modelToCRDTrigger was not including periodic schedule correctly ([\#11475](https://github.com/kubeflow/pipelines/issues/11475)) ([97acacb](https://github.com/kubeflow/pipelines/commit/97acacbd2a0b72d442398ca04382ac1e6d9aa37f)) +* **backend:** randomizing output uri path to avoid overwriting. Fixes [\#10186](https://github.com/kubeflow/pipelines/issues/10186) ([\#11243](https://github.com/kubeflow/pipelines/issues/11243)) ([219725d](https://github.com/kubeflow/pipelines/commit/219725d9f02b690cf0829a21faf092a3e4c65531)) +* **backend:** remove unused function argument ([\#11425](https://github.com/kubeflow/pipelines/issues/11425)) ([7f2278f](https://github.com/kubeflow/pipelines/commit/7f2278f25222992bedfcae5b613a7a06430f4542)) +* **backend:** return error properly ([\#11424](https://github.com/kubeflow/pipelines/issues/11424)) ([13f83cf](https://github.com/kubeflow/pipelines/commit/13f83cf745eb5628d6ae5b25c1ca979d8c6d92ad)) +* **backend:** set default value to true for ForcePathStyle ([\#11281](https://github.com/kubeflow/pipelines/issues/11281)) ([391de8c](https://github.com/kubeflow/pipelines/commit/391de8ca9ec68fe4cd85bba6c82348386fc79842)) +* **backend:** stop heartbeat status updates for ScheduledWorkflows. Fixes [\#8757](https://github.com/kubeflow/pipelines/issues/8757) ([\#11363](https://github.com/kubeflow/pipelines/issues/11363)) ([9ccec4c](https://github.com/kubeflow/pipelines/commit/9ccec4c7d1aff4d2bfdb20cf4fd1f9d64b8632f4)) +* **backend:** Synced ScheduledWorkflow CRs on apiserver startup ([\#11469](https://github.com/kubeflow/pipelines/issues/11469)) ([d21fca6](https://github.com/kubeflow/pipelines/commit/d21fca650c8152d992ad5f7f590f70b1368bc60b)) +* **backend:** upgrade PyYMAL to fix metadata_writer build error ([\#11231](https://github.com/kubeflow/pipelines/issues/11231)) ([a4119a6](https://github.com/kubeflow/pipelines/commit/a4119a6bf1fe220c84aaa5caa7051c423b5f145e)) +* **backend:** upgrade various old dependencies ([\#11448](https://github.com/kubeflow/pipelines/issues/11448)) ([803d7a8](https://github.com/kubeflow/pipelines/commit/803d7a8ebb00924107b890de01e2a53af78d9a5e)) +* **backend:** Use an Argo Workflow exit lifecycle hook for exit handlers ([\#11470](https://github.com/kubeflow/pipelines/issues/11470)) ([3059f7c](https://github.com/kubeflow/pipelines/commit/3059f7c124dc95f867e6f755f7c0720aaa32d48b)) +* **components:** Fix create_custom_training_job_from_component default location ([04d600b](https://github.com/kubeflow/pipelines/commit/04d600b2d36405f34799306c5d24287c75e31595)) +* **components:** remove default prediction column names in evaluation regression component to fix issues with bigquery data source ([753a2f1](https://github.com/kubeflow/pipelines/commit/753a2f148ac3f001bc785acc6359295e6fe521fd)) +* **frontend:** Detailed information of nodes is not displayed when clicking the node. Fixes [\#11325](https://github.com/kubeflow/pipelines/issues/11325) ([\#11493](https://github.com/kubeflow/pipelines/issues/11493)) ([028d81b](https://github.com/kubeflow/pipelines/commit/028d81b624629d4610ddcdced5b982437ff88d08)) +* **frontend:** first time choosing a pipeline definition is VERY slow. Fixes [\#10897](https://github.com/kubeflow/pipelines/issues/10897) ([\#11130](https://github.com/kubeflow/pipelines/issues/11130)) ([cfb3b31](https://github.com/kubeflow/pipelines/commit/cfb3b3149d9ba02daec584af77ef763f936cd727)) +* **frontend:** Fix the frontend image build with Node 22 ([\#11524](https://github.com/kubeflow/pipelines/issues/11524)) ([\#11525](https://github.com/kubeflow/pipelines/issues/11525)) ([2e47604](https://github.com/kubeflow/pipelines/commit/2e4760435ff988063dba6e21707e910bf748e5ff)) +* **sdk:** accelerator type setting in kfp ([\#11373](https://github.com/kubeflow/pipelines/issues/11373)) ([64e3900](https://github.com/kubeflow/pipelines/commit/64e390069d6c60c97ea03e833529a0930398620f)) +* **sdk:** Add error handling. Fixes [\#11164](https://github.com/kubeflow/pipelines/issues/11164) ([\#11356](https://github.com/kubeflow/pipelines/issues/11356)) ([4a64fe9](https://github.com/kubeflow/pipelines/commit/4a64fe9532556a48585b9966db8e10c7de0a8d37)) +* **sdk:** Backport fixes in kubeflow/pipelines#11075 ([\#11392](https://github.com/kubeflow/pipelines/issues/11392)) ([6ebf4aa](https://github.com/kubeflow/pipelines/commit/6ebf4aae0335424d3bc88175fd06a2b2ba05251f)) +* **tests:** remove redundant integration test wf ([\#11322](https://github.com/kubeflow/pipelines/issues/11322)) ([6a35ee5](https://github.com/kubeflow/pipelines/commit/6a35ee5144fba1c72badc7c52161d8a49f34804e)) +* **ui:** Disable GKE Metadata as default Fixes: [\#11247](https://github.com/kubeflow/pipelines/issues/11247), fixes [\#11260](https://github.com/kubeflow/pipelines/issues/11260) ([\#11403](https://github.com/kubeflow/pipelines/issues/11403)) ([23f718d](https://github.com/kubeflow/pipelines/commit/23f718d02e402bad5c9da1a3d76da5c4a97743b3)) +* **ui:** Fixes V1 Run detail unnecessary reloading. Fixes [\#10590](https://github.com/kubeflow/pipelines/issues/10590) ([\#11214](https://github.com/kubeflow/pipelines/issues/11214)) ([eee095e](https://github.com/kubeflow/pipelines/commit/eee095e5c8d53c0eae45165f72549afe5a5cb0e3)) +* **workflows:** patch reversed launcher / driver in workflow matrix ([\#11238](https://github.com/kubeflow/pipelines/issues/11238)) ([ceeda01](https://github.com/kubeflow/pipelines/commit/ceeda01d0a35bd84b79d8f2e7aa2e029cb1de06b)) + + +### Other Pull Requests + +* switch release/api generator images to ghcr ([\#11528](https://github.com/kubeflow/pipelines/issues/11528)) ([\#11530](https://github.com/kubeflow/pipelines/issues/11530)) ([33fca73](https://github.com/kubeflow/pipelines/commit/33fca73fd6f96751db3c7e2c4795acfc7980b649)) +* add remaining dockerfiles to build workflow ([\#11522](https://github.com/kubeflow/pipelines/issues/11522)) ([682d3ac](https://github.com/kubeflow/pipelines/commit/682d3aca5fb92622fb6a1cd94e5984fea4d90471)) +* Fix the failing exit handler SDK execution tests ([\#11519](https://github.com/kubeflow/pipelines/issues/11519)) ([8bce9c4](https://github.com/kubeflow/pipelines/commit/8bce9c4ef6b047d3b71206a97f66ca567e1a7e4f)) +* nominate reviewers for backend ([\#11508](https://github.com/kubeflow/pipelines/issues/11508)) ([56e6116](https://github.com/kubeflow/pipelines/commit/56e6116d054898f8dbe73990da3836e10e8b7523)) +* nominate approver & reviewer for backend ([\#11507](https://github.com/kubeflow/pipelines/issues/11507)) ([81ebd7f](https://github.com/kubeflow/pipelines/commit/81ebd7ff9b0376c44928f2398f48196e38d92cd3)) +* feat[frontend]: implement artifact-repositories configmap support ([\#11354](https://github.com/kubeflow/pipelines/issues/11354)) ([467f30c](https://github.com/kubeflow/pipelines/commit/467f30cf613ecfe181e7bf9c03cb2eef7ae1ea2d)) +* Add-Create-Experiment-button-when-selecting-experiement-final ([\#11332](https://github.com/kubeflow/pipelines/issues/11332)) ([c5f162d](https://github.com/kubeflow/pipelines/commit/c5f162d552e5ae405689066736acf730b9147606)) +* adding chore as a new template. Fixes [\#11263](https://github.com/kubeflow/pipelines/issues/11263) ([\#11317](https://github.com/kubeflow/pipelines/issues/11317)) ([f256d86](https://github.com/kubeflow/pipelines/commit/f256d86fbb9bfff0388cd6ef9df1120e49e995d8)) +* correct lastrun unittest timestamps ([\#11270](https://github.com/kubeflow/pipelines/issues/11270)) ([6f6c8ae](https://github.com/kubeflow/pipelines/commit/6f6c8aeda9d5c219e2958df94dce93ca5a88a6ea)) +* replaced deprecated image repos with registry.k8s.io ([\#11152](https://github.com/kubeflow/pipelines/issues/11152)) ([d23b72b](https://github.com/kubeflow/pipelines/commit/d23b72bf12f55f123a16f53eb35d061180ad9ac4)) + ## [2.3.0](https://github.com/kubeflow/pipelines/compare/2.2.0...2.3.0) (2024-09-06) diff --git a/Makefile b/Makefile new file mode 100644 index 000000000000..82cabe4df700 --- /dev/null +++ b/Makefile @@ -0,0 +1,176 @@ +SHELL := /bin/bash + +include ./Makefile.setup.mk + +.PHONY: setup-python +setup-python: + python3 -m venv .venv && \ + source .venv/bin/activate + +.PHONY: test-go-unittest +test-go-unittest: + go test -v -cover ./backend/... + +.PHONY: test-backend-test +test-backend-test: + source .venv/bin/activate && \ + TEST_SCRIPT="test-flip-coin.sh" ./.github/resources/scripts/e2e-test.sh && \ + TEST_SCRIPT="test-static-loop.sh" ./.github/resources/scripts/e2e-test.sh && \ + TEST_SCRIPT="test-dynamic-loop.sh" ./.github/resources/scripts/e2e-test.sh && \ + TEST_SCRIPT="test-env.sh" ./.github/resources/scripts/e2e-test.sh && \ + TEST_SCRIPT="test-volume.sh" ./.github/resources/scripts/e2e-test.sh + +.PHONY: test-backend-test-flip-coin +test-backend-test-flip-coin: + source .venv/bin/activate && \ + TEST_SCRIPT="test-flip-coin.sh" && source ./.github/resources/scripts/e2e-test.sh + +.PHONY: test-backend-test-static-loop +test-backend-test-static-loop: + source .venv/bin/activate && \ + TEST_SCRIPT="test-static-loop.sh" && source ./.github/resources/scripts/e2e-test.sh + +.PHONY: test-backend-test-dynamic-loop +test-backend-test-dynamic-loop: + source .venv/bin/activate && \ + TEST_SCRIPT="test-dynamic-loop.sh" && source ./.github/resources/scripts/e2e-test.sh + +.PHONY: test-backend-test-env +test-backend-test-env: + source .venv/bin/activate && \ + TEST_SCRIPT="test-env.sh" && source ./.github/resources/scripts/e2e-test.sh + +.PHONY: test-backend-test-volume +test-backend-test-volume: + source .venv/bin/activate && \ + TEST_SCRIPT="test-volume.sh" && source ./.github/resources/scripts/e2e-test.sh + +.PHONY: test-backend-visualization-test +test-backend-visualization-test: + ./test/presubmit-backend-visualization.sh + +.PHONY: test-e2e-initialization-tests-v1 +test-e2e-initialization-tests-v1: + ./.github/resources/scripts/forward-port.sh "kubeflow" "ml-pipeline" 8888 8888 && \ + cd ./backend/test/initialization && \ + go test -v ./... -namespace kubeflow -args -runIntegrationTests=true + +.PHONY: test-e2e-initialization-tests-v2 +test-e2e-initialization-tests-v2: + ./.github/resources/scripts/forward-port.sh "kubeflow" "ml-pipeline" 8888 8888 && \ + cd ./backend/test/v2/initialization && \ + go test -v ./... -namespace kubeflow -args -runIntegrationTests=true + +.PHONY: test-e2e-api-integration-tests-v1 +test-e2e-api-integration-tests-v1: + ./.github/resources/scripts/forward-port.sh "kubeflow" "ml-pipeline" 8888 8888 && \ + ./.github/resources/scripts/forward-port.sh "kubeflow" "mysql" 3306 3306 && \ + cd ./backend/test/integration && \ + go test -v ./... -namespace kubeflow -args -runIntegrationTests=true + +.PHONY: test-e2e-api-integration-tests-v2 +test-e2e-api-integration-tests-v2: + ./.github/resources/scripts/forward-port.sh "kubeflow" "ml-pipeline" 8888 8888 && \ + cd ./backend/test/v2/integration && \ + go test -v ./... -namespace kubeflow -args -runIntegrationTests=true + +.PHONY: test-e2e-frontend-integration-test +test-e2e-frontend-integration-test: + ./.github/resources/scripts/forward-port.sh "kubeflow" "ml-pipeline" 8888 8888 && \ + ./.github/resources/scripts/forward-port.sh "kubeflow" "ml-pipeline-ui" 3000 3000 && \ + cd ./test/frontend-integration-test && \ + docker build . -t kfp-frontend-integration-test:local && \ + docker run --net=host kfp-frontend-integration-test:local --remote-run true + +.PHONY: test-e2e-basic-sample-tests +test-e2e-basic-sample-tests: + ./.github/resources/scripts/forward-port.sh "kubeflow" "ml-pipeline" 8888 8888 && \ + pip3 install -r ./test/sample-test/requirements.txt && \ + python3 ./test/sample-test/sample_test_launcher.py sample_test run_test --namespace kubeflow --test-name sequential --results-gcs-dir output && \ + python3 ./test/sample-test/sample_test_launcher.py sample_test run_test --namespace kubeflow --test-name exit_handler --expected-result failed --results-gcs-dir output + +.PHONY: test-frontend +test-frontend: + npm cache clean --force && \ + cd ./frontend && npm ci && \ + npm run test:ci + +.PHONY: test-grpc-modules +test-grpc-modules: + $(MAKE) setup-python && \ + pytest ./test/gcpc-tests/run_all_gcpc_modules.py + +.PHONY: test-kfp-kubernetes-execution-tests +test-kfp-kubernetes-execution-tests: + $(MAKE) setup-python && \ + ./.github/resources/scripts/forward-port.sh "kubeflow" "ml-pipeline" 8888 8888 && \ + export KFP_ENDPOINT="http://localhost:8888" && \ + export TIMEOUT_SECONDS=2700 && \ + pytest ./test/kfp-kubernetes-execution-tests/sdk_execution_tests.py --asyncio-task-timeout $$TIMEOUT_SECONDS + +.PHONY: test-kfp-kubernetes-library-test +test-kfp-kubernetes-library-test: + ./test/presubmit-test-kfp-kubernetes-library.sh + +.PHONY: test-kfp-samples +test-kfp-samples: + $(MAKE) setup-python && \ + ./.github/resources/scripts/forward-port.sh "kubeflow" "ml-pipeline" 8888 8888 && \ + ./backend/src/v2/test/sample-test.sh + +.PHONY: test-kfp-sdk-runtime-tests +test-kfp-sdk-runtime-tests: + $(MAKE) setup-python && \ + ./test/presubmit-test-kfp-runtime-code.sh + +.PHONY: test-kfp-sdk-tests +test-kfp-sdk-tests: + ./test/presubmit-tests-sdk.sh + +.PHONY: test-kubeflow-pipelines-manifests +test-kubeflow-pipelines-manifests: + ./manifests/kustomize/hack/presubmit.sh + +.PHONY: test-periodic-test +test-periodic-test: + $(MAKE) setup-python && \ + nohup kubectl port-forward --namespace kubeflow svc/ml-pipeline 8888:8888 > kubectl-port-forward.log 2>&1 & \ + log_dir=$$(mktemp -d) && \ + ./test/kfp-functional-test/kfp-functional-test.sh > $$log_dir/periodic_tests.txt + +.PHONY: test-presubmit-backend +test-presubmit-backend: + ./test/presubmit-backend-test.sh + +.PHONY: test-sdk-component-yaml +test-sdk-component-yaml: + $(MAKE) setup-python && \ + ./test/presubmit-component-yaml.sh + +.PHONY: test-sdk-docformatter +test-sdk-docformatter: + $(MAKE) setup-python && \ + ./test/presubmit-docformatter-sdk.sh + +.PHONY: test-sdk-execution +test-sdk-execution: + $(MAKE) setup-python && \ + ./.github/resources/scripts/forward-port.sh "kubeflow" "ml-pipeline" 8888 8888 && \ + export KFP_ENDPOINT="http://localhost:8888" && \ + export TIMEOUT_SECONDS=2700 && \ + pytest ./test/sdk-execution-tests/sdk_execution_tests.py --asyncio-task-timeout $$TIMEOUT_SECONDS + +.PHONY: test-sdk-isort +test-sdk-isort: + $(MAKE) setup-python && \ + ./test/presubmit-isort-sdk.sh + +.PHONY: test-sdk-upgrade +test-sdk-upgrade: + $(MAKE) setup-python && \ + ./test/presubmit-test-sdk-upgrade.sh + +.PHONY: test-sdk-yapf +test-sdk-yapf: + $(MAKE) setup-python && \ + ./test/presubmit-yapf-sdk.sh \ No newline at end of file diff --git a/Makefile.setup.mk b/Makefile.setup.mk new file mode 100644 index 000000000000..df208bdc6b3c --- /dev/null +++ b/Makefile.setup.mk @@ -0,0 +1,170 @@ +SHELL := /bin/bash + +.PHONY: create-kind-cluster +create-kind-cluster: + kind create cluster --name kfp --image kindest/node:v1.29.2 --wait 5m && \ + kubectl version --client --short + +.PHONY: build-images +build-images: + ./.github/resources/scripts/build-images.sh + +.PHONY: deploy-kfp-tekton +deploy-kfp-tekton: + ./.github/resources/scripts/deploy-kfp-tekton.sh + +.PHONY: setup-kfp-tekton +setup-kfp-tekton: + $(MAKE) build-images && \ + $(MAKE) deploy-kfp-tekton + +.PHONY: deploy-kfp +deploy-kfp: + ./.github/resources/scripts/deploy-kfp.sh + +.PHONY: setup-kfp +setup-kfp: + $(MAKE) build-images && \ + $(MAKE) deploy-kfp + +.PHONY: setup-python +setup-python: + python3 -m venv .venv && \ + source .venv/bin/activate + +.PHONY: setup-backend-test +setup-backend-test: + python3 -m venv .venv && \ + source .venv/bin/activate && \ + pip install -e sdk/python + +.PHONY: setup-backend-visualization-test +setup-backend-visualization-test: + $(MAKE) setup-python + +.PHONY: setup-frontend-test +setup-frontend-test: + npm cache clean --force && \ + cd ./frontend && npm ci + +.PHONY: setup-grpc-modules-test +setup-grpc-modules-test: + $(MAKE) setup-python && \ + sudo apt-get update && \ + sudo apt-get install protobuf-compiler -y && \ + pip3 install setuptools && \ + pip3 freeze && \ + pip3 install wheel==0.42.0 && \ + pip install sdk/python && \ + cd ./api && \ + make clean python && \ + cd .. && \ + python3 -m pip install api/v2alpha1/python && \ + pip install components/google-cloud && \ + pip install $(shell grep 'pytest==' sdk/python/requirements-dev.txt) && \ + pytest ./test/gcpc-tests/run_all_gcpc_modules.py + +.PHONY: setup-kfp-kubernetes-execution-tests +setup-kfp-kubernetes-execution-tests: + $(MAKE) setup-kfp && \ + $(MAKE) setup-python && \ + sudo apt-get update && \ + sudo apt-get install protobuf-compiler -y && \ + pip3 install setuptools && \ + pip3 freeze && \ + pip3 install wheel==0.42.0 && \ + pip3 install protobuf==4.25.3 && \ + cd ./api && \ + make clean python && \ + cd .. && \ + python3 -m pip install api/v2alpha1/python && \ + cd ./kubernetes_platform && \ + make clean python && \ + cd .. && \ + pip install -e ./kubernetes_platform/python[dev] && \ + pip install -r ./test/kfp-kubernetes-execution-tests/requirements.txt + +.PHONY: setup-kfp-kubernetes-execution-tests-without-kfp +setup-kfp-kubernetes-execution-tests-without-kfp: + $(MAKE) setup-python && \ + sudo apt-get update && \ + sudo apt-get install protobuf-compiler -y && \ + pip3 install setuptools && \ + pip3 freeze && \ + pip3 install wheel==0.42.0 && \ + pip3 install protobuf==4.25.3 && \ + cd ./api && \ + make clean python && \ + cd .. && \ + python3 -m pip install api/v2alpha1/python && \ + cd ./kubernetes_platform && \ + make clean python && \ + cd .. && \ + pip install -e ./kubernetes_platform/python[dev] && \ + pip install -r ./test/kfp-kubernetes-execution-tests/requirements.txt + +.PHONY: setup-kfp-samples +setup-kfp-samples: + $(MAKE) setup-python && \ + $(MAKE) setup-kfp + +.PHONY: setup-kfp-sdk-runtime-tests +setup-kfp-sdk-runtime-tests: + $(MAKE) setup-python + +.PHONY: setup-kfp-sdk-tests +setup-kfp-sdk-tests: + $(MAKE) setup-python + +.PHONY: setup-periodic-test +setup-periodic-test: + $(MAKE) setup-kfp && \ + $(MAKE) setup-python + +.PHONY: setup-sdk-component-yaml +setup-sdk-component-yaml: + $(MAKE) setup-python && \ + sudo apt-get update && \ + sudo apt-get install protobuf-compiler -y && \ + pip3 install setuptools && \ + pip3 freeze && \ + pip3 install wheel==0.42.0 && \ + pip3 install protobuf==4.25.3 && \ + cd ./api && \ + make clean python && \ + cd .. && \ + python3 -m pip install api/v2alpha1/python && \ + pip install -r ./test/sdk-execution-tests/requirements.txt + +.PHONY: setup-sdk-docformatter +setup-sdk-docformatter: + $(MAKE) setup-python + +.PHONY: setup-sdk-execution +setup-sdk-execution: + $(MAKE) setup-python && \ + $(MAKE) setup-kfp && \ + sudo apt-get update && \ + sudo apt-get install protobuf-compiler -y && \ + pip3 install setuptools && \ + pip3 freeze && \ + pip3 install wheel==0.42.0 && \ + pip3 install protobuf==4.25.3 && \ + cd ./api && \ + make clean python && \ + cd .. && \ + python3 -m pip install api/v2alpha1/python && \ + pip install -r ./test/sdk-execution-tests/requirements.txt + +.PHONY: setup-sdk-isort +setup-sdk-isort: + $(MAKE) setup-python + +.PHONY: setup-sdk-upgrade +setup-sdk-upgrade: + $(MAKE) setup-python + +.PHONY: setup-sdk-yapf +setup-sdk-yapf: + $(MAKE) setup-python && \ + pip install yapf \ No newline at end of file diff --git a/OWNERS b/OWNERS index daa492a35118..37cb96dbeeaf 100644 --- a/OWNERS +++ b/OWNERS @@ -6,5 +6,4 @@ approvers: reviewers: - chensun - HumairAK - - ouadakarim - zijianjoy diff --git a/README.md b/README.md index 99bfadb9b81b..a49effe414f1 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,5 @@ +# Kubeflow Pipelines + [![Coverage Status](https://coveralls.io/repos/github/kubeflow/pipelines/badge.svg?branch=master)](https://coveralls.io/github/kubeflow/pipelines?branch=master) [![SDK Documentation Status](https://readthedocs.org/projects/kubeflow-pipelines/badge/?version=latest)](https://kubeflow-pipelines.readthedocs.io/en/stable/?badge=latest) [![SDK Package version](https://img.shields.io/pypi/v/kfp?color=%2334D058&label=pypi%20package)](https://pypi.org/project/kfp) @@ -19,8 +21,7 @@ The Kubeflow pipelines service has the following goals: * Kubeflow Pipelines can be installed as part of the [Kubeflow Platform](https://www.kubeflow.org/docs/started/installing-kubeflow/#kubeflow-platform). Alternatively you can deploy [Kubeflow Pipelines](https://www.kubeflow.org/docs/components/pipelines/operator-guides/installation/) as a standalone service. - -* The Docker container runtime has been deprecated on Kubernetes 1.20+. Kubeflow Pipelines has switched to use [Emissary Executor](https://www.kubeflow.org/docs/components/pipelines/legacy-v1/installation/choose-executor/#emissary-executor) by default from Kubeflow Pipelines 1.8. Emissary executor is Container runtime agnostic, meaning you are able to run Kubeflow Pipelines on Kubernetes cluster with any [Container runtimes](https://kubernetes.io/docs/setup/production-environment/container-runtimes/). +* The Docker container runtime has been deprecated on Kubernetes 1.20+. Kubeflow Pipelines has switched to use [Emissary Executor](https://www.kubeflow.org/docs/components/pipelines/legacy-v1/installation/choose-executor/#emissary-executor) by default from Kubeflow Pipelines 1.8. Emissary executor is Container runtime agnostic, meaning you are able to run Kubeflow Pipelines on Kubernetes cluster with any [Container runtimes](https://kubernetes.io/docs/setup/production-environment/container-runtimes/). ## Documentation @@ -36,17 +37,25 @@ Consult the [Python SDK reference docs](https://kubeflow-pipelines.readthedocs.i Before you start contributing to Kubeflow Pipelines, read the guidelines in [How to Contribute](./CONTRIBUTING.md). To learn how to build and deploy Kubeflow Pipelines from source code, read the [developer guide](./developer_guide.md). +## Kubeflow Pipelines Community + +### Community Meeting + +The Kubeflow Pipelines Community Meeting occurs every other Wed 10-11AM (PST). -## Kubeflow Pipelines Community Meeting +[Calendar Invite](https://calendar.google.com/event?action=TEMPLATE&tmeid=NTdoNG5uMDBtcnJlYmdlOWt1c2lkY25jdmlfMjAxOTExMTNUMTgwMDAwWiBqZXNzaWV6aHVAZ29vZ2xlLmNvbQ&tmsrc=jessiezhu%40google.com&scp=ALL) -The meeting is happening every other Wed 10-11AM (PST) -[Calendar Invite](https://calendar.google.com/event?action=TEMPLATE&tmeid=NTdoNG5uMDBtcnJlYmdlOWt1c2lkY25jdmlfMjAxOTExMTNUMTgwMDAwWiBqZXNzaWV6aHVAZ29vZ2xlLmNvbQ&tmsrc=jessiezhu%40google.com&scp=ALL) or [Join Meeting Directly](https://meet.google.com/phd-ixfj-kcr/) +[Direct Meeting Link](https://zoom.us/j/92607298595?pwd%3DVlKLUbiguGkbT9oKbaoDmCxrhbRop7.1&sa=D&source=calendar&ust=1736264977415448&usg=AOvVaw1EIkjFsKy0d4yQPptIJS3x) [Meeting notes](http://bit.ly/kfp-meeting-notes) -## Kubeflow Pipelines Slack Channel +### Slack -[#kubeflow-pipelines](https://kubeflow.slack.com) +We also have a slack channel (#kubeflow-pipelines) on the Cloud Native Computing Foundation Slack workspace. You can find more details at [https://www.kubeflow.org/docs/about/community/#kubeflow-slack-channels](https://www.kubeflow.org/docs/about/community/#kubeflow-slack-channels) + +## Architecture + +Details about the KFP Architecture can be found at [Architecture.md](docs/Architecture.md) ## Blog posts @@ -56,6 +65,7 @@ The meeting is happening every other Wed 10-11AM (PST) * [Part 2: How to deploy Jupyter notebooks as components of a Kubeflow ML pipeline](https://towardsdatascience.com/how-to-deploy-jupyter-notebooks-as-components-of-a-kubeflow-ml-pipeline-part-2-b1df77f4e5b3) * [Part 3: How to carry out CI/CD in Machine Learning (“MLOps”) using Kubeflow ML pipelines](https://medium.com/google-cloud/how-to-carry-out-ci-cd-in-machine-learning-mlops-using-kubeflow-ml-pipelines-part-3-bdaf68082112) * [Tekton optimizations for Kubeflow Pipelines 2.0](https://developer.ibm.com/blogs/awb-tekton-optimizations-for-kubeflow-pipelines-2-0) (By Tommy Li) + ## Acknowledgments Kubeflow pipelines uses [Argo Workflows](https://github.com/argoproj/argo-workflows) by default under the hood to orchestrate Kubernetes resources. The Argo community has been very supportive and we are very grateful. Additionally there is Tekton backend available as well. To access it, please refer to [Kubeflow Pipelines with Tekton repository](https://github.com/kubeflow/kfp-tekton). diff --git a/VERSION b/VERSION index cc6612c36e05..9183195ace75 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2.3.0 \ No newline at end of file +2.4.0 \ No newline at end of file diff --git a/adrs/KFP-ADR-0001-use-architecture-decision-records-for-kfp.md b/adrs/KFP-ADR-0001-use-architecture-decision-records-for-kfp.md deleted file mode 100644 index 9a23cdd5e510..000000000000 --- a/adrs/KFP-ADR-0001-use-architecture-decision-records-for-kfp.md +++ /dev/null @@ -1,96 +0,0 @@ -# Use Architecture Decision Records for Kubeflow Pipelines - -| | | -|----------------|--------------------------| -| Date | 2024-04-24 | -| Scope | Kubeflow Pipelines | -| Status | Accepted | -| Authors | [Humair Khan](@HumairAK) | -| Supersedes | N/A | -| Superseded by: | N/A | -| Issues | | -| Other docs: | none | - -# Kubeflow Pipelines Architecture Decision Records - -"Documenting architectural decisions helps a project succeed by helping current and future contributors understand the reasons for doing things a certain way." [1] - -## What is an ADR? - -An architecture decision record is a short text file in a Markdown format. Each record describes a set of forces and a single decision in response to those forces. [2] - -An ADR is not a technical design, a team-level internal procedure, or a roadmap. An ADR does not replace detailed technical design documents or good commit messages. - -## Why - -Using an Architecture Decision Record (ADR) offers many benefits, particularly in managing the complexity and longevity of software projects. - -Some examples include: - -1. ADRs capture the why behind critical architectural choices, not just the what. - * This helps current and future team members understand the reasoning behind decisions, particularly when the rationale is no longer obvious. -2. Improve Communication and Collaboration. - * They serve as a single source of truth for architectural decisions. - * By documenting options and their trade-offs, ADRs encourage structured decision-making and transparency. -3. Enable Traceability - * ADRs create a decision history that allows teams to trace architectural choices back to their original context, assumptions, and goals - -See references below for more exhaustive lists on how ADRs can be a net benefit, especially to an open source project, -where transparency in decision making is key. - -## Goals - -* Capture the Why Behind Decisions -* Foster Clear Communication -* Enable Decision Traceability -* Encourage Thoughtful, Deliberate Decisions -* Preserve Institutional Knowledge - -## Non-Goals - -* Not a substitute for technical or user documentation -* Not a substitute or replacement for meaningful commit messages - -## How - -We will keep each ADR in a short text file in Markdown format. - -We will keep ADRs in this repository, https://github.com/kubeflow/pipelines, under the `./adrs` folder. - -ADRs will be numbered sequentially and monotonically. Numbers will not be reused. - -If a decision is reversed, we will keep the old one around, but mark it as superseded. (It's still relevant to know that it was the decision, but is no longer the decision.) - -We will use a format with just a few parts, so each document is easy to digest. - -## Alternatives - -**Current Approach** - -One alternative is to not do ADRs, and stick to the current approach of doing google docs or similar and presenting it in KFP calls. -The pros for this approach is that it's relatively low overhead and simple. Communicating changes/editing google docs is also immensely easier than on a markdown PR. - -The cons are plentiful however: -* No way to preserve these docs effectively -* Does not live near the codebase -* Difficult to enforce immutability -* No way to formalize an "approval" process (i.e. something akin to a PR "merge") -* Doc owners are not maintainers, and access can be revoked at any time -* Hard to keep track off google documents - -## Reviews - -| Reviewed by | Date | Notes | -|-------------|------|-------| - -## References - -* https://cognitect.com/blog/2011/11/15/documenting-architecture-decisions -* https://adr.github.io/ -* https://docs.aws.amazon.com/prescriptive-guidance/latest/architectural-decision-records/adr-process.html -* https://github.com/joelparkerhenderson/architecture-decision-record?tab=readme-ov-file#what-is-an-architecture-decision-record - -## Citations - -* [1] Heiko W. Rupp, https://www.redhat.com/architect/architecture-decision-records -* [2] Michael Nygard, https://cognitect.com/blog/2011/11/15/documenting-architecture-decisions diff --git a/adrs/OWNERS b/adrs/OWNERS deleted file mode 100644 index 38327cadb34b..000000000000 --- a/adrs/OWNERS +++ /dev/null @@ -1,4 +0,0 @@ -approvers: - - chensun - - HumairAK - - zijianjoy diff --git a/adrs/README.md b/adrs/README.md deleted file mode 100644 index 5bcf7e9d6eac..000000000000 --- a/adrs/README.md +++ /dev/null @@ -1,16 +0,0 @@ -# Kubeflow Pipelines Architecture Decision Records (ADR) - -This folder contains all the Architecture Decision Records for Kubeflow Pipelines. Read more about ADRs [here][1]. - -When adding a new ADR please follow the following instructions: - -1. Use the `template.md` as the basis of your document -2. The format should be in markdown -3. The file name should follow the format -4. (Optional) Bring this up in the KFP community call to bring attention to your proposal - -It is fine to start with something like a Google Document while you are iterating and asking for feedback, but the -document should eventually be surfaced as a markdown ADR in the form of a pull request to this repository so it can -persist alongside the codebase. - -[1]: https://github.com/joelparkerhenderson/architecture-decision-record?tab=readme-ov-file#what-is-an-architecture-decision-record \ No newline at end of file diff --git a/adrs/template.md b/adrs/template.md deleted file mode 100644 index 37658a16dc24..000000000000 --- a/adrs/template.md +++ /dev/null @@ -1,69 +0,0 @@ -# Kubeflow - Architecture Decision Record template - - - - - -| | | -|----------------|--------------------------| -| Date | insert data | -| Scope | | -| Status | Approved | -| Authors | [name](@github-username) | -| Supersedes | N/A | -| Superseded by: | N/A | -| Issues | | -| Other docs: | none | - -## What - -A couple sentences describing what this ADR is about. - -## Why - -A couple sentences describing why we need an ADR for this. - -## Goals - -* Bulleted list of goals - -## Non-Goals - -* Bulleted list of non-goals - -## How - -A couple sentences describing the high level approach that this ADR captures. - -## Open Questions - -Optional section, hopefully removed before transitioning from Draft/Proposed to Accepted. - -## Alternatives - -Carefully describe the alternatives considered, and specifically document what the tradeoffs of each approach are. - -## Security and Privacy Considerations - -Optional section. Talk about any security and privacy concerns here. - -## Risks - -Optional section. Talk about any risks here. - -## Stakeholder Impacts - -| Group | Key Contacts | Date | Impacted? | -|--------------------|------------------|------|-----------| -| group or team name | key contact name | date | ? | - - -## References - -* optional bulleted list - -## Reviews - -| Reviewed by | Date | Notes | -|-------------|------|-------| -| name | date | ? | diff --git a/api/Makefile b/api/Makefile index 461250b52740..7f9bf1b465c0 100644 --- a/api/Makefile +++ b/api/Makefile @@ -12,8 +12,8 @@ # See the License for the specific language governing permissions and # limitations under the License. -# Contact one of Bobgy, capri-xiyue or zijianjoy if this remote image needs an update. -PREBUILT_REMOTE_IMAGE=gcr.io/ml-pipeline-test/api-generator:latest +# Contact one of chensun, HumairAK, zijianjoy if this remote image needs an update. +PREBUILT_REMOTE_IMAGE=ghcr.io/kubeflow/kfp-api-generator:1.0 .PHONY: all all: golang python diff --git a/api/v2alpha1/go/pipelinespec/pipeline_spec.pb.go b/api/v2alpha1/go/pipelinespec/pipeline_spec.pb.go index b4bca0cec5ff..8a6b64ab5d87 100644 --- a/api/v2alpha1/go/pipelinespec/pipeline_spec.pb.go +++ b/api/v2alpha1/go/pipelinespec/pipeline_spec.pb.go @@ -2525,6 +2525,11 @@ type PipelineConfig struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields + + // Name of the semaphore key to control pipeline concurrency + SemaphoreKey string `protobuf:"bytes,1,opt,name=semaphore_key,json=semaphoreKey,proto3" json:"semaphore_key,omitempty"` + // Name of the mutex to ensure mutual exclusion + MutexName string `protobuf:"bytes,2,opt,name=mutex_name,json=mutexName,proto3" json:"mutex_name,omitempty"` } func (x *PipelineConfig) Reset() { @@ -2559,6 +2564,20 @@ func (*PipelineConfig) Descriptor() ([]byte, []int) { return file_pipeline_spec_proto_rawDescGZIP(), []int{30} } +func (x *PipelineConfig) GetSemaphoreKey() string { + if x != nil { + return x.SemaphoreKey + } + return "" +} + +func (x *PipelineConfig) GetMutexName() string { + if x != nil { + return x.MutexName + } + return "" +} + // The runtime config of a PipelineJob. type PipelineJob_RuntimeConfig struct { state protoimpl.MessageState @@ -6523,12 +6542,17 @@ var file_pipeline_spec_proto_rawDesc = []byte{ 0x6b, 0x65, 0x79, 0x12, 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x10, 0x0a, 0x0e, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, - 0x6e, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x42, 0x3c, 0x5a, 0x3a, 0x67, 0x69, 0x74, 0x68, - 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6b, 0x75, 0x62, 0x65, 0x66, 0x6c, 0x6f, 0x77, 0x2f, - 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x32, - 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x67, 0x6f, 0x2f, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, - 0x6e, 0x65, 0x73, 0x70, 0x65, 0x63, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x54, 0x0a, 0x0e, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, + 0x6e, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x23, 0x0a, 0x0d, 0x73, 0x65, 0x6d, 0x61, + 0x70, 0x68, 0x6f, 0x72, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0c, 0x73, 0x65, 0x6d, 0x61, 0x70, 0x68, 0x6f, 0x72, 0x65, 0x4b, 0x65, 0x79, 0x12, 0x1d, 0x0a, + 0x0a, 0x6d, 0x75, 0x74, 0x65, 0x78, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x09, 0x6d, 0x75, 0x74, 0x65, 0x78, 0x4e, 0x61, 0x6d, 0x65, 0x42, 0x3c, 0x5a, 0x3a, + 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6b, 0x75, 0x62, 0x65, 0x66, + 0x6c, 0x6f, 0x77, 0x2f, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x2f, 0x61, 0x70, + 0x69, 0x2f, 0x76, 0x32, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x67, 0x6f, 0x2f, 0x70, 0x69, + 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x70, 0x65, 0x63, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x33, } var ( diff --git a/api/v2alpha1/pipeline_spec.proto b/api/v2alpha1/pipeline_spec.proto index 5393b2e222bf..f85c6b5e8984 100644 --- a/api/v2alpha1/pipeline_spec.proto +++ b/api/v2alpha1/pipeline_spec.proto @@ -1106,5 +1106,9 @@ message PlatformDeploymentConfig { // Spec for pipeline-level config options. See PipelineConfig DSL class. message PipelineConfig { - // TODO add pipeline-level configs + // Name of the semaphore key to control pipeline concurrency + string semaphore_key = 1; + + // Name of the mutex to ensure mutual exclusion + string mutex_name = 2; } diff --git a/backend/Dockerfile b/backend/Dockerfile index 22d917aa24d6..082f910305fe 100644 --- a/backend/Dockerfile +++ b/backend/Dockerfile @@ -54,9 +54,9 @@ COPY backend/src/apiserver/config/sample_config.json /samples/ # Compiling the preloaded samples. # The default image is replaced with the GCR-hosted python image. RUN set -e; \ - < /samples/sample_config.json jq .[].file --raw-output | while read pipeline_yaml; do \ + < /samples/sample_config.json jq ".pipelines[].file" --raw-output | while read pipeline_yaml; do \ pipeline_py="${pipeline_yaml%.yaml}"; \ - python3 "$pipeline_py"; \ + echo "Compiling: \"$pipeline_py\"" && python3 "$pipeline_py" && echo -n "Output: " && ls "$pipeline_py.yaml"; \ done # 3. Start api web server diff --git a/backend/OWNERS b/backend/OWNERS index a314491c1c42..8758337696ea 100644 --- a/backend/OWNERS +++ b/backend/OWNERS @@ -1,8 +1,11 @@ approvers: - chensun - rimolive + - hbelmiro reviewers: - chensun - hbelmiro - HumairAK - rimolive + - mprahl + - gmfrasca diff --git a/backend/README.md b/backend/README.md index 86cd4e896fc4..2b22485025ba 100644 --- a/backend/README.md +++ b/backend/README.md @@ -1,6 +1,20 @@ +# Kubeflow Pipelines Backend + +## Overview + This directory contains code for the components that comprise the Kubeflow Pipelines backend. +This README will help you set up your coding environment in order to build and run the Kubeflow Pipelines backend. The KFP backend powers the core functionality of the KFP platform, handling API requests, workflow management, and data persistence. + +## Prerequisites +Before you begin, ensure you have: +- Go programming language installed +- [go-licenses tool](../hack/install-go-licenses.sh) +- Docker or Podman installed (for building container images) + +Note that you may need to restart your shell after installing these resources in order for the changes to take effect. + ## Building & Testing To run all unittests for backend: @@ -15,64 +29,46 @@ The API server itself can be built using: go build -o /tmp/apiserver backend/src/apiserver/*.go ``` -## Code Style - -Backend codebase follows the [Google's Go Style Guide](https://google.github.io/styleguide/go/). Please, take time to get familiar with the [best practices](https://google.github.io/styleguide/go/best-practices). It is not intended to be exhaustive, but it often helps minimizing guesswork among developers and keep codebase uniform and consistent. - -We use [golangci-lint](https://golangci-lint.run/) tool that can catch common mistakes locally (see detailed configuration [here](https://github.com/kubeflow/pipelines/blob/master/.golangci.yaml)). It can be [conveniently integrated](https://golangci-lint.run/usage/integrations/) with multiple popular IDEs such as VS Code or Vim. - -Finally, it is advised to install [pre-commit](https://pre-commit.com/) in order to automate linter checks (see configuration [here](https://github.com/kubeflow/pipelines/blob/master/.pre-commit-config.yaml)) - -## Building APIServer image locally - The API server image can be built from the root folder of the repo using: ``` export API_SERVER_IMAGE=api_server docker build -f backend/Dockerfile . --tag $API_SERVER_IMAGE ``` -## Deploy APIServer with the image you own build +### Deploying the APIServer (from the image you built) on Kubernetes -Run +First, push your image to a registry that is accessible from your Kubernetes cluster. + +Then, run: ``` kubectl edit deployment.v1.apps/ml-pipeline -n kubeflow ``` -You'll see the field reference the api server docker image. +You'll see the field reference the api server container image (`spec.containers[0].image: gcr.io/ml-pipeline/api-server:`). Change it to point to your own build, after saving and closing the file, apiserver will restart with your change. -## Building client library and swagger files +### Building client library and swagger files After making changes to proto files, the Go client libraries, Python client libraries and swagger files need to be regenerated and checked-in. Refer to [backend/api](./api/README.md) for details. -## Updating licenses info - -1. [Install go-licenses tool](../hack/install-go-licenses.sh) and refer to [its documentation](https://github.com/google/go-licenses) for how to use it. +### Updating licenses info +1. [Install go-licenses tool](../hack/install-go-licenses.sh) (if you haven't already) and refer to [its documentation](https://github.com/google/go-licenses) for how to use it. 2. Run the tool to update all licenses: ```bash - make all + make -C backend all ``` -## Updating python dependencies +### Updating python dependencies [pip-tools](https://github.com/jazzband/pip-tools) is used to manage python dependencies. To update dependencies, edit [requirements.in](requirements.in) and run `./update_requirements.sh` to update and pin the transitive dependencies. -# Visualization Server Instructions -## Updating python dependencies - -[pip-tools](https://github.com/jazzband/pip-tools) is used to manage python -dependencies. To update dependencies, edit [requirements.in](requirements.in) -and run `./update_requirements.sh` to update and pin the transitive -dependencies. - - -## Building conformance tests (WIP) +### Building conformance tests (WIP) Run ``` @@ -81,7 +77,7 @@ docker build . -f backend/Dockerfile.conformance -t ## API Server Development -### Run Locally With a Kind Cluster +### Run the KFP Backend Locally With a Kind Cluster This deploys a local Kubernetes cluster leveraging [kind](https://kind.sigs.k8s.io/), with all the components required to run the Kubeflow Pipelines API server. Note that the `ml-pipeline` `Deployment` (API server) has its replicas set to @@ -99,6 +95,7 @@ pods on the cluster using the `ml-pipeline` `Service`. network interface through Docker/Podman Desktop. See [kind #1200](https://github.com/kubernetes-sigs/kind/issues/1200#issuecomment-1304855791) for an example manifest. * Optional: VSCode is installed to leverage a sample `launch.json` file. + * This relies on dlv: (go install -v github.com/go-delve/delve/cmd/dlv@latest) #### Provisioning the Cluster @@ -111,15 +108,9 @@ make -C backend dev-kind-cluster This may take several minutes since there are many pods. Note that many pods will be in "CrashLoopBackOff" status until all the pods have started. -#### Deleting the Cluster +Also, note that the config in the `make` command above sets the `ml-pipeline` `Deployment` (api server) to have 0 replicas. The intent is to replace it with a locally running API server for debugging and faster development. See the following steps to run the API server locally, and connect it to the KFP backend on your Kind cluster. Note that other backend components (for example, the persistence agent) may show errors until the API server is brought up and connected to the cluster. -Run the following to delete the cluster: - -```bash -kind delete clusters dev-pipelines-api -``` - -#### Launch the API Server With VSCode +#### Launching the API Server With VSCode After the cluster is provisioned, you may leverage the following sample `.vscode/launch.json` file to run the API server locally: @@ -168,12 +159,45 @@ You can also directly connect to the MariaDB database server with: mysql -h 127.0.0.1 -u root ``` -## Remote Debug the Driver +### Scheduled Workflow Development + +If you also want to run the Scheduled Workflow controller locally, stop the controller on the cluster with: + +```bash +kubectl -n kubeflow scale deployment ml-pipeline-scheduledworkflow --replicas=0 +``` + +Then you may leverage the following sample `.vscode/launch.json` file to run the Scheduled Workflow controller locally: + +```json +{ + "version": "0.2.0", + "configurations": [ + { + "name": "Launch Scheduled Workflow controller (Kind)", + "type": "go", + "request": "launch", + "mode": "debug", + "program": "${workspaceFolder}/backend/src/crd/controller/scheduledworkflow", + "env": { + "CRON_SCHEDULE_TIMEZONE": "UTC" + }, + "args": [ + "-namespace=kubeflow", + "-kubeconfig=${workspaceFolder}/kubeconfig_dev-pipelines-api", + "-mlPipelineAPIServerName=localhost" + ] + } + ] +} +``` + +### Remote Debug the Driver These instructions assume you are leveraging the Kind cluster in the [Run Locally With a Kind Cluster](#run-locally-with-a-kind-cluster) section. -### Build the Driver Image With Debug Prerequisites +#### Build the Driver Image With Debug Prerequisites Run the following to create the `backend/Dockerfile.driver-debug` file and build the container image tagged as `kfp-driver:debug`. This container image is based on `backend/Dockerfile.driver` but installs @@ -197,7 +221,7 @@ Alternatively, you can use this Make target that does both. make -C kind-build-and-load-driver-debug ``` -### Run the API Server With Debug Configuration +#### Run the API Server With Debug Configuration You may use the following VS Code `launch.json` file to run the API server which overrides the Driver command to use Delve and the Driver image to use debug image built previously. @@ -229,7 +253,7 @@ command to use Delve and the Driver image to use debug image built previously. } ``` -### Starting a Remote Debug Session +#### Starting a Remote Debug Session Start by launching a pipeline. This will eventually create a Driver pod that is waiting for a remote debug connection. @@ -273,3 +297,22 @@ For debugging a specific Driver pod, you'll need to continuously port forward an without a breakpoint so that Delve will continue execution until the Driver pod you are interested in starts up. At that point, you can set a break point, port forward, and connect to the remote debug session to debug that specific Driver pod. + +### Deleting the Kind Cluster + +Run the following to delete the cluster (once you are finished): + +```bash +kind delete clusters dev-pipelines-api +``` + +## Contributing +### Code Style + +Backend codebase follows the [Google's Go Style Guide](https://google.github.io/styleguide/go/). Please, take time to get familiar with the [best practices](https://google.github.io/styleguide/go/best-practices). It is not intended to be exhaustive, but it often helps minimizing guesswork among developers and keep codebase uniform and consistent. + +We use [golangci-lint](https://golangci-lint.run/) tool that can catch common mistakes locally (see detailed configuration [here](https://github.com/kubeflow/pipelines/blob/master/.golangci.yaml)). It can be [conveniently integrated](https://golangci-lint.run/usage/integrations/) with multiple popular IDEs such as VS Code or Vim. + +Finally, it is advised to install [pre-commit](https://pre-commit.com/) in order to automate linter checks (see configuration [here](https://github.com/kubeflow/pipelines/blob/master/.pre-commit-config.yaml)) + + diff --git a/backend/api/Dockerfile b/backend/api/Dockerfile index d9ff7ffdaeb0..54bb9a5d9bbe 100644 --- a/backend/api/Dockerfile +++ b/backend/api/Dockerfile @@ -13,7 +13,7 @@ # limitations under the License. # Generate client code (go & json) from API protocol buffers -FROM golang:1.22 as generator +FROM golang:1.23 as generator ENV GRPC_GATEWAY_VERSION v1.9.6 ENV GO_SWAGGER_VERSION v0.18.0 ENV GOLANG_PROTOBUF_VERSION v1.5.1 diff --git a/backend/api/Makefile b/backend/api/Makefile index cdb574249514..9ebc9679ff0e 100644 --- a/backend/api/Makefile +++ b/backend/api/Makefile @@ -16,10 +16,12 @@ IMAGE_TAG=kfp-api-generator # Contact chensun or zijianjoy if this remote image needs an update. -REMOTE_IMAGE=gcr.io/ml-pipeline-test/api-generator -# Image generated by https://github.com/kubeflow/pipelines/pull/10580 +REMOTE_IMAGE=ghcr.io/kubeflow/kfp-api-generator +# Assume the latest API version by default. +API_VERSION ?= v2beta1 + # Keep in sync with the version used in test/release/Dockerfile.release -PREBUILT_REMOTE_IMAGE=gcr.io/ml-pipeline-test/api-generator@sha256:41fd3e60ba40430a4c3d87e03be817c5f63b2dfed23059ec9d6bca62ce0cc39c +PREBUILT_REMOTE_IMAGE=ghcr.io/kubeflow/kfp-api-generator:1.0 CONTAINER_ENGINE ?= docker diff --git a/backend/api/README.md b/backend/api/README.md index ee89763218d2..a5ffb040d4d8 100644 --- a/backend/api/README.md +++ b/backend/api/README.md @@ -12,7 +12,7 @@ Tools needed: Set the environment variable `API_VERSION` to the version that you want to generate. We use `v1beta1` as example here. ```bash -export API_VERSION="v1beta1" +export API_VERSION="v2beta1" ``` ## Compiling `.proto` files to Go client and swagger definitions @@ -81,7 +81,9 @@ API definitions in this folder are used to generate [`v1beta1`](https://www.kube API generator image is defined in [Dockerfile](`./Dockerfile`). If you need to update the container, follow these steps: -1. Update the [Dockerfile](`./Dockerfile`) and build the image by running `docker build -t gcr.io/ml-pipeline-test/api-generator:latest .` -1. Push the new container by running `docker push gcr.io/ml-pipeline-test/api-generator:latest` (requires to be [authenticated](https://cloud.google.com/container-registry/docs/advanced-authentication)). +1. Login to GHCR container registry: `echo "" | docker login ghcr.io -u --password-stdin` + * Replace `` with a GitHub Personal Access Token (PAT) with the write:packages and `read:packages` scopes, as well as `delete:packages` if needed. +1. Update the [Dockerfile](`./Dockerfile`) and build the image by running `docker build -t ghcr.io/kubeflow/kfp-api-generator:$VERSION .` +1. Push the new container by running `docker push ghcr.io/kubeflow/kfp-api-generator:$VERSION` (requires to be [authenticated](https://cloud.google.com/container-registry/docs/advanced-authentication)). 1. Update the `PREBUILT_REMOTE_IMAGE` variable in the [Makefile](./Makefile) to point to your new image. -1. Similarly, push a new version of the release tools image to `gcr.io/ml-pipeline-test/release:latest` and run `make push` in [test/release/Makefile](../../test/release/Makefile). +1. Similarly, push a new version of the release tools image to `ghcr.io/kubeflow/kfp-release:$VERSION` and run `make push` in [test/release/Makefile](../../test/release/Makefile). diff --git a/backend/api/v1beta1/job.proto b/backend/api/v1beta1/job.proto index a08a36b22eba..c76b64e91436 100644 --- a/backend/api/v1beta1/job.proto +++ b/backend/api/v1beta1/job.proto @@ -210,9 +210,9 @@ message Job { // Optional input field. Describing the purpose of the job string description = 3; - // Required input field. + // Optional input field. // Describing what the pipeline manifest and parameters to use - // for the scheduled job. + // for the scheduled job. If unset, fetch the pipline_spec at runtime. PipelineSpec pipeline_spec = 4; // Optional input field. Specify which resource this job belongs to. diff --git a/backend/api/v1beta1/python_http_client/README.md b/backend/api/v1beta1/python_http_client/README.md index 86dec1e3d30a..cbf4178476e9 100644 --- a/backend/api/v1beta1/python_http_client/README.md +++ b/backend/api/v1beta1/python_http_client/README.md @@ -3,8 +3,8 @@ This file contains REST API specification for Kubeflow Pipelines. The file is au This Python package is automatically generated by the [OpenAPI Generator](https://openapi-generator.tech) project: -- API version: 2.3.0 -- Package version: 2.3.0 +- API version: 2.4.0 +- Package version: 2.4.0 - Build package: org.openapitools.codegen.languages.PythonClientCodegen For more information, please visit [https://www.google.com](https://www.google.com) diff --git a/backend/api/v1beta1/python_http_client/kfp_server_api/__init__.py b/backend/api/v1beta1/python_http_client/kfp_server_api/__init__.py index c9a01b93c748..2c5f997205a0 100644 --- a/backend/api/v1beta1/python_http_client/kfp_server_api/__init__.py +++ b/backend/api/v1beta1/python_http_client/kfp_server_api/__init__.py @@ -14,7 +14,7 @@ from __future__ import absolute_import -__version__ = "2.3.0" +__version__ = "2.4.0" # import apis into sdk package from kfp_server_api.api.experiment_service_api import ExperimentServiceApi diff --git a/backend/api/v1beta1/python_http_client/kfp_server_api/api_client.py b/backend/api/v1beta1/python_http_client/kfp_server_api/api_client.py index 1284a6c534b2..769e3151bc5b 100644 --- a/backend/api/v1beta1/python_http_client/kfp_server_api/api_client.py +++ b/backend/api/v1beta1/python_http_client/kfp_server_api/api_client.py @@ -78,7 +78,7 @@ def __init__(self, configuration=None, header_name=None, header_value=None, self.default_headers[header_name] = header_value self.cookie = cookie # Set default User-Agent. - self.user_agent = 'OpenAPI-Generator/2.3.0/python' + self.user_agent = 'OpenAPI-Generator/2.4.0/python' self.client_side_validation = configuration.client_side_validation def __enter__(self): diff --git a/backend/api/v1beta1/python_http_client/kfp_server_api/configuration.py b/backend/api/v1beta1/python_http_client/kfp_server_api/configuration.py index 769ee06dd82b..bac549b75b74 100644 --- a/backend/api/v1beta1/python_http_client/kfp_server_api/configuration.py +++ b/backend/api/v1beta1/python_http_client/kfp_server_api/configuration.py @@ -351,8 +351,8 @@ def to_debug_report(self): return "Python SDK Debug Report:\n"\ "OS: {env}\n"\ "Python Version: {pyversion}\n"\ - "Version of the API: 2.3.0\n"\ - "SDK Package Version: 2.3.0".\ + "Version of the API: 2.4.0\n"\ + "SDK Package Version: 2.4.0".\ format(env=sys.platform, pyversion=sys.version) def get_host_settings(self): diff --git a/backend/api/v1beta1/python_http_client/setup.py b/backend/api/v1beta1/python_http_client/setup.py index eafaadeeabd1..961d7b7ab9fe 100644 --- a/backend/api/v1beta1/python_http_client/setup.py +++ b/backend/api/v1beta1/python_http_client/setup.py @@ -13,7 +13,7 @@ from setuptools import setup, find_packages # noqa: H301 NAME = "kfp-server-api" -VERSION = "2.3.0" +VERSION = "2.4.0" # To install the library, run the following # # python setup.py install diff --git a/backend/api/v1beta1/swagger/kfp_api_single_file.swagger.json b/backend/api/v1beta1/swagger/kfp_api_single_file.swagger.json index c74ed43f1b06..02ff00c2b3e7 100644 --- a/backend/api/v1beta1/swagger/kfp_api_single_file.swagger.json +++ b/backend/api/v1beta1/swagger/kfp_api_single_file.swagger.json @@ -2,7 +2,7 @@ "swagger": "2.0", "info": { "title": "Kubeflow Pipelines API", - "version": "2.3.0", + "version": "2.4.0", "description": "This file contains REST API specification for Kubeflow Pipelines. The file is autogenerated from the swagger definition.", "contact": { "name": "google", diff --git a/backend/api/v2beta1/go_client/experiment.pb.go b/backend/api/v2beta1/go_client/experiment.pb.go index 5b4e0a34e577..346cf9b9806e 100644 --- a/backend/api/v2beta1/go_client/experiment.pb.go +++ b/backend/api/v2beta1/go_client/experiment.pb.go @@ -112,7 +112,7 @@ type Experiment struct { Namespace string `protobuf:"bytes,5,opt,name=namespace,proto3" json:"namespace,omitempty"` // Output. Specifies whether this experiment is in archived or available state. StorageState Experiment_StorageState `protobuf:"varint,6,opt,name=storage_state,json=storageState,proto3,enum=kubeflow.pipelines.backend.api.v2beta1.Experiment_StorageState" json:"storage_state,omitempty"` - // Output. The time the created time of the last run in this experiment. + // Output. The creation time of the last run in this experiment. LastRunCreatedAt *timestamppb.Timestamp `protobuf:"bytes,7,opt,name=last_run_created_at,json=lastRunCreatedAt,proto3" json:"last_run_created_at,omitempty"` } @@ -606,153 +606,156 @@ var file_backend_api_v2beta1_experiment_proto_rawDesc = []byte{ 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73, - 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xcc, 0x03, 0x0a, 0x0a, 0x45, - 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x65, 0x78, 0x70, - 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0c, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x21, - 0x0a, 0x0c, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x4e, 0x61, 0x6d, - 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, - 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, - 0x61, 0x6d, 0x70, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x1c, - 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x64, 0x0a, 0x0d, - 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x0e, 0x32, 0x3f, 0x2e, 0x6b, 0x75, 0x62, 0x65, 0x66, 0x6c, 0x6f, 0x77, 0x2e, 0x70, - 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x45, 0x78, 0x70, - 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x53, - 0x74, 0x61, 0x74, 0x65, 0x52, 0x0c, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x53, 0x74, 0x61, - 0x74, 0x65, 0x12, 0x49, 0x0a, 0x13, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x72, 0x75, 0x6e, 0x5f, 0x63, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x10, 0x6c, 0x61, 0x73, - 0x74, 0x52, 0x75, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x22, 0x4a, 0x0a, - 0x0c, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1d, 0x0a, - 0x19, 0x53, 0x54, 0x4f, 0x52, 0x41, 0x47, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x55, - 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, - 0x41, 0x56, 0x41, 0x49, 0x4c, 0x41, 0x42, 0x4c, 0x45, 0x10, 0x01, 0x12, 0x0c, 0x0a, 0x08, 0x41, - 0x52, 0x43, 0x48, 0x49, 0x56, 0x45, 0x44, 0x10, 0x02, 0x22, 0x6d, 0x0a, 0x17, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x52, 0x0a, 0x0a, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, - 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x6b, 0x75, 0x62, 0x65, 0x66, - 0x6c, 0x6f, 0x77, 0x2e, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x2e, 0x62, 0x61, - 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x62, 0x65, 0x74, 0x61, - 0x31, 0x2e, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x0a, 0x65, 0x78, - 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x3b, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x45, - 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x23, 0x0a, 0x0d, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x69, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, - 0x65, 0x6e, 0x74, 0x49, 0x64, 0x22, 0xa3, 0x01, 0x0a, 0x16, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x78, - 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, - 0x1b, 0x0a, 0x09, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x17, 0x0a, 0x07, - 0x73, 0x6f, 0x72, 0x74, 0x5f, 0x62, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, - 0x6f, 0x72, 0x74, 0x42, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x1c, 0x0a, - 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x22, 0xb6, 0x01, 0x0a, 0x17, - 0x4c, 0x69, 0x73, 0x74, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x54, 0x0a, 0x0b, 0x65, 0x78, 0x70, 0x65, 0x72, - 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x6b, - 0x75, 0x62, 0x65, 0x66, 0x6c, 0x6f, 0x77, 0x2e, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, - 0x73, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, - 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, - 0x52, 0x0b, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x1d, 0x0a, - 0x0a, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x05, 0x52, 0x09, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x26, 0x0a, 0x0f, - 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x65, 0x78, 0x74, 0x50, 0x61, 0x67, 0x65, 0x54, - 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x3e, 0x0a, 0x17, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x45, 0x78, - 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x23, 0x0a, 0x0d, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, - 0x6e, 0x74, 0x49, 0x64, 0x22, 0x3f, 0x0a, 0x18, 0x41, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x45, - 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x23, 0x0a, 0x0d, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x69, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, - 0x65, 0x6e, 0x74, 0x49, 0x64, 0x22, 0x41, 0x0a, 0x1a, 0x55, 0x6e, 0x61, 0x72, 0x63, 0x68, 0x69, - 0x76, 0x65, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, - 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x65, 0x78, 0x70, 0x65, - 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x32, 0xb8, 0x08, 0x0a, 0x11, 0x45, 0x78, 0x70, - 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0xb6, - 0x01, 0x0a, 0x10, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, - 0x65, 0x6e, 0x74, 0x12, 0x3f, 0x2e, 0x6b, 0x75, 0x62, 0x65, 0x66, 0x6c, 0x6f, 0x77, 0x2e, 0x70, - 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x32, 0x2e, 0x6b, 0x75, 0x62, 0x65, 0x66, 0x6c, 0x6f, 0x77, 0x2e, - 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, - 0x64, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x45, 0x78, - 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x2d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x27, - 0x22, 0x19, 0x2f, 0x61, 0x70, 0x69, 0x73, 0x2f, 0x76, 0x32, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2f, - 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x3a, 0x0a, 0x65, 0x78, 0x70, - 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0xb4, 0x01, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x45, - 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x3c, 0x2e, 0x6b, 0x75, 0x62, 0x65, - 0x66, 0x6c, 0x6f, 0x77, 0x2e, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x2e, 0x62, - 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x62, 0x65, 0x74, - 0x61, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x32, 0x2e, 0x6b, 0x75, 0x62, 0x65, 0x66, 0x6c, + 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x2c, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x63, 0x2d, 0x67, 0x65, 0x6e, 0x2d, 0x73, 0x77, 0x61, 0x67, 0x67, 0x65, 0x72, 0x2f, 0x6f, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xcc, 0x03, 0x0a, 0x0a, 0x45, 0x78, 0x70, + 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x65, 0x78, 0x70, 0x65, 0x72, + 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, + 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x21, 0x0a, 0x0c, + 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, + 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, + 0x70, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x1c, 0x0a, 0x09, + 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x64, 0x0a, 0x0d, 0x73, 0x74, + 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x0e, 0x32, 0x3f, 0x2e, 0x6b, 0x75, 0x62, 0x65, 0x66, 0x6c, 0x6f, 0x77, 0x2e, 0x70, 0x69, 0x70, + 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x32, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x45, 0x78, 0x70, 0x65, 0x72, + 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x53, 0x74, 0x61, + 0x74, 0x65, 0x52, 0x0c, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, + 0x12, 0x49, 0x0a, 0x13, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x72, 0x75, 0x6e, 0x5f, 0x63, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x10, 0x6c, 0x61, 0x73, 0x74, 0x52, + 0x75, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x22, 0x4a, 0x0a, 0x0c, 0x53, + 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1d, 0x0a, 0x19, 0x53, + 0x54, 0x4f, 0x52, 0x41, 0x47, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x55, 0x4e, 0x53, + 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x41, 0x56, + 0x41, 0x49, 0x4c, 0x41, 0x42, 0x4c, 0x45, 0x10, 0x01, 0x12, 0x0c, 0x0a, 0x08, 0x41, 0x52, 0x43, + 0x48, 0x49, 0x56, 0x45, 0x44, 0x10, 0x02, 0x22, 0x6d, 0x0a, 0x17, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x52, 0x0a, 0x0a, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x6b, 0x75, 0x62, 0x65, 0x66, 0x6c, 0x6f, + 0x77, 0x2e, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x2e, 0x62, 0x61, 0x63, 0x6b, + 0x65, 0x6e, 0x64, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, + 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x0a, 0x65, 0x78, 0x70, 0x65, + 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x3b, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x45, 0x78, 0x70, + 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x23, + 0x0a, 0x0d, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, + 0x74, 0x49, 0x64, 0x22, 0xa3, 0x01, 0x0a, 0x16, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x78, 0x70, 0x65, + 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, + 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x09, 0x70, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x1b, 0x0a, + 0x09, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x17, 0x0a, 0x07, 0x73, 0x6f, + 0x72, 0x74, 0x5f, 0x62, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x6f, 0x72, + 0x74, 0x42, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x1c, 0x0a, 0x09, 0x6e, + 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, + 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x22, 0xb6, 0x01, 0x0a, 0x17, 0x4c, 0x69, + 0x73, 0x74, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x54, 0x0a, 0x0b, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x6b, 0x75, 0x62, + 0x65, 0x66, 0x6c, 0x6f, 0x77, 0x2e, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x2e, + 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x62, 0x65, + 0x74, 0x61, 0x31, 0x2e, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x0b, + 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x74, + 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x09, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x65, + 0x78, 0x74, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x65, 0x78, 0x74, 0x50, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, + 0x65, 0x6e, 0x22, 0x3e, 0x0a, 0x17, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x45, 0x78, 0x70, 0x65, + 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x23, 0x0a, + 0x0d, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, + 0x49, 0x64, 0x22, 0x3f, 0x0a, 0x18, 0x41, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x45, 0x78, 0x70, + 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x23, + 0x0a, 0x0d, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, + 0x74, 0x49, 0x64, 0x22, 0x41, 0x0a, 0x1a, 0x55, 0x6e, 0x61, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, + 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x5f, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, + 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x32, 0xb8, 0x08, 0x0a, 0x11, 0x45, 0x78, 0x70, 0x65, 0x72, + 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0xb6, 0x01, 0x0a, + 0x10, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, + 0x74, 0x12, 0x3f, 0x2e, 0x6b, 0x75, 0x62, 0x65, 0x66, 0x6c, 0x6f, 0x77, 0x2e, 0x70, 0x69, 0x70, + 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x32, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x32, 0x2e, 0x6b, 0x75, 0x62, 0x65, 0x66, 0x6c, 0x6f, 0x77, 0x2e, 0x70, 0x69, + 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x45, 0x78, 0x70, 0x65, + 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x2d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x27, 0x3a, 0x0a, + 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x19, 0x2f, 0x61, 0x70, 0x69, + 0x73, 0x2f, 0x76, 0x32, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2f, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, + 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0xb4, 0x01, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x45, 0x78, 0x70, + 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x3c, 0x2e, 0x6b, 0x75, 0x62, 0x65, 0x66, 0x6c, 0x6f, 0x77, 0x2e, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x62, 0x65, 0x74, 0x61, 0x31, - 0x2e, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x31, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x2b, 0x12, 0x29, 0x2f, 0x61, 0x70, 0x69, 0x73, 0x2f, 0x76, 0x32, 0x62, 0x65, 0x74, - 0x61, 0x31, 0x2f, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x7b, - 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x7d, 0x12, 0xb5, - 0x01, 0x0a, 0x0f, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, - 0x74, 0x73, 0x12, 0x3e, 0x2e, 0x6b, 0x75, 0x62, 0x65, 0x66, 0x6c, 0x6f, 0x77, 0x2e, 0x70, 0x69, - 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, - 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x3f, 0x2e, 0x6b, 0x75, 0x62, 0x65, 0x66, 0x6c, 0x6f, 0x77, 0x2e, 0x70, 0x69, - 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, - 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x21, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1b, 0x12, 0x19, 0x2f, 0x61, 0x70, - 0x69, 0x73, 0x2f, 0x76, 0x32, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2f, 0x65, 0x78, 0x70, 0x65, 0x72, - 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0xa8, 0x01, 0x0a, 0x11, 0x41, 0x72, 0x63, 0x68, 0x69, - 0x76, 0x65, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x40, 0x2e, 0x6b, - 0x75, 0x62, 0x65, 0x66, 0x6c, 0x6f, 0x77, 0x2e, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, - 0x73, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, - 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x41, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x45, 0x78, 0x70, - 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x39, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x33, 0x22, 0x31, - 0x2f, 0x61, 0x70, 0x69, 0x73, 0x2f, 0x76, 0x32, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2f, 0x65, 0x78, - 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x7b, 0x65, 0x78, 0x70, 0x65, 0x72, - 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x7d, 0x3a, 0x61, 0x72, 0x63, 0x68, 0x69, 0x76, - 0x65, 0x12, 0xae, 0x01, 0x0a, 0x13, 0x55, 0x6e, 0x61, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x45, - 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x42, 0x2e, 0x6b, 0x75, 0x62, 0x65, - 0x66, 0x6c, 0x6f, 0x77, 0x2e, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x2e, 0x62, - 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x62, 0x65, 0x74, - 0x61, 0x31, 0x2e, 0x55, 0x6e, 0x61, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x45, 0x78, 0x70, 0x65, - 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x3b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x35, 0x22, 0x33, 0x2f, - 0x61, 0x70, 0x69, 0x73, 0x2f, 0x76, 0x32, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2f, 0x65, 0x78, 0x70, - 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x7b, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, - 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x7d, 0x3a, 0x75, 0x6e, 0x61, 0x72, 0x63, 0x68, 0x69, - 0x76, 0x65, 0x12, 0x9e, 0x01, 0x0a, 0x10, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x45, 0x78, 0x70, - 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x3f, 0x2e, 0x6b, 0x75, 0x62, 0x65, 0x66, 0x6c, + 0x2e, 0x47, 0x65, 0x74, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x32, 0x2e, 0x6b, 0x75, 0x62, 0x65, 0x66, 0x6c, 0x6f, 0x77, + 0x2e, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x65, + 0x6e, 0x64, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x45, + 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x31, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x2b, 0x12, 0x29, 0x2f, 0x61, 0x70, 0x69, 0x73, 0x2f, 0x76, 0x32, 0x62, 0x65, 0x74, 0x61, 0x31, + 0x2f, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x7b, 0x65, 0x78, + 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x7d, 0x12, 0xb5, 0x01, 0x0a, + 0x0f, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x73, + 0x12, 0x3e, 0x2e, 0x6b, 0x75, 0x62, 0x65, 0x66, 0x6c, 0x6f, 0x77, 0x2e, 0x70, 0x69, 0x70, 0x65, + 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x32, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x78, + 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x3f, 0x2e, 0x6b, 0x75, 0x62, 0x65, 0x66, 0x6c, 0x6f, 0x77, 0x2e, 0x70, 0x69, 0x70, 0x65, + 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x32, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x78, + 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x21, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1b, 0x12, 0x19, 0x2f, 0x61, 0x70, 0x69, 0x73, + 0x2f, 0x76, 0x32, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2f, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x12, 0xa8, 0x01, 0x0a, 0x11, 0x41, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, + 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x40, 0x2e, 0x6b, 0x75, 0x62, + 0x65, 0x66, 0x6c, 0x6f, 0x77, 0x2e, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x2e, + 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x62, 0x65, + 0x74, 0x61, 0x31, 0x2e, 0x41, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x45, 0x78, 0x70, 0x65, 0x72, + 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, + 0x6d, 0x70, 0x74, 0x79, 0x22, 0x39, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x33, 0x22, 0x31, 0x2f, 0x61, + 0x70, 0x69, 0x73, 0x2f, 0x76, 0x32, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2f, 0x65, 0x78, 0x70, 0x65, + 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x7b, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, + 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x7d, 0x3a, 0x61, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x12, + 0xae, 0x01, 0x0a, 0x13, 0x55, 0x6e, 0x61, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x45, 0x78, 0x70, + 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x42, 0x2e, 0x6b, 0x75, 0x62, 0x65, 0x66, 0x6c, 0x6f, 0x77, 0x2e, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x62, 0x65, 0x74, 0x61, 0x31, - 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, - 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, - 0x22, 0x31, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2b, 0x2a, 0x29, 0x2f, 0x61, 0x70, 0x69, 0x73, 0x2f, - 0x76, 0x32, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2f, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, - 0x6e, 0x74, 0x73, 0x2f, 0x7b, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x5f, - 0x69, 0x64, 0x7d, 0x42, 0x3d, 0x5a, 0x3b, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, - 0x6d, 0x2f, 0x6b, 0x75, 0x62, 0x65, 0x66, 0x6c, 0x6f, 0x77, 0x2f, 0x70, 0x69, 0x70, 0x65, 0x6c, - 0x69, 0x6e, 0x65, 0x73, 0x2f, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x2f, 0x61, 0x70, 0x69, - 0x2f, 0x76, 0x32, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2f, 0x67, 0x6f, 0x5f, 0x63, 0x6c, 0x69, 0x65, - 0x6e, 0x74, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x2e, 0x55, 0x6e, 0x61, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, + 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, + 0x70, 0x74, 0x79, 0x22, 0x3b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x35, 0x22, 0x33, 0x2f, 0x61, 0x70, + 0x69, 0x73, 0x2f, 0x76, 0x32, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2f, 0x65, 0x78, 0x70, 0x65, 0x72, + 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x7b, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, + 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x7d, 0x3a, 0x75, 0x6e, 0x61, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, + 0x12, 0x9e, 0x01, 0x0a, 0x10, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x45, 0x78, 0x70, 0x65, 0x72, + 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x3f, 0x2e, 0x6b, 0x75, 0x62, 0x65, 0x66, 0x6c, 0x6f, 0x77, + 0x2e, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x65, + 0x6e, 0x64, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x44, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x31, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2b, 0x2a, 0x29, 0x2f, 0x61, 0x70, 0x69, 0x73, 0x2f, 0x76, 0x32, + 0x62, 0x65, 0x74, 0x61, 0x31, 0x2f, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x2f, 0x7b, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, + 0x7d, 0x42, 0x44, 0x92, 0x41, 0x04, 0x2a, 0x02, 0x01, 0x02, 0x5a, 0x3b, 0x67, 0x69, 0x74, 0x68, + 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6b, 0x75, 0x62, 0x65, 0x66, 0x6c, 0x6f, 0x77, 0x2f, + 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x2f, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, + 0x64, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x32, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2f, 0x67, 0x6f, + 0x5f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/backend/api/v2beta1/go_client/recurring_run.pb.go b/backend/api/v2beta1/go_client/recurring_run.pb.go index 29c1fef7dae3..fcc42ce00050 100644 --- a/backend/api/v2beta1/go_client/recurring_run.pb.go +++ b/backend/api/v2beta1/go_client/recurring_run.pb.go @@ -159,7 +159,7 @@ type RecurringRun struct { // Optional input field. Describes the purpose of the recurring run. Description string `protobuf:"bytes,3,opt,name=description,proto3" json:"description,omitempty"` // Required input field. Specifies the source of the pipeline spec for this - // recurring run. Can be either a pipeline version id, or a pipeline spec. + // recurring run. Can be either a pipeline id, pipeline version id, or a pipeline spec. // // Types that are assignable to PipelineSource: // diff --git a/backend/api/v2beta1/go_client/run.pb.go b/backend/api/v2beta1/go_client/run.pb.go index 4713fee5ec9f..ac0d74d088b6 100644 --- a/backend/api/v2beta1/go_client/run.pb.go +++ b/backend/api/v2beta1/go_client/run.pb.go @@ -411,7 +411,7 @@ type Run_PipelineSpec struct { } type Run_PipelineVersionReference struct { - // Reference to a pipeline version containing pipeline_id and pipeline_version_id. + // Reference to a pipeline containing pipeline_id and optionally the pipeline_version_id. PipelineVersionReference *PipelineVersionReference `protobuf:"bytes,18,opt,name=pipeline_version_reference,json=pipelineVersionReference,proto3,oneof"` } @@ -429,7 +429,7 @@ type PipelineVersionReference struct { // Input. Required. Unique ID of the parent pipeline. PipelineId string `protobuf:"bytes,1,opt,name=pipeline_id,json=pipelineId,proto3" json:"pipeline_id,omitempty"` - // Input. Required. Unique ID of an existing pipeline version. + // Input. Optional. Unique ID of an existing pipeline version. If unset, the latest pipeline version is used. PipelineVersionId string `protobuf:"bytes,2,opt,name=pipeline_version_id,json=pipelineVersionId,proto3" json:"pipeline_version_id,omitempty"` } diff --git a/backend/api/v2beta1/go_http_client/experiment_model/v2beta1_experiment.go b/backend/api/v2beta1/go_http_client/experiment_model/v2beta1_experiment.go index e87c02f8e6e5..8b809c17fa19 100644 --- a/backend/api/v2beta1/go_http_client/experiment_model/v2beta1_experiment.go +++ b/backend/api/v2beta1/go_http_client/experiment_model/v2beta1_experiment.go @@ -30,7 +30,7 @@ type V2beta1Experiment struct { // Output. Unique experiment ID. Generated by API server. ExperimentID string `json:"experiment_id,omitempty"` - // Output. The time the created time of the last run in this experiment. + // Output. The creation time of the last run in this experiment. // Format: date-time LastRunCreatedAt strfmt.DateTime `json:"last_run_created_at,omitempty"` diff --git a/backend/api/v2beta1/go_http_client/recurring_run_model/v2beta1_pipeline_version_reference.go b/backend/api/v2beta1/go_http_client/recurring_run_model/v2beta1_pipeline_version_reference.go index 6c4adb9d62eb..615a11c457e0 100644 --- a/backend/api/v2beta1/go_http_client/recurring_run_model/v2beta1_pipeline_version_reference.go +++ b/backend/api/v2beta1/go_http_client/recurring_run_model/v2beta1_pipeline_version_reference.go @@ -18,7 +18,7 @@ type V2beta1PipelineVersionReference struct { // Input. Required. Unique ID of the parent pipeline. PipelineID string `json:"pipeline_id,omitempty"` - // Input. Required. Unique ID of an existing pipeline version. + // Input. Optional. Unique ID of an existing pipeline version. If unset, the latest pipeline version is used. PipelineVersionID string `json:"pipeline_version_id,omitempty"` } diff --git a/backend/api/v2beta1/go_http_client/run_model/v2beta1_pipeline_version_reference.go b/backend/api/v2beta1/go_http_client/run_model/v2beta1_pipeline_version_reference.go index e817451c66ca..48f17f819267 100644 --- a/backend/api/v2beta1/go_http_client/run_model/v2beta1_pipeline_version_reference.go +++ b/backend/api/v2beta1/go_http_client/run_model/v2beta1_pipeline_version_reference.go @@ -18,7 +18,7 @@ type V2beta1PipelineVersionReference struct { // Input. Required. Unique ID of the parent pipeline. PipelineID string `json:"pipeline_id,omitempty"` - // Input. Required. Unique ID of an existing pipeline version. + // Input. Optional. Unique ID of an existing pipeline version. If unset, the latest pipeline version is used. PipelineVersionID string `json:"pipeline_version_id,omitempty"` } diff --git a/backend/api/v2beta1/go_http_client/run_model/v2beta1_run.go b/backend/api/v2beta1/go_http_client/run_model/v2beta1_run.go index c7a012c57c6b..d232fdd05ca0 100644 --- a/backend/api/v2beta1/go_http_client/run_model/v2beta1_run.go +++ b/backend/api/v2beta1/go_http_client/run_model/v2beta1_run.go @@ -49,7 +49,7 @@ type V2beta1Run struct { // This field is Deprecated. The pipeline version id is under pipeline_version_reference for v2. PipelineVersionID string `json:"pipeline_version_id,omitempty"` - // Reference to a pipeline version containing pipeline_id and pipeline_version_id. + // Reference to a pipeline containing pipeline_id and optionally the pipeline_version_id. PipelineVersionReference *V2beta1PipelineVersionReference `json:"pipeline_version_reference,omitempty"` // ID of the recurring run that triggered this run. diff --git a/backend/api/v2beta1/python_http_client/README.md b/backend/api/v2beta1/python_http_client/README.md index 5ad394725526..9ce0492a0ab2 100644 --- a/backend/api/v2beta1/python_http_client/README.md +++ b/backend/api/v2beta1/python_http_client/README.md @@ -3,8 +3,8 @@ This file contains REST API specification for Kubeflow Pipelines. The file is au This Python package is automatically generated by the [OpenAPI Generator](https://openapi-generator.tech) project: -- API version: 2.3.0 -- Package version: 2.3.0 +- API version: 2.4.0 +- Package version: 2.4.0 - Build package: org.openapitools.codegen.languages.PythonClientCodegen For more information, please visit [https://www.google.com](https://www.google.com) diff --git a/backend/api/v2beta1/python_http_client/docs/V2beta1Experiment.md b/backend/api/v2beta1/python_http_client/docs/V2beta1Experiment.md index 6db29f6e900c..7711a85b6fd4 100644 --- a/backend/api/v2beta1/python_http_client/docs/V2beta1Experiment.md +++ b/backend/api/v2beta1/python_http_client/docs/V2beta1Experiment.md @@ -9,6 +9,7 @@ Name | Type | Description | Notes **created_at** | **datetime** | Output. The time that the experiment was created. | [optional] **namespace** | **str** | Optional input field. Specify the namespace this experiment belongs to. | [optional] **storage_state** | [**V2beta1ExperimentStorageState**](V2beta1ExperimentStorageState.md) | | [optional] +**last_run_created_at** | **datetime** | Output. The creation time of the last run in this experiment. | [optional] [[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) diff --git a/backend/api/v2beta1/python_http_client/kfp_server_api/__init__.py b/backend/api/v2beta1/python_http_client/kfp_server_api/__init__.py index 5c3979e90f70..3eb19ad154c2 100644 --- a/backend/api/v2beta1/python_http_client/kfp_server_api/__init__.py +++ b/backend/api/v2beta1/python_http_client/kfp_server_api/__init__.py @@ -14,7 +14,7 @@ from __future__ import absolute_import -__version__ = "2.3.0" +__version__ = "2.4.0" # import apis into sdk package from kfp_server_api.api.auth_service_api import AuthServiceApi diff --git a/backend/api/v2beta1/python_http_client/kfp_server_api/api_client.py b/backend/api/v2beta1/python_http_client/kfp_server_api/api_client.py index 1284a6c534b2..769e3151bc5b 100644 --- a/backend/api/v2beta1/python_http_client/kfp_server_api/api_client.py +++ b/backend/api/v2beta1/python_http_client/kfp_server_api/api_client.py @@ -78,7 +78,7 @@ def __init__(self, configuration=None, header_name=None, header_value=None, self.default_headers[header_name] = header_value self.cookie = cookie # Set default User-Agent. - self.user_agent = 'OpenAPI-Generator/2.3.0/python' + self.user_agent = 'OpenAPI-Generator/2.4.0/python' self.client_side_validation = configuration.client_side_validation def __enter__(self): diff --git a/backend/api/v2beta1/python_http_client/kfp_server_api/configuration.py b/backend/api/v2beta1/python_http_client/kfp_server_api/configuration.py index 769ee06dd82b..bac549b75b74 100644 --- a/backend/api/v2beta1/python_http_client/kfp_server_api/configuration.py +++ b/backend/api/v2beta1/python_http_client/kfp_server_api/configuration.py @@ -351,8 +351,8 @@ def to_debug_report(self): return "Python SDK Debug Report:\n"\ "OS: {env}\n"\ "Python Version: {pyversion}\n"\ - "Version of the API: 2.3.0\n"\ - "SDK Package Version: 2.3.0".\ + "Version of the API: 2.4.0\n"\ + "SDK Package Version: 2.4.0".\ format(env=sys.platform, pyversion=sys.version) def get_host_settings(self): diff --git a/backend/api/v2beta1/python_http_client/kfp_server_api/models/v2beta1_experiment.py b/backend/api/v2beta1/python_http_client/kfp_server_api/models/v2beta1_experiment.py index 50247e1052cf..a0a62d988633 100644 --- a/backend/api/v2beta1/python_http_client/kfp_server_api/models/v2beta1_experiment.py +++ b/backend/api/v2beta1/python_http_client/kfp_server_api/models/v2beta1_experiment.py @@ -38,7 +38,8 @@ class V2beta1Experiment(object): 'description': 'str', 'created_at': 'datetime', 'namespace': 'str', - 'storage_state': 'V2beta1ExperimentStorageState' + 'storage_state': 'V2beta1ExperimentStorageState', + 'last_run_created_at': 'datetime' } attribute_map = { @@ -47,10 +48,11 @@ class V2beta1Experiment(object): 'description': 'description', 'created_at': 'created_at', 'namespace': 'namespace', - 'storage_state': 'storage_state' + 'storage_state': 'storage_state', + 'last_run_created_at': 'last_run_created_at' } - def __init__(self, experiment_id=None, display_name=None, description=None, created_at=None, namespace=None, storage_state=None, local_vars_configuration=None): # noqa: E501 + def __init__(self, experiment_id=None, display_name=None, description=None, created_at=None, namespace=None, storage_state=None, last_run_created_at=None, local_vars_configuration=None): # noqa: E501 """V2beta1Experiment - a model defined in OpenAPI""" # noqa: E501 if local_vars_configuration is None: local_vars_configuration = Configuration() @@ -62,6 +64,7 @@ def __init__(self, experiment_id=None, display_name=None, description=None, crea self._created_at = None self._namespace = None self._storage_state = None + self._last_run_created_at = None self.discriminator = None if experiment_id is not None: @@ -76,6 +79,8 @@ def __init__(self, experiment_id=None, display_name=None, description=None, crea self.namespace = namespace if storage_state is not None: self.storage_state = storage_state + if last_run_created_at is not None: + self.last_run_created_at = last_run_created_at @property def experiment_id(self): @@ -213,6 +218,29 @@ def storage_state(self, storage_state): self._storage_state = storage_state + @property + def last_run_created_at(self): + """Gets the last_run_created_at of this V2beta1Experiment. # noqa: E501 + + Output. The creation time of the last run in this experiment. # noqa: E501 + + :return: The last_run_created_at of this V2beta1Experiment. # noqa: E501 + :rtype: datetime + """ + return self._last_run_created_at + + @last_run_created_at.setter + def last_run_created_at(self, last_run_created_at): + """Sets the last_run_created_at of this V2beta1Experiment. + + Output. The creation time of the last run in this experiment. # noqa: E501 + + :param last_run_created_at: The last_run_created_at of this V2beta1Experiment. # noqa: E501 + :type last_run_created_at: datetime + """ + + self._last_run_created_at = last_run_created_at + def to_dict(self): """Returns the model properties as a dict""" result = {} diff --git a/backend/api/v2beta1/python_http_client/setup.py b/backend/api/v2beta1/python_http_client/setup.py index eafaadeeabd1..961d7b7ab9fe 100644 --- a/backend/api/v2beta1/python_http_client/setup.py +++ b/backend/api/v2beta1/python_http_client/setup.py @@ -13,7 +13,7 @@ from setuptools import setup, find_packages # noqa: H301 NAME = "kfp-server-api" -VERSION = "2.3.0" +VERSION = "2.4.0" # To install the library, run the following # # python setup.py install diff --git a/backend/api/v2beta1/python_http_client/test/test_v2beta1_experiment.py b/backend/api/v2beta1/python_http_client/test/test_v2beta1_experiment.py index c9501af386b6..0552584ca16f 100644 --- a/backend/api/v2beta1/python_http_client/test/test_v2beta1_experiment.py +++ b/backend/api/v2beta1/python_http_client/test/test_v2beta1_experiment.py @@ -41,7 +41,8 @@ def make_instance(self, include_optional): description = '0', created_at = datetime.datetime.strptime('2013-10-20 19:20:30.00', '%Y-%m-%d %H:%M:%S.%f'), namespace = '0', - storage_state = 'STORAGE_STATE_UNSPECIFIED' + storage_state = 'STORAGE_STATE_UNSPECIFIED', + last_run_created_at = datetime.datetime.strptime('2013-10-20 19:20:30.00', '%Y-%m-%d %H:%M:%S.%f') ) else : return V2beta1Experiment( diff --git a/backend/api/v2beta1/python_http_client/test/test_v2beta1_list_experiments_response.py b/backend/api/v2beta1/python_http_client/test/test_v2beta1_list_experiments_response.py index 6f24b275fb12..b67c7c0f2b2c 100644 --- a/backend/api/v2beta1/python_http_client/test/test_v2beta1_list_experiments_response.py +++ b/backend/api/v2beta1/python_http_client/test/test_v2beta1_list_experiments_response.py @@ -43,7 +43,8 @@ def make_instance(self, include_optional): description = '0', created_at = datetime.datetime.strptime('2013-10-20 19:20:30.00', '%Y-%m-%d %H:%M:%S.%f'), namespace = '0', - storage_state = 'STORAGE_STATE_UNSPECIFIED', ) + storage_state = 'STORAGE_STATE_UNSPECIFIED', + last_run_created_at = datetime.datetime.strptime('2013-10-20 19:20:30.00', '%Y-%m-%d %H:%M:%S.%f'), ) ], total_size = 56, next_page_token = '0' diff --git a/backend/api/v2beta1/recurring_run.proto b/backend/api/v2beta1/recurring_run.proto index 09cec8e200f5..66b810901a22 100644 --- a/backend/api/v2beta1/recurring_run.proto +++ b/backend/api/v2beta1/recurring_run.proto @@ -89,7 +89,7 @@ message RecurringRun { string description = 3; // Required input field. Specifies the source of the pipeline spec for this - // recurring run. Can be either a pipeline version id, or a pipeline spec. + // recurring run. Can be either a pipeline id, pipeline version id, or a pipeline spec. oneof pipeline_source { // This field is Deprecated. The pipeline version id is under pipeline_version_reference for v2. string pipeline_version_id = 4 [deprecated=true]; diff --git a/backend/api/v2beta1/run.proto b/backend/api/v2beta1/run.proto index 040abb4a280d..5c48ab19317a 100644 --- a/backend/api/v2beta1/run.proto +++ b/backend/api/v2beta1/run.proto @@ -168,7 +168,7 @@ message Run { // Pipeline spec. google.protobuf.Struct pipeline_spec = 7; - // Reference to a pipeline version containing pipeline_id and pipeline_version_id. + // Reference to a pipeline containing pipeline_id and optionally the pipeline_version_id. PipelineVersionReference pipeline_version_reference = 18; } @@ -213,7 +213,7 @@ message PipelineVersionReference { // Input. Required. Unique ID of the parent pipeline. string pipeline_id = 1; - // Input. Required. Unique ID of an existing pipeline version. + // Input. Optional. Unique ID of an existing pipeline version. If unset, the latest pipeline version is used. string pipeline_version_id = 2; } diff --git a/backend/api/v2beta1/swagger/experiment.swagger.json b/backend/api/v2beta1/swagger/experiment.swagger.json index a77eaa91104b..49b32a497357 100644 --- a/backend/api/v2beta1/swagger/experiment.swagger.json +++ b/backend/api/v2beta1/swagger/experiment.swagger.json @@ -303,7 +303,7 @@ "last_run_created_at": { "type": "string", "format": "date-time", - "description": "Output. The time the created time of the last run in this experiment." + "description": "Output. The creation time of the last run in this experiment." } } }, diff --git a/backend/api/v2beta1/swagger/kfp_api_single_file.swagger.json b/backend/api/v2beta1/swagger/kfp_api_single_file.swagger.json index 3b7a86a69db4..6fc88e10f4be 100644 --- a/backend/api/v2beta1/swagger/kfp_api_single_file.swagger.json +++ b/backend/api/v2beta1/swagger/kfp_api_single_file.swagger.json @@ -2,7 +2,7 @@ "swagger": "2.0", "info": { "title": "Kubeflow Pipelines API", - "version": "2.3.0", + "version": "2.4.0", "description": "This file contains REST API specification for Kubeflow Pipelines. The file is autogenerated from the swagger definition.", "contact": { "name": "google", @@ -1617,7 +1617,7 @@ "last_run_created_at": { "type": "string", "format": "date-time", - "description": "Output. The time the created time of the last run in this experiment." + "description": "Output. The creation time of the last run in this experiment." } } }, @@ -2020,7 +2020,7 @@ }, "pipeline_version_id": { "type": "string", - "description": "Input. Required. Unique ID of an existing pipeline version." + "description": "Input. Optional. Unique ID of an existing pipeline version. If unset, the latest pipeline version is used." } }, "description": "Reference to an existing pipeline version." @@ -2349,7 +2349,7 @@ }, "pipeline_version_reference": { "$ref": "#/definitions/v2beta1PipelineVersionReference", - "description": "Reference to a pipeline version containing pipeline_id and pipeline_version_id." + "description": "Reference to a pipeline containing pipeline_id and optionally the pipeline_version_id." }, "runtime_config": { "$ref": "#/definitions/v2beta1RuntimeConfig", diff --git a/backend/api/v2beta1/swagger/recurring_run.swagger.json b/backend/api/v2beta1/swagger/recurring_run.swagger.json index dfc0a80c19f7..48e811bd1b6f 100644 --- a/backend/api/v2beta1/swagger/recurring_run.swagger.json +++ b/backend/api/v2beta1/swagger/recurring_run.swagger.json @@ -390,7 +390,7 @@ }, "pipeline_version_id": { "type": "string", - "description": "Input. Required. Unique ID of an existing pipeline version." + "description": "Input. Optional. Unique ID of an existing pipeline version. If unset, the latest pipeline version is used." } }, "description": "Reference to an existing pipeline version." diff --git a/backend/api/v2beta1/swagger/run.swagger.json b/backend/api/v2beta1/swagger/run.swagger.json index b71fd939049b..d04bda642138 100644 --- a/backend/api/v2beta1/swagger/run.swagger.json +++ b/backend/api/v2beta1/swagger/run.swagger.json @@ -619,7 +619,7 @@ }, "pipeline_version_id": { "type": "string", - "description": "Input. Required. Unique ID of an existing pipeline version." + "description": "Input. Optional. Unique ID of an existing pipeline version. If unset, the latest pipeline version is used." } }, "description": "Reference to an existing pipeline version." @@ -667,7 +667,7 @@ }, "pipeline_version_reference": { "$ref": "#/definitions/v2beta1PipelineVersionReference", - "description": "Reference to a pipeline version containing pipeline_id and pipeline_version_id." + "description": "Reference to a pipeline containing pipeline_id and optionally the pipeline_version_id." }, "runtime_config": { "$ref": "#/definitions/v2beta1RuntimeConfig", diff --git a/backend/src/apiserver/client/sql.go b/backend/src/apiserver/client/sql.go index 026ef0561904..3a111eb3afc3 100644 --- a/backend/src/apiserver/client/sql.go +++ b/backend/src/apiserver/client/sql.go @@ -22,8 +22,9 @@ import ( ) const ( - MYSQL_TEXT_FORMAT string = "longtext not null" - MYSQL_EXIST_ERROR string = "database exists" + MYSQL_TEXT_FORMAT string = "longtext not null" + MYSQL_TEXT_FORMAT_NULL string = "longtext" + MYSQL_EXIST_ERROR string = "database exists" PGX_TEXT_FORMAT string = "text" PGX_EXIST_ERROR string = "already exists" diff --git a/backend/src/apiserver/client_manager/client_manager.go b/backend/src/apiserver/client_manager/client_manager.go index 2368666e3ff5..9857aac68d50 100644 --- a/backend/src/apiserver/client_manager/client_manager.go +++ b/backend/src/apiserver/client_manager/client_manager.go @@ -345,6 +345,12 @@ func InitDBClient(initConnectionTimeout time.Duration) *storage.DB { if ignoreAlreadyExistError(driverName, response.Error) != nil { glog.Fatalf("Failed to create a foreign key for RunUUID in task table. Error: %s", response.Error) } + + // This is a workaround because AutoMigration does not detect that the column went from not null to nullable. + response = db.Model(&model.Job{}).ModifyColumn("WorkflowSpecManifest", client.MYSQL_TEXT_FORMAT_NULL) + if response.Error != nil { + glog.Fatalf("Failed to make the WorkflowSpecManifest column nullable on jobs. Error: %s", response.Error) + } default: glog.Fatalf("Driver %v is not supported, use \"mysql\" for MySQL, or \"pgx\" for PostgreSQL", driverName) } diff --git a/backend/src/apiserver/config/config.go b/backend/src/apiserver/config/config.go new file mode 100644 index 000000000000..808ce1f993c5 --- /dev/null +++ b/backend/src/apiserver/config/config.go @@ -0,0 +1,212 @@ +// Copyright 2025 The Kubeflow Authors +// +// 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 +// +// https://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. + +package config + +import ( + "encoding/json" + "fmt" + "github.com/golang/glog" + "github.com/kubeflow/pipelines/backend/src/apiserver/client" + "github.com/kubeflow/pipelines/backend/src/apiserver/common" + "github.com/kubeflow/pipelines/backend/src/apiserver/model" + "github.com/kubeflow/pipelines/backend/src/apiserver/resource" + "github.com/kubeflow/pipelines/backend/src/apiserver/server" + "github.com/kubeflow/pipelines/backend/src/common/util" + "google.golang.org/grpc/codes" + "os" + "time" +) + +// deprecated +type deprecatedConfig struct { + Name string + Description string + File string +} + +type configPipelines struct { + Name string + Description string + File string + // optional, Name is used for PipelineVersion if not provided + VersionName string + // optional, Description is used for PipelineVersion if not provided + VersionDescription string +} + +type config struct { + // If pipeline version already exists and + // LoadSamplesOnRestart is enabled, then the pipeline + // version is uploaded again on server restart + // if it does not already exist + LoadSamplesOnRestart bool + Pipelines []configPipelines +} + +// LoadSamples preloads a collection of pipeline samples +// +// If LoadSamplesOnRestart is false then Samples are only +// loaded once when the pipeline system is initially installed. +// They won't be loaded on upgrade or pod restart, to +// prevent them from reappearing if user explicitly deletes the +// samples. If LoadSamplesOnRestart is true then PipelineVersions +// are uploaded if they do not already exist upon upgrade or pod +// restart. +func LoadSamples(resourceManager *resource.ResourceManager, sampleConfigPath string) error { + pathExists, err := client.PathExists(sampleConfigPath) + if err != nil { + return err + } + + if !pathExists { + glog.Infof("No samples path provided, skipping loading samples..") + return nil + } + + configBytes, err := os.ReadFile(sampleConfigPath) + if err != nil { + return fmt.Errorf("failed to read sample configurations file. Err: %v", err) + } + + var pipelineConfig config + if configErr := json.Unmarshal(configBytes, &pipelineConfig); configErr != nil { + // Attempt to parse to deprecated config version: + var deprecatedCfg []deprecatedConfig + if depConfigErr := json.Unmarshal(configBytes, &deprecatedCfg); depConfigErr != nil { + return fmt.Errorf("failed to read sample configurations. Err: %v", configErr) + } + glog.Warningf("encountered deprecated version of samples config, please update to the newer version to " + + "ensure future compatibility") + for _, cfg := range deprecatedCfg { + pipelineConfig.Pipelines = append(pipelineConfig.Pipelines, configPipelines{ + Name: cfg.Name, + File: cfg.File, + Description: cfg.Description, + }) + } + pipelineConfig.LoadSamplesOnRestart = false + } + + // Check if sample has been loaded already and skip loading if true. + haveSamplesLoaded, err := resourceManager.HaveSamplesLoaded() + if err != nil { + return err + } + + if !pipelineConfig.LoadSamplesOnRestart && haveSamplesLoaded { + glog.Infof("Samples already loaded in the past. Skip loading.") + return nil + } + + processedPipelines := map[string]bool{} + + for _, cfg := range pipelineConfig.Pipelines { + // Track if this is the first upload of this pipeline + reader, configErr := os.Open(cfg.File) + if configErr != nil { + return fmt.Errorf("failed to load sample %s. Error: %v", cfg.Name, configErr) + } + pipelineFile, configErr := server.ReadPipelineFile(cfg.File, reader, common.MaxFileLength) + if configErr != nil { + return fmt.Errorf("failed to load sample %s. Error: %v", cfg.Name, configErr) + } + + // Create pipeline if it does not already exist + p, fetchErr := resourceManager.GetPipelineByNameAndNamespace(cfg.Name, "") + if fetchErr != nil { + if util.IsUserErrorCodeMatch(fetchErr, codes.NotFound) { + p, configErr = resourceManager.CreatePipeline(&model.Pipeline{ + Name: cfg.Name, + Description: cfg.Description, + }) + if configErr != nil { + // Log the error but not fail. The API Server pod can restart and it could potentially cause + // name collision. In the future, we might consider loading samples during deployment, instead + // of when API server starts. + glog.Warningf(fmt.Sprintf( + "Failed to create pipeline for %s. Error: %v", cfg.Name, configErr)) + continue + } else { + glog.Info(fmt.Sprintf("Successfully uploaded Pipeline %s.", cfg.Name)) + } + } else { + return fmt.Errorf( + "Failed to handle load sample for Pipeline: %s. Error: %v", cfg.Name, fetchErr) + } + } + + // Use Pipeline Version Name/Description if provided + // Otherwise fallback to owning Pipeline's Name/Description + pvDescription := cfg.Description + if cfg.VersionDescription != "" { + pvDescription = cfg.VersionDescription + } + pvName := cfg.Name + if cfg.VersionName != "" { + pvName = cfg.VersionName + } + + // If the Pipeline Version exists, do nothing + // Otherwise upload new Pipeline Version for + // this pipeline. + _, fetchErr = resourceManager.GetPipelineVersionByName(pvName) + if fetchErr != nil { + if util.IsUserErrorCodeMatch(fetchErr, codes.NotFound) { + _, configErr = resourceManager.CreatePipelineVersion( + &model.PipelineVersion{ + Name: pvName, + Description: pvDescription, + PipelineId: p.UUID, + PipelineSpec: string(pipelineFile), + }, + ) + if configErr != nil { + // Log the error but not fail. The API Server pod can restart and it could potentially cause name collision. + // In the future, we might consider loading samples during deployment, instead of when API server starts. + glog.Warningf(fmt.Sprintf("Failed to create pipeline for %s. Error: %v", pvName, configErr)) + + continue + } else { + glog.Info(fmt.Sprintf("Successfully uploaded PipelineVersion %s.", pvName)) + } + + if processedPipelines[pvName] { + // Since the default sorting is by create time, + // Sleep one second makes sure the samples are + // showing up in the same order as they are added. + time.Sleep(1 * time.Second) + } + } else { + return fmt.Errorf( + "Failed to handle load sample for PipelineVersion: %s. Error: %v", pvName, fetchErr) + } + } else { + // pipeline version already exists, do nothing + continue + } + + processedPipelines[pvName] = true + } + + if !haveSamplesLoaded { + err = resourceManager.MarkSampleLoaded() + if err != nil { + return err + } + } + + glog.Info("All samples are loaded.") + return nil +} diff --git a/backend/src/apiserver/config/config_test.go b/backend/src/apiserver/config/config_test.go new file mode 100644 index 000000000000..fb5af0889401 --- /dev/null +++ b/backend/src/apiserver/config/config_test.go @@ -0,0 +1,230 @@ +// Copyright 2025 The Kubeflow Authors +// +// 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 +// +// https://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. + +package config + +import ( + "encoding/json" + "github.com/kubeflow/pipelines/backend/src/apiserver/list" + "github.com/kubeflow/pipelines/backend/src/apiserver/model" + "github.com/kubeflow/pipelines/backend/src/apiserver/resource" + "github.com/kubeflow/pipelines/backend/src/common/util" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "google.golang.org/grpc/codes" + "os" + "path/filepath" + "testing" +) + +func fakeResourceManager() *resource.ResourceManager { + clientManager := resource.NewFakeClientManagerOrFatalV2() + resourceManager := resource.NewResourceManager(clientManager, &resource.ResourceManagerOptions{CollectMetrics: false}) + return resourceManager +} + +func TestLoadSamplesConfigBackwardsCompatibility(t *testing.T) { + rm := fakeResourceManager() + pc := []deprecatedConfig{ + { + Name: "Pipeline 1", + Description: "test description", + File: "testdata/sample_pipeline.yaml", + }, + { + Name: "Pipeline 2", + Description: "test description", + File: "testdata/sample_pipeline.yaml", + }, + } + + path, err := writeSampleConfigDeprecated(t, pc, "sample.json") + require.NoError(t, err) + err = LoadSamples(rm, path) + require.NoError(t, err) + + _, err = rm.GetPipelineByNameAndNamespace(pc[0].Name, "") + require.NoError(t, err) + _, err = rm.GetPipelineByNameAndNamespace(pc[1].Name, "") + require.NoError(t, err) + + _, err = rm.GetPipelineVersionByName(pc[0].Name) + require.NoError(t, err) + _, err = rm.GetPipelineVersionByName(pc[1].Name) + require.NoError(t, err) + + // Update pipeline version for Pipeline 1 + pc[0].Name = "Pipeline 3" + path, err = writeSampleConfigDeprecated(t, pc, "sample.json") + require.NoError(t, err) + + // Loading samples should result in no pipeline uploaded + err = LoadSamples(rm, path) + require.NoError(t, err) + _, err = rm.GetPipelineByNameAndNamespace(pc[0].Name, "") + var userErr *util.UserError + if assert.ErrorAs(t, err, &userErr) { + require.Equal(t, codes.NotFound, userErr.ExternalStatusCode()) + } +} + +func TestLoadSamples(t *testing.T) { + rm := fakeResourceManager() + pc := config{ + LoadSamplesOnRestart: true, + Pipelines: []configPipelines{ + { + Name: "Pipeline 1", + Description: "test description", + File: "testdata/sample_pipeline.yaml", + VersionName: "Pipeline 1 - Ver 1", + VersionDescription: "Pipeline 1 - Ver 1 Description", + }, + { + Name: "Pipeline 2", + Description: "test description", + File: "testdata/sample_pipeline.yaml", + VersionName: "Pipeline 2 - Ver 1", + VersionDescription: "Pipeline 2 - Ver 1 Description", + }, + }, + } + + path, err := writeSampleConfig(t, pc, "sample.json") + require.NoError(t, err) + err = LoadSamples(rm, path) + require.NoError(t, err) + + var pipeline1 *model.Pipeline + pipeline1, err = rm.GetPipelineByNameAndNamespace(pc.Pipelines[0].Name, "") + require.NoError(t, err) + var pipeline2 *model.Pipeline + pipeline2, err = rm.GetPipelineByNameAndNamespace(pc.Pipelines[1].Name, "") + require.NoError(t, err) + + _, err = rm.GetPipelineVersionByName(pc.Pipelines[0].VersionName) + require.NoError(t, err) + + // Update pipeline version for Pipeline 1 + pc.Pipelines[0].VersionName = "Pipeline 1 - Ver 2" + path, err = writeSampleConfig(t, pc, "sample.json") + require.NoError(t, err) + err = LoadSamples(rm, path) + require.NoError(t, err) + + // Expect another Pipeline version added for Pipeline 1 + opts, err := list.NewOptions(&model.PipelineVersion{}, 10, "id", nil) + require.NoError(t, err) + _, totalSize, _, err := rm.ListPipelineVersions(pipeline1.UUID, opts) + require.NoError(t, err) + require.Equal(t, totalSize, 2) + + // Update pipeline version for Pipeline 2 + pc.Pipelines[1].VersionName = "Pipeline 2 - Ver 2" + path, err = writeSampleConfig(t, pc, "sample.json") + require.NoError(t, err) + err = LoadSamples(rm, path) + require.NoError(t, err) + + // Expect another Pipeline version added for Pipeline 2 + _, err = rm.GetPipelineVersionByName(pc.Pipelines[1].VersionName) + require.NoError(t, err) + _, totalSize, _, err = rm.ListPipelineVersions(pipeline2.UUID, opts) + require.Equal(t, totalSize, 2) + + // Confirm previous pipeline version count has not been affected + _, totalSize, _, err = rm.ListPipelineVersions(pipeline1.UUID, opts) + require.Equal(t, totalSize, 2) + + // When LoadSamplesOnRestart is false, changes to config should + // result in no new pipelines update upon restart + pc.LoadSamplesOnRestart = false + + // Update pipeline version for Pipeline 2 + pc.Pipelines[1].VersionName = "Pipeline 2 - Ver 3" + path, err = writeSampleConfig(t, pc, "sample.json") + require.NoError(t, err) + err = LoadSamples(rm, path) + require.NoError(t, err) + + // Expect no change + _, totalSize, _, err = rm.ListPipelineVersions(pipeline2.UUID, opts) + require.NoError(t, err) + require.Equal(t, totalSize, 2) +} + +func TestLoadSamplesMultiplePipelineVersionsInConfig(t *testing.T) { + rm := fakeResourceManager() + pc := config{ + LoadSamplesOnRestart: true, + Pipelines: []configPipelines{ + { + Name: "Pipeline 1", + Description: "test description", + File: "testdata/sample_pipeline.yaml", + VersionName: "Pipeline 1 - Ver 1", + VersionDescription: "Pipeline 1 - Ver 1 Description", + }, + { + Name: "Pipeline 1", + Description: "test description", + File: "testdata/sample_pipeline.yaml", + VersionName: "Pipeline 1 - Ver 2", + VersionDescription: "Pipeline 1 - Ver 2 Description", + }, + }, + } + + path, err := writeSampleConfig(t, pc, "sample.json") + require.NoError(t, err) + err = LoadSamples(rm, path) + require.NoError(t, err) + + // Expect both versions to be added + var pipeline *model.Pipeline + pipeline, err = rm.GetPipelineByNameAndNamespace(pc.Pipelines[0].Name, "") + require.NoError(t, err) + + _, err = rm.GetPipelineVersionByName(pc.Pipelines[0].VersionName) + require.NoError(t, err) + _, err = rm.GetPipelineVersionByName(pc.Pipelines[1].VersionName) + require.NoError(t, err) + + opts, err := list.NewOptions(&model.PipelineVersion{}, 10, "id", nil) + require.NoError(t, err) + + _, totalSize, _, err := rm.ListPipelineVersions(pipeline.UUID, opts) + require.Equal(t, totalSize, 2) +} + +func writeSampleConfig(t *testing.T, config config, path string) (string, error) { + return writeContents(t, config, path) +} + +func writeSampleConfigDeprecated(t *testing.T, config []deprecatedConfig, path string) (string, error) { + return writeContents(t, config, path) +} + +func writeContents(t *testing.T, content interface{}, path string) (string, error) { + tempDir := t.TempDir() + sampleFilePath := filepath.Join(tempDir, path) + marshal, err := json.Marshal(content) + if err != nil { + return "", err + } + if err := os.WriteFile(sampleFilePath, marshal, 0644); err != nil { + t.Fatalf("Failed to create %v file: %v", path, err) + } + return sampleFilePath, nil +} diff --git a/backend/src/apiserver/config/sample_config.json b/backend/src/apiserver/config/sample_config.json index a4f4145c54e0..01064c9584ef 100644 --- a/backend/src/apiserver/config/sample_config.json +++ b/backend/src/apiserver/config/sample_config.json @@ -1,12 +1,15 @@ -[ - { - "name": "[Tutorial] Data passing in python components", - "description": "[source code](https://github.com/kubeflow/pipelines/tree/master/samples/tutorials/Data%20passing%20in%20python%20components) Shows how to pass data between python components.", - "file": "/samples/tutorials/Data passing in python components/Data passing in python components - Files.py.yaml" - }, - { - "name": "[Tutorial] DSL - Control structures", - "description": "[source code](https://github.com/kubeflow/pipelines/tree/master/samples/tutorials/DSL%20-%20Control%20structures) Shows how to use conditional execution and exit handlers. This pipeline will randomly fail to demonstrate that the exit handler gets executed even in case of failure.", - "file": "/samples/tutorials/DSL - Control structures/DSL - Control structures.py.yaml" - } -] +{ + "loadSamplesOnRestart": true, + "pipelines": [ + { + "name": "[Tutorial] Data passing in python components", + "description": "[source code](https://github.com/kubeflow/pipelines/tree/master/samples/tutorials/Data%20passing%20in%20python%20components) Shows how to pass data between python components.", + "file": "/samples/tutorials/Data passing in python components/Data passing in python components - Files.py.yaml" + }, + { + "name": "[Tutorial] DSL - Control structures", + "description": "[source code](https://github.com/kubeflow/pipelines/tree/master/samples/tutorials/DSL%20-%20Control%20structures) Shows how to use conditional execution and exit handlers. This pipeline will randomly fail to demonstrate that the exit handler gets executed even in case of failure.", + "file": "/samples/tutorials/DSL - Control structures/DSL - Control structures.py.yaml" + } + ] +} diff --git a/backend/src/apiserver/config/testdata/sample_pipeline.yaml b/backend/src/apiserver/config/testdata/sample_pipeline.yaml new file mode 100644 index 000000000000..4a0edac76e4a --- /dev/null +++ b/backend/src/apiserver/config/testdata/sample_pipeline.yaml @@ -0,0 +1,49 @@ +# PIPELINE DEFINITION +# Name: pipeline-hello-world +components: + comp-hello-world: + executorLabel: exec-hello-world +deploymentSpec: + executors: + exec-hello-world: + container: + args: + - --executor_input + - '{{$}}' + - --function_to_execute + - hello_world + command: + - sh + - -c + - "\nif ! [ -x \"$(command -v pip)\" ]; then\n python3 -m ensurepip ||\ + \ python3 -m ensurepip --user || apt-get install python3-pip\nfi\n\nPIP_DISABLE_PIP_VERSION_CHECK=1\ + \ python3 -m pip install --quiet --no-warn-script-location 'kfp==2.10.1'\ + \ '--no-deps' 'typing-extensions>=3.7.4,<5; python_version<\"3.9\"' && \"\ + $0\" \"$@\"\n" + - sh + - -ec + - 'program_path=$(mktemp -d) + + + printf "%s" "$0" > "$program_path/ephemeral_component.py" + + _KFP_RUNTIME=true python3 -m kfp.dsl.executor_main --component_module_path "$program_path/ephemeral_component.py" "$@" + + ' + - "\nimport kfp\nfrom kfp import dsl\nfrom kfp.dsl import *\nfrom typing import\ + \ *\n\ndef hello_world():\n print('hello')\n\n" + image: python:3.9 +pipelineInfo: + name: pipeline-hello-world +root: + dag: + tasks: + hello-world: + cachingOptions: + enableCache: true + componentRef: + name: comp-hello-world + taskInfo: + name: hello-world +schemaVersion: 2.1.0 +sdkVersion: kfp-2.10.1 diff --git a/backend/src/apiserver/main.go b/backend/src/apiserver/main.go index 9841503a32f7..740e735e4c24 100644 --- a/backend/src/apiserver/main.go +++ b/backend/src/apiserver/main.go @@ -16,21 +16,7 @@ package main import ( "context" - "encoding/json" "flag" - "fmt" - "github.com/kubeflow/pipelines/backend/src/apiserver/client" - "io" - "io/ioutil" - "math" - "net" - "net/http" - "os" - "strconv" - "strings" - "sync" - "time" - "github.com/fsnotify/fsnotify" "github.com/golang/glog" "github.com/gorilla/mux" @@ -39,7 +25,7 @@ import ( apiv2beta1 "github.com/kubeflow/pipelines/backend/api/v2beta1/go_client" cm "github.com/kubeflow/pipelines/backend/src/apiserver/client_manager" "github.com/kubeflow/pipelines/backend/src/apiserver/common" - "github.com/kubeflow/pipelines/backend/src/apiserver/model" + "github.com/kubeflow/pipelines/backend/src/apiserver/config" "github.com/kubeflow/pipelines/backend/src/apiserver/resource" "github.com/kubeflow/pipelines/backend/src/apiserver/server" "github.com/kubeflow/pipelines/backend/src/apiserver/template" @@ -49,6 +35,13 @@ import ( "github.com/spf13/viper" "google.golang.org/grpc" "google.golang.org/grpc/reflection" + "io" + "math" + "net" + "net/http" + "strconv" + "strings" + "sync" ) const ( @@ -84,7 +77,7 @@ func main() { &clientManager, &resource.ResourceManagerOptions{CollectMetrics: *collectMetricsFlag}, ) - err := loadSamples(resourceManager) + err := config.LoadSamples(resourceManager, *sampleConfigPath) if err != nil { glog.Fatalf("Failed to load samples. Err: %v", err) } @@ -255,95 +248,6 @@ func registerHttpHandlerFromEndpoint(handler RegisterHttpHandlerFromEndpoint, se } } -// Preload a bunch of pipeline samples -// Samples are only loaded once when the pipeline system is initially installed. -// They won't be loaded when upgrade or pod restart, to prevent them reappear if user explicitly -// delete the samples. -func loadSamples(resourceManager *resource.ResourceManager) error { - // Check if sample has being loaded already and skip loading if true. - haveSamplesLoaded, err := resourceManager.HaveSamplesLoaded() - if err != nil { - return err - } - if haveSamplesLoaded { - glog.Infof("Samples already loaded in the past. Skip loading.") - return nil - } - - pathExists, err := client.PathExists(*sampleConfigPath) - if err != nil { - return err - } - - if !pathExists { - glog.Infof("No samples path provided, skipping loading samples..") - return nil - } - - configBytes, err := ioutil.ReadFile(*sampleConfigPath) - if err != nil { - return fmt.Errorf("failed to read sample configurations file. Err: %v", err) - } - type config struct { - Name string - Description string - File string - } - var configs []config - if err = json.Unmarshal(configBytes, &configs); err != nil { - return fmt.Errorf("failed to read sample configurations. Err: %v", err) - } - for _, config := range configs { - reader, configErr := os.Open(config.File) - if configErr != nil { - return fmt.Errorf("failed to load sample %s. Error: %v", config.Name, configErr) - } - pipelineFile, configErr := server.ReadPipelineFile(config.File, reader, common.MaxFileLength) - if configErr != nil { - return fmt.Errorf("failed to decompress the file %s. Error: %v", config.Name, configErr) - } - p, configErr := resourceManager.CreatePipeline( - &model.Pipeline{ - Name: config.Name, - Description: config.Description, - }, - ) - if configErr != nil { - // Log the error but not fail. The API Server pod can restart and it could potentially cause name collision. - // In the future, we might consider loading samples during deployment, instead of when API server starts. - glog.Warningf(fmt.Sprintf("Failed to create pipeline for %s. Error: %v", config.Name, configErr)) - - continue - } - - _, configErr = resourceManager.CreatePipelineVersion( - &model.PipelineVersion{ - Name: config.Name, - Description: config.Description, - PipelineId: p.UUID, - PipelineSpec: string(pipelineFile), - }, - ) - if configErr != nil { - // Log the error but not fail. The API Server pod can restart and it could potentially cause name collision. - // In the future, we might consider loading samples during deployment, instead of when API server starts. - glog.Warningf(fmt.Sprintf("Failed to create pipeline for %s. Error: %v", config.Name, configErr)) - - continue - } - // Since the default sorting is by create time, - // Sleep one second makes sure the samples are showing up in the same order as they are added. - time.Sleep(1 * time.Second) - } - // Mark sample as loaded - err = resourceManager.MarkSampleLoaded() - if err != nil { - return err - } - glog.Info("All samples are loaded.") - return nil -} - func initConfig() { // Import environment variable, support nested vars e.g. OBJECTSTORECONFIG_ACCESSKEY replacer := strings.NewReplacer(".", "_") diff --git a/backend/src/apiserver/model/pipeline_spec.go b/backend/src/apiserver/model/pipeline_spec.go index b0fb41841192..2f92c5c68bd5 100644 --- a/backend/src/apiserver/model/pipeline_spec.go +++ b/backend/src/apiserver/model/pipeline_spec.go @@ -33,7 +33,8 @@ type PipelineSpec struct { PipelineSpecManifest string `gorm:"column:PipelineSpecManifest; size:33554432;"` // Argo workflow YAML definition. This is the Argo Spec converted from Pipeline YAML. - WorkflowSpecManifest string `gorm:"column:WorkflowSpecManifest; not null; size:33554432;"` + // This is deprecated. Use the pipeline ID, pipeline version ID, or pipeline spec manifest. + WorkflowSpecManifest string `gorm:"column:WorkflowSpecManifest; size:33554432;"` // Store parameters key-value pairs as serialized string. // This field is only used for V1 API. For V2, use the `Parameters` field in RuntimeConfig. diff --git a/backend/src/apiserver/resource/resource_manager.go b/backend/src/apiserver/resource/resource_manager.go index 94fdc578c62c..6523496e0126 100644 --- a/backend/src/apiserver/resource/resource_manager.go +++ b/backend/src/apiserver/resource/resource_manager.go @@ -590,6 +590,12 @@ func (r *ResourceManager) ReconcileSwfCrs(ctx context.Context) error { default: } + // If the pipeline isn't pinned, skip it. The runs API is used directly by the ScheduledWorkflow controller + // in this case with just the pipeline ID and optionally the pipeline version ID. + if jobs[i].PipelineSpec.PipelineSpecManifest == "" && jobs[i].PipelineSpec.WorkflowSpecManifest == "" { + continue + } + tmpl, _, err := r.fetchTemplateFromPipelineSpec(&jobs[i].PipelineSpec) if err != nil { return failedToReconcileSwfCrsError(err) @@ -1041,13 +1047,6 @@ func (r *ResourceManager) fetchPipelineVersionFromPipelineSpec(pipelineSpec mode // Manifest's namespace gets overwritten with the job.Namespace if the later is non-empty. // Otherwise, job.Namespace gets overwritten by the manifest. func (r *ResourceManager) CreateJob(ctx context.Context, job *model.Job) (*model.Job, error) { - // Create a template based on the manifest of an existing pipeline version or used-provided manifest. - // Update the job.PipelineSpec if an existing pipeline version is used. - tmpl, manifest, err := r.fetchTemplateFromPipelineSpec(&job.PipelineSpec) - if err != nil { - return nil, util.NewInternalServerError(err, "Failed to create a recurring run with an invalid pipeline spec manifest") - } - // Create a new ScheduledWorkflow at the ScheduledWorkflow client. k8sNamespace := job.Namespace if k8sNamespace == "" { @@ -1059,12 +1058,63 @@ func (r *ResourceManager) CreateJob(ctx context.Context, job *model.Job) (*model job.Namespace = k8sNamespace - // TODO(gkcalat): consider changing the flow. Other resource UUIDs are assigned by their respective stores (DB). - // Convert modelJob into scheduledWorkflow. - scheduledWorkflow, err := tmpl.ScheduledWorkflow(job) - if err != nil { - return nil, util.Wrap(err, "Failed to create a recurring run during scheduled workflow creation") + var manifest string + var scheduledWorkflow *scheduledworkflow.ScheduledWorkflow + var tmpl template.Template + + // If the pipeline version or pipeline spec is provided, this means the user wants to pin to a specific pipeline. + // Otherwise, always let the ScheduledWorkflow controller pick the latest. + if job.PipelineVersionId != "" || job.PipelineSpecManifest != "" || job.WorkflowSpecManifest != "" { + var err error + // Create a template based on the manifest of an existing pipeline version or used-provided manifest. + // Update the job.PipelineSpec if an existing pipeline version is used. + tmpl, manifest, err = r.fetchTemplateFromPipelineSpec(&job.PipelineSpec) + if err != nil { + return nil, util.NewInternalServerError(err, "Failed to create a recurring run with an invalid pipeline spec manifest") + } + + // TODO(gkcalat): consider changing the flow. Other resource UUIDs are assigned by their respective stores (DB). + // Convert modelJob into scheduledWorkflow. + scheduledWorkflow, err = tmpl.ScheduledWorkflow(job) + if err != nil { + return nil, util.Wrap(err, "Failed to create a recurring run during scheduled workflow creation") + } + } else if job.PipelineId == "" { + return nil, errors.New("Cannot create a job with an empty pipeline ID") + } else { + // Validate the input parameters on the latest pipeline version. The latest pipeline version is not stored + // in the ScheduledWorkflow. It's just to help the user with up front validation at recurring run creation + // time. + manifest, err := r.GetPipelineLatestTemplate(job.PipelineId) + if err != nil { + return nil, util.Wrap(err, "Failed to validate the input parameters on the latest pipeline version") + } + + tmpl, err := template.New(manifest) + if err != nil { + return nil, util.Wrap(err, "Failed to fetch a template with an invalid pipeline spec manifest") + } + + _, err = tmpl.ScheduledWorkflow(job) + if err != nil { + return nil, util.Wrap(err, "Failed to validate the input parameters on the latest pipeline version") + } + + scheduledWorkflow, err = template.NewGenericScheduledWorkflow(job) + if err != nil { + return nil, util.Wrap(err, "Failed to create a recurring run during scheduled workflow creation") + } + + parameters, err := template.StringMapToCRDParameters(job.RuntimeConfig.Parameters) + if err != nil { + return nil, util.Wrap(err, "Converting runtime config's parameters to CDR parameters failed") + } + + scheduledWorkflow.Spec.Workflow = &scheduledworkflow.WorkflowResource{ + Parameters: parameters, PipelineRoot: job.PipelineRoot, + } } + newScheduledWorkflow, err := r.getScheduledWorkflowClient(k8sNamespace).Create(ctx, scheduledWorkflow) if err != nil { if err, ok := err.(net.Error); ok && err.Timeout() { @@ -1080,6 +1130,11 @@ func (r *ResourceManager) CreateJob(ctx context.Context, job *model.Job) (*model for _, modelRef := range job.ResourceReferences { modelRef.ResourceUUID = string(swf.UID) } + + if tmpl == nil { + return r.jobStore.CreateJob(job) + } + if tmpl.GetTemplateType() == template.V1 { // Get the service account serviceAccount := "" @@ -1616,7 +1671,7 @@ func (r *ResourceManager) CreatePipelineVersion(pv *model.PipelineVersion) (*mod } // After pipeline version being created in DB and pipeline file being - // saved in minio server, set this pieline version to status ready. + // saved in minio server, set this pipeline version to status ready. version.Status = model.PipelineVersionReady err = r.pipelineStore.UpdatePipelineVersionStatus(version.UUID, version.Status) if err != nil { @@ -1625,7 +1680,7 @@ func (r *ResourceManager) CreatePipelineVersion(pv *model.PipelineVersion) (*mod return version, nil } -// Returns a pipeline version. +// Returns a pipeline version by Id. func (r *ResourceManager) GetPipelineVersion(pipelineVersionId string) (*model.PipelineVersion, error) { if pipelineVersion, err := r.pipelineStore.GetPipelineVersion(pipelineVersionId); err != nil { return nil, util.Wrapf(err, "Failed to get a pipeline version with id %v", pipelineVersionId) @@ -1634,6 +1689,15 @@ func (r *ResourceManager) GetPipelineVersion(pipelineVersionId string) (*model.P } } +// Returns a pipeline version by Name. +func (r *ResourceManager) GetPipelineVersionByName(name string) (*model.PipelineVersion, error) { + if pipelineVersion, err := r.pipelineStore.GetPipelineVersionByName(name); err != nil { + return nil, util.Wrapf(err, "Failed to get a pipeline version with name %v", name) + } else { + return pipelineVersion, nil + } +} + // Returns the latest pipeline version for a specified pipeline id. func (r *ResourceManager) GetLatestPipelineVersion(pipelineId string) (*model.PipelineVersion, error) { // Verify pipeline exists diff --git a/backend/src/apiserver/resource/resource_manager_test.go b/backend/src/apiserver/resource/resource_manager_test.go index 3a29893fec5b..4271e4f05fd5 100644 --- a/backend/src/apiserver/resource/resource_manager_test.go +++ b/backend/src/apiserver/resource/resource_manager_test.go @@ -2366,37 +2366,25 @@ func TestCreateJob_ThroughPipelineID(t *testing.T) { pipelineStore, ok := store.pipelineStore.(*storage.PipelineStore) assert.True(t, ok) pipelineStore.SetUUIDGenerator(util.NewFakeUUIDGeneratorOrFatal(FakeUUIDOne, nil)) - pv := createPipelineVersion( - pipeline.UUID, - "version_for_job", - "", - "", - testWorkflow.ToStringForStore(), - "", - "", - ) - version, err := manager.CreatePipelineVersion(pv) - assert.Nil(t, err) // The pipeline specified via pipeline id will be converted to this // pipeline's default version, which will be used to create run. newJob, err := manager.CreateJob(context.Background(), job) expectedJob := &model.Job{ - UUID: "123e4567-e89b-12d3-a456-426655440000", - DisplayName: "j1", - K8SName: "job-", - Namespace: "ns1", - ServiceAccount: "pipeline-runner", + UUID: "123e4567-e89b-12d3-a456-426655440000", + DisplayName: "j1", + K8SName: "job-", + Namespace: "ns1", + // Since there is no pipeline version or service account specified, the API server will select the service + // account when compiling the run, not within the ScheduledWorkflow. + ServiceAccount: "", Enabled: true, - CreatedAtInSec: 5, - UpdatedAtInSec: 5, + CreatedAtInSec: 4, + UpdatedAtInSec: 4, Conditions: "STATUS_UNSPECIFIED", PipelineSpec: model.PipelineSpec{ - PipelineId: pipeline.UUID, - PipelineName: version.Name, - PipelineVersionId: version.UUID, - WorkflowSpecManifest: testWorkflow.ToStringForStore(), - Parameters: "[{\"name\":\"param1\",\"value\":\"world\"}]", + PipelineId: pipeline.UUID, + Parameters: "[{\"name\":\"param1\",\"value\":\"world\"}]", }, ExperimentId: experiment.UUID, } @@ -2512,6 +2500,7 @@ func TestCreateJob_ThroughPipelineIdAndPipelineVersion(t *testing.T) { } func TestCreateJob_EmptyPipelineSpec(t *testing.T) { + initEnvVars() store := NewFakeClientManagerOrFatal(util.NewFakeTimeForEpoch()) defer store.Close() manager := NewResourceManager(store, &ResourceManagerOptions{CollectMetrics: false}) @@ -2526,7 +2515,11 @@ func TestCreateJob_EmptyPipelineSpec(t *testing.T) { } _, err := manager.CreateJob(context.Background(), job) assert.NotNil(t, err) - assert.Contains(t, err.Error(), "Failed to fetch a template with an empty pipeline spec manifest") + errMsg := "" + if err != nil { + errMsg = err.Error() + } + assert.Contains(t, errMsg, "Cannot create a job with an empty pipeline ID") } func TestCreateJob_InvalidWorkflowSpec(t *testing.T) { diff --git a/backend/src/apiserver/server/api_converter.go b/backend/src/apiserver/server/api_converter.go index bdf55811de3a..e6351b1397af 100644 --- a/backend/src/apiserver/server/api_converter.go +++ b/backend/src/apiserver/server/api_converter.go @@ -1869,10 +1869,13 @@ func toModelJob(j interface{}) (*model.Job, error) { case *apiv2beta1.RecurringRun: pipelineId = apiJob.GetPipelineVersionReference().GetPipelineId() pipelineVersionId = apiJob.GetPipelineVersionReference().GetPipelineVersionId() - if spec, err := pipelineSpecStructToYamlString(apiJob.GetPipelineSpec()); err == nil { - pipelineSpec = spec - } else { - return nil, util.Wrap(err, "Failed to convert API recurring run to its internal representation due to pipeline spec conversion error") + + if apiJob.GetPipelineSpec() != nil { + if spec, err := pipelineSpecStructToYamlString(apiJob.GetPipelineSpec()); err == nil { + pipelineSpec = spec + } else { + return nil, util.Wrap(err, "Failed to convert API recurring run to its internal representation due to pipeline spec conversion error") + } } cfg, err := toModelRuntimeConfig(apiJob.GetRuntimeConfig()) @@ -1933,6 +1936,7 @@ func toModelJob(j interface{}) (*model.Job, error) { } else if pipelineVersionId != "" { pipelineName = fmt.Sprintf("pipelines/%v", pipelineVersionId) } + status := model.StatusStateUnspecified if isEnabled { status = model.StatusStateEnabled diff --git a/backend/src/apiserver/server/api_util_test.go b/backend/src/apiserver/server/api_util_test.go index e004e4639e29..39d5dec75342 100644 --- a/backend/src/apiserver/server/api_util_test.go +++ b/backend/src/apiserver/server/api_util_test.go @@ -15,7 +15,7 @@ package server import ( - "io/ioutil" + "os" "strings" "testing" @@ -377,7 +377,7 @@ func TestValidateRunMetric_InvalidNodeIDs(t *testing.T) { } func loadYaml(t *testing.T, path string) string { - res, err := ioutil.ReadFile(path) + res, err := os.ReadFile(path) if err != nil { t.Error(err) } diff --git a/backend/src/apiserver/server/job_server.go b/backend/src/apiserver/server/job_server.go index d78db2aff768..557287ee62f0 100644 --- a/backend/src/apiserver/server/job_server.go +++ b/backend/src/apiserver/server/job_server.go @@ -115,6 +115,19 @@ func (s *JobServer) CreateJob(ctx context.Context, request *apiv1beta1.CreateJob if err != nil { return nil, util.Wrap(err, "Failed to create a recurring run due to conversion error") } + + // In the v2 API, the pipeline version being empty means always pick the latest at run submission time. In v1, + // it means to use the latest pipeline version at recurring run creation time. Handle this case here since + // modelJob does not have the concept of which API version it came from. + if modelJob.PipelineId != "" && modelJob.WorkflowSpecManifest == "" && modelJob.PipelineSpecManifest == "" && modelJob.PipelineVersionId == "" { + pipelineVersion, err := s.resourceManager.GetLatestPipelineVersion(modelJob.PipelineId) + if err != nil { + return nil, util.Wrapf(err, "Failed to fetch a pipeline version from pipeline %v", modelJob.PipelineId) + } + + modelJob.PipelineVersionId = pipelineVersion.UUID + } + newJob, err := s.createJob(ctx, modelJob) if err != nil { return nil, util.Wrap(err, "Failed to create a recurring run") diff --git a/backend/src/apiserver/server/job_server_test.go b/backend/src/apiserver/server/job_server_test.go index f9dc4b80a770..ebe819732968 100644 --- a/backend/src/apiserver/server/job_server_test.go +++ b/backend/src/apiserver/server/job_server_test.go @@ -148,10 +148,11 @@ func TestCreateJob_WrongInput(t *testing.T) { Trigger: &apiv1beta1.Trigger_CronSchedule{CronSchedule: &apiv1beta1.CronSchedule{ StartTime: ×tamp.Timestamp{Seconds: 1}, Cron: "1 * * * *", - }}}, + }}, + }, ResourceReferences: validReference, }, - "Failed to fetch a template with an empty pipeline spec manifest", + "Failed to create a recurring run: Cannot create a job with an empty pipeline ID", }, { "invalid pipeline spec", @@ -172,7 +173,8 @@ func TestCreateJob_WrongInput(t *testing.T) { {Key: &apiv1beta1.ResourceKey{Type: apiv1beta1.ResourceType_EXPERIMENT, Id: experiment.UUID}, Relationship: apiv1beta1.Relationship_OWNER}, }, }, - "Failed to get the latest pipeline version as pipeline was not found: ResourceNotFoundError: Pipeline not_exist_pipeline not found", + "Failed to fetch a pipeline version from pipeline not_exist_pipeline: Failed to get the latest " + + "pipeline version as pipeline was not found: ResourceNotFoundError: Pipeline not_exist_pipeline not found", }, { "invalid cron", @@ -240,7 +242,11 @@ func TestCreateJob_WrongInput(t *testing.T) { for _, tt := range tests { got, err := server.CreateJob(context.Background(), &apiv1beta1.CreateJobRequest{Job: tt.arg}) assert.NotNil(t, err) - assert.Contains(t, err.Error(), tt.errMsg) + errMsg := "" + if err != nil { + errMsg = err.Error() + } + assert.Contains(t, errMsg, tt.errMsg) assert.Nil(t, got) } } diff --git a/backend/src/apiserver/server/pipeline_server_test.go b/backend/src/apiserver/server/pipeline_server_test.go index 8ff7831fe55a..1c5b2c6fc8d9 100644 --- a/backend/src/apiserver/server/pipeline_server_test.go +++ b/backend/src/apiserver/server/pipeline_server_test.go @@ -17,7 +17,7 @@ package server import ( "context" "encoding/json" - "io/ioutil" + "io" "net/http" "net/http/httptest" "os" @@ -614,7 +614,7 @@ func getMockServer(t *testing.T) *httptest.Server { // Send response to be tested file, err := os.Open("test" + req.URL.String()) assert.Nil(t, err) - bytes, err := ioutil.ReadAll(file) + bytes, err := io.ReadAll(file) assert.Nil(t, err) rw.WriteHeader(http.StatusOK) diff --git a/backend/src/apiserver/server/util.go b/backend/src/apiserver/server/util.go index bec7c6135953..5d88de11d6de 100644 --- a/backend/src/apiserver/server/util.go +++ b/backend/src/apiserver/server/util.go @@ -22,7 +22,6 @@ import ( "compress/gzip" "errors" "io" - "io/ioutil" "strings" "github.com/kubeflow/pipelines/backend/src/common/util" @@ -108,7 +107,7 @@ func DecompressPipelineTarball(compressedFile []byte) ([]byte, error) { } } - decompressedFile, err := ioutil.ReadAll(tarReader) + decompressedFile, err := io.ReadAll(tarReader) if err != nil { return nil, util.NewInvalidInputErrorWithDetails(err, "Error reading pipeline YAML from the tarball file") } @@ -141,7 +140,7 @@ func DecompressPipelineZip(compressedFile []byte) ([]byte, error) { if err != nil { return nil, util.NewInvalidInputErrorWithDetails(err, "Error extracting pipeline from the zip file. Failed to read the content") } - decompressedFile, err := ioutil.ReadAll(rc) + decompressedFile, err := io.ReadAll(rc) if err != nil { return nil, util.NewInvalidInputErrorWithDetails(err, "Error reading pipeline YAML from the zip file") } diff --git a/backend/src/apiserver/server/util_test.go b/backend/src/apiserver/server/util_test.go index c6a0998379fe..b5e3c9d9f4ab 100644 --- a/backend/src/apiserver/server/util_test.go +++ b/backend/src/apiserver/server/util_test.go @@ -15,7 +15,6 @@ package server import ( - "io/ioutil" "os" "strings" "testing" @@ -47,67 +46,67 @@ func TestLoadFile_LargeDoc(t *testing.T) { } func TestDecompressPipelineTarball(t *testing.T) { - tarballByte, _ := ioutil.ReadFile("test/arguments_tarball/arguments.tar.gz") + tarballByte, _ := os.ReadFile("test/arguments_tarball/arguments.tar.gz") pipelineFile, err := DecompressPipelineTarball(tarballByte) assert.Nil(t, err) - expectedPipelineFile, _ := ioutil.ReadFile("test/arguments-parameters.yaml") + expectedPipelineFile, _ := os.ReadFile("test/arguments-parameters.yaml") assert.Equal(t, expectedPipelineFile, pipelineFile) } func TestDecompressPipelineTarball_MalformattedTarball(t *testing.T) { - tarballByte, _ := ioutil.ReadFile("test/malformatted_tarball.tar.gz") + tarballByte, _ := os.ReadFile("test/malformatted_tarball.tar.gz") _, err := DecompressPipelineTarball(tarballByte) assert.NotNil(t, err) assert.Contains(t, err.Error(), "Not a valid tarball file") } func TestDecompressPipelineTarball_NonYamlTarball(t *testing.T) { - tarballByte, _ := ioutil.ReadFile("test/non_yaml_tarball/non_yaml_tarball.tar.gz") + tarballByte, _ := os.ReadFile("test/non_yaml_tarball/non_yaml_tarball.tar.gz") _, err := DecompressPipelineTarball(tarballByte) assert.NotNil(t, err) assert.Contains(t, err.Error(), "Expecting a pipeline.yaml file inside the tarball") } func TestDecompressPipelineTarball_EmptyTarball(t *testing.T) { - tarballByte, _ := ioutil.ReadFile("test/empty_tarball/empty.tar.gz") + tarballByte, _ := os.ReadFile("test/empty_tarball/empty.tar.gz") _, err := DecompressPipelineTarball(tarballByte) assert.NotNil(t, err) assert.Contains(t, err.Error(), "Not a valid tarball file") } func TestDecompressPipelineZip(t *testing.T) { - zipByte, _ := ioutil.ReadFile("test/arguments_zip/arguments-parameters.zip") + zipByte, _ := os.ReadFile("test/arguments_zip/arguments-parameters.zip") pipelineFile, err := DecompressPipelineZip(zipByte) assert.Nil(t, err) - expectedPipelineFile, _ := ioutil.ReadFile("test/arguments-parameters.yaml") + expectedPipelineFile, _ := os.ReadFile("test/arguments-parameters.yaml") assert.Equal(t, expectedPipelineFile, pipelineFile) } func TestDecompressPipelineZip_MalformattedZip(t *testing.T) { - zipByte, _ := ioutil.ReadFile("test/malformatted_zip.zip") + zipByte, _ := os.ReadFile("test/malformatted_zip.zip") _, err := DecompressPipelineZip(zipByte) assert.NotNil(t, err) assert.Contains(t, err.Error(), "Not a valid zip file") } func TestDecompressPipelineZip_MalformedZip2(t *testing.T) { - zipByte, _ := ioutil.ReadFile("test/malformed_zip2.zip") + zipByte, _ := os.ReadFile("test/malformed_zip2.zip") _, err := DecompressPipelineZip(zipByte) assert.NotNil(t, err) assert.Contains(t, err.Error(), "Not a valid zip file") } func TestDecompressPipelineZip_NonYamlZip(t *testing.T) { - zipByte, _ := ioutil.ReadFile("test/non_yaml_zip/non_yaml_file.zip") + zipByte, _ := os.ReadFile("test/non_yaml_zip/non_yaml_file.zip") _, err := DecompressPipelineZip(zipByte) assert.NotNil(t, err) assert.Contains(t, err.Error(), "Expecting a pipeline.yaml file inside the zip") } func TestDecompressPipelineZip_EmptyZip(t *testing.T) { - zipByte, _ := ioutil.ReadFile("test/empty_tarball/empty.zip") + zipByte, _ := os.ReadFile("test/empty_tarball/empty.zip") _, err := DecompressPipelineZip(zipByte) assert.NotNil(t, err) assert.Contains(t, err.Error(), "Not a valid zip file") @@ -118,7 +117,7 @@ func TestReadPipelineFile_YAML(t *testing.T) { fileBytes, err := ReadPipelineFile("arguments-parameters.yaml", file, common.MaxFileLength) assert.Nil(t, err) - expectedFileBytes, _ := ioutil.ReadFile("test/arguments-parameters.yaml") + expectedFileBytes, _ := os.ReadFile("test/arguments-parameters.yaml") assert.Equal(t, expectedFileBytes, fileBytes) } @@ -127,7 +126,7 @@ func TestReadPipelineFile_JSON(t *testing.T) { fileBytes, err := ReadPipelineFile("v2-hello-world.json", file, common.MaxFileLength) assert.Nil(t, err) - expectedFileBytes, _ := ioutil.ReadFile("test/v2-hello-world.json") + expectedFileBytes, _ := os.ReadFile("test/v2-hello-world.json") assert.Equal(t, expectedFileBytes, fileBytes) } @@ -136,7 +135,7 @@ func TestReadPipelineFile_Zip(t *testing.T) { pipelineFile, err := ReadPipelineFile("arguments-parameters.zip", file, common.MaxFileLength) assert.Nil(t, err) - expectedPipelineFile, _ := ioutil.ReadFile("test/arguments-parameters.yaml") + expectedPipelineFile, _ := os.ReadFile("test/arguments-parameters.yaml") assert.Equal(t, expectedPipelineFile, pipelineFile) } @@ -145,7 +144,7 @@ func TestReadPipelineFile_Zip_AnyExtension(t *testing.T) { pipelineFile, err := ReadPipelineFile("arguments-parameters.pipeline", file, common.MaxFileLength) assert.Nil(t, err) - expectedPipelineFile, _ := ioutil.ReadFile("test/arguments-parameters.yaml") + expectedPipelineFile, _ := os.ReadFile("test/arguments-parameters.yaml") assert.Equal(t, expectedPipelineFile, pipelineFile) } @@ -154,7 +153,7 @@ func TestReadPipelineFile_MultifileZip(t *testing.T) { pipelineFile, err := ReadPipelineFile("pipeline_plus_component.ai-hub-package", file, common.MaxFileLength) assert.Nil(t, err) - expectedPipelineFile, _ := ioutil.ReadFile("test/pipeline_plus_component/pipeline.yaml") + expectedPipelineFile, _ := os.ReadFile("test/pipeline_plus_component/pipeline.yaml") assert.Equal(t, expectedPipelineFile, pipelineFile) } @@ -163,7 +162,7 @@ func TestReadPipelineFile_Tarball(t *testing.T) { pipelineFile, err := ReadPipelineFile("arguments.tar.gz", file, common.MaxFileLength) assert.Nil(t, err) - expectedPipelineFile, _ := ioutil.ReadFile("test/arguments-parameters.yaml") + expectedPipelineFile, _ := os.ReadFile("test/arguments-parameters.yaml") assert.Equal(t, expectedPipelineFile, pipelineFile) } @@ -172,7 +171,7 @@ func TestReadPipelineFile_Tarball_AnyExtension(t *testing.T) { pipelineFile, err := ReadPipelineFile("arguments.pipeline", file, common.MaxFileLength) assert.Nil(t, err) - expectedPipelineFile, _ := ioutil.ReadFile("test/arguments-parameters.yaml") + expectedPipelineFile, _ := os.ReadFile("test/arguments-parameters.yaml") assert.Equal(t, expectedPipelineFile, pipelineFile) } @@ -181,7 +180,7 @@ func TestReadPipelineFile_MultifileTarball(t *testing.T) { pipelineFile, err := ReadPipelineFile("pipeline_plus_component.ai-hub-package", file, common.MaxFileLength) assert.Nil(t, err) - expectedPipelineFile, _ := ioutil.ReadFile("test/pipeline_plus_component/pipeline.yaml") + expectedPipelineFile, _ := os.ReadFile("test/pipeline_plus_component/pipeline.yaml") assert.Equal(t, expectedPipelineFile, pipelineFile) } diff --git a/backend/src/apiserver/server/visualization_server.go b/backend/src/apiserver/server/visualization_server.go index 31f6094daa2d..7ff4cf9356ac 100644 --- a/backend/src/apiserver/server/visualization_server.go +++ b/backend/src/apiserver/server/visualization_server.go @@ -18,7 +18,7 @@ import ( "context" "encoding/json" "fmt" - "io/ioutil" + "io" "net/http" "net/url" "strings" @@ -120,7 +120,7 @@ func (s *VisualizationServer) generateVisualizationFromRequest(request *go_clien return nil, fmt.Errorf(resp.Status) } defer resp.Body.Close() - body, err := ioutil.ReadAll(resp.Body) + body, err := io.ReadAll(resp.Body) if err != nil { return nil, util.Wrap(err, "Unable to parse visualization response") } diff --git a/backend/src/apiserver/storage/pipeline_store.go b/backend/src/apiserver/storage/pipeline_store.go index e085e0f3665b..0d4e016007c7 100644 --- a/backend/src/apiserver/storage/pipeline_store.go +++ b/backend/src/apiserver/storage/pipeline_store.go @@ -17,7 +17,6 @@ package storage import ( "database/sql" "fmt" - sq "github.com/Masterminds/squirrel" "github.com/golang/glog" "github.com/kubeflow/pipelines/backend/src/apiserver/list" @@ -100,6 +99,7 @@ type PipelineStoreInterface interface { CreatePipelineVersion(pipelineVersion *model.PipelineVersion) (*model.PipelineVersion, error) GetPipelineVersionWithStatus(pipelineVersionId string, status model.PipelineVersionStatus) (*model.PipelineVersion, error) GetPipelineVersion(pipelineVersionId string) (*model.PipelineVersion, error) + GetPipelineVersionByName(name string) (*model.PipelineVersion, error) GetLatestPipelineVersion(pipelineId string) (*model.PipelineVersion, error) ListPipelineVersions(pipelineId string, opts *list.Options) ([]*model.PipelineVersion, int, string, error) UpdatePipelineVersionStatus(pipelineVersionId string, status model.PipelineVersionStatus) error @@ -822,33 +822,45 @@ func (s *PipelineStore) GetPipelineVersion(versionId string) (*model.PipelineVer return s.GetPipelineVersionWithStatus(versionId, model.PipelineVersionReady) } +func (s *PipelineStore) GetPipelineVersionByName(name string) (*model.PipelineVersion, error) { + return s.getPipelineVersionByCol("Name", name, model.PipelineVersionReady) +} + // Returns a pipeline version with specified status. func (s *PipelineStore) GetPipelineVersionWithStatus(versionId string, status model.PipelineVersionStatus) (*model.PipelineVersion, error) { + return s.getPipelineVersionByCol("UUID", versionId, status) +} + +// getPipelineVersionByCol retrieves a PipelineVersion filtered on +// colName with colVal and the given status. This is particularly +// useful for fetching pipeline Version by either UUID or Name columns. +func (s *PipelineStore) getPipelineVersionByCol(colName, colVal string, status model.PipelineVersionStatus) (*model.PipelineVersion, error) { // Prepare a SQL query sql, args, err := sq. Select(pipelineVersionColumns...). From("pipeline_versions"). - Where(sq.And{sq.Eq{"pipeline_versions.UUID": versionId}, sq.Eq{"pipeline_versions.Status": status}}). + Where(sq.And{ + sq.Eq{fmt.Sprintf("pipeline_versions.%s", colName): colVal}, sq.Eq{"pipeline_versions.Status": status}}). Limit(1). ToSql() if err != nil { - return nil, util.NewInternalServerError(err, "Failed to create query to fetch a pipeline version %v with status %v", versionId, string(status)) + return nil, util.NewInternalServerError(err, "Failed to create query to fetch a pipeline version with %v=%v and status=%v", colName, colVal, string(status)) } // Execute the query r, err := s.db.Query(sql, args...) if err != nil { - return nil, util.NewInternalServerError(err, "Failed fetching pipeline version %v with status %v", versionId, string(status)) + return nil, util.NewInternalServerError(err, "Failed fetching pipeline version with %v=%v and status=%v", colName, colVal, string(status)) } defer r.Close() // Parse results versions, err := s.scanPipelineVersionsRows(r) if err != nil || len(versions) > 1 { - return nil, util.NewInternalServerError(err, "Failed to parse a pipeline version %v from SQL response with status %v", versionId, string(status)) + return nil, util.NewInternalServerError(err, "Failed to parse a pipeline version from SQL response with %v=%v and status=%v", colName, colVal, string(status)) } if len(versions) == 0 { - return nil, util.NewResourceNotFoundError("PipelineVersion", versionId) + return nil, util.NewResourceNotFoundError("PipelineVersion", colVal) } return versions[0], nil } diff --git a/backend/src/apiserver/template/argo_template.go b/backend/src/apiserver/template/argo_template.go index 90a04f6bd5df..721d9cd8fc39 100644 --- a/backend/src/apiserver/template/argo_template.go +++ b/backend/src/apiserver/template/argo_template.go @@ -23,7 +23,6 @@ import ( "github.com/kubeflow/pipelines/backend/src/apiserver/model" "github.com/kubeflow/pipelines/backend/src/common/util" scheduledworkflow "github.com/kubeflow/pipelines/backend/src/crd/pkg/apis/scheduledworkflow/v1beta1" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "sigs.k8s.io/yaml" ) @@ -113,10 +112,6 @@ func (t *Argo) ScheduledWorkflow(modelJob *model.Job) (*scheduledworkflow.Schedu setDefaultServiceAccount(workflow, modelJob.ServiceAccount) // Disable istio sidecar injection if not specified workflow.SetAnnotationsToAllTemplatesIfKeyNotExist(util.AnnotationKeyIstioSidecarInject, util.AnnotationValueIstioSidecarInjectDisabled) - swfGeneratedName, err := toSWFCRDResourceGeneratedName(modelJob.K8SName) - if err != nil { - return nil, util.Wrap(err, "Create job failed") - } // Marking auto-added artifacts as optional. Otherwise most older workflows will start failing after upgrade to Argo 2.3. // TODO: Fix the components to explicitly declare the artifacts they really output. @@ -127,28 +122,17 @@ func (t *Argo) ScheduledWorkflow(modelJob *model.Job) (*scheduledworkflow.Schedu if err != nil { return nil, util.Wrap(err, "Failed to convert v1 parameters to CRD parameters") } - crdTrigger, err := modelToCRDTrigger(modelJob.Trigger) + + scheduledWorkflow, err := NewGenericScheduledWorkflow(modelJob) if err != nil { return nil, err } - scheduledWorkflow := &scheduledworkflow.ScheduledWorkflow{ - TypeMeta: metav1.TypeMeta{ - APIVersion: "kubeflow.org/v1beta1", - Kind: "ScheduledWorkflow", - }, - ObjectMeta: metav1.ObjectMeta{GenerateName: swfGeneratedName}, - Spec: scheduledworkflow.ScheduledWorkflowSpec{ - Enabled: modelJob.Enabled, - MaxConcurrency: &modelJob.MaxConcurrency, - Trigger: crdTrigger, - Workflow: &scheduledworkflow.WorkflowResource{ - Parameters: swfParameters, - Spec: workflow.ToStringForSchedule(), - }, - NoCatchup: util.BoolPointer(modelJob.NoCatchup), - }, + scheduledWorkflow.Spec.Workflow = &scheduledworkflow.WorkflowResource{ + Parameters: swfParameters, + Spec: workflow.ToStringForSchedule(), } + return scheduledWorkflow, nil } diff --git a/backend/src/apiserver/template/template.go b/backend/src/apiserver/template/template.go index 738838c1651c..f793dbc646fc 100644 --- a/backend/src/apiserver/template/template.go +++ b/backend/src/apiserver/template/template.go @@ -169,7 +169,7 @@ func modelToPipelineJobRuntimeConfig(modelRuntimeConfig *model.RuntimeConfig) (* // Assumes that the serialized parameters will take a form of // map[string]*structpb.Value, which works for runtimeConfig.Parameters such as // {"param1":"value1","param2":"value2"}. -func stringMapToCRDParameters(modelParams string) ([]scheduledworkflow.Parameter, error) { +func StringMapToCRDParameters(modelParams string) ([]scheduledworkflow.Parameter, error) { var swParams []scheduledworkflow.Parameter var parameters map[string]*structpb.Value if modelParams == "" { diff --git a/backend/src/apiserver/template/template_test.go b/backend/src/apiserver/template/template_test.go index 27c9817cb605..db266ccf2594 100644 --- a/backend/src/apiserver/template/template_test.go +++ b/backend/src/apiserver/template/template_test.go @@ -16,7 +16,7 @@ package template import ( "encoding/json" - "io/ioutil" + "os" "strings" "testing" "time" @@ -255,7 +255,7 @@ func TestModelToCRDTrigger_Cron(t *testing.T) { } func loadYaml(t *testing.T, path string) string { - res, err := ioutil.ReadFile(path) + res, err := os.ReadFile(path) if err != nil { t.Error(err) } diff --git a/backend/src/apiserver/template/v2_template.go b/backend/src/apiserver/template/v2_template.go index 1055bcdf8a97..df2ff9e3a13a 100644 --- a/backend/src/apiserver/template/v2_template.go +++ b/backend/src/apiserver/template/v2_template.go @@ -41,9 +41,38 @@ type V2Spec struct { platformSpec *pipelinespec.PlatformSpec } -var ( - Launcher = "" -) +var Launcher = "" + +func NewGenericScheduledWorkflow(modelJob *model.Job) (*scheduledworkflow.ScheduledWorkflow, error) { + swfGeneratedName, err := toSWFCRDResourceGeneratedName(modelJob.K8SName) + if err != nil { + return nil, util.Wrap(err, "Create job failed") + } + + crdTrigger, err := modelToCRDTrigger(modelJob.Trigger) + if err != nil { + return nil, util.Wrap(err, "converting model trigger to crd trigger failed") + } + + return &scheduledworkflow.ScheduledWorkflow{ + TypeMeta: metav1.TypeMeta{ + APIVersion: "kubeflow.org/v2beta1", + Kind: "ScheduledWorkflow", + }, + ObjectMeta: metav1.ObjectMeta{GenerateName: swfGeneratedName}, + Spec: scheduledworkflow.ScheduledWorkflowSpec{ + Enabled: modelJob.Enabled, + MaxConcurrency: &modelJob.MaxConcurrency, + Trigger: crdTrigger, + NoCatchup: util.BoolPointer(modelJob.NoCatchup), + ExperimentId: modelJob.ExperimentId, + PipelineId: modelJob.PipelineId, + PipelineName: modelJob.PipelineName, + PipelineVersionId: modelJob.PipelineVersionId, + ServiceAccount: modelJob.ServiceAccount, + }, + }, nil +} // Converts modelJob to ScheduledWorkflow. func (t *V2Spec) ScheduledWorkflow(modelJob *model.Job) (*scheduledworkflow.ScheduledWorkflow, error) { @@ -102,41 +131,23 @@ func (t *V2Spec) ScheduledWorkflow(modelJob *model.Job) (*scheduledworkflow.Sche } // Disable istio sidecar injection if not specified executionSpec.SetAnnotationsToAllTemplatesIfKeyNotExist(util.AnnotationKeyIstioSidecarInject, util.AnnotationValueIstioSidecarInjectDisabled) - swfGeneratedName, err := toSWFCRDResourceGeneratedName(modelJob.K8SName) - if err != nil { - return nil, util.Wrap(err, "Create job failed") - } - parameters, err := stringMapToCRDParameters(modelJob.RuntimeConfig.Parameters) + parameters, err := StringMapToCRDParameters(modelJob.RuntimeConfig.Parameters) if err != nil { return nil, util.Wrap(err, "Converting runtime config's parameters to CDR parameters failed") } - crdTrigger, err := modelToCRDTrigger(modelJob.Trigger) + + scheduledWorkflow, err := NewGenericScheduledWorkflow(modelJob) if err != nil { - return nil, util.Wrap(err, "converting model trigger to crd trigger failed") + return nil, err } - scheduledWorkflow := &scheduledworkflow.ScheduledWorkflow{ - TypeMeta: metav1.TypeMeta{ - APIVersion: "kubeflow.org/v2beta1", - Kind: "ScheduledWorkflow", - }, - ObjectMeta: metav1.ObjectMeta{GenerateName: swfGeneratedName}, - Spec: scheduledworkflow.ScheduledWorkflowSpec{ - Enabled: modelJob.Enabled, - MaxConcurrency: &modelJob.MaxConcurrency, - Trigger: crdTrigger, - Workflow: &scheduledworkflow.WorkflowResource{ - Parameters: parameters, - Spec: executionSpec.ToStringForSchedule(), - }, - NoCatchup: util.BoolPointer(modelJob.NoCatchup), - ExperimentId: modelJob.ExperimentId, - PipelineId: modelJob.PipelineId, - PipelineName: modelJob.PipelineName, - PipelineVersionId: modelJob.PipelineVersionId, - ServiceAccount: executionSpec.ServiceAccount(), - }, + scheduledWorkflow.Spec.Workflow = &scheduledworkflow.WorkflowResource{ + Parameters: parameters, + Spec: executionSpec.ToStringForSchedule(), } + + scheduledWorkflow.Spec.ServiceAccount = executionSpec.ServiceAccount() + return scheduledWorkflow, nil } diff --git a/backend/src/apiserver/visualization/exporter.py b/backend/src/apiserver/visualization/exporter.py index 757be271cc6d..c115c2f11242 100644 --- a/backend/src/apiserver/visualization/exporter.py +++ b/backend/src/apiserver/visualization/exporter.py @@ -143,11 +143,10 @@ def generate_html_from_notebook(self, nb: NotebookNode) -> Text: """ # HTML generator and exporter object - html_exporter = HTMLExporter() template_file = "templates/{}.tpl".format(self.template_type.value) - html_exporter.template_file = str(Path.cwd() / template_file) # Output generator self.ep.preprocess(nb, {"metadata": {"path": Path.cwd()}}, self.km) + html_exporter = HTMLExporter(template_file=str(Path.cwd() / template_file)) # Export all html and outputs body, _ = html_exporter.from_notebook_node(nb, resources={}) return body diff --git a/backend/src/apiserver/visualization/requirements.in b/backend/src/apiserver/visualization/requirements.in index 4639a05a2f6b..e24773cf61d5 100644 --- a/backend/src/apiserver/visualization/requirements.in +++ b/backend/src/apiserver/visualization/requirements.in @@ -4,10 +4,10 @@ google-api-python-client==1.7.* itables==0.1.0 ipykernel==5.1.1 ipython==7.12.0 -jinja2==2.11.3 -jupyter_client==5.3.* +Jinja2>=3.1.2,<4 +jupyter-client==8.6.3 markupsafe==2.0.1 -nbconvert==5.5.0 +nbconvert==7.16.5 nbformat==5.10.4 scikit-learn==0.24.2 tensorflow==2.10.1 @@ -16,4 +16,3 @@ tensorflow-model-analysis==0.40.* tensorflow-data-validation==1.9.* tensorflow-serving-api==2.10.1 tornado==6.* -mistune<2.0.0 \ No newline at end of file diff --git a/backend/src/apiserver/visualization/requirements.txt b/backend/src/apiserver/visualization/requirements.txt index e57613c77bc2..fa15911aca81 100644 --- a/backend/src/apiserver/visualization/requirements.txt +++ b/backend/src/apiserver/visualization/requirements.txt @@ -1,5 +1,5 @@ # -# This file is autogenerated by pip-compile with Python 3.9 +# This file is autogenerated by pip-compile with Python 3.8 # by the following command: # # pip-compile --output-file=- --resolver=backtracking - @@ -12,40 +12,58 @@ absl-py==1.4.0 # tensorflow-metadata # tensorflow-model-analysis # tfx-bsl +anyio==4.5.2 + # via + # httpx + # jupyter-server apache-beam[gcp]==2.46.0 # via + # apache-beam # tensorflow-data-validation # tensorflow-model-analysis # tfx-bsl argon2-cffi==23.1.0 - # via notebook + # via jupyter-server argon2-cffi-bindings==21.2.0 # via argon2-cffi +arrow==1.3.0 + # via isoduration astunparse==1.6.3 # via tensorflow -attrs==23.1.0 +async-lru==2.0.4 + # via jupyterlab +attrs==24.3.0 # via # jsonschema # referencing +babel==2.16.0 + # via jupyterlab-server backcall==0.2.0 # via ipython -bleach==6.0.0 +beautifulsoup4==4.12.3 # via nbconvert +bleach[css]==6.1.0 + # via + # bleach + # nbconvert bokeh==1.2.0 - # via -r requirements.in + # via -r - cachetools==4.2.4 # via # apache-beam # google-auth -certifi==2023.7.22 - # via requests -cffi==1.15.1 +certifi==2024.12.14 + # via + # httpcore + # httpx + # requests +cffi==1.17.1 # via argon2-cffi-bindings -charset-normalizer==3.2.0 +charset-normalizer==3.4.1 # via requests cloudpickle==2.2.1 # via apache-beam -comm==0.1.4 +comm==0.2.2 # via ipywidgets crcmod==1.7 # via apache-beam @@ -59,24 +77,27 @@ dill==0.3.1.1 # via apache-beam docopt==0.6.2 # via hdfs -entrypoints==0.4 - # via nbconvert -fastavro==1.8.3 +exceptiongroup==1.2.2 + # via anyio +fastavro==1.9.7 # via apache-beam fasteners==0.19 # via # apache-beam # google-apitools -fastjsonschema==2.20.0 +fastjsonschema==2.21.1 # via nbformat -flatbuffers==23.5.26 +flatbuffers==24.12.23 # via tensorflow +fqdn==1.5.1 + # via jsonschema gast==0.4.0 # via tensorflow gcsfs==0.2.3 - # via -r requirements.in -google-api-core[grpc]==2.11.1 + # via -r - +google-api-core[grpc]==2.24.0 # via + # google-api-core # google-cloud-bigquery # google-cloud-bigquery-storage # google-cloud-bigtable @@ -92,11 +113,11 @@ google-api-core[grpc]==2.11.1 # google-cloud-vision google-api-python-client==1.7.12 # via - # -r requirements.in + # -r - # tfx-bsl google-apitools==0.5.31 # via apache-beam -google-auth==2.23.0 +google-auth==2.37.0 # via # apache-beam # gcsfs @@ -104,7 +125,11 @@ google-auth==2.23.0 # google-api-python-client # google-auth-httplib2 # google-auth-oauthlib + # google-cloud-bigquery # google-cloud-core + # google-cloud-dlp + # google-cloud-pubsub + # google-cloud-vision # tensorboard google-auth-httplib2==0.1.1 # via @@ -114,13 +139,13 @@ google-auth-oauthlib==0.4.6 # via # gcsfs # tensorboard -google-cloud-bigquery==3.11.4 +google-cloud-bigquery==3.27.0 # via apache-beam google-cloud-bigquery-storage==2.16.2 # via apache-beam google-cloud-bigtable==1.7.3 # via apache-beam -google-cloud-core==2.3.3 +google-cloud-core==2.4.1 # via # apache-beam # google-cloud-bigquery @@ -129,50 +154,52 @@ google-cloud-core==2.3.3 # google-cloud-spanner google-cloud-datastore==1.15.5 # via apache-beam -google-cloud-dlp==3.12.3 +google-cloud-dlp==3.18.0 # via apache-beam google-cloud-language==1.3.2 # via apache-beam -google-cloud-pubsub==2.18.4 +google-cloud-pubsub==2.21.4 # via # apache-beam # google-cloud-pubsublite -google-cloud-pubsublite==1.8.3 +google-cloud-pubsublite==1.11.1 # via apache-beam google-cloud-recommendations-ai==0.7.1 # via apache-beam -google-cloud-spanner==3.40.1 +google-cloud-spanner==3.46.0 # via apache-beam google-cloud-videointelligence==1.16.3 # via apache-beam -google-cloud-vision==3.4.4 +google-cloud-vision==3.7.2 # via apache-beam google-crc32c==1.5.0 # via google-resumable-media google-pasta==0.2.0 # via tensorflow -google-resumable-media==2.6.0 +google-resumable-media==2.7.2 # via google-cloud-bigquery -googleapis-common-protos[grpc]==1.60.0 +googleapis-common-protos[grpc]==1.63.1 # via # google-api-core # grpc-google-iam-v1 # grpcio-status # tensorflow-metadata -grpc-google-iam-v1==0.12.6 +grpc-google-iam-v1==0.12.7 # via # google-cloud-bigtable # google-cloud-pubsub # google-cloud-spanner -grpcio==1.58.0 +grpc-interceptor==0.15.4 + # via google-cloud-spanner +grpcio==1.69.0 # via # apache-beam # google-api-core - # google-cloud-bigquery # google-cloud-pubsub # google-cloud-pubsublite # googleapis-common-protos # grpc-google-iam-v1 + # grpc-interceptor # grpcio-status # tensorboard # tensorflow @@ -182,10 +209,14 @@ grpcio-status==1.48.2 # google-api-core # google-cloud-pubsub # google-cloud-pubsublite -h5py==3.9.0 +h11==0.14.0 + # via httpcore +h5py==3.11.0 # via tensorflow -hdfs==2.7.2 +hdfs==2.7.3 # via apache-beam +httpcore==1.0.7 + # via httpx httplib2==0.21.0 # via # apache-beam @@ -193,93 +224,146 @@ httplib2==0.21.0 # google-apitools # google-auth-httplib2 # oauth2client -idna==3.4 - # via requests -importlib-metadata==6.8.0 - # via markdown +httpx==0.28.1 + # via jupyterlab +idna==3.10 + # via + # anyio + # httpx + # jsonschema + # requests +importlib-metadata==8.5.0 + # via + # jupyter-client + # jupyter-lsp + # jupyterlab + # jupyterlab-server + # markdown + # nbconvert +importlib-resources==6.4.5 + # via + # jsonschema + # jsonschema-specifications + # jupyterlab ipykernel==5.1.1 # via - # -r requirements.in - # notebook + # -r - + # jupyterlab ipython==7.12.0 # via - # -r requirements.in + # -r - # ipykernel # ipywidgets # tensorflow-model-analysis ipython-genutils==0.2.0 - # via - # ipywidgets - # notebook -ipywidgets==7.8.1 + # via ipywidgets +ipywidgets==7.8.5 # via tensorflow-model-analysis +isoduration==20.11.0 + # via jsonschema itables==0.1.0 - # via -r requirements.in -jedi==0.19.0 + # via -r - +jedi==0.19.2 # via ipython -jinja2==2.11.3 +jinja2==3.1.5 # via - # -r requirements.in + # -r - # bokeh + # jupyter-server + # jupyterlab + # jupyterlab-server # nbconvert - # notebook joblib==0.14.1 # via # scikit-learn # tensorflow-data-validation -jsonschema==4.19.1 - # via nbformat -jsonschema-specifications==2023.7.1 +json5==0.10.0 + # via jupyterlab-server +jsonpointer==3.0.0 + # via jsonschema +jsonschema[format-nongpl]==4.23.0 + # via + # jupyter-events + # jupyterlab-server + # nbformat +jsonschema-specifications==2023.12.1 # via jsonschema -jupyter-client==5.3.5 +jupyter-client==8.6.3 # via - # -r requirements.in + # -r - # ipykernel - # notebook -jupyter-core==5.3.1 + # jupyter-server + # nbclient +jupyter-core==5.7.2 # via # jupyter-client + # jupyter-server + # jupyterlab + # nbclient # nbconvert # nbformat +jupyter-events==0.10.0 + # via jupyter-server +jupyter-lsp==2.2.5 + # via jupyterlab +jupyter-server==2.14.2 + # via + # jupyter-lsp + # jupyterlab + # jupyterlab-server + # notebook + # notebook-shim +jupyter-server-terminals==0.5.3 + # via jupyter-server +jupyterlab==4.1.5 + # via notebook +jupyterlab-pygments==0.3.0 + # via nbconvert +jupyterlab-server==2.27.3 + # via + # jupyterlab # notebook -jupyterlab-widgets==1.1.7 +jupyterlab-widgets==1.1.11 # via ipywidgets keras==2.10.0 # via tensorflow keras-preprocessing==1.1.2 # via tensorflow -libclang==16.0.6 +libclang==18.1.1 # via tensorflow -markdown==3.4.4 +markdown==3.7 # via tensorboard markupsafe==2.0.1 # via - # -r requirements.in + # -r - # jinja2 -mistune==0.8.4 - # via - # -r requirements.in # nbconvert -nbconvert==5.5.0 +mistune==3.1.0 + # via nbconvert +nbclient==0.10.1 + # via nbconvert +nbconvert==7.16.5 # via - # -r requirements.in - # notebook + # -r - + # jupyter-server nbformat==5.10.4 # via - # -r requirements.in + # -r - + # jupyter-server + # nbclient # nbconvert - # notebook -nest-asyncio==1.5.8 - # via notebook -notebook==6.4.13 +notebook==7.1.3 # via widgetsnbextension +notebook-shim==0.2.4 + # via + # jupyterlab + # notebook numpy==1.24.4 # via # apache-beam # bokeh # h5py # keras-preprocessing - # opt-einsum # pandas # pyarrow # scikit-learn @@ -295,16 +379,22 @@ oauthlib==3.2.2 # via requests-oauthlib objsize==0.6.1 # via apache-beam -opt-einsum==3.3.0 +opt-einsum==3.4.0 # via tensorflow -orjson==3.9.7 +orjson==3.10.14 # via apache-beam -overrides==6.5.0 - # via google-cloud-pubsublite -packaging==23.1 +overrides==7.7.0 + # via + # google-cloud-pubsublite + # jupyter-server +packaging==24.2 # via # bokeh # google-cloud-bigquery + # jupyter-server + # jupyterlab + # jupyterlab-server + # nbconvert # tensorflow pandas==1.5.3 # via @@ -312,26 +402,28 @@ pandas==1.5.3 # tensorflow-data-validation # tensorflow-model-analysis # tfx-bsl -pandocfilters==1.5.0 +pandocfilters==1.5.1 # via nbconvert -parso==0.8.3 +parso==0.8.4 # via jedi -pexpect==4.8.0 +pexpect==4.9.0 # via ipython pickleshare==0.7.5 # via ipython -pillow==10.3.0 +pillow==10.4.0 # via bokeh -platformdirs==3.10.0 +pkgutil-resolve-name==1.3.10 + # via jsonschema +platformdirs==4.3.6 # via jupyter-core -prometheus-client==0.17.1 - # via notebook -prompt-toolkit==3.0.39 +prometheus-client==0.21.1 + # via jupyter-server +prompt-toolkit==3.0.48 # via ipython -proto-plus==1.22.3 +proto-plus==1.25.0 # via # apache-beam - # google-cloud-bigquery + # google-api-core # google-cloud-bigquery-storage # google-cloud-dlp # google-cloud-pubsub @@ -342,7 +434,6 @@ protobuf==3.19.6 # via # apache-beam # google-api-core - # google-cloud-bigquery # google-cloud-bigquery-storage # google-cloud-bigtable # google-cloud-datastore @@ -374,66 +465,82 @@ pyarrow==5.0.0 # tensorflow-data-validation # tensorflow-model-analysis # tfx-bsl -pyasn1==0.5.0 +pyasn1==0.6.1 # via # oauth2client # pyasn1-modules # rsa -pyasn1-modules==0.3.0 +pyasn1-modules==0.4.1 # via # google-auth # oauth2client -pycparser==2.21 +pycparser==2.22 # via cffi pydot==1.4.2 # via apache-beam pyfarmhash==0.3.2 # via tensorflow-data-validation -pygments==2.16.1 +pygments==2.19.1 # via # ipython # nbconvert pymongo==3.13.0 # via apache-beam -pyparsing==3.1.1 +pyparsing==3.1.4 # via # httplib2 # pydot -python-dateutil==2.8.2 +python-dateutil==2.9.0.post0 # via # apache-beam + # arrow # bokeh # google-cloud-bigquery # jupyter-client # pandas -pytz==2023.3.post1 +python-json-logger==3.2.1 + # via jupyter-events +pytz==2024.2 # via # apache-beam + # babel # pandas -pyyaml==6.0.1 - # via bokeh -pyzmq==25.1.1 +pyyaml==6.0.2 + # via + # bokeh + # jupyter-events +pyzmq==26.2.0 # via # jupyter-client - # notebook -referencing==0.30.2 + # jupyter-server +referencing==0.35.1 # via # jsonschema # jsonschema-specifications -regex==2023.8.8 + # jupyter-events +regex==2024.11.6 # via apache-beam -requests==2.32.2 +requests==2.32.3 # via # apache-beam # gcsfs # google-api-core # google-cloud-bigquery # hdfs + # jupyterlab-server # requests-oauthlib # tensorboard -requests-oauthlib==1.3.1 +requests-oauthlib==2.0.0 # via google-auth-oauthlib -rpds-py==0.10.3 +rfc3339-validator==0.1.4 + # via + # jsonschema + # jupyter-events +rfc3986-validator==0.1.1 + # via + # jsonschema + # jupyter-events +rpds-py==0.20.1 # via # jsonschema # referencing @@ -442,14 +549,14 @@ rsa==4.9 # google-auth # oauth2client scikit-learn==0.24.2 - # via -r requirements.in + # via -r - scipy==1.10.1 # via # scikit-learn # tensorflow-model-analysis -send2trash==1.8.2 - # via notebook -six==1.16.0 +send2trash==1.8.3 + # via jupyter-server +six==1.17.0 # via # astunparse # bleach @@ -461,10 +568,15 @@ six==1.16.0 # keras-preprocessing # oauth2client # python-dateutil + # rfc3339-validator # tensorflow # tensorflow-data-validation # tensorflow-model-analysis -sqlparse==0.5.0 +sniffio==1.3.1 + # via anyio +soupsieve==2.6 + # via beautifulsoup4 +sqlparse==0.5.3 # via google-cloud-spanner tensorboard==2.10.1 # via tensorflow @@ -474,50 +586,56 @@ tensorboard-plugin-wit==1.8.1 # via tensorboard tensorflow==2.10.1 # via - # -r requirements.in + # -r - # tensorflow-data-validation # tensorflow-model-analysis # tensorflow-serving-api # tfx-bsl tensorflow-data-validation==1.9.0 - # via -r requirements.in + # via -r - tensorflow-estimator==2.10.0 # via tensorflow tensorflow-io-gcs-filesystem==0.34.0 # via tensorflow tensorflow-metadata==1.9.0 # via - # -r requirements.in + # -r - # tensorflow-data-validation # tensorflow-model-analysis # tfx-bsl tensorflow-model-analysis==0.40.0 - # via -r requirements.in + # via -r - tensorflow-serving-api==2.10.1 # via - # -r requirements.in + # -r - # tfx-bsl -termcolor==2.3.0 +termcolor==2.4.0 # via tensorflow -terminado==0.17.1 - # via notebook -testpath==0.6.0 - # via nbconvert +terminado==0.18.1 + # via + # jupyter-server + # jupyter-server-terminals tfx-bsl==1.9.0 # via # tensorflow-data-validation # tensorflow-model-analysis -threadpoolctl==3.2.0 +threadpoolctl==3.5.0 # via scikit-learn +tinycss2==1.2.1 + # via bleach +tomli==2.2.1 + # via jupyterlab tornado==6.4.2 # via - # -r requirements.in + # -r - # bokeh # ipykernel # jupyter-client + # jupyter-server + # jupyterlab # notebook # terminado -traitlets==5.10.0 +traitlets==5.14.3 # via # comm # ipykernel @@ -525,36 +643,53 @@ traitlets==5.10.0 # ipywidgets # jupyter-client # jupyter-core + # jupyter-events + # jupyter-server + # jupyterlab + # nbclient # nbconvert # nbformat - # notebook -typing-extensions==4.8.0 +types-python-dateutil==2.9.0.20241206 + # via arrow +typing-extensions==4.12.2 # via + # anyio # apache-beam + # async-lru + # mistune + # python-json-logger # tensorflow +uri-template==1.3.0 + # via jsonschema uritemplate==3.0.1 # via google-api-python-client -urllib3==1.26.16 - # via - # google-auth - # requests -wcwidth==0.2.6 +urllib3==2.2.3 + # via requests +wcwidth==0.2.13 # via prompt-toolkit +webcolors==24.8.0 + # via jsonschema webencodings==0.5.1 - # via bleach + # via + # bleach + # tinycss2 +websocket-client==1.8.0 + # via jupyter-server werkzeug==2.1.2 # via tensorboard -wheel==0.41.2 +wheel==0.45.1 # via # astunparse # tensorboard -widgetsnbextension==3.6.6 +widgetsnbextension==3.6.10 # via ipywidgets -wrapt==1.15.0 +wrapt==1.17.2 # via tensorflow -zipp==3.17.0 - # via importlib-metadata -zstandard==0.21.0 +zipp==3.20.2 + # via + # importlib-metadata + # importlib-resources +zstandard==0.23.0 # via apache-beam # The following packages are considered to be unsafe in a requirements file: diff --git a/backend/src/apiserver/visualization/snapshots/snap_test_exporter.py b/backend/src/apiserver/visualization/snapshots/snap_test_exporter.py index c28e506ad1b3..a1d1234244ce 100644 --- a/backend/src/apiserver/visualization/snapshots/snap_test_exporter.py +++ b/backend/src/apiserver/visualization/snapshots/snap_test_exporter.py @@ -7,30 +7,19 @@ snapshots = Snapshot() -snapshots['TestExporterMethods::test_create_cell_from_args_with_multiple_args 1'] = ''' +snapshots['TestExporterMethods::test_create_cell_from_args_with_multiple_args 1'] = '''\
- -
- -
- - - +
gs://ml-pipeline/data.csv
-lambda x: (x['target'] > x['fare'] * 0.2)
+lambda x: (x['target'] > x['fare'] * 0.2)
 
-
-
- - - ''' snapshots['TestExporterMethods::test_create_cell_from_args_with_no_args 1'] = 'variables = {}' @@ -61,27 +50,16 @@ print(2)''' -snapshots['TestExporterMethods::test_generate_custom_visualization_html_from_notebook 1'] = ''' +snapshots['TestExporterMethods::test_generate_custom_visualization_html_from_notebook 1'] = '''\
- -
- -
- - - +
2
 
-
-
- - - ''' diff --git a/backend/src/apiserver/visualization/templates/basic.tpl b/backend/src/apiserver/visualization/templates/basic.tpl index 9c803e8a9fce..bf6b6b3353fd 100644 --- a/backend/src/apiserver/visualization/templates/basic.tpl +++ b/backend/src/apiserver/visualization/templates/basic.tpl @@ -1,4 +1,4 @@ -{%- extends 'display_priority.tpl' -%} +{%- extends 'base/display_priority.j2' -%} {% block output_group %}
diff --git a/backend/src/cache/server/admission.go b/backend/src/cache/server/admission.go index b8ed733af15b..b2d3f3279d0e 100644 --- a/backend/src/cache/server/admission.go +++ b/backend/src/cache/server/admission.go @@ -18,7 +18,7 @@ import ( "encoding/json" "errors" "fmt" - "io/ioutil" + "io" "log" "net/http" @@ -73,7 +73,7 @@ func doServeAdmitFunc(w http.ResponseWriter, r *http.Request, admit admitFunc, c return nil, fmt.Errorf("Invalid method %q, only POST requests are allowed", r.Method) } - body, err := ioutil.ReadAll(r.Body) + body, err := io.ReadAll(r.Body) if err != nil { w.WriteHeader(http.StatusBadRequest) return nil, fmt.Errorf("Could not read request body: %v", err) diff --git a/backend/src/common/client/api_server/util.go b/backend/src/common/client/api_server/util.go index 20cb38879a67..d67b0d1387a6 100644 --- a/backend/src/common/client/api_server/util.go +++ b/backend/src/common/client/api_server/util.go @@ -2,7 +2,6 @@ package api_server import ( "fmt" - "io/ioutil" "net/http" "os" "time" @@ -38,7 +37,7 @@ var SATokenVolumeProjectionAuth runtime.ClientAuthInfoWriter = runtime.ClientAut projectedPath = saDefaultTokenPath } - content, err := ioutil.ReadFile(projectedPath) + content, err := os.ReadFile(projectedPath) if err != nil { return fmt.Errorf("Failed to read projected SA token at %s: %w", projectedPath, err) } diff --git a/backend/src/common/util/service.go b/backend/src/common/util/service.go index cf0f5379a389..c5624b642295 100644 --- a/backend/src/common/util/service.go +++ b/backend/src/common/util/service.go @@ -15,6 +15,7 @@ package util import ( + "context" "fmt" "net/http" "strings" @@ -94,6 +95,16 @@ func GetKubernetesClientFromClientConfig(clientConfig clientcmd.ClientConfig) ( return clientSet, config, namespace, nil } +func GetRpcConnectionWithTimeout(address string, timeout time.Time) (*grpc.ClientConn, error) { + ctx, _ := context.WithDeadline(context.Background(), timeout) + + conn, err := grpc.DialContext(ctx, address, grpc.WithInsecure(), grpc.WithBlock()) + if err != nil { + return nil, errors.Wrapf(err, "Failed to create gRPC connection") + } + return conn, nil +} + func GetRpcConnection(address string) (*grpc.ClientConn, error) { conn, err := grpc.Dial(address, grpc.WithInsecure()) if err != nil { diff --git a/backend/src/common/util/tgz.go b/backend/src/common/util/tgz.go index 2fe27fdb2cfd..1f6ad9851f41 100644 --- a/backend/src/common/util/tgz.go +++ b/backend/src/common/util/tgz.go @@ -19,7 +19,6 @@ import ( "bytes" "compress/gzip" "io" - "io/ioutil" "strings" ) @@ -77,7 +76,7 @@ func ExtractTgz(tgzContent string) (map[string]string, error) { if hdr == nil { continue } - fileContent, err := ioutil.ReadAll(tr) + fileContent, err := io.ReadAll(tr) if err != nil { return nil, err } diff --git a/backend/src/crd/controller/scheduledworkflow/controller.go b/backend/src/crd/controller/scheduledworkflow/controller.go index 51581c47e46d..d11d537ac5f1 100644 --- a/backend/src/crd/controller/scheduledworkflow/controller.go +++ b/backend/src/crd/controller/scheduledworkflow/controller.go @@ -20,6 +20,7 @@ import ( "time" workflowapi "github.com/argoproj/argo-workflows/v3/pkg/apis/workflow/v1alpha1" + api "github.com/kubeflow/pipelines/backend/api/v2beta1/go_client" commonutil "github.com/kubeflow/pipelines/backend/src/common/util" "github.com/kubeflow/pipelines/backend/src/crd/controller/scheduledworkflow/client" "github.com/kubeflow/pipelines/backend/src/crd/controller/scheduledworkflow/util" @@ -30,6 +31,8 @@ import ( swfinformers "github.com/kubeflow/pipelines/backend/src/crd/pkg/client/informers/externalversions" wraperror "github.com/pkg/errors" log "github.com/sirupsen/logrus" + "google.golang.org/grpc/metadata" + "google.golang.org/protobuf/types/known/structpb" corev1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/util/runtime" @@ -40,6 +43,7 @@ import ( _ "k8s.io/client-go/plugin/pkg/client/auth/gcp" "k8s.io/client-go/tools/cache" "k8s.io/client-go/tools/record" + "k8s.io/client-go/transport" "k8s.io/client-go/util/workqueue" ) @@ -60,6 +64,7 @@ type Controller struct { kubeClient *client.KubeClient swfClient *client.ScheduledWorkflowClient workflowClient *client.WorkflowClient + runClient api.RunServiceClient // workqueue is a rate limited work queue. This is used to queue work to be // processed instead of performing it as soon as a change happens. This @@ -73,6 +78,10 @@ type Controller struct { // the timezone loation which the scheduled will use location *time.Location + + // tokenSrc provides a way to get the latest refreshed token when authentication to the REST API server is enabled. + // This will be nil when authentication is not enabled. + tokenSrc transport.ResettableTokenSource } // NewController returns a new sample controller @@ -80,10 +89,12 @@ func NewController( kubeClientSet kubernetes.Interface, swfClientSet swfclientset.Interface, workflowClientSet commonutil.ExecutionClient, + runClient api.RunServiceClient, swfInformerFactory swfinformers.SharedInformerFactory, executionInformer commonutil.ExecutionInformer, time commonutil.TimeInterface, location *time.Location, + tokenSrc transport.ResettableTokenSource, ) (*Controller, error) { // obtain references to shared informers swfInformer := swfInformerFactory.Scheduledworkflow().V1beta1().ScheduledWorkflows() @@ -102,11 +113,13 @@ func NewController( controller := &Controller{ kubeClient: client.NewKubeClient(kubeClientSet, recorder), swfClient: client.NewScheduledWorkflowClient(swfClientSet, swfInformer), + runClient: runClient, workflowClient: client.NewWorkflowClient(workflowClientSet, executionInformer), workqueue: workqueue.NewNamedRateLimitingQueue( workqueue.NewItemExponentialFailureRateLimiter(DefaultJobBackOff, MaxJobBackOff), swfregister.Kind), time: time, location: location, + tokenSrc: tokenSrc, } log.Info("Setting up event handlers") @@ -507,12 +520,72 @@ func (c *Controller) submitNewWorkflowIfNotAlreadySubmitted( } // If the workflow is not found, we need to create it. - newWorkflow, err := swf.NewWorkflow(nextScheduledEpoch, nowEpoch) - createdWorkflow, err := c.workflowClient.Create(ctx, swf.Namespace, newWorkflow) + if swf.Spec.Workflow != nil && swf.Spec.Workflow.Spec != nil { + newWorkflow, err := swf.NewWorkflow(nextScheduledEpoch, nowEpoch) + if err != nil { + return false, "", err + } + + createdWorkflow, err := c.workflowClient.Create(ctx, swf.Namespace, newWorkflow) + if err != nil { + return false, "", err + } + return true, createdWorkflow.ExecutionName(), nil + } + + if c.tokenSrc != nil { + token, err := c.tokenSrc.Token() + if err != nil { + return false, "", fmt.Errorf("Failed to get a token to communicate with the REST API: %w", err) + } + + ctx = metadata.AppendToOutgoingContext(ctx, "Authorization", "Bearer "+token.AccessToken) + } + + var runtimeConfig *api.RuntimeConfig + + if swf.Spec.Workflow != nil { + runtimeConfig = &api.RuntimeConfig{ + Parameters: map[string]*structpb.Value{}, + PipelineRoot: swf.Spec.Workflow.PipelineRoot, + } + + for _, param := range swf.Spec.Workflow.Parameters { + val := &structpb.Value{} + + err := val.UnmarshalJSON([]byte(param.Value)) + if err != nil { + return false, "", err + } + + runtimeConfig.Parameters[param.Name] = val + } + } + + run, err := c.runClient.CreateRun(ctx, &api.CreateRunRequest{ + ExperimentId: swf.Spec.ExperimentId, + Run: &api.Run{ + ExperimentId: swf.Spec.ExperimentId, + DisplayName: swf.NextResourceName(), + RecurringRunId: string(swf.UID), + RuntimeConfig: runtimeConfig, + PipelineSource: &api.Run_PipelineVersionReference{ + PipelineVersionReference: &api.PipelineVersionReference{ + PipelineId: swf.Spec.PipelineId, + // This can be empty, which causes the latest pipeline version to be selected. + PipelineVersionId: swf.Spec.PipelineVersionId, + }, + }, + ServiceAccount: swf.Spec.ServiceAccount, + }, + }) if err != nil { - return false, "", err + return false, "", fmt.Errorf( + "failed to create a run from the scheduled workflow (%s/%s): %w", swf.Namespace, swf.Name, err, + ) } - return true, createdWorkflow.ExecutionName(), nil + + return true, run.DisplayName, nil } func (c *Controller) updateStatus( diff --git a/backend/src/crd/controller/scheduledworkflow/main.go b/backend/src/crd/controller/scheduledworkflow/main.go index e4d176a2a1fb..4cb178e0038f 100644 --- a/backend/src/crd/controller/scheduledworkflow/main.go +++ b/backend/src/crd/controller/scheduledworkflow/main.go @@ -16,9 +16,12 @@ package main import ( "flag" + "fmt" + "os" "strings" "time" + api "github.com/kubeflow/pipelines/backend/api/v2beta1/go_client" commonutil "github.com/kubeflow/pipelines/backend/src/common/util" "github.com/kubeflow/pipelines/backend/src/crd/controller/scheduledworkflow/util" swfclientset "github.com/kubeflow/pipelines/backend/src/crd/pkg/client/clientset/versioned" @@ -29,16 +32,27 @@ import ( "k8s.io/client-go/kubernetes" _ "k8s.io/client-go/plugin/pkg/client/auth/gcp" "k8s.io/client-go/tools/clientcmd" + "k8s.io/client-go/transport" ) var ( - logLevel string - masterURL string - kubeconfig string - namespace string - location *time.Location - clientQPS float64 - clientBurst int + logLevel string + masterURL string + kubeconfig string + namespace string + location *time.Location + clientQPS float64 + clientBurst int + mlPipelineAPIServerName string + mlPipelineServiceGRPCPort string +) + +const ( + // These flags match the persistence agent + mlPipelineAPIServerBasePathFlagName = "mlPipelineAPIServerBasePath" + mlPipelineAPIServerNameFlagName = "mlPipelineAPIServerName" + mlPipelineAPIServerGRPCPortFlagName = "mlPipelineServiceGRPCPort" + apiTokenFile = "/var/run/secrets/kubeflow/tokens/scheduledworkflow-sa-token" ) func main() { @@ -85,14 +99,35 @@ func main() { scheduleInformerFactory = swfinformers.NewFilteredSharedInformerFactory(scheduleClient, time.Second*30, namespace, nil) } + grpcAddress := fmt.Sprintf("%s:%s", mlPipelineAPIServerName, mlPipelineServiceGRPCPort) + + log.Infof("Connecting the API server over GRPC at: %s", grpcAddress) + apiConnection, err := commonutil.GetRpcConnectionWithTimeout(grpcAddress, time.Now().Add(time.Minute)) + if err != nil { + log.Fatalf("Error connecting to the API server after trying for one minute: %v", err) + } + + var tokenSrc transport.ResettableTokenSource + + if _, err := os.Stat(apiTokenFile); err == nil { + tokenSrc = transport.NewCachedFileTokenSource(apiTokenFile) + } + + runClient := api.NewRunServiceClient(apiConnection) + + log.Info("Successfully connected to the API server") + controller, err := NewController( kubeClient, scheduleClient, execClient, + runClient, scheduleInformerFactory, execInformer, commonutil.NewRealTime(), - location) + location, + tokenSrc, + ) if err != nil { log.Fatalf("Failed to instantiate the controller: %v", err) } @@ -123,6 +158,8 @@ func init() { // Use default value of client QPS (5) & burst (10) defined in // k8s.io/client-go/rest/config.go#RESTClientFor flag.Float64Var(&clientQPS, "clientQPS", 5, "The maximum QPS to the master from this client.") + flag.StringVar(&mlPipelineAPIServerName, mlPipelineAPIServerNameFlagName, "ml-pipeline", "Name of the ML pipeline API server.") + flag.StringVar(&mlPipelineServiceGRPCPort, mlPipelineAPIServerGRPCPortFlagName, "8887", "GRPC Port of the ML pipeline API server.") flag.IntVar(&clientBurst, "clientBurst", 10, "Maximum burst for throttle from this client.") var err error location, err = util.GetLocation() diff --git a/backend/src/crd/controller/scheduledworkflow/util/scheduled_workflow.go b/backend/src/crd/controller/scheduledworkflow/util/scheduled_workflow.go index 3e1aac51211f..ea4bfe2b8f1d 100644 --- a/backend/src/crd/controller/scheduledworkflow/util/scheduled_workflow.go +++ b/backend/src/crd/controller/scheduledworkflow/util/scheduled_workflow.go @@ -17,12 +17,13 @@ package util import ( "fmt" "hash/fnv" - corev1 "k8s.io/api/core/v1" "math" "sort" "strconv" "time" + corev1 "k8s.io/api/core/v1" + commonutil "github.com/kubeflow/pipelines/backend/src/common/util" swfapi "github.com/kubeflow/pipelines/backend/src/crd/pkg/apis/scheduledworkflow/v1beta1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" diff --git a/backend/src/crd/pkg/apis/scheduledworkflow/v1beta1/types.go b/backend/src/crd/pkg/apis/scheduledworkflow/v1beta1/types.go index 66cc76927077..3de0d6dae153 100644 --- a/backend/src/crd/pkg/apis/scheduledworkflow/v1beta1/types.go +++ b/backend/src/crd/pkg/apis/scheduledworkflow/v1beta1/types.go @@ -108,10 +108,14 @@ type WorkflowResource struct { Parameters []Parameter `json:"parameters,omitempty"` + PipelineRoot string `json:"pipelineRoot,omitempty"` + // Specification of the workflow to start. // Use interface{} for backward compatibility // TODO: change it to string and avoid type casting // after several releases + // This is deprecated. In a future release, this will be ignored and this will be compiled by the API server + // at runtime. Spec interface{} `json:"spec,omitempty"` } diff --git a/backend/src/v2/README.md b/backend/src/v2/README.md index b85185f49a39..702f31b9c283 100644 --- a/backend/src/v2/README.md +++ b/backend/src/v2/README.md @@ -33,11 +33,11 @@ it should have the following content: For example: ```makefile - export DEV_IMAGE_PREFIX=gcr.io/ml-pipeline-test/kfp- + export DEV_IMAGE_PREFIX=ghcr.io/kubeflow-test/kfp-/kfp- ``` Then after images are built, they will be pushed to locations like - `gcr.io/ml-pipeline-test/kfp-driver`. + `ghcr.io/kubeflow-test/kfp-driver`. The `.env` file is ignored by git, it's your local development configuration. @@ -56,14 +56,14 @@ it should have the following content: echo "GOARCH_VALUE="$(go env GOARCH) >> .env ``` -* Install sample test python dependencies (require Python 3.7 or 3.8 due to [ml-metadata limitation](https://github.com/google/ml-metadata/issues/139)): +* Install sample test python dependencies: ```bash cd test pip install -r requirements.txt ``` -* [Connecting to Kubeflow Pipelines using the SDK client](https://www.kubeflow.org/docs/components/pipelines/sdk/connect-api/#configure-sdk-client-by-environment-variables). +* [Connecting to Kubeflow Pipelines using the SDK client](https://www.kubeflow.org/docs/components/pipelines/user-guides/core-functions/connect-api/#configure-sdk-client-by-environment-variables). Recommend adding the env vars to your .bashrc or .zshrc etc to persist your config. diff --git a/backend/src/v2/cmd/compiler/main.go b/backend/src/v2/cmd/compiler/main.go index b1c46b2c8f00..6d79a14b0c82 100644 --- a/backend/src/v2/cmd/compiler/main.go +++ b/backend/src/v2/cmd/compiler/main.go @@ -16,7 +16,6 @@ package main import ( "flag" "fmt" - "io/ioutil" "os" "github.com/golang/glog" @@ -92,7 +91,7 @@ func init() { } func loadJob(path string) (*pipelinespec.PipelineJob, error) { - bytes, err := ioutil.ReadFile(path) + bytes, err := os.ReadFile(path) if err != nil { return nil, err } @@ -104,7 +103,7 @@ func loadJob(path string) (*pipelinespec.PipelineJob, error) { } func loadSpec(path string) (*pipelinespec.PipelineJob, error) { - bytes, err := ioutil.ReadFile(path) + bytes, err := os.ReadFile(path) if err != nil { return nil, err } diff --git a/backend/src/v2/cmd/driver/main.go b/backend/src/v2/cmd/driver/main.go index 793ccfe1b800..865aacda216a 100644 --- a/backend/src/v2/cmd/driver/main.go +++ b/backend/src/v2/cmd/driver/main.go @@ -19,7 +19,6 @@ import ( "encoding/json" "flag" "fmt" - "io/ioutil" "os" "path/filepath" "strconv" @@ -275,7 +274,7 @@ func writeFile(path string, data []byte) (err error) { if err := os.MkdirAll(filepath.Dir(path), 0o755); err != nil { return err } - return ioutil.WriteFile(path, data, 0o644) + return os.WriteFile(path, data, 0o644) } func newMlmdClient() (*metadata.Client, error) { diff --git a/backend/src/v2/compiler/argocompiler/argo_test.go b/backend/src/v2/compiler/argocompiler/argo_test.go index 7ebf98ff49fc..0c8db38f71c8 100644 --- a/backend/src/v2/compiler/argocompiler/argo_test.go +++ b/backend/src/v2/compiler/argocompiler/argo_test.go @@ -17,7 +17,7 @@ package argocompiler_test import ( "flag" "fmt" - "io/ioutil" + "os" "strings" "testing" @@ -80,12 +80,12 @@ func Test_argo_compiler(t *testing.T) { if err != nil { t.Fatal(err) } - err = ioutil.WriteFile(tt.argoYAMLPath, got, 0x664) + err = os.WriteFile(tt.argoYAMLPath, got, 0x664) if err != nil { t.Fatal(err) } } - argoYAML, err := ioutil.ReadFile(tt.argoYAMLPath) + argoYAML, err := os.ReadFile(tt.argoYAMLPath) if err != nil { t.Fatal(err) } @@ -125,7 +125,7 @@ func Test_argo_compiler(t *testing.T) { func load(t *testing.T, path string, platformSpecPath string) (*pipelinespec.PipelineJob, *pipelinespec.SinglePlatformSpec) { t.Helper() - content, err := ioutil.ReadFile(path) + content, err := os.ReadFile(path) if err != nil { t.Error(err) } @@ -136,7 +136,7 @@ func load(t *testing.T, path string, platformSpecPath string) (*pipelinespec.Pip platformSpec := &pipelinespec.PlatformSpec{} if platformSpecPath != "" { - content, err = ioutil.ReadFile(platformSpecPath) + content, err = os.ReadFile(platformSpecPath) if err != nil { t.Error(err) } diff --git a/backend/src/v2/compiler/argocompiler/container.go b/backend/src/v2/compiler/argocompiler/container.go index 9409afd7aef3..91f3d039c2a3 100644 --- a/backend/src/v2/compiler/argocompiler/container.go +++ b/backend/src/v2/compiler/argocompiler/container.go @@ -30,9 +30,9 @@ import ( const ( volumeNameKFPLauncher = "kfp-launcher" volumeNameCABundle = "ca-bundle" - DefaultLauncherImage = "gcr.io/ml-pipeline/kfp-launcher@sha256:bef55a344574a25c557256d7c66cb19edacfd2008d694e5b6bb5b612d59feae0" + DefaultLauncherImage = "ghcr.io/kubeflow/kfp-launcher:2.4.0" LauncherImageEnvVar = "V2_LAUNCHER_IMAGE" - DefaultDriverImage = "gcr.io/ml-pipeline/kfp-driver@sha256:dc8b56a2eb071f30409828a8884d621092e68385af11a6c06aa9e9fbcfbb19de" + DefaultDriverImage = "ghcr.io/kubeflow/kfp-driver:2.4.0" DriverImageEnvVar = "V2_DRIVER_IMAGE" DefaultDriverCommand = "driver" DriverCommandEnvVar = "V2_DRIVER_COMMAND" diff --git a/backend/src/v2/compiler/tektoncompiler/tekton_test.go b/backend/src/v2/compiler/tektoncompiler/tekton_test.go index 95253621c6a1..4f8fe0bfd661 100644 --- a/backend/src/v2/compiler/tektoncompiler/tekton_test.go +++ b/backend/src/v2/compiler/tektoncompiler/tekton_test.go @@ -17,7 +17,7 @@ package tektoncompiler_test import ( "flag" "fmt" - "io/ioutil" + "os" "sort" "testing" @@ -69,12 +69,12 @@ func Test_tekton_compiler(t *testing.T) { if err != nil { t.Fatal(err) } - err = ioutil.WriteFile(tt.tektonYAMLPath, got, 0664) + err = os.WriteFile(tt.tektonYAMLPath, got, 0664) if err != nil { t.Fatal(err) } } - tektonYAML, err := ioutil.ReadFile(tt.tektonYAMLPath) + tektonYAML, err := os.ReadFile(tt.tektonYAMLPath) if err != nil { t.Fatal(err) } @@ -194,12 +194,12 @@ func testCompile(t *testing.T, test testInputs) { if err != nil { t.Fatal(err) } - err = ioutil.WriteFile(test.tektonYAMLPath, got, 0644) + err = os.WriteFile(test.tektonYAMLPath, got, 0644) if err != nil { t.Fatal(err) } } - tektonYAML, err := ioutil.ReadFile(test.tektonYAMLPath) + tektonYAML, err := os.ReadFile(test.tektonYAMLPath) if err != nil { t.Fatal(err) } @@ -221,7 +221,7 @@ func testCompile(t *testing.T, test testInputs) { func load(t *testing.T, path string, platformSpecPath string, fileType string) (*pipelinespec.PipelineJob, *pipelinespec.SinglePlatformSpec) { t.Helper() - content, err := ioutil.ReadFile(path) + content, err := os.ReadFile(path) if err != nil { t.Error(err) } @@ -238,7 +238,7 @@ func load(t *testing.T, path string, platformSpecPath string, fileType string) ( platformSpec := &pipelinespec.PlatformSpec{} if platformSpecPath != "" { - content, err = ioutil.ReadFile(platformSpecPath) + content, err = os.ReadFile(platformSpecPath) if err != nil { t.Error(err) } diff --git a/backend/src/v2/compiler/visitor_test.go b/backend/src/v2/compiler/visitor_test.go index 0d23ee15f4ea..00aec8e81b64 100644 --- a/backend/src/v2/compiler/visitor_test.go +++ b/backend/src/v2/compiler/visitor_test.go @@ -15,7 +15,7 @@ package compiler_test import ( "fmt" - "io/ioutil" + "os" "testing" "github.com/golang/protobuf/jsonpb" @@ -87,7 +87,7 @@ func Test_AcceptTestVisitor(t *testing.T) { func load(t *testing.T, path string) *pipelinespec.PipelineJob { t.Helper() - content, err := ioutil.ReadFile(path) + content, err := os.ReadFile(path) if err != nil { t.Error(err) } diff --git a/backend/src/v2/component/launcher_v2.go b/backend/src/v2/component/launcher_v2.go index a80091699bc7..025440e1111b 100644 --- a/backend/src/v2/component/launcher_v2.go +++ b/backend/src/v2/component/launcher_v2.go @@ -19,7 +19,6 @@ import ( "encoding/json" "errors" "fmt" - "io/ioutil" "os" "os/exec" "path/filepath" @@ -365,7 +364,7 @@ func collectOutputParameters(executorInput *pipelinespec.ExecutorInput, executor msg := func(err error) error { return fmt.Errorf("failed to read output parameter name=%q type=%q path=%q: %w", name, paramSpec.GetParameterType(), param.GetOutputFile(), err) } - b, err := ioutil.ReadFile(param.GetOutputFile()) + b, err := os.ReadFile(param.GetOutputFile()) if err != nil { return msg(err) } @@ -708,7 +707,7 @@ func getExecutorOutputFile(path string) (*pipelinespec.ExecutorOutput, error) { } } - b, err := ioutil.ReadFile(path) + b, err := os.ReadFile(path) if err != nil { return nil, fmt.Errorf("failed to read output metadata file %q: %w", path, err) } diff --git a/backend/src/v2/config/env.go b/backend/src/v2/config/env.go index 3597091b79a9..74c5cf8b4a69 100644 --- a/backend/src/v2/config/env.go +++ b/backend/src/v2/config/env.go @@ -19,12 +19,13 @@ package config import ( "context" "fmt" - "github.com/kubeflow/pipelines/backend/src/v2/objectstore" - "io/ioutil" - "sigs.k8s.io/yaml" + "os" "strconv" "strings" + "github.com/kubeflow/pipelines/backend/src/v2/objectstore" + "sigs.k8s.io/yaml" + "github.com/golang/glog" k8errors "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -84,7 +85,7 @@ func (c *Config) DefaultPipelineRoot() string { func InPodNamespace() (string, error) { // The path is available in Pods. // https://kubernetes.io/docs/tasks/run-application/access-api-from-pod/#directly-accessing-the-rest-api - ns, err := ioutil.ReadFile("/var/run/secrets/kubernetes.io/serviceaccount/namespace") + ns, err := os.ReadFile("/var/run/secrets/kubernetes.io/serviceaccount/namespace") if err != nil { return "", fmt.Errorf("failed to get namespace in Pod: %w", err) } @@ -93,7 +94,7 @@ func InPodNamespace() (string, error) { // InPodName gets the pod name from inside a Kubernetes Pod. func InPodName() (string, error) { - podName, err := ioutil.ReadFile("/etc/hostname") + podName, err := os.ReadFile("/etc/hostname") if err != nil { return "", fmt.Errorf("failed to get pod name in Pod: %w", err) } diff --git a/backend/src/v2/driver/driver.go b/backend/src/v2/driver/driver.go index c30edb5fd943..e104fc1a9c92 100644 --- a/backend/src/v2/driver/driver.go +++ b/backend/src/v2/driver/driver.go @@ -1872,9 +1872,11 @@ func createPVC( return "", createdExecution, pb.Execution_FAILED, fmt.Errorf("failed to get id from createdExecution") } */ - err = createCache(ctx, createdExecution, opts, taskStartedTime, fingerPrint, cacheClient) - if err != nil { - return "", createdExecution, pb.Execution_FAILED, fmt.Errorf("failed to create cache entrty for create pvc: %w", err) + if opts.Task.GetCachingOptions().GetEnableCache() { + err = createCache(ctx, createdExecution, opts, taskStartedTime, fingerPrint, cacheClient) + if err != nil { + return "", createdExecution, pb.Execution_FAILED, fmt.Errorf("failed to create cache entry for create pvc: %w", err) + } } return createdPVC.ObjectMeta.Name, createdExecution, pb.Execution_COMPLETE, nil @@ -1981,9 +1983,11 @@ func deletePVC( return createdExecution, pb.Execution_FAILED, fmt.Errorf("failed to get id from createdExecution") } */ - err = createCache(ctx, createdExecution, opts, taskStartedTime, fingerPrint, cacheClient) - if err != nil { - return createdExecution, pb.Execution_FAILED, fmt.Errorf("failed to create cache entrty for delete pvc: %w", err) + if opts.Task.GetCachingOptions().GetEnableCache() && ecfg.CachedMLMDExecutionID != "" { + err = createCache(ctx, createdExecution, opts, taskStartedTime, fingerPrint, cacheClient) + if err != nil { + return createdExecution, pb.Execution_FAILED, fmt.Errorf("failed to create cache entry for delete pvc: %w", err) + } } return createdExecution, pb.Execution_COMPLETE, nil diff --git a/backend/src/v2/objectstore/object_store.go b/backend/src/v2/objectstore/object_store.go index 42ec6418c430..713b1bcc0c26 100644 --- a/backend/src/v2/objectstore/object_store.go +++ b/backend/src/v2/objectstore/object_store.go @@ -18,7 +18,6 @@ import ( "context" "fmt" "io" - "io/ioutil" "os" "path/filepath" "regexp" @@ -97,7 +96,7 @@ func UploadBlob(ctx context.Context, bucket *blob.Bucket, localPath, blobPath st } // localPath is a directory. - files, err := ioutil.ReadDir(localPath) + files, err := os.ReadDir(localPath) if err != nil { return fmt.Errorf("unable to list local directory %q: %w", localPath, err) } diff --git a/backend/test/integration/db_test.go b/backend/test/integration/db_test.go index be65889effca..76d34b322c22 100644 --- a/backend/test/integration/db_test.go +++ b/backend/test/integration/db_test.go @@ -48,9 +48,7 @@ func (s *DBTestSuite) TestInitDBClient_MySQL() { viper.Set("DBDriverName", "mysql") viper.Set("DBConfig.MySQLConfig.DBName", "mlpipeline") // The default port-forwarding IP address that test uses is different compared to production - if *localTest { - viper.Set("DBConfig.MySQLConfig.Host", "localhost") - } + viper.Set("DBConfig.MySQLConfig.Host", "localhost") duration, _ := time.ParseDuration("1m") db := cm.InitDBClient(duration) assert.NotNil(t, db) diff --git a/backend/test/integration/job_api_test.go b/backend/test/integration/job_api_test.go index 58c02b9e9809..0f32a6439607 100644 --- a/backend/test/integration/job_api_test.go +++ b/backend/test/integration/job_api_test.go @@ -18,7 +18,7 @@ import ( "bytes" "context" "fmt" - "io/ioutil" + "os" "reflect" "strings" "testing" @@ -209,7 +209,7 @@ func (s *JobApiTestSuite) TestJobApis() { // Make sure the job is created at least 1 second later than the first one, // because sort by created_at has precision of 1 second. time.Sleep(1 * time.Second) - argParamsBytes, err := ioutil.ReadFile("../resources/arguments-parameters.yaml") + argParamsBytes, err := os.ReadFile("../resources/arguments-parameters.yaml") assert.Nil(t, err) argParamsBytes, err = yaml.ToJSON(argParamsBytes) assert.Nil(t, err) diff --git a/backend/test/integration/pipeline_api_test.go b/backend/test/integration/pipeline_api_test.go index d43aaa9bcc1c..5a56b5ad0c31 100644 --- a/backend/test/integration/pipeline_api_test.go +++ b/backend/test/integration/pipeline_api_test.go @@ -15,7 +15,7 @@ package integration import ( - "io/ioutil" + "os" "testing" "time" @@ -232,14 +232,14 @@ func (s *PipelineApiTest) TestPipelineAPI() { /* ---------- Verify get template works ---------- */ template, err := s.pipelineClient.GetTemplate(¶ms.PipelineServiceGetTemplateParams{ID: argumentYAMLPipeline.ID}) require.Nil(t, err) - bytes, err := ioutil.ReadFile("../resources/arguments-parameters.yaml") + bytes, err := os.ReadFile("../resources/arguments-parameters.yaml") require.Nil(t, err) expected, _ := pipelinetemplate.New(bytes) assert.Equal(t, expected, template) template, err = s.pipelineClient.GetTemplate(¶ms.PipelineServiceGetTemplateParams{ID: v2HelloPipeline.ID}) require.Nil(t, err) - bytes, err = ioutil.ReadFile("../resources/v2-hello-world.yaml") + bytes, err = os.ReadFile("../resources/v2-hello-world.yaml") require.Nil(t, err) expected, _ = pipelinetemplate.New(bytes) assert.Equal(t, expected, template) diff --git a/backend/test/integration/pipeline_version_api_test.go b/backend/test/integration/pipeline_version_api_test.go index 121144406e39..07c2aad2c382 100644 --- a/backend/test/integration/pipeline_version_api_test.go +++ b/backend/test/integration/pipeline_version_api_test.go @@ -15,7 +15,7 @@ package integration import ( - "io/ioutil" + "os" "testing" "time" @@ -325,7 +325,7 @@ func (s *PipelineVersionApiTest) TestArgoSpec() { /* ---------- Verify get template works ---------- */ template, err := s.pipelineClient.GetPipelineVersionTemplate(¶ms.PipelineServiceGetPipelineVersionTemplateParams{VersionID: argumentYAMLPipelineVersion.ID}) require.Nil(t, err) - bytes, err := ioutil.ReadFile("../resources/arguments-parameters.yaml") + bytes, err := os.ReadFile("../resources/arguments-parameters.yaml") require.Nil(t, err) expected, err := pipelinetemplate.New(bytes) require.Nil(t, err) @@ -358,7 +358,7 @@ func (s *PipelineVersionApiTest) TestV2Spec() { /* ---------- Verify get template works ---------- */ template, err := s.pipelineClient.GetPipelineVersionTemplate(¶ms.PipelineServiceGetPipelineVersionTemplateParams{VersionID: v2Version.ID}) require.Nil(t, err) - bytes, err := ioutil.ReadFile("../resources/v2-hello-world.yaml") + bytes, err := os.ReadFile("../resources/v2-hello-world.yaml") require.Nil(t, err) expected, err := pipelinetemplate.New(bytes) require.Nil(t, err) diff --git a/backend/test/integration/run_api_test.go b/backend/test/integration/run_api_test.go index bb095013c7e0..12cc6b93f8e9 100644 --- a/backend/test/integration/run_api_test.go +++ b/backend/test/integration/run_api_test.go @@ -16,7 +16,7 @@ package integration import ( "fmt" - "io/ioutil" + "os" "testing" "time" @@ -176,7 +176,7 @@ func (s *RunApiTestSuite) TestRunApis() { assert.Nil(t, err) /* ---------- Create a new argument parameter run by uploading workflow manifest ---------- */ - argParamsBytes, err := ioutil.ReadFile("../resources/arguments-parameters.yaml") + argParamsBytes, err := os.ReadFile("../resources/arguments-parameters.yaml") assert.Nil(t, err) argParamsBytes, err = yaml.ToJSON(argParamsBytes) assert.Nil(t, err) @@ -433,7 +433,7 @@ func (s *RunApiTestSuite) checkHelloWorldRunDetail(t *testing.T, runDetail *run_ } func (s *RunApiTestSuite) checkArgParamsRunDetail(t *testing.T, runDetail *run_model.APIRunDetail, experimentId string, experimentName string) { - argParamsBytes, err := ioutil.ReadFile("../resources/arguments-parameters.yaml") + argParamsBytes, err := os.ReadFile("../resources/arguments-parameters.yaml") assert.Nil(t, err) argParamsBytes, err = yaml.ToJSON(argParamsBytes) assert.Nil(t, err) diff --git a/backend/test/integration/upgrade_test.go b/backend/test/integration/upgrade_test.go index 10737afdd691..415d2f54f9c8 100644 --- a/backend/test/integration/upgrade_test.go +++ b/backend/test/integration/upgrade_test.go @@ -16,7 +16,7 @@ package integration import ( "fmt" - "io/ioutil" + "os" "testing" "time" @@ -318,7 +318,7 @@ func (s *UpgradeTests) VerifyPipelines() { /* ---------- Verify get template works ---------- */ template, err := s.pipelineClient.GetTemplate(&pipelineParams.PipelineServiceGetTemplateParams{ID: pipelines[0].ID}) require.Nil(t, err) - bytes, err := ioutil.ReadFile("../resources/arguments-parameters.yaml") + bytes, err := os.ReadFile("../resources/arguments-parameters.yaml") require.Nil(t, err) expected, err := pipelinetemplate.New(bytes) require.Nil(t, err) diff --git a/backend/test/v2/integration/pipeline_version_api_test.go b/backend/test/v2/integration/pipeline_version_api_test.go index b6f55a155bd7..493f3eb2a803 100644 --- a/backend/test/v2/integration/pipeline_version_api_test.go +++ b/backend/test/v2/integration/pipeline_version_api_test.go @@ -16,7 +16,7 @@ package integration import ( "encoding/json" - "io/ioutil" + "os" "strings" "testing" "time" @@ -285,7 +285,7 @@ func (s *PipelineVersionApiTest) TestPipelineSpec() { assert.NotNil(t, pipelineVersion.CreatedAt) /* ---------- Verify pipeline spec ---------- */ - bytes, err := ioutil.ReadFile("../resources/arguments-parameters.yaml") + bytes, err := os.ReadFile("../resources/arguments-parameters.yaml") require.Nil(t, err) expected_bytes, err := yaml.YAMLToJSON(bytes) require.Nil(t, err) @@ -319,7 +319,7 @@ func (s *PipelineVersionApiTest) TestV2Spec() { assert.Equal(t, "hello-world", v2Version.DisplayName) /* ---------- Verify pipeline spec ---------- */ - bytes, err := ioutil.ReadFile("../resources/hello-world.yaml") + bytes, err := os.ReadFile("../resources/hello-world.yaml") require.Nil(t, err) expected_bytes, err := yaml.YAMLToJSON(bytes) require.Nil(t, err) diff --git a/backend/test/v2/integration/recurring_run_api_test.go b/backend/test/v2/integration/recurring_run_api_test.go index cfb0a5a245de..bd4458ccfcfe 100644 --- a/backend/test/v2/integration/recurring_run_api_test.go +++ b/backend/test/v2/integration/recurring_run_api_test.go @@ -17,7 +17,7 @@ package integration import ( "context" "fmt" - "io/ioutil" + "os" "strings" "testing" "time" @@ -197,7 +197,7 @@ func (s *RecurringRunApiTestSuite) TestRecurringRunApis() { // Make sure the recurringRun is created at least 1 second later than the first one, // because sort by created_at has precision of 1 second. time.Sleep(1 * time.Second) - argParamsBytes, err := ioutil.ReadFile("../resources/arguments-parameters.yaml") + argParamsBytes, err := os.ReadFile("../resources/arguments-parameters.yaml") assert.Nil(t, err) pipeline_spec := &structpb.Struct{} err = yaml.Unmarshal(argParamsBytes, pipeline_spec) @@ -373,6 +373,73 @@ func (s *RecurringRunApiTestSuite) TestRecurringRunApis() { } } +func (s *RecurringRunApiTestSuite) TestRecurringRunApisUseLatest() { + t := s.T() + + /* ---------- Upload pipelines YAML ---------- */ + helloWorldPipeline, err := s.pipelineUploadClient.UploadFile("../resources/hello-world.yaml", upload_params.NewUploadPipelineParams()) + assert.Nil(t, err) + + /* ---------- Upload pipeline version YAML ---------- */ + time.Sleep(1 * time.Second) + helloWorldPipelineVersion, err := s.pipelineUploadClient.UploadPipelineVersion( + "../resources/hello-world.yaml", &upload_params.UploadPipelineVersionParams{ + Name: util.StringPointer("hello-world-version"), + Pipelineid: util.StringPointer(helloWorldPipeline.PipelineID), + }) + assert.Nil(t, err) + + /* ---------- Create a new hello world experiment ---------- */ + experiment := test.MakeExperiment("hello world experiment", "", s.resourceNamespace) + helloWorldExperiment, err := s.experimentClient.Create(&experiment_params.ExperimentServiceCreateExperimentParams{Body: experiment}) + assert.Nil(t, err) + + /* ---------- Create a new hello world recurringRun by specifying pipeline ID without a version ---------- */ + createRecurringRunRequest := &recurring_run_params.RecurringRunServiceCreateRecurringRunParams{Body: &recurring_run_model.V2beta1RecurringRun{ + DisplayName: "hello world with latest pipeline version", + Description: "this is hello world", + ExperimentID: helloWorldExperiment.ExperimentID, + PipelineVersionReference: &recurring_run_model.V2beta1PipelineVersionReference{ + PipelineID: helloWorldPipelineVersion.PipelineID, + }, + MaxConcurrency: 10, + Mode: recurring_run_model.RecurringRunModeENABLE, + }} + helloWorldRecurringRun, err := s.recurringRunClient.Create(createRecurringRunRequest) + assert.Nil(t, err) + + // The scheduledWorkflow CRD would create the run and it synced to the DB by persistent agent. + // This could take a few seconds to finish. + + /* ---------- Check run for hello world recurringRun ---------- */ + var helloWorldRun *run_model.V2beta1Run + + if err := retrier.New(retrier.ConstantBackoff(8, 5*time.Second), nil).Run(func() error { + runs, totalSize, _, err := s.runClient.List(&run_params.RunServiceListRunsParams{ + ExperimentID: util.StringPointer(helloWorldExperiment.ExperimentID), + }) + if err != nil { + return err + } + if len(runs) != 1 { + return fmt.Errorf("expected runs to be length 1, got: %v", len(runs)) + } + if totalSize != 1 { + return fmt.Errorf("expected total size 1, got: %v", totalSize) + } + helloWorldRun = runs[0] + return s.checkHelloWorldRun(helloWorldRun, helloWorldExperiment.ExperimentID, helloWorldRecurringRun.RecurringRunID) + }); err != nil { + assert.Nil(t, err) + assert.FailNow(t, "Timed out waiting for the recurring run") + } + + // Verify the latest pipeline version was selected + assert.Equal( + t, helloWorldPipelineVersion.PipelineVersionID, helloWorldRun.PipelineVersionReference.PipelineVersionID, + ) +} + func (s *RecurringRunApiTestSuite) TestRecurringRunApis_noCatchupOption() { t := s.T() diff --git a/backend/test/v2/integration/run_api_test.go b/backend/test/v2/integration/run_api_test.go index 757821cbcb68..b45744716c20 100644 --- a/backend/test/v2/integration/run_api_test.go +++ b/backend/test/v2/integration/run_api_test.go @@ -17,7 +17,7 @@ package integration import ( "encoding/json" "fmt" - "io/ioutil" + "os" "testing" "time" @@ -166,7 +166,7 @@ func (s *RunApiTestSuite) TestRunApis() { assert.Nil(t, err) /* ---------- Create a new argument parameter run by uploading workflow manifest ---------- */ - argParamsBytes, err := ioutil.ReadFile("../resources/arguments-parameters.yaml") + argParamsBytes, err := os.ReadFile("../resources/arguments-parameters.yaml") assert.Nil(t, err) pipeline_spec := &structpb.Struct{} err = yaml.Unmarshal(argParamsBytes, pipeline_spec) @@ -389,7 +389,7 @@ func (s *RunApiTestSuite) checkHelloWorldRunDetail(t *testing.T, run *run_model. func (s *RunApiTestSuite) checkArgParamsRunDetail(t *testing.T, run *run_model.V2beta1Run, experimentId string) { // Compare the pipeline spec first. - argParamsBytes, err := ioutil.ReadFile("../resources/arguments-parameters.yaml") + argParamsBytes, err := os.ReadFile("../resources/arguments-parameters.yaml") assert.Nil(t, err) // pipeline_spec := &structpb.Struct{} // err = yaml.Unmarshal(argParamsBytes, pipeline_spec) diff --git a/backend/test/v2/integration/upgrade_test.go b/backend/test/v2/integration/upgrade_test.go index 79ab190d7d24..4a23e14223ac 100644 --- a/backend/test/v2/integration/upgrade_test.go +++ b/backend/test/v2/integration/upgrade_test.go @@ -17,7 +17,7 @@ package integration import ( "encoding/json" "fmt" - "io/ioutil" + "os" "strings" "testing" "time" @@ -340,7 +340,7 @@ func (s *UpgradeTests) VerifyPipelines() { assert.Equal(t, totalSize, 1) pipelineVersion, err := s.pipelineClient.GetPipelineVersion(¶ms.PipelineServiceGetPipelineVersionParams{PipelineID: pipelines[0].PipelineID, PipelineVersionID: pipelineVersions[0].PipelineVersionID}) require.Nil(t, err) - bytes, err := ioutil.ReadFile("../resources/arguments-parameters.yaml") + bytes, err := os.ReadFile("../resources/arguments-parameters.yaml") expected_bytes, err := yaml.YAMLToJSON(bytes) require.Nil(t, err) actual_bytes, err := json.Marshal(pipelineVersion.PipelineSpec) diff --git a/backend/third_party_licenses/apiserver.csv b/backend/third_party_licenses/apiserver.csv index 73a9148ef647..ca1008622d57 100644 --- a/backend/third_party_licenses/apiserver.csv +++ b/backend/third_party_licenses/apiserver.csv @@ -144,7 +144,7 @@ go.uber.org/zap,https://github.com/uber-go/zap/blob/v1.26.0/LICENSE.txt,MIT gocloud.dev,https://github.com/google/go-cloud/blob/v0.23.0/LICENSE,Apache-2.0 golang.org/x/crypto,https://cs.opensource.google/go/x/crypto/+/v0.31.0:LICENSE,BSD-3-Clause golang.org/x/exp,https://cs.opensource.google/go/x/exp/+/92128663:LICENSE,BSD-3-Clause -golang.org/x/net,https://cs.opensource.google/go/x/net/+/v0.25.0:LICENSE,BSD-3-Clause +golang.org/x/net,https://cs.opensource.google/go/x/net/+/v0.33.0:LICENSE,BSD-3-Clause golang.org/x/oauth2,https://cs.opensource.google/go/x/oauth2/+/v0.16.0:LICENSE,BSD-3-Clause golang.org/x/sync/semaphore,https://cs.opensource.google/go/x/sync/+/v0.10.0:LICENSE,BSD-3-Clause golang.org/x/sys,https://cs.opensource.google/go/x/sys/+/v0.28.0:LICENSE,BSD-3-Clause diff --git a/backend/third_party_licenses/cache_server.csv b/backend/third_party_licenses/cache_server.csv index 8b898bf66244..3903e9a937f7 100644 --- a/backend/third_party_licenses/cache_server.csv +++ b/backend/third_party_licenses/cache_server.csv @@ -100,7 +100,7 @@ go.uber.org/multierr,https://github.com/uber-go/multierr/blob/v1.11.0/LICENSE.tx go.uber.org/zap,https://github.com/uber-go/zap/blob/v1.26.0/LICENSE.txt,MIT golang.org/x/crypto,https://cs.opensource.google/go/x/crypto/+/v0.31.0:LICENSE,BSD-3-Clause golang.org/x/exp,https://cs.opensource.google/go/x/exp/+/92128663:LICENSE,BSD-3-Clause -golang.org/x/net,https://cs.opensource.google/go/x/net/+/v0.25.0:LICENSE,BSD-3-Clause +golang.org/x/net,https://cs.opensource.google/go/x/net/+/v0.33.0:LICENSE,BSD-3-Clause golang.org/x/oauth2,https://cs.opensource.google/go/x/oauth2/+/v0.16.0:LICENSE,BSD-3-Clause golang.org/x/sync/semaphore,https://cs.opensource.google/go/x/sync/+/v0.10.0:LICENSE,BSD-3-Clause golang.org/x/sys/unix,https://cs.opensource.google/go/x/sys/+/v0.28.0:LICENSE,BSD-3-Clause diff --git a/backend/third_party_licenses/driver.csv b/backend/third_party_licenses/driver.csv index 4b872f93fd71..3faaf83b791e 100644 --- a/backend/third_party_licenses/driver.csv +++ b/backend/third_party_licenses/driver.csv @@ -118,7 +118,7 @@ go.uber.org/zap,https://github.com/uber-go/zap/blob/v1.26.0/LICENSE.txt,MIT gocloud.dev,https://github.com/google/go-cloud/blob/v0.23.0/LICENSE,Apache-2.0 golang.org/x/crypto,https://cs.opensource.google/go/x/crypto/+/v0.31.0:LICENSE,BSD-3-Clause golang.org/x/exp,https://cs.opensource.google/go/x/exp/+/92128663:LICENSE,BSD-3-Clause -golang.org/x/net,https://cs.opensource.google/go/x/net/+/v0.25.0:LICENSE,BSD-3-Clause +golang.org/x/net,https://cs.opensource.google/go/x/net/+/v0.33.0:LICENSE,BSD-3-Clause golang.org/x/oauth2,https://cs.opensource.google/go/x/oauth2/+/v0.16.0:LICENSE,BSD-3-Clause golang.org/x/sync/semaphore,https://cs.opensource.google/go/x/sync/+/v0.10.0:LICENSE,BSD-3-Clause golang.org/x/sys,https://cs.opensource.google/go/x/sys/+/v0.28.0:LICENSE,BSD-3-Clause diff --git a/backend/third_party_licenses/launcher.csv b/backend/third_party_licenses/launcher.csv index bda51c275bc3..f2ddc5b6d55a 100644 --- a/backend/third_party_licenses/launcher.csv +++ b/backend/third_party_licenses/launcher.csv @@ -117,7 +117,7 @@ go.uber.org/zap,https://github.com/uber-go/zap/blob/v1.26.0/LICENSE.txt,MIT gocloud.dev,https://github.com/google/go-cloud/blob/v0.23.0/LICENSE,Apache-2.0 golang.org/x/crypto,https://cs.opensource.google/go/x/crypto/+/v0.31.0:LICENSE,BSD-3-Clause golang.org/x/exp,https://cs.opensource.google/go/x/exp/+/92128663:LICENSE,BSD-3-Clause -golang.org/x/net,https://cs.opensource.google/go/x/net/+/v0.25.0:LICENSE,BSD-3-Clause +golang.org/x/net,https://cs.opensource.google/go/x/net/+/v0.33.0:LICENSE,BSD-3-Clause golang.org/x/oauth2,https://cs.opensource.google/go/x/oauth2/+/v0.16.0:LICENSE,BSD-3-Clause golang.org/x/sync/semaphore,https://cs.opensource.google/go/x/sync/+/v0.10.0:LICENSE,BSD-3-Clause golang.org/x/sys,https://cs.opensource.google/go/x/sys/+/v0.28.0:LICENSE,BSD-3-Clause diff --git a/backend/third_party_licenses/persistence_agent.csv b/backend/third_party_licenses/persistence_agent.csv index 7399b3a94dfa..f19fd6ae58a0 100644 --- a/backend/third_party_licenses/persistence_agent.csv +++ b/backend/third_party_licenses/persistence_agent.csv @@ -95,7 +95,7 @@ go.uber.org/multierr,https://github.com/uber-go/multierr/blob/v1.11.0/LICENSE.tx go.uber.org/zap,https://github.com/uber-go/zap/blob/v1.26.0/LICENSE.txt,MIT golang.org/x/crypto,https://cs.opensource.google/go/x/crypto/+/v0.31.0:LICENSE,BSD-3-Clause golang.org/x/exp,https://cs.opensource.google/go/x/exp/+/92128663:LICENSE,BSD-3-Clause -golang.org/x/net,https://cs.opensource.google/go/x/net/+/v0.25.0:LICENSE,BSD-3-Clause +golang.org/x/net,https://cs.opensource.google/go/x/net/+/v0.33.0:LICENSE,BSD-3-Clause golang.org/x/oauth2,https://cs.opensource.google/go/x/oauth2/+/v0.16.0:LICENSE,BSD-3-Clause golang.org/x/sync/semaphore,https://cs.opensource.google/go/x/sync/+/v0.10.0:LICENSE,BSD-3-Clause golang.org/x/sys/unix,https://cs.opensource.google/go/x/sys/+/v0.28.0:LICENSE,BSD-3-Clause diff --git a/backend/third_party_licenses/swf.csv b/backend/third_party_licenses/swf.csv index 6109cc3ada00..9aed9d610cb0 100644 --- a/backend/third_party_licenses/swf.csv +++ b/backend/third_party_licenses/swf.csv @@ -104,7 +104,7 @@ go.uber.org/multierr,https://github.com/uber-go/multierr/blob/v1.11.0/LICENSE.tx go.uber.org/zap,https://github.com/uber-go/zap/blob/v1.26.0/LICENSE.txt,MIT golang.org/x/crypto,https://cs.opensource.google/go/x/crypto/+/v0.31.0:LICENSE,BSD-3-Clause golang.org/x/exp,https://cs.opensource.google/go/x/exp/+/92128663:LICENSE,BSD-3-Clause -golang.org/x/net,https://cs.opensource.google/go/x/net/+/v0.25.0:LICENSE,BSD-3-Clause +golang.org/x/net,https://cs.opensource.google/go/x/net/+/v0.33.0:LICENSE,BSD-3-Clause golang.org/x/oauth2,https://cs.opensource.google/go/x/oauth2/+/v0.16.0:LICENSE,BSD-3-Clause golang.org/x/sync/semaphore,https://cs.opensource.google/go/x/sync/+/v0.10.0:LICENSE,BSD-3-Clause golang.org/x/sys/unix,https://cs.opensource.google/go/x/sys/+/v0.28.0:LICENSE,BSD-3-Clause diff --git a/backend/third_party_licenses/viewer.csv b/backend/third_party_licenses/viewer.csv index 0df530dc7f1b..924567b6cb53 100644 --- a/backend/third_party_licenses/viewer.csv +++ b/backend/third_party_licenses/viewer.csv @@ -32,7 +32,7 @@ github.com/prometheus/common/internal/bitbucket.org/ww/goautoneg,https://github. github.com/prometheus/procfs,https://github.com/prometheus/procfs/blob/v0.12.0/LICENSE,Apache-2.0 github.com/spf13/pflag,https://github.com/spf13/pflag/blob/v1.0.5/LICENSE,BSD-3-Clause golang.org/x/exp/maps,https://cs.opensource.google/go/x/exp/+/92128663:LICENSE,BSD-3-Clause -golang.org/x/net,https://cs.opensource.google/go/x/net/+/v0.25.0:LICENSE,BSD-3-Clause +golang.org/x/net,https://cs.opensource.google/go/x/net/+/v0.33.0:LICENSE,BSD-3-Clause golang.org/x/oauth2,https://cs.opensource.google/go/x/oauth2/+/v0.16.0:LICENSE,BSD-3-Clause golang.org/x/sys/unix,https://cs.opensource.google/go/x/sys/+/v0.28.0:LICENSE,BSD-3-Clause golang.org/x/term,https://cs.opensource.google/go/x/term/+/v0.27.0:LICENSE,BSD-3-Clause diff --git a/components/contrib/openvino/ovms-deployer/containers/requirements.txt b/components/contrib/openvino/ovms-deployer/containers/requirements.txt index 11bbdaa3ba60..e2de17c7a096 100644 --- a/components/contrib/openvino/ovms-deployer/containers/requirements.txt +++ b/components/contrib/openvino/ovms-deployer/containers/requirements.txt @@ -1,3 +1,3 @@ -jinja2==2.11.3 +Jinja2>=3.1.2,<4 futures==3.1.1 tensorflow-serving-api==1.13.0 diff --git a/docs/Architecture.md b/docs/Architecture.md new file mode 100644 index 000000000000..901369b6d6a2 --- /dev/null +++ b/docs/Architecture.md @@ -0,0 +1,7 @@ +# Kubeflow Pipelines Architecture + +Below is a detailed diagram of the Kubeflow Pipelines Architecture. + +![KubeFlow Pipelines Cluster Wide Architecture](../images/kfp-cluster-wide-architecture.png) + +The above diagram documents the various components in Kubeflow Pipelines and how they interact. This should be a useful starting point for any developers. diff --git a/frontend/Dockerfile b/frontend/Dockerfile index cbcf17a6b67b..a23636a141e0 100644 --- a/frontend/Dockerfile +++ b/frontend/Dockerfile @@ -1,4 +1,4 @@ -FROM node:18.18.2 as build +FROM node:22.13 as build ARG COMMIT_HASH ENV COMMIT_HASH=${COMMIT_HASH} @@ -25,7 +25,7 @@ RUN mkdir -p ./server/dist && \ # concatenate them to one file under ./src/server RUN ./scripts/yarn-licenses.sh -FROM node:18.18.2-alpine3.17 +FROM node:22.13-alpine COPY --from=build ./src/frontend/server /server COPY --from=build ./src/frontend/build /client diff --git a/frontend/mock-backend/package-lock.json b/frontend/mock-backend/package-lock.json index 5443c0467c4c..bc8c0a6797f6 100644 --- a/frontend/mock-backend/package-lock.json +++ b/frontend/mock-backend/package-lock.json @@ -1,94 +1,106 @@ { "name": "mock-backend", "version": "1.0.0", - "lockfileVersion": 1, + "lockfileVersion": 3, "requires": true, - "dependencies": { - "@types/body-parser": { + "packages": { + "": { + "name": "mock-backend", + "version": "1.0.0", + "license": "ISC", + "dependencies": { + "@types/express": "^4.16.0", + "express": "^4.16.3" + } + }, + "node_modules/@types/body-parser": { "version": "1.17.0", "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.17.0.tgz", "integrity": "sha512-a2+YeUjPkztKJu5aIF2yArYFQQp8d51wZ7DavSHjFuY1mqVgidGyzEQ41JIVNy82fXj8yPgy2vJmfIywgESW6w==", - "requires": { + "dependencies": { "@types/connect": "*", "@types/node": "*" } }, - "@types/connect": { + "node_modules/@types/connect": { "version": "3.4.32", "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.32.tgz", "integrity": "sha512-4r8qa0quOvh7lGD0pre62CAb1oni1OO6ecJLGCezTmhQ8Fz50Arx9RUszryR8KlgK6avuSXvviL6yWyViQABOg==", - "requires": { + "dependencies": { "@types/node": "*" } }, - "@types/events": { + "node_modules/@types/events": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@types/events/-/events-1.2.0.tgz", "integrity": "sha512-KEIlhXnIutzKwRbQkGWb/I4HFqBuUykAdHgDED6xqwXJfONCjF5VoE0cXEiurh3XauygxzeDzgtXUqvLkxFzzA==" }, - "@types/express": { + "node_modules/@types/express": { "version": "4.16.0", "resolved": "https://registry.npmjs.org/@types/express/-/express-4.16.0.tgz", "integrity": "sha512-TtPEYumsmSTtTetAPXlJVf3kEqb6wZK0bZojpJQrnD/djV4q1oB6QQ8aKvKqwNPACoe02GNiy5zDzcYivR5Z2w==", - "requires": { + "dependencies": { "@types/body-parser": "*", "@types/express-serve-static-core": "*", "@types/serve-static": "*" } }, - "@types/express-serve-static-core": { + "node_modules/@types/express-serve-static-core": { "version": "4.16.0", "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.16.0.tgz", "integrity": "sha512-lTeoCu5NxJU4OD9moCgm0ESZzweAx0YqsAcab6OB0EB3+As1OaHtKnaGJvcngQxYsi9UNv0abn4/DRavrRxt4w==", - "requires": { + "dependencies": { "@types/events": "*", "@types/node": "*", "@types/range-parser": "*" } }, - "@types/mime": { + "node_modules/@types/mime": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@types/mime/-/mime-2.0.0.tgz", "integrity": "sha512-A2TAGbTFdBw9azHbpVd+/FkdW2T6msN1uct1O9bH3vTerEHKZhTXJUQXy+hNq1B0RagfU8U+KBdqiZpxjhOUQA==" }, - "@types/node": { + "node_modules/@types/node": { "version": "10.11.6", "resolved": "https://registry.npmjs.org/@types/node/-/node-10.11.6.tgz", "integrity": "sha512-fnA7yvqg3oKQDb3skBif9w5RRKVKAaeKeNuLzZL37XcSiWL4IoSXQnnbchR3UnBu2EMLHBip7ZVEkqoIVBP8QQ==" }, - "@types/range-parser": { + "node_modules/@types/range-parser": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.2.tgz", "integrity": "sha512-HtKGu+qG1NPvYe1z7ezLsyIaXYyi8SoAVqWDZgDQ8dLrsZvSzUNCwZyfX33uhWxL/SU0ZDQZ3nwZ0nimt507Kw==" }, - "@types/serve-static": { + "node_modules/@types/serve-static": { "version": "1.13.2", "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.2.tgz", "integrity": "sha512-/BZ4QRLpH/bNYgZgwhKEh+5AsboDBcUdlBYgzoLX0fpj3Y2gp6EApyOlM3bK53wQS/OE1SrdSYBAbux2D1528Q==", - "requires": { + "dependencies": { "@types/express-serve-static-core": "*", "@types/mime": "*" } }, - "accepts": { + "node_modules/accepts": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "requires": { + "dependencies": { "mime-types": "~2.1.34", "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" } }, - "array-flatten": { + "node_modules/array-flatten": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" }, - "body-parser": { + "node_modules/body-parser": { "version": "1.20.3", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", - "requires": { + "dependencies": { "bytes": "3.1.2", "content-type": "~1.0.5", "debug": "2.6.9", @@ -101,114 +113,161 @@ "raw-body": "2.5.2", "type-is": "~1.6.18", "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" } }, - "bytes": { + "node_modules/bytes": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "engines": { + "node": ">= 0.8" + } }, - "call-bind": { + "node_modules/call-bind": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", - "requires": { + "dependencies": { "es-define-property": "^1.0.0", "es-errors": "^1.3.0", "function-bind": "^1.1.2", "get-intrinsic": "^1.2.4", "set-function-length": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "content-disposition": { + "node_modules/content-disposition": { "version": "0.5.4", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", - "requires": { + "dependencies": { "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" } }, - "content-type": { + "node_modules/content-type": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==" + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "engines": { + "node": ">= 0.6" + } }, - "cookie": { + "node_modules/cookie": { "version": "0.7.1", "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", - "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==" + "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", + "engines": { + "node": ">= 0.6" + } }, - "cookie-signature": { + "node_modules/cookie-signature": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" }, - "debug": { + "node_modules/debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { + "dependencies": { "ms": "2.0.0" } }, - "define-data-property": { + "node_modules/define-data-property": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", - "requires": { + "dependencies": { "es-define-property": "^1.0.0", "es-errors": "^1.3.0", "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "depd": { + "node_modules/depd": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "engines": { + "node": ">= 0.8" + } }, - "destroy": { + "node_modules/destroy": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==" + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } }, - "ee-first": { + "node_modules/ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, - "encodeurl": { + "node_modules/encodeurl": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", - "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==" + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "engines": { + "node": ">= 0.8" + } }, - "es-define-property": { + "node_modules/es-define-property": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", - "requires": { + "dependencies": { "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" } }, - "es-errors": { + "node_modules/es-errors": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==" + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "engines": { + "node": ">= 0.4" + } }, - "escape-html": { + "node_modules/escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" }, - "etag": { + "node_modules/etag": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==" + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "engines": { + "node": ">= 0.6" + } }, - "express": { + "node_modules/express": { "version": "4.21.2", "resolved": "http://registry.npmjs.org/express/-/express-4.21.2.tgz", "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", - "requires": { + "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", "body-parser": "1.20.3", @@ -240,13 +299,20 @@ "type-is": "~1.6.18", "utils-merge": "1.0.1", "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, - "finalhandler": { + "node_modules/finalhandler": { "version": "1.3.1", "resolved": "http://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", - "requires": { + "dependencies": { "debug": "2.6.9", "encodeurl": "~2.0.0", "escape-html": "~1.0.3", @@ -254,213 +320,329 @@ "parseurl": "~1.3.3", "statuses": "2.0.1", "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" } }, - "forwarded": { + "node_modules/forwarded": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==" + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "engines": { + "node": ">= 0.6" + } }, - "fresh": { + "node_modules/fresh": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==" + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "engines": { + "node": ">= 0.6" + } }, - "function-bind": { + "node_modules/function-bind": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==" + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "get-intrinsic": { + "node_modules/get-intrinsic": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", - "requires": { + "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2", "has-proto": "^1.0.1", "has-symbols": "^1.0.3", "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "gopd": { + "node_modules/gopd": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==" + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "has-property-descriptors": { + "node_modules/has-property-descriptors": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", - "requires": { + "dependencies": { "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "has-proto": { + "node_modules/has-proto": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.1.0.tgz", "integrity": "sha512-QLdzI9IIO1Jg7f9GT1gXpPpXArAn6cS31R1eEZqz08Gc+uQ8/XiqHWt17Fiw+2p6oTTIq5GXEpQkAlA88YRl/Q==", - "requires": { + "dependencies": { "call-bind": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "has-symbols": { + "node_modules/has-symbols": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", - "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==" + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "hasown": { + "node_modules/hasown": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "requires": { + "dependencies": { "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" } }, - "http-errors": { + "node_modules/http-errors": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "requires": { + "dependencies": { "depd": "2.0.0", "inherits": "2.0.4", "setprototypeof": "1.2.0", "statuses": "2.0.1", "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" } }, - "iconv-lite": { + "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==", - "requires": { + "dependencies": { "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" } }, - "inherits": { + "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, - "ipaddr.js": { + "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==" + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "engines": { + "node": ">= 0.10" + } }, - "media-typer": { + "node_modules/media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==" + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "engines": { + "node": ">= 0.6" + } }, - "merge-descriptors": { + "node_modules/merge-descriptors": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", - "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==" + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "methods": { + "node_modules/methods": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==" + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "engines": { + "node": ">= 0.6" + } }, - "mime": { + "node_modules/mime": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } }, - "mime-db": { + "node_modules/mime-db": { "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } }, - "mime-types": { + "node_modules/mime-types": { "version": "2.1.35", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "requires": { + "dependencies": { "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" } }, - "ms": { + "node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, - "negotiator": { + "node_modules/negotiator": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==" + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "engines": { + "node": ">= 0.6" + } }, - "object-inspect": { + "node_modules/object-inspect": { "version": "1.13.3", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.3.tgz", - "integrity": "sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==" + "integrity": "sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "on-finished": { + "node_modules/on-finished": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "requires": { + "dependencies": { "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" } }, - "parseurl": { + "node_modules/parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "engines": { + "node": ">= 0.8" + } }, - "path-to-regexp": { + "node_modules/path-to-regexp": { "version": "0.1.12", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==" }, - "proxy-addr": { + "node_modules/proxy-addr": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", - "requires": { + "dependencies": { "forwarded": "0.2.0", "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" } }, - "qs": { + "node_modules/qs": { "version": "6.13.0", "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", - "requires": { + "dependencies": { "side-channel": "^1.0.6" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "range-parser": { + "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==" + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "engines": { + "node": ">= 0.6" + } }, - "raw-body": { + "node_modules/raw-body": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", - "requires": { + "dependencies": { "bytes": "3.1.2", "http-errors": "2.0.0", "iconv-lite": "0.4.24", "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" } }, - "safe-buffer": { + "node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] }, - "safer-buffer": { + "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, - "send": { + "node_modules/send": { "version": "0.19.0", "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", - "requires": { + "dependencies": { "debug": "2.6.9", "depd": "2.0.0", "destroy": "1.2.0", @@ -475,92 +657,126 @@ "range-parser": "~1.2.1", "statuses": "2.0.1" }, - "dependencies": { - "encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==" - }, - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - } + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "engines": { + "node": ">= 0.8" } }, - "serve-static": { + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/serve-static": { "version": "1.16.2", "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", - "requires": { + "dependencies": { "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "parseurl": "~1.3.3", "send": "0.19.0" + }, + "engines": { + "node": ">= 0.8.0" } }, - "set-function-length": { + "node_modules/set-function-length": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", - "requires": { + "dependencies": { "define-data-property": "^1.1.4", "es-errors": "^1.3.0", "function-bind": "^1.1.2", "get-intrinsic": "^1.2.4", "gopd": "^1.0.1", "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" } }, - "setprototypeof": { + "node_modules/setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" }, - "side-channel": { + "node_modules/side-channel": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", - "requires": { + "dependencies": { "call-bind": "^1.0.7", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.4", "object-inspect": "^1.13.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "statuses": { + "node_modules/statuses": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "engines": { + "node": ">= 0.8" + } }, - "toidentifier": { + "node_modules/toidentifier": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "engines": { + "node": ">=0.6" + } }, - "type-is": { + "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==", - "requires": { + "dependencies": { "media-typer": "0.3.0", "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" } }, - "unpipe": { + "node_modules/unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==" + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "engines": { + "node": ">= 0.8" + } }, - "utils-merge": { + "node_modules/utils-merge": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==" + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "engines": { + "node": ">= 0.4.0" + } }, - "vary": { + "node_modules/vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==" + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "engines": { + "node": ">= 0.8" + } } } } diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 752bed9c017f..abd41b419eb3 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -23519,9 +23519,10 @@ } }, "node_modules/express/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": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", + "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", + "license": "MIT" }, "node_modules/express/node_modules/qs": { "version": "6.11.0", @@ -33587,9 +33588,16 @@ } }, "node_modules/nanoid": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.1.tgz", - "integrity": "sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==", + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz", + "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", "bin": { "nanoid": "bin/nanoid.cjs" }, @@ -65426,7 +65434,7 @@ "methods": "~1.1.2", "on-finished": "2.4.1", "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", + "path-to-regexp": "0.1.12", "proxy-addr": "~2.0.7", "qs": "6.11.0", "range-parser": "~1.2.1", @@ -65512,9 +65520,9 @@ "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==" }, "path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", + "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==" }, "qs": { "version": "6.11.0", @@ -73251,9 +73259,9 @@ } }, "nanoid": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.1.tgz", - "integrity": "sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==" + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz", + "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==" }, "nanomatch": { "version": "1.2.13", @@ -74320,7 +74328,7 @@ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.5.tgz", "integrity": "sha512-jBDboWM8qpaqwkMwItqTQTiFikhs/67OYVvblFFTM7MrZjt6yMKd6r2kgXizEbTTljacm4NldIlZnhbjr84QYg==", "requires": { - "nanoid": "^3.1.30", + "nanoid": "3.3.8", "picocolors": "^1.0.0", "source-map-js": "^1.0.1" } diff --git a/frontend/package.json b/frontend/package.json index cff25bb3cf86..865aa3baa7b2 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -152,6 +152,12 @@ "resolutions": { "workbox-webpack-plugin": "6.6.0" }, + "overrides": { + "nanoid": "3.3.8", + "express": { + "path-to-regexp": "0.1.12" + } + }, "homepage": "./", "jest": { "collectCoverageFrom": [ diff --git a/frontend/server/package-lock.json b/frontend/server/package-lock.json index 729910997aae..7481de33773c 100644 --- a/frontend/server/package-lock.json +++ b/frontend/server/package-lock.json @@ -1,12 +1,49 @@ { + "name": "server", + "lockfileVersion": 3, "requires": true, - "lockfileVersion": 1, - "dependencies": { - "@aws-crypto/sha256-browser": { + "packages": { + "": { + "dependencies": { + "@aws-sdk/credential-providers": "^3.621.0", + "@google-cloud/storage": "^2.5.0", + "@kubernetes/client-node": "^0.8.2", + "axios": ">=1.6.0", + "crypto-js": "^3.1.8", + "express": "^4.21.0", + "gunzip-maybe": "^1.4.1", + "http-proxy-middleware": "^0.18.0", + "lodash": ">=4.17.21", + "minio": "~8.0.3", + "node-fetch": "^2.6.7", + "peek-stream": "^1.1.3", + "portable-fetch": "^3.0.0", + "tar-stream": "^2.1.0" + }, + "devDependencies": { + "@types/crypto-js": "^3.1.43", + "@types/express": "^4.11.1", + "@types/gunzip-maybe": "^1.4.0", + "@types/http-proxy-middleware": "^0.19.3", + "@types/jest": "^24.9.1", + "@types/node": "^14.14.20", + "@types/node-fetch": "^2.1.2", + "@types/supertest": "^2.0.8", + "@types/tar": "^4.0.3", + "@types/tar-stream": "^1.6.1", + "jest": "^25.3.0", + "prettier": "1.19.1", + "supertest": "^4.0.2", + "ts-jest": "^25.2.1", + "tslint": "^5.20.1", + "typescript": "^3.6.4" + } + }, + "node_modules/@aws-crypto/sha256-browser": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-5.2.0.tgz", "integrity": "sha512-AXfN/lGotSQwu6HNcEsIASo7kWXZ5HYWvfOmSNKDsEqC4OashTp8alTmaz+F7TC2L083SFv5RdB+qU3Vs1kZqw==", - "requires": { + "dependencies": { "@aws-crypto/sha256-js": "^5.2.0", "@aws-crypto/supports-web-crypto": "^5.2.0", "@aws-crypto/util": "^5.2.0", @@ -14,87 +51,88 @@ "@aws-sdk/util-locate-window": "^3.0.0", "@smithy/util-utf8": "^2.0.0", "tslib": "^2.6.2" - }, + } + }, + "node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/util-utf8": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", + "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==", "dependencies": { - "@smithy/util-utf8": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", - "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==", - "requires": { - "@smithy/util-buffer-from": "^2.2.0", - "tslib": "^2.6.2" - } - }, - "tslib": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", - "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" - } + "@smithy/util-buffer-from": "^2.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" } }, - "@aws-crypto/sha256-js": { + "node_modules/@aws-crypto/sha256-browser/node_modules/tslib": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" + }, + "node_modules/@aws-crypto/sha256-js": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-5.2.0.tgz", "integrity": "sha512-FFQQyu7edu4ufvIZ+OadFpHHOt+eSTBaYaki44c+akjg7qZg9oOQeLlk77F6tSYqjDAFClrHJk9tMf0HdVyOvA==", - "requires": { + "dependencies": { "@aws-crypto/util": "^5.2.0", "@aws-sdk/types": "^3.222.0", "tslib": "^2.6.2" }, - "dependencies": { - "tslib": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", - "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" - } + "engines": { + "node": ">=16.0.0" } }, - "@aws-crypto/supports-web-crypto": { + "node_modules/@aws-crypto/sha256-js/node_modules/tslib": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" + }, + "node_modules/@aws-crypto/supports-web-crypto": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-5.2.0.tgz", "integrity": "sha512-iAvUotm021kM33eCdNfwIN//F77/IADDSs58i+MDaOqFrVjZo9bAal0NK7HurRuWLLpF1iLX7gbWrjHjeo+YFg==", - "requires": { - "tslib": "^2.6.2" - }, "dependencies": { - "tslib": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", - "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" - } + "tslib": "^2.6.2" } }, - "@aws-crypto/util": { + "node_modules/@aws-crypto/supports-web-crypto/node_modules/tslib": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" + }, + "node_modules/@aws-crypto/util": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-5.2.0.tgz", "integrity": "sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==", - "requires": { + "dependencies": { "@aws-sdk/types": "^3.222.0", "@smithy/util-utf8": "^2.0.0", "tslib": "^2.6.2" - }, + } + }, + "node_modules/@aws-crypto/util/node_modules/@smithy/util-utf8": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", + "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==", "dependencies": { - "@smithy/util-utf8": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", - "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==", - "requires": { - "@smithy/util-buffer-from": "^2.2.0", - "tslib": "^2.6.2" - } - }, - "tslib": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", - "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" - } + "@smithy/util-buffer-from": "^2.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" } }, - "@aws-sdk/client-cognito-identity": { + "node_modules/@aws-crypto/util/node_modules/tslib": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" + }, + "node_modules/@aws-sdk/client-cognito-identity": { "version": "3.621.0", "resolved": "https://registry.npmjs.org/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.621.0.tgz", "integrity": "sha512-FpXia5qFf6ijcNDWenVq+mP9r1LbiW/+52i9wrv2+Afi6Nn1ROf8W7St8WvE9TEZ3t78y+vis4CwqfGts+uiKA==", - "requires": { + "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", "@aws-sdk/client-sso-oidc": "3.621.0", @@ -137,19 +175,20 @@ "@smithy/util-utf8": "^3.0.0", "tslib": "^2.6.2" }, - "dependencies": { - "tslib": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", - "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" - } + "engines": { + "node": ">=16.0.0" } }, - "@aws-sdk/client-sso": { + "node_modules/@aws-sdk/client-cognito-identity/node_modules/tslib": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" + }, + "node_modules/@aws-sdk/client-sso": { "version": "3.621.0", "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.621.0.tgz", "integrity": "sha512-xpKfikN4u0BaUYZA9FGUMkkDmfoIP0Q03+A86WjqDWhcOoqNA1DkHsE4kZ+r064ifkPUfcNuUvlkVTEoBZoFjA==", - "requires": { + "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", "@aws-sdk/core": "3.621.0", @@ -189,19 +228,15 @@ "@smithy/util-utf8": "^3.0.0", "tslib": "^2.6.2" }, - "dependencies": { - "tslib": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", - "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" - } + "engines": { + "node": ">=16.0.0" } }, - "@aws-sdk/client-sso-oidc": { + "node_modules/@aws-sdk/client-sso-oidc": { "version": "3.621.0", "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.621.0.tgz", "integrity": "sha512-mMjk3mFUwV2Y68POf1BQMTF+F6qxt5tPu6daEUCNGC9Cenk3h2YXQQoS4/eSyYzuBiYk3vx49VgleRvdvkg8rg==", - "requires": { + "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", "@aws-sdk/core": "3.621.0", @@ -242,19 +277,28 @@ "@smithy/util-utf8": "^3.0.0", "tslib": "^2.6.2" }, - "dependencies": { - "tslib": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", - "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" - } + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "@aws-sdk/client-sts": "^3.621.0" } }, - "@aws-sdk/client-sts": { + "node_modules/@aws-sdk/client-sso-oidc/node_modules/tslib": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" + }, + "node_modules/@aws-sdk/client-sso/node_modules/tslib": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" + }, + "node_modules/@aws-sdk/client-sts": { "version": "3.621.0", "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.621.0.tgz", "integrity": "sha512-707uiuReSt+nAx6d0c21xLjLm2lxeKc7padxjv92CIrIocnQSlJPxSCM7r5zBhwiahJA6MNQwmTl2xznU67KgA==", - "requires": { + "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", "@aws-sdk/client-sso-oidc": "3.621.0", @@ -296,19 +340,20 @@ "@smithy/util-utf8": "^3.0.0", "tslib": "^2.6.2" }, - "dependencies": { - "tslib": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", - "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" - } + "engines": { + "node": ">=16.0.0" } }, - "@aws-sdk/core": { + "node_modules/@aws-sdk/client-sts/node_modules/tslib": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" + }, + "node_modules/@aws-sdk/core": { "version": "3.621.0", "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.621.0.tgz", "integrity": "sha512-CtOwWmDdEiINkGXD93iGfXjN0WmCp9l45cDWHHGa8lRgEDyhuL7bwd/pH5aSzj0j8SiQBG2k0S7DHbd5RaqvbQ==", - "requires": { + "dependencies": { "@smithy/core": "^2.3.1", "@smithy/node-config-provider": "^3.1.4", "@smithy/protocol-http": "^4.1.0", @@ -319,56 +364,59 @@ "fast-xml-parser": "4.4.1", "tslib": "^2.6.2" }, - "dependencies": { - "tslib": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", - "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" - } + "engines": { + "node": ">=16.0.0" } }, - "@aws-sdk/credential-provider-cognito-identity": { + "node_modules/@aws-sdk/core/node_modules/tslib": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" + }, + "node_modules/@aws-sdk/credential-provider-cognito-identity": { "version": "3.621.0", "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.621.0.tgz", "integrity": "sha512-Q+3awvTVJSqIGRjCUQflRwKPKlZ0TfmL3EQHgFLhZZrToeBapEA62+FY+T70aTKAZZZZprlvYeFPtBloNd5ziA==", - "requires": { + "dependencies": { "@aws-sdk/client-cognito-identity": "3.621.0", "@aws-sdk/types": "3.609.0", "@smithy/property-provider": "^3.1.3", "@smithy/types": "^3.3.0", "tslib": "^2.6.2" }, - "dependencies": { - "tslib": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", - "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" - } + "engines": { + "node": ">=16.0.0" } }, - "@aws-sdk/credential-provider-env": { + "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/tslib": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" + }, + "node_modules/@aws-sdk/credential-provider-env": { "version": "3.620.1", "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.620.1.tgz", "integrity": "sha512-ExuILJ2qLW5ZO+rgkNRj0xiAipKT16Rk77buvPP8csR7kkCflT/gXTyzRe/uzIiETTxM7tr8xuO9MP/DQXqkfg==", - "requires": { + "dependencies": { "@aws-sdk/types": "3.609.0", "@smithy/property-provider": "^3.1.3", "@smithy/types": "^3.3.0", "tslib": "^2.6.2" }, - "dependencies": { - "tslib": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", - "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" - } + "engines": { + "node": ">=16.0.0" } }, - "@aws-sdk/credential-provider-http": { + "node_modules/@aws-sdk/credential-provider-env/node_modules/tslib": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" + }, + "node_modules/@aws-sdk/credential-provider-http": { "version": "3.621.0", "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.621.0.tgz", "integrity": "sha512-/jc2tEsdkT1QQAI5Dvoci50DbSxtJrevemwFsm0B73pwCcOQZ5ZwwSdVqGsPutzYzUVx3bcXg3LRL7jLACqRIg==", - "requires": { + "dependencies": { "@aws-sdk/types": "3.609.0", "@smithy/fetch-http-handler": "^3.2.4", "@smithy/node-http-handler": "^3.1.4", @@ -379,19 +427,20 @@ "@smithy/util-stream": "^3.1.3", "tslib": "^2.6.2" }, - "dependencies": { - "tslib": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", - "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" - } + "engines": { + "node": ">=16.0.0" } }, - "@aws-sdk/credential-provider-ini": { + "node_modules/@aws-sdk/credential-provider-http/node_modules/tslib": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" + }, + "node_modules/@aws-sdk/credential-provider-ini": { "version": "3.621.0", "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.621.0.tgz", "integrity": "sha512-0EWVnSc+JQn5HLnF5Xv405M8n4zfdx9gyGdpnCmAmFqEDHA8LmBdxJdpUk1Ovp/I5oPANhjojxabIW5f1uU0RA==", - "requires": { + "dependencies": { "@aws-sdk/credential-provider-env": "3.620.1", "@aws-sdk/credential-provider-http": "3.621.0", "@aws-sdk/credential-provider-process": "3.620.1", @@ -404,19 +453,23 @@ "@smithy/types": "^3.3.0", "tslib": "^2.6.2" }, - "dependencies": { - "tslib": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", - "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" - } + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "@aws-sdk/client-sts": "^3.621.0" } }, - "@aws-sdk/credential-provider-node": { + "node_modules/@aws-sdk/credential-provider-ini/node_modules/tslib": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" + }, + "node_modules/@aws-sdk/credential-provider-node": { "version": "3.621.0", "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.621.0.tgz", "integrity": "sha512-4JqpccUgz5Snanpt2+53hbOBbJQrSFq7E1sAAbgY6BKVQUsW5qyXqnjvSF32kDeKa5JpBl3bBWLZl04IadcPHw==", - "requires": { + "dependencies": { "@aws-sdk/credential-provider-env": "3.620.1", "@aws-sdk/credential-provider-http": "3.621.0", "@aws-sdk/credential-provider-ini": "3.621.0", @@ -430,38 +483,40 @@ "@smithy/types": "^3.3.0", "tslib": "^2.6.2" }, - "dependencies": { - "tslib": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", - "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" - } + "engines": { + "node": ">=16.0.0" } }, - "@aws-sdk/credential-provider-process": { + "node_modules/@aws-sdk/credential-provider-node/node_modules/tslib": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" + }, + "node_modules/@aws-sdk/credential-provider-process": { "version": "3.620.1", "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.620.1.tgz", "integrity": "sha512-hWqFMidqLAkaV9G460+1at6qa9vySbjQKKc04p59OT7lZ5cO5VH5S4aI05e+m4j364MBROjjk2ugNvfNf/8ILg==", - "requires": { + "dependencies": { "@aws-sdk/types": "3.609.0", "@smithy/property-provider": "^3.1.3", "@smithy/shared-ini-file-loader": "^3.1.4", "@smithy/types": "^3.3.0", "tslib": "^2.6.2" }, - "dependencies": { - "tslib": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", - "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" - } + "engines": { + "node": ">=16.0.0" } }, - "@aws-sdk/credential-provider-sso": { + "node_modules/@aws-sdk/credential-provider-process/node_modules/tslib": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" + }, + "node_modules/@aws-sdk/credential-provider-sso": { "version": "3.621.0", "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.621.0.tgz", "integrity": "sha512-Kza0jcFeA/GEL6xJlzR2KFf1PfZKMFnxfGzJzl5yN7EjoGdMijl34KaRyVnfRjnCWcsUpBWKNIDk9WZVMY9yiw==", - "requires": { + "dependencies": { "@aws-sdk/client-sso": "3.621.0", "@aws-sdk/token-providers": "3.614.0", "@aws-sdk/types": "3.609.0", @@ -470,37 +525,42 @@ "@smithy/types": "^3.3.0", "tslib": "^2.6.2" }, - "dependencies": { - "tslib": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", - "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" - } + "engines": { + "node": ">=16.0.0" } }, - "@aws-sdk/credential-provider-web-identity": { + "node_modules/@aws-sdk/credential-provider-sso/node_modules/tslib": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" + }, + "node_modules/@aws-sdk/credential-provider-web-identity": { "version": "3.621.0", "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.621.0.tgz", "integrity": "sha512-w7ASSyfNvcx7+bYGep3VBgC3K6vEdLmlpjT7nSIHxxQf+WSdvy+HynwJosrpZax0sK5q0D1Jpn/5q+r5lwwW6w==", - "requires": { + "dependencies": { "@aws-sdk/types": "3.609.0", "@smithy/property-provider": "^3.1.3", "@smithy/types": "^3.3.0", "tslib": "^2.6.2" }, - "dependencies": { - "tslib": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", - "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" - } + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "@aws-sdk/client-sts": "^3.621.0" } }, - "@aws-sdk/credential-providers": { + "node_modules/@aws-sdk/credential-provider-web-identity/node_modules/tslib": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" + }, + "node_modules/@aws-sdk/credential-providers": { "version": "3.621.0", "resolved": "https://registry.npmjs.org/@aws-sdk/credential-providers/-/credential-providers-3.621.0.tgz", "integrity": "sha512-FQbC7I8ae/72ZekLBa45jWJ+Q3d+YPhc3bW/rCks6RrldM6RgLTGr8pTOPCxHl828ky10RjkBiBmVU818rliyw==", - "requires": { + "dependencies": { "@aws-sdk/client-cognito-identity": "3.621.0", "@aws-sdk/client-sso": "3.621.0", "@aws-sdk/client-sts": "3.621.0", @@ -518,91 +578,96 @@ "@smithy/types": "^3.3.0", "tslib": "^2.6.2" }, - "dependencies": { - "tslib": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", - "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" - } + "engines": { + "node": ">=16.0.0" } }, - "@aws-sdk/middleware-host-header": { + "node_modules/@aws-sdk/credential-providers/node_modules/tslib": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" + }, + "node_modules/@aws-sdk/middleware-host-header": { "version": "3.620.0", "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.620.0.tgz", "integrity": "sha512-VMtPEZwqYrII/oUkffYsNWY9PZ9xpNJpMgmyU0rlDQ25O1c0Hk3fJmZRe6pEkAJ0omD7kLrqGl1DUjQVxpd/Rg==", - "requires": { + "dependencies": { "@aws-sdk/types": "3.609.0", "@smithy/protocol-http": "^4.1.0", "@smithy/types": "^3.3.0", "tslib": "^2.6.2" }, - "dependencies": { - "tslib": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", - "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" - } + "engines": { + "node": ">=16.0.0" } }, - "@aws-sdk/middleware-logger": { + "node_modules/@aws-sdk/middleware-host-header/node_modules/tslib": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" + }, + "node_modules/@aws-sdk/middleware-logger": { "version": "3.609.0", "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.609.0.tgz", "integrity": "sha512-S62U2dy4jMDhDFDK5gZ4VxFdWzCtLzwbYyFZx2uvPYTECkepLUfzLic2BHg2Qvtu4QjX+oGE3P/7fwaGIsGNuQ==", - "requires": { + "dependencies": { "@aws-sdk/types": "3.609.0", "@smithy/types": "^3.3.0", "tslib": "^2.6.2" }, - "dependencies": { - "tslib": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", - "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" - } + "engines": { + "node": ">=16.0.0" } }, - "@aws-sdk/middleware-recursion-detection": { + "node_modules/@aws-sdk/middleware-logger/node_modules/tslib": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" + }, + "node_modules/@aws-sdk/middleware-recursion-detection": { "version": "3.620.0", "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.620.0.tgz", "integrity": "sha512-nh91S7aGK3e/o1ck64sA/CyoFw+gAYj2BDOnoNa6ouyCrVJED96ZXWbhye/fz9SgmNUZR2g7GdVpiLpMKZoI5w==", - "requires": { + "dependencies": { "@aws-sdk/types": "3.609.0", "@smithy/protocol-http": "^4.1.0", "@smithy/types": "^3.3.0", "tslib": "^2.6.2" }, - "dependencies": { - "tslib": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", - "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" - } + "engines": { + "node": ">=16.0.0" } }, - "@aws-sdk/middleware-user-agent": { + "node_modules/@aws-sdk/middleware-recursion-detection/node_modules/tslib": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" + }, + "node_modules/@aws-sdk/middleware-user-agent": { "version": "3.620.0", "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.620.0.tgz", "integrity": "sha512-bvS6etn+KsuL32ubY5D3xNof1qkenpbJXf/ugGXbg0n98DvDFQ/F+SMLxHgbnER5dsKYchNnhmtI6/FC3HFu/A==", - "requires": { + "dependencies": { "@aws-sdk/types": "3.609.0", "@aws-sdk/util-endpoints": "3.614.0", "@smithy/protocol-http": "^4.1.0", "@smithy/types": "^3.3.0", "tslib": "^2.6.2" }, - "dependencies": { - "tslib": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", - "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" - } + "engines": { + "node": ">=16.0.0" } }, - "@aws-sdk/region-config-resolver": { + "node_modules/@aws-sdk/middleware-user-agent/node_modules/tslib": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" + }, + "node_modules/@aws-sdk/region-config-resolver": { "version": "3.614.0", "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.614.0.tgz", "integrity": "sha512-vDCeMXvic/LU0KFIUjpC3RiSTIkkvESsEfbVHiHH0YINfl8HnEqR5rj+L8+phsCeVg2+LmYwYxd5NRz4PHxt5g==", - "requires": { + "dependencies": { "@aws-sdk/types": "3.609.0", "@smithy/node-config-provider": "^3.1.4", "@smithy/types": "^3.3.0", @@ -610,133 +675,148 @@ "@smithy/util-middleware": "^3.0.3", "tslib": "^2.6.2" }, - "dependencies": { - "tslib": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", - "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" - } + "engines": { + "node": ">=16.0.0" } }, - "@aws-sdk/token-providers": { + "node_modules/@aws-sdk/region-config-resolver/node_modules/tslib": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" + }, + "node_modules/@aws-sdk/token-providers": { "version": "3.614.0", "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.614.0.tgz", "integrity": "sha512-okItqyY6L9IHdxqs+Z116y5/nda7rHxLvROxtAJdLavWTYDydxrZstImNgGWTeVdmc0xX2gJCI77UYUTQWnhRw==", - "requires": { + "dependencies": { "@aws-sdk/types": "3.609.0", "@smithy/property-provider": "^3.1.3", "@smithy/shared-ini-file-loader": "^3.1.4", "@smithy/types": "^3.3.0", "tslib": "^2.6.2" }, - "dependencies": { - "tslib": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", - "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" - } + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "@aws-sdk/client-sso-oidc": "^3.614.0" } }, - "@aws-sdk/types": { + "node_modules/@aws-sdk/token-providers/node_modules/tslib": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" + }, + "node_modules/@aws-sdk/types": { "version": "3.609.0", "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.609.0.tgz", "integrity": "sha512-+Tqnh9w0h2LcrUsdXyT1F8mNhXz+tVYBtP19LpeEGntmvHwa2XzvLUCWpoIAIVsHp5+HdB2X9Sn0KAtmbFXc2Q==", - "requires": { + "dependencies": { "@smithy/types": "^3.3.0", "tslib": "^2.6.2" }, - "dependencies": { - "tslib": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", - "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" - } + "engines": { + "node": ">=16.0.0" } }, - "@aws-sdk/util-endpoints": { + "node_modules/@aws-sdk/types/node_modules/tslib": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" + }, + "node_modules/@aws-sdk/util-endpoints": { "version": "3.614.0", "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.614.0.tgz", "integrity": "sha512-wK2cdrXHH4oz4IomV/yrGkftU9A+ITB6nFL+rxxyO78is2ifHJpFdV4aqk4LSkXYPi6CXWNru/Dqc7yiKXgJPw==", - "requires": { + "dependencies": { "@aws-sdk/types": "3.609.0", "@smithy/types": "^3.3.0", "@smithy/util-endpoints": "^2.0.5", "tslib": "^2.6.2" }, - "dependencies": { - "tslib": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", - "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" - } + "engines": { + "node": ">=16.0.0" } }, - "@aws-sdk/util-locate-window": { + "node_modules/@aws-sdk/util-endpoints/node_modules/tslib": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" + }, + "node_modules/@aws-sdk/util-locate-window": { "version": "3.568.0", "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.568.0.tgz", "integrity": "sha512-3nh4TINkXYr+H41QaPelCceEB2FXP3fxp93YZXB/kqJvX0U9j0N0Uk45gvsjmEPzG8XxkPEeLIfT2I1M7A6Lig==", - "requires": { + "dependencies": { "tslib": "^2.6.2" }, - "dependencies": { - "tslib": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", - "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" - } + "engines": { + "node": ">=16.0.0" } }, - "@aws-sdk/util-user-agent-browser": { + "node_modules/@aws-sdk/util-locate-window/node_modules/tslib": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" + }, + "node_modules/@aws-sdk/util-user-agent-browser": { "version": "3.609.0", "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.609.0.tgz", "integrity": "sha512-fojPU+mNahzQ0YHYBsx0ZIhmMA96H+ZIZ665ObU9tl+SGdbLneVZVikGve+NmHTQwHzwkFsZYYnVKAkreJLAtA==", - "requires": { + "dependencies": { "@aws-sdk/types": "3.609.0", "@smithy/types": "^3.3.0", "bowser": "^2.11.0", "tslib": "^2.6.2" - }, - "dependencies": { - "tslib": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", - "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" - } } }, - "@aws-sdk/util-user-agent-node": { + "node_modules/@aws-sdk/util-user-agent-browser/node_modules/tslib": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" + }, + "node_modules/@aws-sdk/util-user-agent-node": { "version": "3.614.0", "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.614.0.tgz", "integrity": "sha512-15ElZT88peoHnq5TEoEtZwoXTXRxNrk60TZNdpl/TUBJ5oNJ9Dqb5Z4ryb8ofN6nm9aFf59GVAerFDz8iUoHBA==", - "requires": { + "dependencies": { "@aws-sdk/types": "3.609.0", "@smithy/node-config-provider": "^3.1.4", "@smithy/types": "^3.3.0", "tslib": "^2.6.2" }, - "dependencies": { - "tslib": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", - "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "aws-crt": ">=1.0.0" + }, + "peerDependenciesMeta": { + "aws-crt": { + "optional": true } } }, - "@babel/code-frame": { + "node_modules/@aws-sdk/util-user-agent-node/node_modules/tslib": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" + }, + "node_modules/@babel/code-frame": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", "dev": true, - "requires": { + "dependencies": { "@babel/highlight": "^7.8.3" } }, - "@babel/core": { + "node_modules/@babel/core": { "version": "7.9.0", "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.9.0.tgz", "integrity": "sha512-kWc7L0fw1xwvI0zi8OKVBuxRVefwGOrKSQMvrQ3dW+bIIavBY3/NpXmpjMy7bQnLgwgzWQZ8TlM57YHpHNHz4w==", "dev": true, - "requires": { + "dependencies": { "@babel/code-frame": "^7.8.3", "@babel/generator": "^7.9.0", "@babel/helper-module-transforms": "^7.9.0", @@ -754,102 +834,122 @@ "semver": "^5.4.1", "source-map": "^0.5.0" }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "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": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } + "ms": "^2.1.1" } }, - "@babel/generator": { + "node_modules/@babel/core/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@babel/generator": { "version": "7.9.5", "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.9.5.tgz", "integrity": "sha512-GbNIxVB3ZJe3tLeDm1HSn2AhuD/mVcyLDpgtLXa5tplmWrJdF/elxB56XNqCuD6szyNkDi6wuoKXln3QeBmCHQ==", "dev": true, - "requires": { + "dependencies": { "@babel/types": "^7.9.5", "jsesc": "^2.5.1", "lodash": "^4.17.13", "source-map": "^0.5.0" - }, - "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } } }, - "@babel/helper-environment-visitor": { + "node_modules/@babel/generator/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@babel/helper-environment-visitor": { "version": "7.22.20", "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", - "dev": true + "dev": true, + "engines": { + "node": ">=6.9.0" + } }, - "@babel/helper-hoist-variables": { + "node_modules/@babel/helper-hoist-variables": { "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", "dev": true, - "requires": { + "dependencies": { "@babel/types": "^7.22.5" }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables/node_modules/@babel/helper-validator-identifier": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables/node_modules/@babel/types": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz", + "integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==", + "dev": true, "dependencies": { - "@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", - "dev": true - }, - "@babel/types": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz", - "integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==", - "dev": true, - "requires": { - "@babel/helper-string-parser": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.20", - "to-fast-properties": "^2.0.0" - } - } + "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.20", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" } }, - "@babel/helper-member-expression-to-functions": { + "node_modules/@babel/helper-member-expression-to-functions": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.8.3.tgz", "integrity": "sha512-fO4Egq88utkQFjbPrSHGmGLFqmrshs11d46WI+WZDESt7Wu7wN2G2Iu+NMMZJFDOVRHAMIkB5SNh30NtwCA7RA==", "dev": true, - "requires": { + "dependencies": { "@babel/types": "^7.8.3" } }, - "@babel/helper-module-imports": { + "node_modules/@babel/helper-module-imports": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.8.3.tgz", "integrity": "sha512-R0Bx3jippsbAEtzkpZ/6FIiuzOURPcMjHp+Z6xPe6DtApDJx+w7UYyOLanZqO8+wKR9G10s/FmHXvxaMd9s6Kg==", "dev": true, - "requires": { + "dependencies": { "@babel/types": "^7.8.3" } }, - "@babel/helper-module-transforms": { + "node_modules/@babel/helper-module-transforms": { "version": "7.9.0", "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.9.0.tgz", "integrity": "sha512-0FvKyu0gpPfIQ8EkxlrAydOWROdHpBmiCiRwLkUiBGhCUPRRbVD2/tm3sFr/c/GWFrQ/ffutGUAnx7V0FzT2wA==", "dev": true, - "requires": { + "dependencies": { "@babel/helper-module-imports": "^7.8.3", "@babel/helper-replace-supers": "^7.8.6", "@babel/helper-simple-access": "^7.8.3", @@ -859,199 +959,238 @@ "lodash": "^4.17.13" } }, - "@babel/helper-optimise-call-expression": { + "node_modules/@babel/helper-optimise-call-expression": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.8.3.tgz", "integrity": "sha512-Kag20n86cbO2AvHca6EJsvqAd82gc6VMGule4HwebwMlwkpXuVqrNRj6CkCV2sKxgi9MyAUnZVnZ6lJ1/vKhHQ==", "dev": true, - "requires": { + "dependencies": { "@babel/types": "^7.8.3" } }, - "@babel/helper-plugin-utils": { + "node_modules/@babel/helper-plugin-utils": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", "dev": true }, - "@babel/helper-replace-supers": { + "node_modules/@babel/helper-replace-supers": { "version": "7.8.6", "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.8.6.tgz", "integrity": "sha512-PeMArdA4Sv/Wf4zXwBKPqVj7n9UF/xg6slNRtZW84FM7JpE1CbG8B612FyM4cxrf4fMAMGO0kR7voy1ForHHFA==", "dev": true, - "requires": { + "dependencies": { "@babel/helper-member-expression-to-functions": "^7.8.3", "@babel/helper-optimise-call-expression": "^7.8.3", "@babel/traverse": "^7.8.6", "@babel/types": "^7.8.6" } }, - "@babel/helper-simple-access": { + "node_modules/@babel/helper-simple-access": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.8.3.tgz", "integrity": "sha512-VNGUDjx5cCWg4vvCTR8qQ7YJYZ+HBjxOgXEl7ounz+4Sn7+LMD3CFrCTEU6/qXKbA2nKg21CwhhBzO0RpRbdCw==", "dev": true, - "requires": { + "dependencies": { "@babel/template": "^7.8.3", "@babel/types": "^7.8.3" } }, - "@babel/helper-split-export-declaration": { + "node_modules/@babel/helper-split-export-declaration": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", "dev": true, - "requires": { + "dependencies": { "@babel/types": "^7.8.3" } }, - "@babel/helper-string-parser": { + "node_modules/@babel/helper-string-parser": { "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", - "dev": true + "dev": true, + "engines": { + "node": ">=6.9.0" + } }, - "@babel/helper-validator-identifier": { + "node_modules/@babel/helper-validator-identifier": { "version": "7.9.5", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.5.tgz", "integrity": "sha512-/8arLKUFq882w4tWGj9JYzRpAlZgiWUJ+dtteNTDqrRBz9Iguck9Rn3ykuBDoUwh2TO4tSAJlrxDUOXWklJe4g==", "dev": true }, - "@babel/helpers": { + "node_modules/@babel/helpers": { "version": "7.9.2", "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.9.2.tgz", "integrity": "sha512-JwLvzlXVPjO8eU9c/wF9/zOIN7X6h8DYf7mG4CiFRZRvZNKEF5dQ3H3V+ASkHoIB3mWhatgl5ONhyqHRI6MppA==", "dev": true, - "requires": { + "dependencies": { "@babel/template": "^7.8.3", "@babel/traverse": "^7.9.0", "@babel/types": "^7.9.0" } }, - "@babel/highlight": { + "node_modules/@babel/highlight": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", "dev": true, - "requires": { + "dependencies": { "chalk": "^2.0.0", "esutils": "^2.0.2", "js-tokens": "^4.0.0" } }, - "@babel/parser": { + "node_modules/@babel/parser": { "version": "7.9.4", "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.9.4.tgz", "integrity": "sha512-bC49otXX6N0/VYhgOMh4gnP26E9xnDZK3TmbNpxYzzz9BQLBosQwfyOe9/cXUU3txYhTzLCbcqd5c8y/OmCjHA==", - "dev": true + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } }, - "@babel/plugin-syntax-async-generators": { + "node_modules/@babel/plugin-syntax-async-generators": { "version": "7.8.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", "dev": true, - "requires": { + "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "@babel/plugin-syntax-bigint": { + "node_modules/@babel/plugin-syntax-bigint": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", "dev": true, - "requires": { + "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "@babel/plugin-syntax-class-properties": { + "node_modules/@babel/plugin-syntax-class-properties": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.8.3.tgz", "integrity": "sha512-UcAyQWg2bAN647Q+O811tG9MrJ38Z10jjhQdKNAL8fsyPzE3cCN/uT+f55cFVY4aGO4jqJAvmqsuY3GQDwAoXg==", "dev": true, - "requires": { + "dependencies": { "@babel/helper-plugin-utils": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "@babel/plugin-syntax-json-strings": { + "node_modules/@babel/plugin-syntax-json-strings": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", "dev": true, - "requires": { + "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "@babel/plugin-syntax-logical-assignment-operators": { + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.8.3.tgz", "integrity": "sha512-Zpg2Sgc++37kuFl6ppq2Q7Awc6E6AIW671x5PY8E/f7MCIyPPGK/EoeZXvvY3P42exZ3Q4/t3YOzP/HiN79jDg==", "dev": true, - "requires": { + "dependencies": { "@babel/helper-plugin-utils": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "@babel/plugin-syntax-nullish-coalescing-operator": { + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", "dev": true, - "requires": { + "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "@babel/plugin-syntax-numeric-separator": { + "node_modules/@babel/plugin-syntax-numeric-separator": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.8.3.tgz", "integrity": "sha512-H7dCMAdN83PcCmqmkHB5dtp+Xa9a6LKSvA2hiFBC/5alSHxM5VgWZXFqDi0YFe8XNGT6iCa+z4V4zSt/PdZ7Dw==", "dev": true, - "requires": { + "dependencies": { "@babel/helper-plugin-utils": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "@babel/plugin-syntax-object-rest-spread": { + "node_modules/@babel/plugin-syntax-object-rest-spread": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", "dev": true, - "requires": { + "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "@babel/plugin-syntax-optional-catch-binding": { + "node_modules/@babel/plugin-syntax-optional-catch-binding": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", "dev": true, - "requires": { + "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "@babel/plugin-syntax-optional-chaining": { + "node_modules/@babel/plugin-syntax-optional-chaining": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", "dev": true, - "requires": { + "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "@babel/template": { + "node_modules/@babel/template": { "version": "7.8.6", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.6.tgz", "integrity": "sha512-zbMsPMy/v0PWFZEhQJ66bqjhH+z0JgMoBWuikXybgG3Gkd/3t5oQ1Rw2WQhnSrsOmsKXnZOx15tkC4qON/+JPg==", "dev": true, - "requires": { + "dependencies": { "@babel/code-frame": "^7.8.3", "@babel/parser": "^7.8.6", "@babel/types": "^7.8.6" } }, - "@babel/traverse": { + "node_modules/@babel/traverse": { "version": "7.23.2", "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.2.tgz", "integrity": "sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==", "dev": true, - "requires": { + "dependencies": { "@babel/code-frame": "^7.22.13", "@babel/generator": "^7.23.0", "@babel/helper-environment-visitor": "^7.22.20", @@ -1063,136 +1202,181 @@ "debug": "^4.1.0", "globals": "^11.1.0" }, - "dependencies": { - "@babel/code-frame": { - "version": "7.22.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", - "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", - "dev": true, - "requires": { - "@babel/highlight": "^7.22.13", - "chalk": "^2.4.2" - } - }, - "@babel/generator": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.0.tgz", - "integrity": "sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==", - "dev": true, - "requires": { - "@babel/types": "^7.23.0", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", - "jsesc": "^2.5.1" - } - }, - "@babel/helper-function-name": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", - "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", - "dev": true, - "requires": { - "@babel/template": "^7.22.15", - "@babel/types": "^7.23.0" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", - "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", - "dev": true, - "requires": { - "@babel/types": "^7.22.5" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", - "dev": true - }, - "@babel/highlight": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", - "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.22.20", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz", - "integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==", - "dev": true - }, - "@babel/template": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", - "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.22.13", - "@babel/parser": "^7.22.15", - "@babel/types": "^7.22.15" - } - }, - "@babel/types": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz", - "integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==", - "dev": true, - "requires": { - "@babel/helper-string-parser": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.20", - "to-fast-properties": "^2.0.0" - } - }, - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - } + "engines": { + "node": ">=6.9.0" } }, - "@babel/types": { - "version": "7.9.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.9.5.tgz", - "integrity": "sha512-XjnvNqenk818r5zMaba+sLQjnbda31UfUURv3ei0qPQw4u+j2jMyJ5b11y8ZHYTRSI3NnInQkkkRT4fLqqPdHg==", + "node_modules/@babel/traverse/node_modules/@babel/code-frame": { + "version": "7.22.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", + "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.9.5", - "lodash": "^4.17.13", + "dependencies": { + "@babel/highlight": "^7.22.13", + "chalk": "^2.4.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse/node_modules/@babel/generator": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.0.tgz", + "integrity": "sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==", + "dev": true, + "dependencies": { + "@babel/types": "^7.23.0", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse/node_modules/@babel/helper-function-name": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", + "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", + "dev": true, + "dependencies": { + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse/node_modules/@babel/helper-split-export-declaration": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse/node_modules/@babel/helper-validator-identifier": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse/node_modules/@babel/highlight": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", + "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse/node_modules/@babel/parser": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz", + "integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/traverse/node_modules/@babel/template": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", + "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.22.13", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse/node_modules/@babel/types": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz", + "integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.20", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@babel/types": { + "version": "7.9.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.9.5.tgz", + "integrity": "sha512-XjnvNqenk818r5zMaba+sLQjnbda31UfUURv3ei0qPQw4u+j2jMyJ5b11y8ZHYTRSI3NnInQkkkRT4fLqqPdHg==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.9.5", + "lodash": "^4.17.13", "to-fast-properties": "^2.0.0" } }, - "@bcoe/v8-coverage": { + "node_modules/@bcoe/v8-coverage": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", "dev": true }, - "@cnakazawa/watch": { + "node_modules/@cnakazawa/watch": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/@cnakazawa/watch/-/watch-1.0.4.tgz", "integrity": "sha512-v9kIhKwjeZThiWrLmj0y17CWoyddASLj9O2yvbZkbvw/N3rWOYy9zkV66ursAoVr0mV15bL8g0c4QZUE6cdDoQ==", "dev": true, - "requires": { + "dependencies": { "exec-sh": "^0.3.2", "minimist": "^1.2.0" + }, + "bin": { + "watch": "cli.js" + }, + "engines": { + "node": ">=0.1.95" } }, - "@google-cloud/common": { + "node_modules/@google-cloud/common": { "version": "0.32.1", "resolved": "https://registry.npmjs.org/@google-cloud/common/-/common-0.32.1.tgz", "integrity": "sha512-bLdPzFvvBMtVkwsoBtygE9oUm3yrNmPa71gvOgucYI/GqvNP2tb6RYsDHPq98kvignhcgHGDI5wyNgxaCo8bKQ==", - "requires": { + "dependencies": { "@google-cloud/projectify": "^0.3.3", "@google-cloud/promisify": "^0.4.0", "@types/request": "^2.48.1", @@ -1205,40 +1389,44 @@ "retry-request": "^4.0.0", "teeny-request": "^3.11.3" }, - "dependencies": { - "arrify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", - "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==" - } + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@google-cloud/common/node_modules/arrify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", + "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", + "engines": { + "node": ">=8" } }, - "@google-cloud/paginator": { + "node_modules/@google-cloud/paginator": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/@google-cloud/paginator/-/paginator-0.2.0.tgz", "integrity": "sha512-2ZSARojHDhkLvQ+CS32K+iUhBsWg3AEw+uxtqblA7xoCABDyhpj99FPp35xy6A+XlzMhOSrHHaxFE+t6ZTQq0w==", - "requires": { + "dependencies": { "arrify": "^1.0.1", "extend": "^3.0.1", "split-array-stream": "^2.0.0", "stream-events": "^1.0.4" } }, - "@google-cloud/projectify": { + "node_modules/@google-cloud/projectify": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/@google-cloud/projectify/-/projectify-0.3.3.tgz", "integrity": "sha512-7522YHQ4IhaafgSunsFF15nG0TGVmxgXidy9cITMe+256RgqfcrfWphiMufW+Ou4kqagW/u3yxwbzVEW3dk2Uw==" }, - "@google-cloud/promisify": { + "node_modules/@google-cloud/promisify": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/@google-cloud/promisify/-/promisify-0.4.0.tgz", "integrity": "sha512-4yAHDC52TEMCNcMzVC8WlqnKKKq+Ssi2lXoUg9zWWkZ6U6tq9ZBRYLHHCRdfU+EU9YJsVmivwGcKYCjRGjnf4Q==" }, - "@google-cloud/storage": { + "node_modules/@google-cloud/storage": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/@google-cloud/storage/-/storage-2.5.0.tgz", "integrity": "sha512-q1mwB6RUebIahbA3eriRs8DbG2Ij81Ynb9k8hMqTPkmbd8/S6Z0d6hVvfPmnyvX9Ej13IcmEYIbymuq/RBLghA==", - "requires": { + "dependencies": { "@google-cloud/common": "^0.32.0", "@google-cloud/paginator": "^0.2.0", "@google-cloud/promisify": "^0.4.0", @@ -1260,96 +1448,124 @@ "teeny-request": "^3.11.3", "through2": "^3.0.0", "xdg-basedir": "^3.0.0" + }, + "engines": { + "node": ">=6.0.0" } }, - "@istanbuljs/load-nyc-config": { + "node_modules/@istanbuljs/load-nyc-config": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.0.0.tgz", "integrity": "sha512-ZR0rq/f/E4f4XcgnDvtMWXCUJpi8eO0rssVhmztsZqLIEFA9UUP9zmpE0VxlM+kv/E1ul2I876Fwil2ayptDVg==", "dev": true, - "requires": { + "dependencies": { "camelcase": "^5.3.1", "find-up": "^4.1.0", "js-yaml": "^3.13.1", "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" } }, - "@istanbuljs/schema": { + "node_modules/@istanbuljs/schema": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.2.tgz", "integrity": "sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw==", - "dev": true + "dev": true, + "engines": { + "node": ">=8" + } }, - "@jest/console": { + "node_modules/@jest/console": { "version": "25.3.0", "resolved": "https://registry.npmjs.org/@jest/console/-/console-25.3.0.tgz", "integrity": "sha512-LvSDNqpmZIZyweFaEQ6wKY7CbexPitlsLHGJtcooNECo0An/w49rFhjCJzu6efeb6+a3ee946xss1Jcd9r03UQ==", "dev": true, - "requires": { + "dependencies": { "@jest/source-map": "^25.2.6", "chalk": "^3.0.0", "jest-util": "^25.3.0", "slash": "^3.0.0" }, + "engines": { + "node": ">= 8.3" + } + }, + "node_modules/@jest/console/node_modules/ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, "dependencies": { - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "dev": true, - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "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 - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "@jest/core": { + "node_modules/@jest/console/node_modules/chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/console/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/@jest/console/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/@jest/console/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/@jest/console/node_modules/supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/core": { "version": "25.3.0", "resolved": "https://registry.npmjs.org/@jest/core/-/core-25.3.0.tgz", "integrity": "sha512-+D5a/tFf6pA/Gqft2DLBp/yeSRgXhlJ+Wpst0X/ZkfTRP54qDR3C61VfHwaex+GzZBiTcE9vQeoZ2v5T10+Mqw==", "dev": true, - "requires": { + "dependencies": { "@jest/console": "^25.3.0", "@jest/reporters": "^25.3.0", "@jest/test-result": "^25.3.0", @@ -1379,6674 +1595,8445 @@ "slash": "^3.0.0", "strip-ansi": "^6.0.0" }, - "dependencies": { - "@jest/types": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-25.3.0.tgz", - "integrity": "sha512-UkaDNewdqXAmCDbN2GlUM6amDKS78eCqiw/UmF5nE0mmLTd6moJkiZJML/X52Ke3LH7Swhw883IRXq8o9nWjVw==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^15.0.0", - "chalk": "^3.0.0" - } - }, - "@types/yargs": { - "version": "15.0.4", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.4.tgz", - "integrity": "sha512-9T1auFmbPZoxHz0enUFlUuKRy3it01R+hlggyVUMtnCTQRunsQYifnSGb8hET4Xo8yiC0o0r1paW3ud5+rbURg==", - "dev": true, - "requires": { - "@types/yargs-parser": "*" - } - }, - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "dev": true, - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.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" - } - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "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 - }, - "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" - } - }, - "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 - }, - "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 - }, - "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", - "dev": true, - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.0.5" - } - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - }, - "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" - } - } + "engines": { + "node": ">= 8.3" } }, - "@jest/environment": { + "node_modules/@jest/core/node_modules/@jest/types": { "version": "25.3.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-25.3.0.tgz", - "integrity": "sha512-vgooqwJTHLLak4fE+TaCGeYP7Tz1Y3CKOsNxR1sE0V3nx3KRUHn3NUnt+wbcfd5yQWKZQKAfW6wqbuwQLrXo3g==", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-25.3.0.tgz", + "integrity": "sha512-UkaDNewdqXAmCDbN2GlUM6amDKS78eCqiw/UmF5nE0mmLTd6moJkiZJML/X52Ke3LH7Swhw883IRXq8o9nWjVw==", "dev": true, - "requires": { - "@jest/fake-timers": "^25.3.0", - "@jest/types": "^25.3.0", - "jest-mock": "^25.3.0" - }, "dependencies": { - "@jest/types": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-25.3.0.tgz", - "integrity": "sha512-UkaDNewdqXAmCDbN2GlUM6amDKS78eCqiw/UmF5nE0mmLTd6moJkiZJML/X52Ke3LH7Swhw883IRXq8o9nWjVw==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^15.0.0", - "chalk": "^3.0.0" - } - }, - "@types/yargs": { - "version": "15.0.4", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.4.tgz", - "integrity": "sha512-9T1auFmbPZoxHz0enUFlUuKRy3it01R+hlggyVUMtnCTQRunsQYifnSGb8hET4Xo8yiC0o0r1paW3ud5+rbURg==", - "dev": true, - "requires": { - "@types/yargs-parser": "*" - } - }, - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "dev": true, - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "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 - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^15.0.0", + "chalk": "^3.0.0" + }, + "engines": { + "node": ">= 8.3" } }, - "@jest/fake-timers": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-25.3.0.tgz", - "integrity": "sha512-NHAj7WbsyR3qBJPpBwSwqaq2WluIvUQsyzpJTN7XDVk7VnlC/y1BAnaYZL3vbPIP8Nhm0Ae5DJe0KExr/SdMJQ==", + "node_modules/@jest/core/node_modules/@types/yargs": { + "version": "15.0.4", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.4.tgz", + "integrity": "sha512-9T1auFmbPZoxHz0enUFlUuKRy3it01R+hlggyVUMtnCTQRunsQYifnSGb8hET4Xo8yiC0o0r1paW3ud5+rbURg==", "dev": true, - "requires": { - "@jest/types": "^25.3.0", - "jest-message-util": "^25.3.0", - "jest-mock": "^25.3.0", - "jest-util": "^25.3.0", - "lolex": "^5.0.0" - }, "dependencies": { - "@jest/types": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-25.3.0.tgz", - "integrity": "sha512-UkaDNewdqXAmCDbN2GlUM6amDKS78eCqiw/UmF5nE0mmLTd6moJkiZJML/X52Ke3LH7Swhw883IRXq8o9nWjVw==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^15.0.0", - "chalk": "^3.0.0" - } - }, - "@types/yargs": { - "version": "15.0.4", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.4.tgz", - "integrity": "sha512-9T1auFmbPZoxHz0enUFlUuKRy3it01R+hlggyVUMtnCTQRunsQYifnSGb8hET4Xo8yiC0o0r1paW3ud5+rbURg==", - "dev": true, - "requires": { - "@types/yargs-parser": "*" - } - }, - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "dev": true, - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "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 - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } + "@types/yargs-parser": "*" } }, - "@jest/reporters": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-25.3.0.tgz", - "integrity": "sha512-1u0ZBygs0C9DhdYgLCrRfZfNKQa+9+J7Uo+Z9z0RWLHzgsxhoG32lrmMOtUw48yR6bLNELdvzormwUqSk4H4Vg==", + "node_modules/@jest/core/node_modules/ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", "dev": true, - "requires": { - "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^25.3.0", - "@jest/test-result": "^25.3.0", - "@jest/transform": "^25.3.0", - "@jest/types": "^25.3.0", - "chalk": "^3.0.0", - "collect-v8-coverage": "^1.0.0", - "exit": "^0.1.2", - "glob": "^7.1.2", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^4.0.0", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.0.2", - "jest-haste-map": "^25.3.0", - "jest-resolve": "^25.3.0", - "jest-util": "^25.3.0", - "jest-worker": "^25.2.6", - "node-notifier": "^6.0.0", - "slash": "^3.0.0", - "source-map": "^0.6.0", - "string-length": "^3.1.0", - "terminal-link": "^2.0.0", - "v8-to-istanbul": "^4.0.1" - }, "dependencies": { - "@jest/types": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-25.3.0.tgz", - "integrity": "sha512-UkaDNewdqXAmCDbN2GlUM6amDKS78eCqiw/UmF5nE0mmLTd6moJkiZJML/X52Ke3LH7Swhw883IRXq8o9nWjVw==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^15.0.0", - "chalk": "^3.0.0" - } - }, - "@types/yargs": { - "version": "15.0.4", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.4.tgz", - "integrity": "sha512-9T1auFmbPZoxHz0enUFlUuKRy3it01R+hlggyVUMtnCTQRunsQYifnSGb8hET4Xo8yiC0o0r1paW3ud5+rbURg==", - "dev": true, - "requires": { - "@types/yargs-parser": "*" - } - }, - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "dev": true, - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "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 - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "@jest/source-map": { - "version": "25.2.6", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-25.2.6.tgz", - "integrity": "sha512-VuIRZF8M2zxYFGTEhkNSvQkUKafQro4y+mwUxy5ewRqs5N/ynSFUODYp3fy1zCnbCMy1pz3k+u57uCqx8QRSQQ==", + "node_modules/@jest/core/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, - "requires": { - "callsites": "^3.0.0", - "graceful-fs": "^4.2.3", - "source-map": "^0.6.0" + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" } }, - "@jest/test-result": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-25.3.0.tgz", - "integrity": "sha512-mqrGuiiPXl1ap09Mydg4O782F3ouDQfsKqtQzIjitpwv3t1cHDwCto21jThw6WRRE+dKcWQvLG70GpyLJICfGw==", + "node_modules/@jest/core/node_modules/chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", "dev": true, - "requires": { - "@jest/console": "^25.3.0", - "@jest/types": "^25.3.0", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - }, "dependencies": { - "@jest/types": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-25.3.0.tgz", - "integrity": "sha512-UkaDNewdqXAmCDbN2GlUM6amDKS78eCqiw/UmF5nE0mmLTd6moJkiZJML/X52Ke3LH7Swhw883IRXq8o9nWjVw==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^15.0.0", - "chalk": "^3.0.0" - } - }, - "@types/yargs": { - "version": "15.0.4", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.4.tgz", - "integrity": "sha512-9T1auFmbPZoxHz0enUFlUuKRy3it01R+hlggyVUMtnCTQRunsQYifnSGb8hET4Xo8yiC0o0r1paW3ud5+rbURg==", - "dev": true, - "requires": { - "@types/yargs-parser": "*" - } - }, - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "dev": true, - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "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 - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" } }, - "@jest/test-sequencer": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-25.3.0.tgz", - "integrity": "sha512-Xvns3xbji7JCvVcDGvqJ/pf4IpmohPODumoPEZJ0/VgC5gI4XaNVIBET2Dq5Czu6Gk3xFcmhtthh/MBOTljdNg==", + "node_modules/@jest/core/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, - "requires": { - "@jest/test-result": "^25.3.0", - "jest-haste-map": "^25.3.0", - "jest-runner": "^25.3.0", - "jest-runtime": "^25.3.0" + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" } }, - "@jest/transform": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-25.3.0.tgz", - "integrity": "sha512-W01p8kTDvvEX6kd0tJc7Y5VdYyFaKwNWy1HQz6Jqlhu48z/8Gxp+yFCDVj+H8Rc7ezl3Mg0hDaGuFVkmHOqirg==", + "node_modules/@jest/core/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/@jest/core/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, - "requires": { - "@babel/core": "^7.1.0", - "@jest/types": "^25.3.0", - "babel-plugin-istanbul": "^6.0.0", - "chalk": "^3.0.0", - "convert-source-map": "^1.4.0", - "fast-json-stable-stringify": "^2.0.0", - "graceful-fs": "^4.2.3", - "jest-haste-map": "^25.3.0", - "jest-regex-util": "^25.2.6", - "jest-util": "^25.3.0", - "micromatch": "^4.0.2", - "pirates": "^4.0.1", - "realpath-native": "^2.0.0", - "slash": "^3.0.0", - "source-map": "^0.6.1", - "write-file-atomic": "^3.0.0" - }, "dependencies": { - "@jest/types": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-25.3.0.tgz", - "integrity": "sha512-UkaDNewdqXAmCDbN2GlUM6amDKS78eCqiw/UmF5nE0mmLTd6moJkiZJML/X52Ke3LH7Swhw883IRXq8o9nWjVw==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^15.0.0", - "chalk": "^3.0.0" - } - }, - "@types/yargs": { - "version": "15.0.4", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.4.tgz", - "integrity": "sha512-9T1auFmbPZoxHz0enUFlUuKRy3it01R+hlggyVUMtnCTQRunsQYifnSGb8hET4Xo8yiC0o0r1paW3ud5+rbURg==", - "dev": true, - "requires": { - "@types/yargs-parser": "*" - } - }, - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "dev": true, - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.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" - } - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "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 - }, - "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" - } - }, - "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 - }, - "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 - }, - "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", - "dev": true, - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.0.5" - } - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - }, - "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" - } - }, - "write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", - "dev": true, - "requires": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - } + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" } }, - "@jest/types": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", - "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", + "node_modules/@jest/core/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, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^13.0.0" + "engines": { + "node": ">=8" } }, - "@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "node_modules/@jest/core/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, - "requires": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" + "engines": { + "node": ">=0.12.0" } }, - "@jridgewell/resolve-uri": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", - "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", - "dev": true - }, - "@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", - "dev": true - }, - "@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", - "dev": true - }, - "@jridgewell/trace-mapping": { - "version": "0.3.19", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz", - "integrity": "sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==", + "node_modules/@jest/core/node_modules/micromatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", + "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", "dev": true, - "requires": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" + "dependencies": { + "braces": "^3.0.1", + "picomatch": "^2.0.5" + }, + "engines": { + "node": ">=8" } }, - "@kubernetes/client-node": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/@kubernetes/client-node/-/client-node-0.8.2.tgz", - "integrity": "sha512-crS3h59+fOGXQgxVdq3XH81ytY7FV2HnB5z/+lSWD3bi5D5lHKu3PVN2PHCDMNExPy0KthcfqBoIVFVy4CoG3A==", - "requires": { - "@types/js-yaml": "^3.11.2", - "@types/node": "^10.12.0", - "@types/request": "^2.47.1", - "@types/underscore": "^1.8.9", - "@types/ws": "^6.0.1", - "byline": "^5.0.0", - "isomorphic-ws": "^4.0.1", - "js-yaml": "^3.12.0", - "jsonpath": "^1.0.0", - "request": "^2.88.0", - "shelljs": "^0.8.2", - "tslib": "^1.9.3", - "underscore": "^1.9.1", - "ws": "^6.1.0" - }, + "node_modules/@jest/core/node_modules/supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, "dependencies": { - "@types/node": { - "version": "10.17.60", - "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", - "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==" - } + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "@sinonjs/commons": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.7.2.tgz", - "integrity": "sha512-+DUO6pnp3udV/v2VfUWgaY5BIE1IfT7lLfeDzPVeMT1XKkaAp9LgSI9x5RtrFQoZ9Oi0PgXQQHPaoKu7dCjVxw==", + "node_modules/@jest/core/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, - "requires": { - "type-detect": "4.0.8" + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" } }, - "@smithy/abort-controller": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-3.1.1.tgz", - "integrity": "sha512-MBJBiidoe+0cTFhyxT8g+9g7CeVccLM0IOKKUMCNQ1CNMJ/eIfoo0RTfVrXOONEI1UCN1W+zkiHSbzUNE9dZtQ==", - "requires": { - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, + "node_modules/@jest/environment": { + "version": "25.3.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-25.3.0.tgz", + "integrity": "sha512-vgooqwJTHLLak4fE+TaCGeYP7Tz1Y3CKOsNxR1sE0V3nx3KRUHn3NUnt+wbcfd5yQWKZQKAfW6wqbuwQLrXo3g==", + "dev": true, "dependencies": { - "tslib": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", - "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" - } + "@jest/fake-timers": "^25.3.0", + "@jest/types": "^25.3.0", + "jest-mock": "^25.3.0" + }, + "engines": { + "node": ">= 8.3" } }, - "@smithy/config-resolver": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-3.0.5.tgz", - "integrity": "sha512-SkW5LxfkSI1bUC74OtfBbdz+grQXYiPYolyu8VfpLIjEoN/sHVBlLeGXMQ1vX4ejkgfv6sxVbQJ32yF2cl1veA==", - "requires": { - "@smithy/node-config-provider": "^3.1.4", - "@smithy/types": "^3.3.0", - "@smithy/util-config-provider": "^3.0.0", - "@smithy/util-middleware": "^3.0.3", - "tslib": "^2.6.2" - }, + "node_modules/@jest/environment/node_modules/@jest/types": { + "version": "25.3.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-25.3.0.tgz", + "integrity": "sha512-UkaDNewdqXAmCDbN2GlUM6amDKS78eCqiw/UmF5nE0mmLTd6moJkiZJML/X52Ke3LH7Swhw883IRXq8o9nWjVw==", + "dev": true, "dependencies": { - "tslib": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", - "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" - } + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^15.0.0", + "chalk": "^3.0.0" + }, + "engines": { + "node": ">= 8.3" } }, - "@smithy/core": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@smithy/core/-/core-2.3.1.tgz", - "integrity": "sha512-BC7VMXx/1BCmRPCVzzn4HGWAtsrb7/0758EtwOGFJQrlSwJBEjCcDLNZLFoL/68JexYa2s+KmgL/UfmXdG6v1w==", - "requires": { - "@smithy/middleware-endpoint": "^3.1.0", - "@smithy/middleware-retry": "^3.0.13", - "@smithy/middleware-serde": "^3.0.3", - "@smithy/protocol-http": "^4.1.0", - "@smithy/smithy-client": "^3.1.11", - "@smithy/types": "^3.3.0", - "@smithy/util-middleware": "^3.0.3", - "tslib": "^2.6.2" - }, + "node_modules/@jest/environment/node_modules/@types/yargs": { + "version": "15.0.4", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.4.tgz", + "integrity": "sha512-9T1auFmbPZoxHz0enUFlUuKRy3it01R+hlggyVUMtnCTQRunsQYifnSGb8hET4Xo8yiC0o0r1paW3ud5+rbURg==", + "dev": true, "dependencies": { - "tslib": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", - "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" - } + "@types/yargs-parser": "*" } }, - "@smithy/credential-provider-imds": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-3.2.0.tgz", - "integrity": "sha512-0SCIzgd8LYZ9EJxUjLXBmEKSZR/P/w6l7Rz/pab9culE/RWuqelAKGJvn5qUOl8BgX8Yj5HWM50A5hiB/RzsgA==", - "requires": { - "@smithy/node-config-provider": "^3.1.4", - "@smithy/property-provider": "^3.1.3", - "@smithy/types": "^3.3.0", - "@smithy/url-parser": "^3.0.3", - "tslib": "^2.6.2" - }, + "node_modules/@jest/environment/node_modules/ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, "dependencies": { - "tslib": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", - "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" - } + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "@smithy/fetch-http-handler": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-3.2.4.tgz", - "integrity": "sha512-kBprh5Gs5h7ug4nBWZi1FZthdqSM+T7zMmsZxx0IBvWUn7dK3diz2SHn7Bs4dQGFDk8plDv375gzenDoNwrXjg==", - "requires": { - "@smithy/protocol-http": "^4.1.0", - "@smithy/querystring-builder": "^3.0.3", - "@smithy/types": "^3.3.0", - "@smithy/util-base64": "^3.0.0", - "tslib": "^2.6.2" - }, + "node_modules/@jest/environment/node_modules/chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, "dependencies": { - "tslib": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", - "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" - } + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" } }, - "@smithy/hash-node": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-3.0.3.tgz", - "integrity": "sha512-2ctBXpPMG+B3BtWSGNnKELJ7SH9e4TNefJS0cd2eSkOOROeBnnVBnAy9LtJ8tY4vUEoe55N4CNPxzbWvR39iBw==", - "requires": { - "@smithy/types": "^3.3.0", - "@smithy/util-buffer-from": "^3.0.0", - "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2" - }, + "node_modules/@jest/environment/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": { - "@smithy/is-array-buffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-3.0.0.tgz", - "integrity": "sha512-+Fsu6Q6C4RSJiy81Y8eApjEB5gVtM+oFKTffg+jSuwtvomJJrhUJBu2zS8wjXSgH/g1MKEWrzyChTBe6clb5FQ==", - "requires": { - "tslib": "^2.6.2" - } - }, - "@smithy/util-buffer-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-3.0.0.tgz", - "integrity": "sha512-aEOHCgq5RWFbP+UDPvPot26EJHjOC+bRgse5A8V3FSShqd5E5UN4qc7zkwsvJPPAVsf73QwYcHN1/gt/rtLwQA==", - "requires": { - "@smithy/is-array-buffer": "^3.0.0", - "tslib": "^2.6.2" - } - }, - "tslib": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", - "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" - } + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" } }, - "@smithy/invalid-dependency": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-3.0.3.tgz", - "integrity": "sha512-ID1eL/zpDULmHJbflb864k72/SNOZCADRc9i7Exq3RUNJw6raWUSlFEQ+3PX3EYs++bTxZB2dE9mEHTQLv61tw==", - "requires": { - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "dependencies": { - "tslib": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", - "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" - } + "node_modules/@jest/environment/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/@jest/environment/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" } }, - "@smithy/is-array-buffer": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz", - "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==", - "requires": { - "tslib": "^2.6.2" + "node_modules/@jest/environment/node_modules/supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/fake-timers": { + "version": "25.3.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-25.3.0.tgz", + "integrity": "sha512-NHAj7WbsyR3qBJPpBwSwqaq2WluIvUQsyzpJTN7XDVk7VnlC/y1BAnaYZL3vbPIP8Nhm0Ae5DJe0KExr/SdMJQ==", + "dev": true, "dependencies": { - "tslib": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", - "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" - } + "@jest/types": "^25.3.0", + "jest-message-util": "^25.3.0", + "jest-mock": "^25.3.0", + "jest-util": "^25.3.0", + "lolex": "^5.0.0" + }, + "engines": { + "node": ">= 8.3" } }, - "@smithy/middleware-content-length": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-3.0.5.tgz", - "integrity": "sha512-ILEzC2eyxx6ncej3zZSwMpB5RJ0zuqH7eMptxC4KN3f+v9bqT8ohssKbhNR78k/2tWW+KS5Spw+tbPF4Ejyqvw==", - "requires": { - "@smithy/protocol-http": "^4.1.0", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" + "node_modules/@jest/fake-timers/node_modules/@jest/types": { + "version": "25.3.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-25.3.0.tgz", + "integrity": "sha512-UkaDNewdqXAmCDbN2GlUM6amDKS78eCqiw/UmF5nE0mmLTd6moJkiZJML/X52Ke3LH7Swhw883IRXq8o9nWjVw==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^15.0.0", + "chalk": "^3.0.0" }, + "engines": { + "node": ">= 8.3" + } + }, + "node_modules/@jest/fake-timers/node_modules/@types/yargs": { + "version": "15.0.4", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.4.tgz", + "integrity": "sha512-9T1auFmbPZoxHz0enUFlUuKRy3it01R+hlggyVUMtnCTQRunsQYifnSGb8hET4Xo8yiC0o0r1paW3ud5+rbURg==", + "dev": true, "dependencies": { - "tslib": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", - "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" - } + "@types/yargs-parser": "*" } }, - "@smithy/middleware-endpoint": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-3.1.0.tgz", - "integrity": "sha512-5y5aiKCEwg9TDPB4yFE7H6tYvGFf1OJHNczeY10/EFF8Ir8jZbNntQJxMWNfeQjC1mxPsaQ6mR9cvQbf+0YeMw==", - "requires": { - "@smithy/middleware-serde": "^3.0.3", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/shared-ini-file-loader": "^3.1.4", - "@smithy/types": "^3.3.0", - "@smithy/url-parser": "^3.0.3", - "@smithy/util-middleware": "^3.0.3", - "tslib": "^2.6.2" - }, + "node_modules/@jest/fake-timers/node_modules/ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, "dependencies": { - "tslib": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", - "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" - } + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "@smithy/middleware-retry": { - "version": "3.0.13", - "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-3.0.13.tgz", - "integrity": "sha512-zvCLfaRYCaUmjbF2yxShGZdolSHft7NNCTA28HVN9hKcEbOH+g5irr1X9s+in8EpambclGnevZY4A3lYpvDCFw==", - "requires": { - "@smithy/node-config-provider": "^3.1.4", - "@smithy/protocol-http": "^4.1.0", - "@smithy/service-error-classification": "^3.0.3", - "@smithy/smithy-client": "^3.1.11", - "@smithy/types": "^3.3.0", - "@smithy/util-middleware": "^3.0.3", - "@smithy/util-retry": "^3.0.3", - "tslib": "^2.6.2", - "uuid": "^9.0.1" - }, + "node_modules/@jest/fake-timers/node_modules/chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, "dependencies": { - "tslib": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", - "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" - }, - "uuid": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", - "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==" - } + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" } }, - "@smithy/middleware-serde": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-3.0.3.tgz", - "integrity": "sha512-puUbyJQBcg9eSErFXjKNiGILJGtiqmuuNKEYNYfUD57fUl4i9+mfmThtQhvFXU0hCVG0iEJhvQUipUf+/SsFdA==", - "requires": { - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, + "node_modules/@jest/fake-timers/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": { - "tslib": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", - "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" - } + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" } }, - "@smithy/middleware-stack": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-3.0.3.tgz", - "integrity": "sha512-r4klY9nFudB0r9UdSMaGSyjyQK5adUyPnQN/ZM6M75phTxOdnc/AhpvGD1fQUvgmqjQEBGCwpnPbDm8pH5PapA==", - "requires": { - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "dependencies": { - "tslib": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", - "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" - } + "node_modules/@jest/fake-timers/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/@jest/fake-timers/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" } }, - "@smithy/node-config-provider": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-3.1.4.tgz", - "integrity": "sha512-YvnElQy8HR4vDcAjoy7Xkx9YT8xZP4cBXcbJSgm/kxmiQu08DwUwj8rkGnyoJTpfl/3xYHH+d8zE+eHqoDCSdQ==", - "requires": { - "@smithy/property-provider": "^3.1.3", - "@smithy/shared-ini-file-loader": "^3.1.4", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, + "node_modules/@jest/fake-timers/node_modules/supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, "dependencies": { - "tslib": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", - "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" - } + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "@smithy/node-http-handler": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-3.1.4.tgz", - "integrity": "sha512-+UmxgixgOr/yLsUxcEKGH0fMNVteJFGkmRltYFHnBMlogyFdpzn2CwqWmxOrfJELhV34v0WSlaqG1UtE1uXlJg==", - "requires": { - "@smithy/abort-controller": "^3.1.1", - "@smithy/protocol-http": "^4.1.0", - "@smithy/querystring-builder": "^3.0.3", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, + "node_modules/@jest/reporters": { + "version": "25.3.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-25.3.0.tgz", + "integrity": "sha512-1u0ZBygs0C9DhdYgLCrRfZfNKQa+9+J7Uo+Z9z0RWLHzgsxhoG32lrmMOtUw48yR6bLNELdvzormwUqSk4H4Vg==", + "dev": true, "dependencies": { - "tslib": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", - "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" - } + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^25.3.0", + "@jest/test-result": "^25.3.0", + "@jest/transform": "^25.3.0", + "@jest/types": "^25.3.0", + "chalk": "^3.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.2", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^4.0.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.0.2", + "jest-haste-map": "^25.3.0", + "jest-resolve": "^25.3.0", + "jest-util": "^25.3.0", + "jest-worker": "^25.2.6", + "slash": "^3.0.0", + "source-map": "^0.6.0", + "string-length": "^3.1.0", + "terminal-link": "^2.0.0", + "v8-to-istanbul": "^4.0.1" + }, + "engines": { + "node": ">= 8.3" + }, + "optionalDependencies": { + "node-notifier": "^6.0.0" } }, - "@smithy/property-provider": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-3.1.3.tgz", - "integrity": "sha512-zahyOVR9Q4PEoguJ/NrFP4O7SMAfYO1HLhB18M+q+Z4KFd4V2obiMnlVoUFzFLSPeVt1POyNWneHHrZaTMoc/g==", - "requires": { - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, + "node_modules/@jest/reporters/node_modules/@jest/types": { + "version": "25.3.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-25.3.0.tgz", + "integrity": "sha512-UkaDNewdqXAmCDbN2GlUM6amDKS78eCqiw/UmF5nE0mmLTd6moJkiZJML/X52Ke3LH7Swhw883IRXq8o9nWjVw==", + "dev": true, "dependencies": { - "tslib": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", - "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" - } + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^15.0.0", + "chalk": "^3.0.0" + }, + "engines": { + "node": ">= 8.3" } }, - "@smithy/protocol-http": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-4.1.0.tgz", - "integrity": "sha512-dPVoHYQ2wcHooGXg3LQisa1hH0e4y0pAddPMeeUPipI1tEOqL6A4N0/G7abeq+K8wrwSgjk4C0wnD1XZpJm5aA==", - "requires": { - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, + "node_modules/@jest/reporters/node_modules/@types/yargs": { + "version": "15.0.4", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.4.tgz", + "integrity": "sha512-9T1auFmbPZoxHz0enUFlUuKRy3it01R+hlggyVUMtnCTQRunsQYifnSGb8hET4Xo8yiC0o0r1paW3ud5+rbURg==", + "dev": true, "dependencies": { - "tslib": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", - "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" - } + "@types/yargs-parser": "*" } }, - "@smithy/querystring-builder": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-3.0.3.tgz", - "integrity": "sha512-vyWckeUeesFKzCDaRwWLUA1Xym9McaA6XpFfAK5qI9DKJ4M33ooQGqvM4J+LalH4u/Dq9nFiC8U6Qn1qi0+9zw==", - "requires": { - "@smithy/types": "^3.3.0", - "@smithy/util-uri-escape": "^3.0.0", - "tslib": "^2.6.2" - }, + "node_modules/@jest/reporters/node_modules/ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, "dependencies": { - "tslib": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", - "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" - } + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "@smithy/querystring-parser": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-3.0.3.tgz", - "integrity": "sha512-zahM1lQv2YjmznnfQsWbYojFe55l0SLG/988brlLv1i8z3dubloLF+75ATRsqPBboUXsW6I9CPGE5rQgLfY0vQ==", - "requires": { - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" + "node_modules/@jest/reporters/node_modules/chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/reporters/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": { - "tslib": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", - "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" - } + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" } }, - "@smithy/service-error-classification": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-3.0.3.tgz", - "integrity": "sha512-Jn39sSl8cim/VlkLsUhRFq/dKDnRUFlfRkvhOJaUbLBXUsLRLNf9WaxDv/z9BjuQ3A6k/qE8af1lsqcwm7+DaQ==", - "requires": { - "@smithy/types": "^3.3.0" + "node_modules/@jest/reporters/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/@jest/reporters/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" } }, - "@smithy/shared-ini-file-loader": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-3.1.4.tgz", - "integrity": "sha512-qMxS4hBGB8FY2GQqshcRUy1K6k8aBWP5vwm8qKkCT3A9K2dawUwOIJfqh9Yste/Bl0J2lzosVyrXDj68kLcHXQ==", - "requires": { - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, + "node_modules/@jest/reporters/node_modules/supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, "dependencies": { - "tslib": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", - "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" - } + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "@smithy/signature-v4": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-4.1.0.tgz", - "integrity": "sha512-aRryp2XNZeRcOtuJoxjydO6QTaVhxx/vjaR+gx7ZjaFgrgPRyZ3HCTbfwqYj6ZWEBHkCSUfcaymKPURaByukag==", - "requires": { - "@smithy/is-array-buffer": "^3.0.0", - "@smithy/protocol-http": "^4.1.0", - "@smithy/types": "^3.3.0", - "@smithy/util-hex-encoding": "^3.0.0", - "@smithy/util-middleware": "^3.0.3", - "@smithy/util-uri-escape": "^3.0.0", - "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2" - }, + "node_modules/@jest/source-map": { + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-25.2.6.tgz", + "integrity": "sha512-VuIRZF8M2zxYFGTEhkNSvQkUKafQro4y+mwUxy5ewRqs5N/ynSFUODYp3fy1zCnbCMy1pz3k+u57uCqx8QRSQQ==", + "dev": true, "dependencies": { - "@smithy/is-array-buffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-3.0.0.tgz", - "integrity": "sha512-+Fsu6Q6C4RSJiy81Y8eApjEB5gVtM+oFKTffg+jSuwtvomJJrhUJBu2zS8wjXSgH/g1MKEWrzyChTBe6clb5FQ==", - "requires": { - "tslib": "^2.6.2" - } - }, - "tslib": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", - "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" - } + "callsites": "^3.0.0", + "graceful-fs": "^4.2.3", + "source-map": "^0.6.0" + }, + "engines": { + "node": ">= 8.3" } }, - "@smithy/smithy-client": { - "version": "3.1.11", - "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-3.1.11.tgz", - "integrity": "sha512-l0BpyYkciNyMaS+PnFFz4aO5sBcXvGLoJd7mX9xrMBIm2nIQBVvYgp2ZpPDMzwjKCavsXu06iuCm0F6ZJZc6yQ==", - "requires": { - "@smithy/middleware-endpoint": "^3.1.0", - "@smithy/middleware-stack": "^3.0.3", - "@smithy/protocol-http": "^4.1.0", - "@smithy/types": "^3.3.0", - "@smithy/util-stream": "^3.1.3", - "tslib": "^2.6.2" - }, + "node_modules/@jest/test-result": { + "version": "25.3.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-25.3.0.tgz", + "integrity": "sha512-mqrGuiiPXl1ap09Mydg4O782F3ouDQfsKqtQzIjitpwv3t1cHDwCto21jThw6WRRE+dKcWQvLG70GpyLJICfGw==", + "dev": true, "dependencies": { - "tslib": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", - "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" - } + "@jest/console": "^25.3.0", + "@jest/types": "^25.3.0", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": ">= 8.3" } }, - "@smithy/types": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.3.0.tgz", - "integrity": "sha512-IxvBBCTFDHbVoK7zIxqA1ZOdc4QfM5HM7rGleCuHi7L1wnKv5Pn69xXJQ9hgxH60ZVygH9/JG0jRgtUncE3QUA==", - "requires": { - "tslib": "^2.6.2" - }, + "node_modules/@jest/test-result/node_modules/@jest/types": { + "version": "25.3.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-25.3.0.tgz", + "integrity": "sha512-UkaDNewdqXAmCDbN2GlUM6amDKS78eCqiw/UmF5nE0mmLTd6moJkiZJML/X52Ke3LH7Swhw883IRXq8o9nWjVw==", + "dev": true, "dependencies": { - "tslib": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", - "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" - } + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^15.0.0", + "chalk": "^3.0.0" + }, + "engines": { + "node": ">= 8.3" } }, - "@smithy/url-parser": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-3.0.3.tgz", - "integrity": "sha512-pw3VtZtX2rg+s6HMs6/+u9+hu6oY6U7IohGhVNnjbgKy86wcIsSZwgHrFR+t67Uyxvp4Xz3p3kGXXIpTNisq8A==", - "requires": { - "@smithy/querystring-parser": "^3.0.3", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, + "node_modules/@jest/test-result/node_modules/@types/yargs": { + "version": "15.0.4", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.4.tgz", + "integrity": "sha512-9T1auFmbPZoxHz0enUFlUuKRy3it01R+hlggyVUMtnCTQRunsQYifnSGb8hET4Xo8yiC0o0r1paW3ud5+rbURg==", + "dev": true, "dependencies": { - "tslib": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", - "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" - } + "@types/yargs-parser": "*" } }, - "@smithy/util-base64": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-3.0.0.tgz", - "integrity": "sha512-Kxvoh5Qtt0CDsfajiZOCpJxgtPHXOKwmM+Zy4waD43UoEMA+qPxxa98aE/7ZhdnBFZFXMOiBR5xbcaMhLtznQQ==", - "requires": { - "@smithy/util-buffer-from": "^3.0.0", - "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2" - }, + "node_modules/@jest/test-result/node_modules/ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, "dependencies": { - "@smithy/is-array-buffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-3.0.0.tgz", - "integrity": "sha512-+Fsu6Q6C4RSJiy81Y8eApjEB5gVtM+oFKTffg+jSuwtvomJJrhUJBu2zS8wjXSgH/g1MKEWrzyChTBe6clb5FQ==", - "requires": { - "tslib": "^2.6.2" - } - }, - "@smithy/util-buffer-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-3.0.0.tgz", - "integrity": "sha512-aEOHCgq5RWFbP+UDPvPot26EJHjOC+bRgse5A8V3FSShqd5E5UN4qc7zkwsvJPPAVsf73QwYcHN1/gt/rtLwQA==", - "requires": { - "@smithy/is-array-buffer": "^3.0.0", - "tslib": "^2.6.2" - } - }, - "tslib": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", - "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" - } + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "@smithy/util-body-length-browser": { + "node_modules/@jest/test-result/node_modules/chalk": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-3.0.0.tgz", - "integrity": "sha512-cbjJs2A1mLYmqmyVl80uoLTJhAcfzMOyPgjwAYusWKMdLeNtzmMz9YxNl3/jRLoxSS3wkqkf0jwNdtXWtyEBaQ==", - "requires": { - "tslib": "^2.6.2" - }, + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, "dependencies": { - "tslib": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", - "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" - } + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" } }, - "@smithy/util-body-length-node": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-3.0.0.tgz", - "integrity": "sha512-Tj7pZ4bUloNUP6PzwhN7K386tmSmEET9QtQg0TgdNOnxhZvCssHji+oZTUIuzxECRfG8rdm2PMw2WCFs6eIYkA==", - "requires": { - "tslib": "^2.6.2" - }, + "node_modules/@jest/test-result/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": { - "tslib": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", - "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" - } + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" } }, - "@smithy/util-buffer-from": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz", - "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==", - "requires": { - "@smithy/is-array-buffer": "^2.2.0", - "tslib": "^2.6.2" - }, - "dependencies": { - "tslib": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", - "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" - } - } + "node_modules/@jest/test-result/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 }, - "@smithy/util-config-provider": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-3.0.0.tgz", - "integrity": "sha512-pbjk4s0fwq3Di/ANL+rCvJMKM5bzAQdE5S/6RL5NXgMExFAi6UgQMPOm5yPaIWPpr+EOXKXRonJ3FoxKf4mCJQ==", - "requires": { - "tslib": "^2.6.2" - }, - "dependencies": { - "tslib": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", - "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" - } + "node_modules/@jest/test-result/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" } }, - "@smithy/util-defaults-mode-browser": { - "version": "3.0.13", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-3.0.13.tgz", - "integrity": "sha512-ZIRSUsnnMRStOP6OKtW+gCSiVFkwnfQF2xtf32QKAbHR6ACjhbAybDvry+3L5qQYdh3H6+7yD/AiUE45n8mTTw==", - "requires": { - "@smithy/property-provider": "^3.1.3", - "@smithy/smithy-client": "^3.1.11", - "@smithy/types": "^3.3.0", - "bowser": "^2.11.0", - "tslib": "^2.6.2" - }, + "node_modules/@jest/test-result/node_modules/supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, "dependencies": { - "tslib": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", - "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" - } + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "@smithy/util-defaults-mode-node": { - "version": "3.0.13", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-3.0.13.tgz", - "integrity": "sha512-voUa8TFJGfD+U12tlNNLCDlXibt9vRdNzRX45Onk/WxZe7TS+hTOZouEZRa7oARGicdgeXvt1A0W45qLGYdy+g==", - "requires": { - "@smithy/config-resolver": "^3.0.5", - "@smithy/credential-provider-imds": "^3.2.0", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/property-provider": "^3.1.3", - "@smithy/smithy-client": "^3.1.11", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, + "node_modules/@jest/test-sequencer": { + "version": "25.3.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-25.3.0.tgz", + "integrity": "sha512-Xvns3xbji7JCvVcDGvqJ/pf4IpmohPODumoPEZJ0/VgC5gI4XaNVIBET2Dq5Czu6Gk3xFcmhtthh/MBOTljdNg==", + "dev": true, "dependencies": { - "tslib": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", - "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" - } + "@jest/test-result": "^25.3.0", + "jest-haste-map": "^25.3.0", + "jest-runner": "^25.3.0", + "jest-runtime": "^25.3.0" + }, + "engines": { + "node": ">= 8.3" } }, - "@smithy/util-endpoints": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-2.0.5.tgz", - "integrity": "sha512-ReQP0BWihIE68OAblC/WQmDD40Gx+QY1Ez8mTdFMXpmjfxSyz2fVQu3A4zXRfQU9sZXtewk3GmhfOHswvX+eNg==", - "requires": { - "@smithy/node-config-provider": "^3.1.4", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, + "node_modules/@jest/transform": { + "version": "25.3.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-25.3.0.tgz", + "integrity": "sha512-W01p8kTDvvEX6kd0tJc7Y5VdYyFaKwNWy1HQz6Jqlhu48z/8Gxp+yFCDVj+H8Rc7ezl3Mg0hDaGuFVkmHOqirg==", + "dev": true, "dependencies": { - "tslib": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", - "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" - } + "@babel/core": "^7.1.0", + "@jest/types": "^25.3.0", + "babel-plugin-istanbul": "^6.0.0", + "chalk": "^3.0.0", + "convert-source-map": "^1.4.0", + "fast-json-stable-stringify": "^2.0.0", + "graceful-fs": "^4.2.3", + "jest-haste-map": "^25.3.0", + "jest-regex-util": "^25.2.6", + "jest-util": "^25.3.0", + "micromatch": "^4.0.2", + "pirates": "^4.0.1", + "realpath-native": "^2.0.0", + "slash": "^3.0.0", + "source-map": "^0.6.1", + "write-file-atomic": "^3.0.0" + }, + "engines": { + "node": ">= 8.3" } }, - "@smithy/util-hex-encoding": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-3.0.0.tgz", - "integrity": "sha512-eFndh1WEK5YMUYvy3lPlVmYY/fZcQE1D8oSf41Id2vCeIkKJXPcYDCZD+4+xViI6b1XSd7tE+s5AmXzz5ilabQ==", - "requires": { - "tslib": "^2.6.2" - }, + "node_modules/@jest/transform/node_modules/@jest/types": { + "version": "25.3.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-25.3.0.tgz", + "integrity": "sha512-UkaDNewdqXAmCDbN2GlUM6amDKS78eCqiw/UmF5nE0mmLTd6moJkiZJML/X52Ke3LH7Swhw883IRXq8o9nWjVw==", + "dev": true, "dependencies": { - "tslib": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", - "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" - } + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^15.0.0", + "chalk": "^3.0.0" + }, + "engines": { + "node": ">= 8.3" } }, - "@smithy/util-middleware": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-3.0.3.tgz", - "integrity": "sha512-l+StyYYK/eO3DlVPbU+4Bi06Jjal+PFLSMmlWM1BEwyLxZ3aKkf1ROnoIakfaA7mC6uw3ny7JBkau4Yc+5zfWw==", - "requires": { - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, + "node_modules/@jest/transform/node_modules/@types/yargs": { + "version": "15.0.4", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.4.tgz", + "integrity": "sha512-9T1auFmbPZoxHz0enUFlUuKRy3it01R+hlggyVUMtnCTQRunsQYifnSGb8hET4Xo8yiC0o0r1paW3ud5+rbURg==", + "dev": true, "dependencies": { - "tslib": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", - "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" - } + "@types/yargs-parser": "*" } }, - "@smithy/util-retry": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-3.0.3.tgz", - "integrity": "sha512-AFw+hjpbtVApzpNDhbjNG5NA3kyoMs7vx0gsgmlJF4s+yz1Zlepde7J58zpIRIsdjc+emhpAITxA88qLkPF26w==", - "requires": { - "@smithy/service-error-classification": "^3.0.3", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, + "node_modules/@jest/transform/node_modules/ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, "dependencies": { - "tslib": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", - "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" - } + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "@smithy/util-stream": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-3.1.3.tgz", - "integrity": "sha512-FIv/bRhIlAxC0U7xM1BCnF2aDRPq0UaelqBHkM2lsCp26mcBbgI0tCVTv+jGdsQLUmAMybua/bjDsSu8RQHbmw==", - "requires": { - "@smithy/fetch-http-handler": "^3.2.4", - "@smithy/node-http-handler": "^3.1.4", - "@smithy/types": "^3.3.0", - "@smithy/util-base64": "^3.0.0", - "@smithy/util-buffer-from": "^3.0.0", - "@smithy/util-hex-encoding": "^3.0.0", - "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2" - }, + "node_modules/@jest/transform/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": { - "@smithy/is-array-buffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-3.0.0.tgz", - "integrity": "sha512-+Fsu6Q6C4RSJiy81Y8eApjEB5gVtM+oFKTffg+jSuwtvomJJrhUJBu2zS8wjXSgH/g1MKEWrzyChTBe6clb5FQ==", - "requires": { - "tslib": "^2.6.2" - } - }, - "@smithy/util-buffer-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-3.0.0.tgz", - "integrity": "sha512-aEOHCgq5RWFbP+UDPvPot26EJHjOC+bRgse5A8V3FSShqd5E5UN4qc7zkwsvJPPAVsf73QwYcHN1/gt/rtLwQA==", - "requires": { - "@smithy/is-array-buffer": "^3.0.0", - "tslib": "^2.6.2" - } - }, - "tslib": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", - "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" - } + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" } }, - "@smithy/util-uri-escape": { + "node_modules/@jest/transform/node_modules/chalk": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-3.0.0.tgz", - "integrity": "sha512-LqR7qYLgZTD7nWLBecUi4aqolw8Mhza9ArpNEQ881MJJIU2sE5iHCK6TdyqqzcDLy0OPe10IY4T8ctVdtynubg==", - "requires": { - "tslib": "^2.6.2" - }, + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, "dependencies": { - "tslib": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", - "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" - } + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" } }, - "@smithy/util-utf8": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-3.0.0.tgz", - "integrity": "sha512-rUeT12bxFnplYDe815GXbq/oixEGHfRFFtcTF3YdDi/JaENIM6aSYYLJydG83UNzLXeRI5K8abYd/8Sp/QM0kA==", - "requires": { - "@smithy/util-buffer-from": "^3.0.0", - "tslib": "^2.6.2" - }, + "node_modules/@jest/transform/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": { - "@smithy/is-array-buffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-3.0.0.tgz", - "integrity": "sha512-+Fsu6Q6C4RSJiy81Y8eApjEB5gVtM+oFKTffg+jSuwtvomJJrhUJBu2zS8wjXSgH/g1MKEWrzyChTBe6clb5FQ==", - "requires": { - "tslib": "^2.6.2" - } - }, - "@smithy/util-buffer-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-3.0.0.tgz", - "integrity": "sha512-aEOHCgq5RWFbP+UDPvPot26EJHjOC+bRgse5A8V3FSShqd5E5UN4qc7zkwsvJPPAVsf73QwYcHN1/gt/rtLwQA==", - "requires": { - "@smithy/is-array-buffer": "^3.0.0", - "tslib": "^2.6.2" - } - }, - "tslib": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", - "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" - } + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" } }, - "@types/babel__core": { - "version": "7.1.7", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.7.tgz", - "integrity": "sha512-RL62NqSFPCDK2FM1pSDH0scHpJvsXtZNiYlMB73DgPBaG1E38ZYVL+ei5EkWRbr+KC4YNiAUNBnRj+bgwpgjMw==", + "node_modules/@jest/transform/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/@jest/transform/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, - "requires": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" } }, - "@types/babel__generator": { - "version": "7.6.1", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.1.tgz", - "integrity": "sha512-bBKm+2VPJcMRVwNhxKu8W+5/zT7pwNEqeokFOmbvVSqGzFneNxYcEBro9Ac7/N9tlsaPYnZLK8J1LWKkMsLAew==", + "node_modules/@jest/transform/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, - "requires": { - "@babel/types": "^7.0.0" + "engines": { + "node": ">=8" } }, - "@types/babel__template": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.0.2.tgz", - "integrity": "sha512-/K6zCpeW7Imzgab2bLkLEbz0+1JlFSrUMdw7KoIIu+IUdu51GWaBZpd3y1VXGVXzynvGa4DaIaxNZHiON3GXUg==", + "node_modules/@jest/transform/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, - "requires": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" + "engines": { + "node": ">=0.12.0" } }, - "@types/babel__traverse": { - "version": "7.0.10", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.0.10.tgz", - "integrity": "sha512-74fNdUGrWsgIB/V9kTO5FGHPWYY6Eqn+3Z7L6Hc4e/BxjYV7puvBqp5HwsVYYfLm6iURYBNCx4Ut37OF9yitCw==", + "node_modules/@jest/transform/node_modules/micromatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", + "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", "dev": true, - "requires": { - "@babel/types": "^7.3.0" + "dependencies": { + "braces": "^3.0.1", + "picomatch": "^2.0.5" + }, + "engines": { + "node": ">=8" } }, - "@types/body-parser": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.0.tgz", - "integrity": "sha512-W98JrE0j2K78swW4ukqMleo8R7h/pFETjM2DQ90MF6XK2i4LO4W3gQ71Lt4w3bfm2EvVSyWHplECvB5sK22yFQ==", + "node_modules/@jest/transform/node_modules/supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", "dev": true, - "requires": { - "@types/connect": "*", - "@types/node": "*" + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "@types/caseless": { - "version": "0.12.2", - "resolved": "https://registry.npmjs.org/@types/caseless/-/caseless-0.12.2.tgz", - "integrity": "sha512-6ckxMjBBD8URvjB6J3NcnuAn5Pkl7t3TizAg+xdlzzQGSPSmBcXf8KoIH0ua/i+tio+ZRUHEXp0HEmvaR4kt0w==" - }, - "@types/color-name": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", - "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==", - "dev": true - }, - "@types/connect": { - "version": "3.4.33", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.33.tgz", - "integrity": "sha512-2+FrkXY4zllzTNfJth7jOqEHC+enpLeGslEhpnTAkg21GkRrWV4SsAtqchtT4YS9/nODBU2/ZfsBY2X4J/dX7A==", + "node_modules/@jest/transform/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, - "requires": { - "@types/node": "*" + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" } }, - "@types/cookiejar": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@types/cookiejar/-/cookiejar-2.1.1.tgz", - "integrity": "sha512-aRnpPa7ysx3aNW60hTiCtLHlQaIFsXFCgQlpakNgDNVFzbtusSY8PwjAQgRWfSk0ekNoBjO51eQRB6upA9uuyw==", - "dev": true - }, - "@types/crypto-js": { - "version": "3.1.43", - "resolved": "https://registry.npmjs.org/@types/crypto-js/-/crypto-js-3.1.43.tgz", - "integrity": "sha512-EHe/YKctU3IYNBsDmSOPX/7jLHPRlx8WaiDKSY9JCTnJ8XJeM4c0ZJvx+9Gxmr2s2ihI92R+3U/gNL1sq5oRuQ==", - "dev": true + "node_modules/@jest/transform/node_modules/write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } }, - "@types/express": { - "version": "4.17.2", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.2.tgz", - "integrity": "sha512-5mHFNyavtLoJmnusB8OKJ5bshSzw+qkMIBAobLrIM48HJvunFva9mOa6aBwh64lBFyNwBbs0xiEFuj4eU/NjCA==", + "node_modules/@jest/types": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", + "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", "dev": true, - "requires": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "*", - "@types/serve-static": "*" + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^13.0.0" + }, + "engines": { + "node": ">= 6" } }, - "@types/express-serve-static-core": { - "version": "4.17.2", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.2.tgz", - "integrity": "sha512-El9yMpctM6tORDAiBwZVLMcxoTMcqqRO9dVyYcn7ycLWbvR8klrDn8CAOwRfZujZtWD7yS/mshTdz43jMOejbg==", + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", "dev": true, - "requires": { - "@types/node": "*", - "@types/range-parser": "*" + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" } }, - "@types/gunzip-maybe": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@types/gunzip-maybe/-/gunzip-maybe-1.4.0.tgz", - "integrity": "sha512-dFP9GrYAR9KhsjTkWJ8q8Gsfql75YIKcg9DuQOj/IrlPzR7W+1zX+cclw1McV82UXAQ+Lpufvgk3e9bC8+HzgA==", + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", "dev": true, - "requires": { - "@types/node": "*" + "engines": { + "node": ">=6.0.0" } }, - "@types/http-proxy": { - "version": "1.17.4", - "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.4.tgz", - "integrity": "sha512-IrSHl2u6AWXduUaDLqYpt45tLVCtYv7o4Z0s1KghBCDgIIS9oW5K1H8mZG/A2CfeLdEa7rTd1ACOiHBc1EMT2Q==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/http-proxy-middleware": { - "version": "0.19.3", - "resolved": "https://registry.npmjs.org/@types/http-proxy-middleware/-/http-proxy-middleware-0.19.3.tgz", - "integrity": "sha512-lnBTx6HCOUeIJMLbI/LaL5EmdKLhczJY5oeXZpX/cXE4rRqb3RmV7VcMpiEfYkmTjipv3h7IAyIINe4plEv7cA==", + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", "dev": true, - "requires": { - "@types/connect": "*", - "@types/http-proxy": "*", - "@types/node": "*" + "engines": { + "node": ">=6.0.0" } }, - "@types/istanbul-lib-coverage": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.1.tgz", - "integrity": "sha512-hRJD2ahnnpLgsj6KWMYSrmXkM3rm2Dl1qkx6IOFD5FnuNPXJIG5L0dhgKXCYTRMGzU4n0wImQ/xfmRc4POUFlg==", + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", "dev": true }, - "@types/istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "*" - } - }, - "@types/istanbul-reports": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-1.1.1.tgz", - "integrity": "sha512-UpYjBi8xefVChsCoBpKShdxTllC9pwISirfoZsUa2AAdQg/Jd2KQGtSbw+ya7GPo7x/wAPlH6JBhKhAsXUEZNA==", + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.19", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz", + "integrity": "sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==", "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "*", - "@types/istanbul-lib-report": "*" + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "@types/jest": { - "version": "24.9.1", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-24.9.1.tgz", - "integrity": "sha512-Fb38HkXSVA4L8fGKEZ6le5bB8r6MRWlOCZbVuWZcmOMSCd2wCYOwN1ibj8daIoV9naq7aaOZjrLCoCMptKU/4Q==", - "dev": true, - "requires": { - "jest-diff": "^24.3.0" + "node_modules/@kubernetes/client-node": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/@kubernetes/client-node/-/client-node-0.8.2.tgz", + "integrity": "sha512-crS3h59+fOGXQgxVdq3XH81ytY7FV2HnB5z/+lSWD3bi5D5lHKu3PVN2PHCDMNExPy0KthcfqBoIVFVy4CoG3A==", + "dependencies": { + "@types/js-yaml": "^3.11.2", + "@types/node": "^10.12.0", + "@types/request": "^2.47.1", + "@types/underscore": "^1.8.9", + "@types/ws": "^6.0.1", + "byline": "^5.0.0", + "isomorphic-ws": "^4.0.1", + "js-yaml": "^3.12.0", + "jsonpath": "^1.0.0", + "request": "^2.88.0", + "shelljs": "^0.8.2", + "tslib": "^1.9.3", + "underscore": "^1.9.1", + "ws": "^6.1.0" } }, - "@types/js-yaml": { - "version": "3.12.2", - "resolved": "https://registry.npmjs.org/@types/js-yaml/-/js-yaml-3.12.2.tgz", - "integrity": "sha512-0CFu/g4mDSNkodVwWijdlr8jH7RoplRWNgovjFLEZeT+QEbbZXjBmCe3HwaWheAlCbHwomTwzZoSedeOycABug==" - }, - "@types/mime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-2.0.1.tgz", - "integrity": "sha512-FwI9gX75FgVBJ7ywgnq/P7tw+/o1GUbtP0KzbtusLigAOgIgNISRK0ZPl4qertvXSIE8YbsVJueQ90cDt9YYyw==", - "dev": true + "node_modules/@kubernetes/client-node/node_modules/@types/node": { + "version": "10.17.60", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", + "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==" }, - "@types/minio": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/@types/minio/-/minio-7.0.5.tgz", - "integrity": "sha512-lbZSyinS73XTJ9u4PTO3oVbv1qKzubqtp4hDCxfG36fAGNLPMBDMNcxC8jfs6ezc3kliGXwZy4/8eh4HvyVO4Q==", + "node_modules/@sinonjs/commons": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.7.2.tgz", + "integrity": "sha512-+DUO6pnp3udV/v2VfUWgaY5BIE1IfT7lLfeDzPVeMT1XKkaAp9LgSI9x5RtrFQoZ9Oi0PgXQQHPaoKu7dCjVxw==", "dev": true, - "requires": { - "@types/node": "*" + "dependencies": { + "type-detect": "4.0.8" } }, - "@types/minipass": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@types/minipass/-/minipass-2.2.0.tgz", - "integrity": "sha512-wuzZksN4w4kyfoOv/dlpov4NOunwutLA/q7uc00xU02ZyUY+aoM5PWIXEKBMnm0NHd4a+N71BMjq+x7+2Af1fg==", - "dev": true, - "requires": { - "@types/node": "*" + "node_modules/@smithy/abort-controller": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-3.1.1.tgz", + "integrity": "sha512-MBJBiidoe+0cTFhyxT8g+9g7CeVccLM0IOKKUMCNQ1CNMJ/eIfoo0RTfVrXOONEI1UCN1W+zkiHSbzUNE9dZtQ==", + "dependencies": { + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" } }, - "@types/node": { - "version": "14.14.20", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.20.tgz", - "integrity": "sha512-Y93R97Ouif9JEOWPIUyU+eyIdyRqQR0I8Ez1dzku4hDx34NWh4HbtIc3WNzwB1Y9ULvNGeu5B8h8bVL5cAk4/A==" + "node_modules/@smithy/abort-controller/node_modules/tslib": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" }, - "@types/node-fetch": { - "version": "2.5.5", - "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.5.5.tgz", - "integrity": "sha512-IWwjsyYjGw+em3xTvWVQi5MgYKbRs0du57klfTaZkv/B24AEQ/p/IopNeqIYNy3EsfHOpg8ieQSDomPcsYMHpA==", - "dev": true, - "requires": { - "@types/node": "*", - "form-data": "^3.0.0" - }, + "node_modules/@smithy/config-resolver": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-3.0.5.tgz", + "integrity": "sha512-SkW5LxfkSI1bUC74OtfBbdz+grQXYiPYolyu8VfpLIjEoN/sHVBlLeGXMQ1vX4ejkgfv6sxVbQJ32yF2cl1veA==", "dependencies": { - "form-data": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.0.tgz", - "integrity": "sha512-CKMFDglpbMi6PyN+brwB9Q/GOw0eAnsrEZDgcsH5Krhz5Od/haKHAX0NmQfha2zPPz0JpWzA7GJHGSnvCRLWsg==", - "dev": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - } - } + "@smithy/node-config-provider": "^3.1.4", + "@smithy/types": "^3.3.0", + "@smithy/util-config-provider": "^3.0.0", + "@smithy/util-middleware": "^3.0.3", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" } }, - "@types/prettier": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-1.19.1.tgz", - "integrity": "sha512-5qOlnZscTn4xxM5MeGXAMOsIOIKIbh9e85zJWfBRVPlRMEVawzoPhINYbRGkBZCI8LxvBe7tJCdWiarA99OZfQ==", - "dev": true - }, - "@types/range-parser": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.3.tgz", - "integrity": "sha512-ewFXqrQHlFsgc09MK5jP5iR7vumV/BYayNC6PgJO2LPe8vrnNFyjQjSppfEngITi0qvfKtzFvgKymGheFM9UOA==", - "dev": true + "node_modules/@smithy/config-resolver/node_modules/tslib": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" }, - "@types/request": { - "version": "2.48.4", - "resolved": "https://registry.npmjs.org/@types/request/-/request-2.48.4.tgz", - "integrity": "sha512-W1t1MTKYR8PxICH+A4HgEIPuAC3sbljoEVfyZbeFJJDbr30guDspJri2XOaM2E+Un7ZjrihaDi7cf6fPa2tbgw==", - "requires": { - "@types/caseless": "*", - "@types/node": "*", - "@types/tough-cookie": "*", - "form-data": "^2.5.0" - }, + "node_modules/@smithy/core": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@smithy/core/-/core-2.3.1.tgz", + "integrity": "sha512-BC7VMXx/1BCmRPCVzzn4HGWAtsrb7/0758EtwOGFJQrlSwJBEjCcDLNZLFoL/68JexYa2s+KmgL/UfmXdG6v1w==", "dependencies": { - "@types/node": { - "version": "13.7.4", - "resolved": "https://registry.npmjs.org/@types/node/-/node-13.7.4.tgz", - "integrity": "sha512-oVeL12C6gQS/GAExndigSaLxTrKpQPxewx9bOcwfvJiJge4rr7wNaph4J+ns5hrmIV2as5qxqN8YKthn9qh0jw==" - } + "@smithy/middleware-endpoint": "^3.1.0", + "@smithy/middleware-retry": "^3.0.13", + "@smithy/middleware-serde": "^3.0.3", + "@smithy/protocol-http": "^4.1.0", + "@smithy/smithy-client": "^3.1.11", + "@smithy/types": "^3.3.0", + "@smithy/util-middleware": "^3.0.3", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" } }, - "@types/serve-static": { - "version": "1.13.3", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.3.tgz", - "integrity": "sha512-oprSwp094zOglVrXdlo/4bAHtKTAxX6VT8FOZlBKrmyLbNvE1zxZyJ6yikMVtHIvwP45+ZQGJn+FdXGKTozq0g==", - "dev": true, - "requires": { - "@types/express-serve-static-core": "*", - "@types/mime": "*" + "node_modules/@smithy/core/node_modules/tslib": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" + }, + "node_modules/@smithy/credential-provider-imds": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-3.2.0.tgz", + "integrity": "sha512-0SCIzgd8LYZ9EJxUjLXBmEKSZR/P/w6l7Rz/pab9culE/RWuqelAKGJvn5qUOl8BgX8Yj5HWM50A5hiB/RzsgA==", + "dependencies": { + "@smithy/node-config-provider": "^3.1.4", + "@smithy/property-provider": "^3.1.3", + "@smithy/types": "^3.3.0", + "@smithy/url-parser": "^3.0.3", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" } }, - "@types/stack-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-1.0.1.tgz", - "integrity": "sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw==", - "dev": true + "node_modules/@smithy/credential-provider-imds/node_modules/tslib": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" }, - "@types/superagent": { - "version": "4.1.7", - "resolved": "https://registry.npmjs.org/@types/superagent/-/superagent-4.1.7.tgz", - "integrity": "sha512-JSwNPgRYjIC4pIeOqLwWwfGj6iP1n5NE6kNBEbGx2V8H78xCPwx7QpNp9plaI30+W3cFEzJO7BIIsXE+dbtaGg==", - "dev": true, - "requires": { - "@types/cookiejar": "*", - "@types/node": "*" + "node_modules/@smithy/fetch-http-handler": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-3.2.4.tgz", + "integrity": "sha512-kBprh5Gs5h7ug4nBWZi1FZthdqSM+T7zMmsZxx0IBvWUn7dK3diz2SHn7Bs4dQGFDk8plDv375gzenDoNwrXjg==", + "dependencies": { + "@smithy/protocol-http": "^4.1.0", + "@smithy/querystring-builder": "^3.0.3", + "@smithy/types": "^3.3.0", + "@smithy/util-base64": "^3.0.0", + "tslib": "^2.6.2" } }, - "@types/supertest": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/@types/supertest/-/supertest-2.0.8.tgz", - "integrity": "sha512-wcax7/ip4XSSJRLbNzEIUVy2xjcBIZZAuSd2vtltQfRK7kxhx5WMHbLHkYdxN3wuQCrwpYrg86/9byDjPXoGMA==", - "dev": true, - "requires": { - "@types/superagent": "*" - } + "node_modules/@smithy/fetch-http-handler/node_modules/tslib": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" }, - "@types/tar": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@types/tar/-/tar-4.0.3.tgz", - "integrity": "sha512-Z7AVMMlkI8NTWF0qGhC4QIX0zkV/+y0J8x7b/RsHrN0310+YNjoJd8UrApCiGBCWtKjxS9QhNqLi2UJNToh5hA==", - "dev": true, - "requires": { - "@types/minipass": "*", - "@types/node": "*" + "node_modules/@smithy/hash-node": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-3.0.3.tgz", + "integrity": "sha512-2ctBXpPMG+B3BtWSGNnKELJ7SH9e4TNefJS0cd2eSkOOROeBnnVBnAy9LtJ8tY4vUEoe55N4CNPxzbWvR39iBw==", + "dependencies": { + "@smithy/types": "^3.3.0", + "@smithy/util-buffer-from": "^3.0.0", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" } }, - "@types/tar-stream": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/@types/tar-stream/-/tar-stream-1.6.1.tgz", - "integrity": "sha512-pYCDOPuRE+4tXFk1rSMYiuI+kSrXiJ4av1bboQbkcEBA2rqwEWfIn9kdMSH+5nYu58WksHuxwx+7kVbtg0Le7w==", - "dev": true, - "requires": { - "@types/node": "*" + "node_modules/@smithy/hash-node/node_modules/@smithy/is-array-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-3.0.0.tgz", + "integrity": "sha512-+Fsu6Q6C4RSJiy81Y8eApjEB5gVtM+oFKTffg+jSuwtvomJJrhUJBu2zS8wjXSgH/g1MKEWrzyChTBe6clb5FQ==", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" } }, - "@types/tough-cookie": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-2.3.6.tgz", - "integrity": "sha512-wHNBMnkoEBiRAd3s8KTKwIuO9biFtTf0LehITzBhSco+HQI0xkXZbLOD55SW3Aqw3oUkHstkm5SPv58yaAdFPQ==" + "node_modules/@smithy/hash-node/node_modules/@smithy/util-buffer-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-3.0.0.tgz", + "integrity": "sha512-aEOHCgq5RWFbP+UDPvPot26EJHjOC+bRgse5A8V3FSShqd5E5UN4qc7zkwsvJPPAVsf73QwYcHN1/gt/rtLwQA==", + "dependencies": { + "@smithy/is-array-buffer": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } }, - "@types/underscore": { - "version": "1.9.4", - "resolved": "https://registry.npmjs.org/@types/underscore/-/underscore-1.9.4.tgz", - "integrity": "sha512-CjHWEMECc2/UxOZh0kpiz3lEyX2Px3rQS9HzD20lxMvx571ivOBQKeLnqEjxUY0BMgp6WJWo/pQLRBwMW5v4WQ==" + "node_modules/@smithy/hash-node/node_modules/tslib": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" }, - "@types/ws": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-6.0.4.tgz", - "integrity": "sha512-PpPrX7SZW9re6+Ha8ojZG4Se8AZXgf0GK6zmfqEuCsY49LFDNXO3SByp44X3dFEqtB73lkCDAdUazhAjVPiNwg==", - "requires": { - "@types/node": "*" + "node_modules/@smithy/invalid-dependency": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-3.0.3.tgz", + "integrity": "sha512-ID1eL/zpDULmHJbflb864k72/SNOZCADRc9i7Exq3RUNJw6raWUSlFEQ+3PX3EYs++bTxZB2dE9mEHTQLv61tw==", + "dependencies": { + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" } }, - "@types/yargs": { - "version": "13.0.8", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.8.tgz", - "integrity": "sha512-XAvHLwG7UQ+8M4caKIH0ZozIOYay5fQkAgyIXegXT9jPtdIGdhga+sUEdAr1CiG46aB+c64xQEYyEzlwWVTNzA==", - "dev": true, - "requires": { - "@types/yargs-parser": "*" - } + "node_modules/@smithy/invalid-dependency/node_modules/tslib": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" }, - "@types/yargs-parser": { - "version": "15.0.0", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-15.0.0.tgz", - "integrity": "sha512-FA/BWv8t8ZWJ+gEOnLLd8ygxH/2UFbAvgEonyfN6yWGLKc7zVjbpl2Y4CTjid9h2RfgPP6SEt6uHwEOply00yw==", - "dev": true + "node_modules/@smithy/is-array-buffer": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz", + "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } }, - "abab": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.3.tgz", - "integrity": "sha512-tsFzPpcttalNjFBCFMqsKYQcWxxen1pgJR56by//QwvJc4/OUS3kPOOttx2tSIfjsylB0pYu7f5D3K1RCxUnUg==", - "dev": true + "node_modules/@smithy/is-array-buffer/node_modules/tslib": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" }, - "abort-controller": { + "node_modules/@smithy/middleware-content-length": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-3.0.5.tgz", + "integrity": "sha512-ILEzC2eyxx6ncej3zZSwMpB5RJ0zuqH7eMptxC4KN3f+v9bqT8ohssKbhNR78k/2tWW+KS5Spw+tbPF4Ejyqvw==", + "dependencies": { + "@smithy/protocol-http": "^4.1.0", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/middleware-content-length/node_modules/tslib": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" + }, + "node_modules/@smithy/middleware-endpoint": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-3.1.0.tgz", + "integrity": "sha512-5y5aiKCEwg9TDPB4yFE7H6tYvGFf1OJHNczeY10/EFF8Ir8jZbNntQJxMWNfeQjC1mxPsaQ6mR9cvQbf+0YeMw==", + "dependencies": { + "@smithy/middleware-serde": "^3.0.3", + "@smithy/node-config-provider": "^3.1.4", + "@smithy/shared-ini-file-loader": "^3.1.4", + "@smithy/types": "^3.3.0", + "@smithy/url-parser": "^3.0.3", + "@smithy/util-middleware": "^3.0.3", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/middleware-endpoint/node_modules/tslib": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" + }, + "node_modules/@smithy/middleware-retry": { + "version": "3.0.13", + "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-3.0.13.tgz", + "integrity": "sha512-zvCLfaRYCaUmjbF2yxShGZdolSHft7NNCTA28HVN9hKcEbOH+g5irr1X9s+in8EpambclGnevZY4A3lYpvDCFw==", + "dependencies": { + "@smithy/node-config-provider": "^3.1.4", + "@smithy/protocol-http": "^4.1.0", + "@smithy/service-error-classification": "^3.0.3", + "@smithy/smithy-client": "^3.1.11", + "@smithy/types": "^3.3.0", + "@smithy/util-middleware": "^3.0.3", + "@smithy/util-retry": "^3.0.3", + "tslib": "^2.6.2", + "uuid": "^9.0.1" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/middleware-retry/node_modules/tslib": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" + }, + "node_modules/@smithy/middleware-retry/node_modules/uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/@smithy/middleware-serde": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-3.0.3.tgz", + "integrity": "sha512-puUbyJQBcg9eSErFXjKNiGILJGtiqmuuNKEYNYfUD57fUl4i9+mfmThtQhvFXU0hCVG0iEJhvQUipUf+/SsFdA==", + "dependencies": { + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/middleware-serde/node_modules/tslib": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" + }, + "node_modules/@smithy/middleware-stack": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-3.0.3.tgz", + "integrity": "sha512-r4klY9nFudB0r9UdSMaGSyjyQK5adUyPnQN/ZM6M75phTxOdnc/AhpvGD1fQUvgmqjQEBGCwpnPbDm8pH5PapA==", + "dependencies": { + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/middleware-stack/node_modules/tslib": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" + }, + "node_modules/@smithy/node-config-provider": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-3.1.4.tgz", + "integrity": "sha512-YvnElQy8HR4vDcAjoy7Xkx9YT8xZP4cBXcbJSgm/kxmiQu08DwUwj8rkGnyoJTpfl/3xYHH+d8zE+eHqoDCSdQ==", + "dependencies": { + "@smithy/property-provider": "^3.1.3", + "@smithy/shared-ini-file-loader": "^3.1.4", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/node-config-provider/node_modules/tslib": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" + }, + "node_modules/@smithy/node-http-handler": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-3.1.4.tgz", + "integrity": "sha512-+UmxgixgOr/yLsUxcEKGH0fMNVteJFGkmRltYFHnBMlogyFdpzn2CwqWmxOrfJELhV34v0WSlaqG1UtE1uXlJg==", + "dependencies": { + "@smithy/abort-controller": "^3.1.1", + "@smithy/protocol-http": "^4.1.0", + "@smithy/querystring-builder": "^3.0.3", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/node-http-handler/node_modules/tslib": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" + }, + "node_modules/@smithy/property-provider": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-3.1.3.tgz", + "integrity": "sha512-zahyOVR9Q4PEoguJ/NrFP4O7SMAfYO1HLhB18M+q+Z4KFd4V2obiMnlVoUFzFLSPeVt1POyNWneHHrZaTMoc/g==", + "dependencies": { + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/property-provider/node_modules/tslib": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" + }, + "node_modules/@smithy/protocol-http": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-4.1.0.tgz", + "integrity": "sha512-dPVoHYQ2wcHooGXg3LQisa1hH0e4y0pAddPMeeUPipI1tEOqL6A4N0/G7abeq+K8wrwSgjk4C0wnD1XZpJm5aA==", + "dependencies": { + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/protocol-http/node_modules/tslib": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" + }, + "node_modules/@smithy/querystring-builder": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-3.0.3.tgz", + "integrity": "sha512-vyWckeUeesFKzCDaRwWLUA1Xym9McaA6XpFfAK5qI9DKJ4M33ooQGqvM4J+LalH4u/Dq9nFiC8U6Qn1qi0+9zw==", + "dependencies": { + "@smithy/types": "^3.3.0", + "@smithy/util-uri-escape": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/querystring-builder/node_modules/tslib": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" + }, + "node_modules/@smithy/querystring-parser": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-3.0.3.tgz", + "integrity": "sha512-zahM1lQv2YjmznnfQsWbYojFe55l0SLG/988brlLv1i8z3dubloLF+75ATRsqPBboUXsW6I9CPGE5rQgLfY0vQ==", + "dependencies": { + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/querystring-parser/node_modules/tslib": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" + }, + "node_modules/@smithy/service-error-classification": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-3.0.3.tgz", + "integrity": "sha512-Jn39sSl8cim/VlkLsUhRFq/dKDnRUFlfRkvhOJaUbLBXUsLRLNf9WaxDv/z9BjuQ3A6k/qE8af1lsqcwm7+DaQ==", + "dependencies": { + "@smithy/types": "^3.3.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/shared-ini-file-loader": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-3.1.4.tgz", + "integrity": "sha512-qMxS4hBGB8FY2GQqshcRUy1K6k8aBWP5vwm8qKkCT3A9K2dawUwOIJfqh9Yste/Bl0J2lzosVyrXDj68kLcHXQ==", + "dependencies": { + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/shared-ini-file-loader/node_modules/tslib": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" + }, + "node_modules/@smithy/signature-v4": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-4.1.0.tgz", + "integrity": "sha512-aRryp2XNZeRcOtuJoxjydO6QTaVhxx/vjaR+gx7ZjaFgrgPRyZ3HCTbfwqYj6ZWEBHkCSUfcaymKPURaByukag==", + "dependencies": { + "@smithy/is-array-buffer": "^3.0.0", + "@smithy/protocol-http": "^4.1.0", + "@smithy/types": "^3.3.0", + "@smithy/util-hex-encoding": "^3.0.0", + "@smithy/util-middleware": "^3.0.3", + "@smithy/util-uri-escape": "^3.0.0", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/signature-v4/node_modules/@smithy/is-array-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-3.0.0.tgz", + "integrity": "sha512-+Fsu6Q6C4RSJiy81Y8eApjEB5gVtM+oFKTffg+jSuwtvomJJrhUJBu2zS8wjXSgH/g1MKEWrzyChTBe6clb5FQ==", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/signature-v4/node_modules/tslib": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" + }, + "node_modules/@smithy/smithy-client": { + "version": "3.1.11", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-3.1.11.tgz", + "integrity": "sha512-l0BpyYkciNyMaS+PnFFz4aO5sBcXvGLoJd7mX9xrMBIm2nIQBVvYgp2ZpPDMzwjKCavsXu06iuCm0F6ZJZc6yQ==", + "dependencies": { + "@smithy/middleware-endpoint": "^3.1.0", + "@smithy/middleware-stack": "^3.0.3", + "@smithy/protocol-http": "^4.1.0", + "@smithy/types": "^3.3.0", + "@smithy/util-stream": "^3.1.3", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/smithy-client/node_modules/tslib": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" + }, + "node_modules/@smithy/types": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.3.0.tgz", + "integrity": "sha512-IxvBBCTFDHbVoK7zIxqA1ZOdc4QfM5HM7rGleCuHi7L1wnKv5Pn69xXJQ9hgxH60ZVygH9/JG0jRgtUncE3QUA==", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/types/node_modules/tslib": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" + }, + "node_modules/@smithy/url-parser": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-3.0.3.tgz", + "integrity": "sha512-pw3VtZtX2rg+s6HMs6/+u9+hu6oY6U7IohGhVNnjbgKy86wcIsSZwgHrFR+t67Uyxvp4Xz3p3kGXXIpTNisq8A==", + "dependencies": { + "@smithy/querystring-parser": "^3.0.3", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@smithy/url-parser/node_modules/tslib": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" + }, + "node_modules/@smithy/util-base64": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-3.0.0.tgz", + "integrity": "sha512-Kxvoh5Qtt0CDsfajiZOCpJxgtPHXOKwmM+Zy4waD43UoEMA+qPxxa98aE/7ZhdnBFZFXMOiBR5xbcaMhLtznQQ==", + "dependencies": { + "@smithy/util-buffer-from": "^3.0.0", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/util-base64/node_modules/@smithy/is-array-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-3.0.0.tgz", + "integrity": "sha512-+Fsu6Q6C4RSJiy81Y8eApjEB5gVtM+oFKTffg+jSuwtvomJJrhUJBu2zS8wjXSgH/g1MKEWrzyChTBe6clb5FQ==", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/util-base64/node_modules/@smithy/util-buffer-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-3.0.0.tgz", + "integrity": "sha512-aEOHCgq5RWFbP+UDPvPot26EJHjOC+bRgse5A8V3FSShqd5E5UN4qc7zkwsvJPPAVsf73QwYcHN1/gt/rtLwQA==", + "dependencies": { + "@smithy/is-array-buffer": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/util-base64/node_modules/tslib": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" + }, + "node_modules/@smithy/util-body-length-browser": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-3.0.0.tgz", + "integrity": "sha512-cbjJs2A1mLYmqmyVl80uoLTJhAcfzMOyPgjwAYusWKMdLeNtzmMz9YxNl3/jRLoxSS3wkqkf0jwNdtXWtyEBaQ==", + "dependencies": { + "tslib": "^2.6.2" + } + }, + "node_modules/@smithy/util-body-length-browser/node_modules/tslib": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" + }, + "node_modules/@smithy/util-body-length-node": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-3.0.0.tgz", + "integrity": "sha512-Tj7pZ4bUloNUP6PzwhN7K386tmSmEET9QtQg0TgdNOnxhZvCssHji+oZTUIuzxECRfG8rdm2PMw2WCFs6eIYkA==", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/util-body-length-node/node_modules/tslib": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" + }, + "node_modules/@smithy/util-buffer-from": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz", + "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==", + "dependencies": { + "@smithy/is-array-buffer": "^2.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/util-buffer-from/node_modules/tslib": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" + }, + "node_modules/@smithy/util-config-provider": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-3.0.0.tgz", + "integrity": "sha512-pbjk4s0fwq3Di/ANL+rCvJMKM5bzAQdE5S/6RL5NXgMExFAi6UgQMPOm5yPaIWPpr+EOXKXRonJ3FoxKf4mCJQ==", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/util-config-provider/node_modules/tslib": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" + }, + "node_modules/@smithy/util-defaults-mode-browser": { + "version": "3.0.13", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-3.0.13.tgz", + "integrity": "sha512-ZIRSUsnnMRStOP6OKtW+gCSiVFkwnfQF2xtf32QKAbHR6ACjhbAybDvry+3L5qQYdh3H6+7yD/AiUE45n8mTTw==", + "dependencies": { + "@smithy/property-provider": "^3.1.3", + "@smithy/smithy-client": "^3.1.11", + "@smithy/types": "^3.3.0", + "bowser": "^2.11.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@smithy/util-defaults-mode-browser/node_modules/tslib": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" + }, + "node_modules/@smithy/util-defaults-mode-node": { + "version": "3.0.13", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-3.0.13.tgz", + "integrity": "sha512-voUa8TFJGfD+U12tlNNLCDlXibt9vRdNzRX45Onk/WxZe7TS+hTOZouEZRa7oARGicdgeXvt1A0W45qLGYdy+g==", + "dependencies": { + "@smithy/config-resolver": "^3.0.5", + "@smithy/credential-provider-imds": "^3.2.0", + "@smithy/node-config-provider": "^3.1.4", + "@smithy/property-provider": "^3.1.3", + "@smithy/smithy-client": "^3.1.11", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@smithy/util-defaults-mode-node/node_modules/tslib": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" + }, + "node_modules/@smithy/util-endpoints": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-2.0.5.tgz", + "integrity": "sha512-ReQP0BWihIE68OAblC/WQmDD40Gx+QY1Ez8mTdFMXpmjfxSyz2fVQu3A4zXRfQU9sZXtewk3GmhfOHswvX+eNg==", + "dependencies": { + "@smithy/node-config-provider": "^3.1.4", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/util-endpoints/node_modules/tslib": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" + }, + "node_modules/@smithy/util-hex-encoding": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-3.0.0.tgz", + "integrity": "sha512-eFndh1WEK5YMUYvy3lPlVmYY/fZcQE1D8oSf41Id2vCeIkKJXPcYDCZD+4+xViI6b1XSd7tE+s5AmXzz5ilabQ==", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/util-hex-encoding/node_modules/tslib": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" + }, + "node_modules/@smithy/util-middleware": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-3.0.3.tgz", + "integrity": "sha512-l+StyYYK/eO3DlVPbU+4Bi06Jjal+PFLSMmlWM1BEwyLxZ3aKkf1ROnoIakfaA7mC6uw3ny7JBkau4Yc+5zfWw==", + "dependencies": { + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/util-middleware/node_modules/tslib": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" + }, + "node_modules/@smithy/util-retry": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-3.0.3.tgz", + "integrity": "sha512-AFw+hjpbtVApzpNDhbjNG5NA3kyoMs7vx0gsgmlJF4s+yz1Zlepde7J58zpIRIsdjc+emhpAITxA88qLkPF26w==", + "dependencies": { + "@smithy/service-error-classification": "^3.0.3", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/util-retry/node_modules/tslib": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" + }, + "node_modules/@smithy/util-stream": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-3.1.3.tgz", + "integrity": "sha512-FIv/bRhIlAxC0U7xM1BCnF2aDRPq0UaelqBHkM2lsCp26mcBbgI0tCVTv+jGdsQLUmAMybua/bjDsSu8RQHbmw==", + "dependencies": { + "@smithy/fetch-http-handler": "^3.2.4", + "@smithy/node-http-handler": "^3.1.4", + "@smithy/types": "^3.3.0", + "@smithy/util-base64": "^3.0.0", + "@smithy/util-buffer-from": "^3.0.0", + "@smithy/util-hex-encoding": "^3.0.0", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/util-stream/node_modules/@smithy/is-array-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-3.0.0.tgz", + "integrity": "sha512-+Fsu6Q6C4RSJiy81Y8eApjEB5gVtM+oFKTffg+jSuwtvomJJrhUJBu2zS8wjXSgH/g1MKEWrzyChTBe6clb5FQ==", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/util-stream/node_modules/@smithy/util-buffer-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-3.0.0.tgz", + "integrity": "sha512-aEOHCgq5RWFbP+UDPvPot26EJHjOC+bRgse5A8V3FSShqd5E5UN4qc7zkwsvJPPAVsf73QwYcHN1/gt/rtLwQA==", + "dependencies": { + "@smithy/is-array-buffer": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/util-stream/node_modules/tslib": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" + }, + "node_modules/@smithy/util-uri-escape": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-3.0.0.tgz", + "integrity": "sha512-LqR7qYLgZTD7nWLBecUi4aqolw8Mhza9ArpNEQ881MJJIU2sE5iHCK6TdyqqzcDLy0OPe10IY4T8ctVdtynubg==", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/util-uri-escape/node_modules/tslib": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" + }, + "node_modules/@smithy/util-utf8": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-3.0.0.tgz", + "integrity": "sha512-rUeT12bxFnplYDe815GXbq/oixEGHfRFFtcTF3YdDi/JaENIM6aSYYLJydG83UNzLXeRI5K8abYd/8Sp/QM0kA==", + "dependencies": { + "@smithy/util-buffer-from": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/util-utf8/node_modules/@smithy/is-array-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-3.0.0.tgz", + "integrity": "sha512-+Fsu6Q6C4RSJiy81Y8eApjEB5gVtM+oFKTffg+jSuwtvomJJrhUJBu2zS8wjXSgH/g1MKEWrzyChTBe6clb5FQ==", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/util-utf8/node_modules/@smithy/util-buffer-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-3.0.0.tgz", + "integrity": "sha512-aEOHCgq5RWFbP+UDPvPot26EJHjOC+bRgse5A8V3FSShqd5E5UN4qc7zkwsvJPPAVsf73QwYcHN1/gt/rtLwQA==", + "dependencies": { + "@smithy/is-array-buffer": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/util-utf8/node_modules/tslib": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" + }, + "node_modules/@types/babel__core": { + "version": "7.1.7", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.7.tgz", + "integrity": "sha512-RL62NqSFPCDK2FM1pSDH0scHpJvsXtZNiYlMB73DgPBaG1E38ZYVL+ei5EkWRbr+KC4YNiAUNBnRj+bgwpgjMw==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.6.1", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.1.tgz", + "integrity": "sha512-bBKm+2VPJcMRVwNhxKu8W+5/zT7pwNEqeokFOmbvVSqGzFneNxYcEBro9Ac7/N9tlsaPYnZLK8J1LWKkMsLAew==", + "dev": true, + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.0.2.tgz", + "integrity": "sha512-/K6zCpeW7Imzgab2bLkLEbz0+1JlFSrUMdw7KoIIu+IUdu51GWaBZpd3y1VXGVXzynvGa4DaIaxNZHiON3GXUg==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.0.10", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.0.10.tgz", + "integrity": "sha512-74fNdUGrWsgIB/V9kTO5FGHPWYY6Eqn+3Z7L6Hc4e/BxjYV7puvBqp5HwsVYYfLm6iURYBNCx4Ut37OF9yitCw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.3.0" + } + }, + "node_modules/@types/body-parser": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-W98JrE0j2K78swW4ukqMleo8R7h/pFETjM2DQ90MF6XK2i4LO4W3gQ71Lt4w3bfm2EvVSyWHplECvB5sK22yFQ==", + "dev": true, + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/caseless": { + "version": "0.12.2", + "resolved": "https://registry.npmjs.org/@types/caseless/-/caseless-0.12.2.tgz", + "integrity": "sha512-6ckxMjBBD8URvjB6J3NcnuAn5Pkl7t3TizAg+xdlzzQGSPSmBcXf8KoIH0ua/i+tio+ZRUHEXp0HEmvaR4kt0w==" + }, + "node_modules/@types/color-name": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", + "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==", + "dev": true + }, + "node_modules/@types/connect": { + "version": "3.4.33", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.33.tgz", + "integrity": "sha512-2+FrkXY4zllzTNfJth7jOqEHC+enpLeGslEhpnTAkg21GkRrWV4SsAtqchtT4YS9/nODBU2/ZfsBY2X4J/dX7A==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/cookiejar": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@types/cookiejar/-/cookiejar-2.1.1.tgz", + "integrity": "sha512-aRnpPa7ysx3aNW60hTiCtLHlQaIFsXFCgQlpakNgDNVFzbtusSY8PwjAQgRWfSk0ekNoBjO51eQRB6upA9uuyw==", + "dev": true + }, + "node_modules/@types/crypto-js": { + "version": "3.1.43", + "resolved": "https://registry.npmjs.org/@types/crypto-js/-/crypto-js-3.1.43.tgz", + "integrity": "sha512-EHe/YKctU3IYNBsDmSOPX/7jLHPRlx8WaiDKSY9JCTnJ8XJeM4c0ZJvx+9Gxmr2s2ihI92R+3U/gNL1sq5oRuQ==", + "dev": true + }, + "node_modules/@types/express": { + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.2.tgz", + "integrity": "sha512-5mHFNyavtLoJmnusB8OKJ5bshSzw+qkMIBAobLrIM48HJvunFva9mOa6aBwh64lBFyNwBbs0xiEFuj4eU/NjCA==", + "dev": true, + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "*", + "@types/serve-static": "*" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.2.tgz", + "integrity": "sha512-El9yMpctM6tORDAiBwZVLMcxoTMcqqRO9dVyYcn7ycLWbvR8klrDn8CAOwRfZujZtWD7yS/mshTdz43jMOejbg==", + "dev": true, + "dependencies": { + "@types/node": "*", + "@types/range-parser": "*" + } + }, + "node_modules/@types/gunzip-maybe": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@types/gunzip-maybe/-/gunzip-maybe-1.4.0.tgz", + "integrity": "sha512-dFP9GrYAR9KhsjTkWJ8q8Gsfql75YIKcg9DuQOj/IrlPzR7W+1zX+cclw1McV82UXAQ+Lpufvgk3e9bC8+HzgA==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/http-proxy": { + "version": "1.17.4", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.4.tgz", + "integrity": "sha512-IrSHl2u6AWXduUaDLqYpt45tLVCtYv7o4Z0s1KghBCDgIIS9oW5K1H8mZG/A2CfeLdEa7rTd1ACOiHBc1EMT2Q==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/http-proxy-middleware": { + "version": "0.19.3", + "resolved": "https://registry.npmjs.org/@types/http-proxy-middleware/-/http-proxy-middleware-0.19.3.tgz", + "integrity": "sha512-lnBTx6HCOUeIJMLbI/LaL5EmdKLhczJY5oeXZpX/cXE4rRqb3RmV7VcMpiEfYkmTjipv3h7IAyIINe4plEv7cA==", + "dev": true, + "dependencies": { + "@types/connect": "*", + "@types/http-proxy": "*", + "@types/node": "*" + } + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.1.tgz", + "integrity": "sha512-hRJD2ahnnpLgsj6KWMYSrmXkM3rm2Dl1qkx6IOFD5FnuNPXJIG5L0dhgKXCYTRMGzU4n0wImQ/xfmRc4POUFlg==", + "dev": true + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-1.1.1.tgz", + "integrity": "sha512-UpYjBi8xefVChsCoBpKShdxTllC9pwISirfoZsUa2AAdQg/Jd2KQGtSbw+ya7GPo7x/wAPlH6JBhKhAsXUEZNA==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "*", + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/jest": { + "version": "24.9.1", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-24.9.1.tgz", + "integrity": "sha512-Fb38HkXSVA4L8fGKEZ6le5bB8r6MRWlOCZbVuWZcmOMSCd2wCYOwN1ibj8daIoV9naq7aaOZjrLCoCMptKU/4Q==", + "dev": true, + "dependencies": { + "jest-diff": "^24.3.0" + } + }, + "node_modules/@types/js-yaml": { + "version": "3.12.2", + "resolved": "https://registry.npmjs.org/@types/js-yaml/-/js-yaml-3.12.2.tgz", + "integrity": "sha512-0CFu/g4mDSNkodVwWijdlr8jH7RoplRWNgovjFLEZeT+QEbbZXjBmCe3HwaWheAlCbHwomTwzZoSedeOycABug==" + }, + "node_modules/@types/mime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-2.0.1.tgz", + "integrity": "sha512-FwI9gX75FgVBJ7ywgnq/P7tw+/o1GUbtP0KzbtusLigAOgIgNISRK0ZPl4qertvXSIE8YbsVJueQ90cDt9YYyw==", + "dev": true + }, + "node_modules/@types/minipass": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@types/minipass/-/minipass-2.2.0.tgz", + "integrity": "sha512-wuzZksN4w4kyfoOv/dlpov4NOunwutLA/q7uc00xU02ZyUY+aoM5PWIXEKBMnm0NHd4a+N71BMjq+x7+2Af1fg==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/node": { + "version": "14.14.20", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.20.tgz", + "integrity": "sha512-Y93R97Ouif9JEOWPIUyU+eyIdyRqQR0I8Ez1dzku4hDx34NWh4HbtIc3WNzwB1Y9ULvNGeu5B8h8bVL5cAk4/A==" + }, + "node_modules/@types/node-fetch": { + "version": "2.5.5", + "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.5.5.tgz", + "integrity": "sha512-IWwjsyYjGw+em3xTvWVQi5MgYKbRs0du57klfTaZkv/B24AEQ/p/IopNeqIYNy3EsfHOpg8ieQSDomPcsYMHpA==", + "dev": true, + "dependencies": { + "@types/node": "*", + "form-data": "^3.0.0" + } + }, + "node_modules/@types/node-fetch/node_modules/form-data": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.0.tgz", + "integrity": "sha512-CKMFDglpbMi6PyN+brwB9Q/GOw0eAnsrEZDgcsH5Krhz5Od/haKHAX0NmQfha2zPPz0JpWzA7GJHGSnvCRLWsg==", + "dev": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@types/prettier": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-1.19.1.tgz", + "integrity": "sha512-5qOlnZscTn4xxM5MeGXAMOsIOIKIbh9e85zJWfBRVPlRMEVawzoPhINYbRGkBZCI8LxvBe7tJCdWiarA99OZfQ==", + "dev": true + }, + "node_modules/@types/range-parser": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.3.tgz", + "integrity": "sha512-ewFXqrQHlFsgc09MK5jP5iR7vumV/BYayNC6PgJO2LPe8vrnNFyjQjSppfEngITi0qvfKtzFvgKymGheFM9UOA==", + "dev": true + }, + "node_modules/@types/request": { + "version": "2.48.4", + "resolved": "https://registry.npmjs.org/@types/request/-/request-2.48.4.tgz", + "integrity": "sha512-W1t1MTKYR8PxICH+A4HgEIPuAC3sbljoEVfyZbeFJJDbr30guDspJri2XOaM2E+Un7ZjrihaDi7cf6fPa2tbgw==", + "dependencies": { + "@types/caseless": "*", + "@types/node": "*", + "@types/tough-cookie": "*", + "form-data": "^2.5.0" + } + }, + "node_modules/@types/request/node_modules/@types/node": { + "version": "13.7.4", + "resolved": "https://registry.npmjs.org/@types/node/-/node-13.7.4.tgz", + "integrity": "sha512-oVeL12C6gQS/GAExndigSaLxTrKpQPxewx9bOcwfvJiJge4rr7wNaph4J+ns5hrmIV2as5qxqN8YKthn9qh0jw==" + }, + "node_modules/@types/serve-static": { + "version": "1.13.3", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.3.tgz", + "integrity": "sha512-oprSwp094zOglVrXdlo/4bAHtKTAxX6VT8FOZlBKrmyLbNvE1zxZyJ6yikMVtHIvwP45+ZQGJn+FdXGKTozq0g==", + "dev": true, + "dependencies": { + "@types/express-serve-static-core": "*", + "@types/mime": "*" + } + }, + "node_modules/@types/stack-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-1.0.1.tgz", + "integrity": "sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw==", + "dev": true + }, + "node_modules/@types/superagent": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/@types/superagent/-/superagent-4.1.7.tgz", + "integrity": "sha512-JSwNPgRYjIC4pIeOqLwWwfGj6iP1n5NE6kNBEbGx2V8H78xCPwx7QpNp9plaI30+W3cFEzJO7BIIsXE+dbtaGg==", + "dev": true, + "dependencies": { + "@types/cookiejar": "*", + "@types/node": "*" + } + }, + "node_modules/@types/supertest": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@types/supertest/-/supertest-2.0.8.tgz", + "integrity": "sha512-wcax7/ip4XSSJRLbNzEIUVy2xjcBIZZAuSd2vtltQfRK7kxhx5WMHbLHkYdxN3wuQCrwpYrg86/9byDjPXoGMA==", + "dev": true, + "dependencies": { + "@types/superagent": "*" + } + }, + "node_modules/@types/tar": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@types/tar/-/tar-4.0.3.tgz", + "integrity": "sha512-Z7AVMMlkI8NTWF0qGhC4QIX0zkV/+y0J8x7b/RsHrN0310+YNjoJd8UrApCiGBCWtKjxS9QhNqLi2UJNToh5hA==", + "dev": true, + "dependencies": { + "@types/minipass": "*", + "@types/node": "*" + } + }, + "node_modules/@types/tar-stream": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@types/tar-stream/-/tar-stream-1.6.1.tgz", + "integrity": "sha512-pYCDOPuRE+4tXFk1rSMYiuI+kSrXiJ4av1bboQbkcEBA2rqwEWfIn9kdMSH+5nYu58WksHuxwx+7kVbtg0Le7w==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/tough-cookie": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-2.3.6.tgz", + "integrity": "sha512-wHNBMnkoEBiRAd3s8KTKwIuO9biFtTf0LehITzBhSco+HQI0xkXZbLOD55SW3Aqw3oUkHstkm5SPv58yaAdFPQ==" + }, + "node_modules/@types/underscore": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/@types/underscore/-/underscore-1.9.4.tgz", + "integrity": "sha512-CjHWEMECc2/UxOZh0kpiz3lEyX2Px3rQS9HzD20lxMvx571ivOBQKeLnqEjxUY0BMgp6WJWo/pQLRBwMW5v4WQ==" + }, + "node_modules/@types/ws": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-6.0.4.tgz", + "integrity": "sha512-PpPrX7SZW9re6+Ha8ojZG4Se8AZXgf0GK6zmfqEuCsY49LFDNXO3SByp44X3dFEqtB73lkCDAdUazhAjVPiNwg==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/yargs": { + "version": "13.0.8", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.8.tgz", + "integrity": "sha512-XAvHLwG7UQ+8M4caKIH0ZozIOYay5fQkAgyIXegXT9jPtdIGdhga+sUEdAr1CiG46aB+c64xQEYyEzlwWVTNzA==", + "dev": true, + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "15.0.0", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-15.0.0.tgz", + "integrity": "sha512-FA/BWv8t8ZWJ+gEOnLLd8ygxH/2UFbAvgEonyfN6yWGLKc7zVjbpl2Y4CTjid9h2RfgPP6SEt6uHwEOply00yw==", + "dev": true + }, + "node_modules/@zxing/text-encoding": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@zxing/text-encoding/-/text-encoding-0.9.0.tgz", + "integrity": "sha512-U/4aVJ2mxI0aDNI8Uq0wEhMgY+u4CNtEb0om3+y3+niDAsoTCOB33UF0sxpzqzdqXLqmvc+vZyAt4O8pPdfkwA==", + "license": "(Unlicense OR Apache-2.0)", + "optional": true + }, + "node_modules/abab": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.3.tgz", + "integrity": "sha512-tsFzPpcttalNjFBCFMqsKYQcWxxen1pgJR56by//QwvJc4/OUS3kPOOttx2tSIfjsylB0pYu7f5D3K1RCxUnUg==", + "deprecated": "Use your platform's native atob() and btoa() methods instead", + "dev": true + }, + "node_modules/abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "dependencies": { + "event-target-shim": "^5.0.0" + }, + "engines": { + "node": ">=6.5" + } + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.1.tgz", + "integrity": "sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-globals": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.3.4.tgz", + "integrity": "sha512-clfQEh21R+D0leSbUdWf3OcfqyaCSAQ8Ryq00bofSekfr9W8u1jyYZo6ir0xu9Gtcf7BjcHJpnbZH7JOCpP60A==", + "dev": true, + "dependencies": { + "acorn": "^6.0.1", + "acorn-walk": "^6.0.1" + } + }, + "node_modules/acorn-globals/node_modules/acorn": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz", + "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-walk": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.2.0.tgz", + "integrity": "sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/agent-base": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", + "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==", + "dependencies": { + "es6-promisify": "^5.0.0" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.0.tgz", + "integrity": "sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw==", + "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" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz", + "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==", + "dev": true, + "dependencies": { + "type-fest": "^0.11.0" + }, + "engines": { + "node": ">=8" + }, + "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/anymatch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", + "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "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==", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz", + "integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=", + "dev": true + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" + }, + "node_modules/array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "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=", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", + "engines": { + "node": ">=0.10.0" + } + }, + "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": "2.6.3", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", + "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", + "dependencies": { + "lodash": "^4.17.14" + } + }, + "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==" + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + }, + "node_modules/atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "bin": { + "atob": "bin/atob.js" + }, + "engines": { + "node": ">= 4.5.0" + } + }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "license": "MIT", + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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=", + "engines": { + "node": "*" + } + }, + "node_modules/aws4": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.9.1.tgz", + "integrity": "sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug==" + }, + "node_modules/axios": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.0.tgz", + "integrity": "sha512-EZ1DYihju9pwVB+jg67ogm+Tmqc6JmhamRN6I4Zt8DfZu5lbcQGw3ozH9lFejSJgs/ibaef3A9PMXPLeefFGJg==", + "dependencies": { + "follow-redirects": "^1.15.0", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/axios/node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/babel-jest": { + "version": "25.3.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-25.3.0.tgz", + "integrity": "sha512-qiXeX1Cmw4JZ5yQ4H57WpkO0MZ61Qj+YnsVUwAMnDV5ls+yHon11XjarDdgP7H8lTmiEi6biiZA8y3Tmvx6pCg==", + "dev": true, + "dependencies": { + "@jest/transform": "^25.3.0", + "@jest/types": "^25.3.0", + "@types/babel__core": "^7.1.7", + "babel-plugin-istanbul": "^6.0.0", + "babel-preset-jest": "^25.3.0", + "chalk": "^3.0.0", + "slash": "^3.0.0" + }, + "engines": { + "node": ">= 8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/babel-jest/node_modules/@jest/types": { + "version": "25.3.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-25.3.0.tgz", + "integrity": "sha512-UkaDNewdqXAmCDbN2GlUM6amDKS78eCqiw/UmF5nE0mmLTd6moJkiZJML/X52Ke3LH7Swhw883IRXq8o9nWjVw==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^15.0.0", + "chalk": "^3.0.0" + }, + "engines": { + "node": ">= 8.3" + } + }, + "node_modules/babel-jest/node_modules/@types/yargs": { + "version": "15.0.4", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.4.tgz", + "integrity": "sha512-9T1auFmbPZoxHz0enUFlUuKRy3it01R+hlggyVUMtnCTQRunsQYifnSGb8hET4Xo8yiC0o0r1paW3ud5+rbURg==", + "dev": true, + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/babel-jest/node_modules/ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "dependencies": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/babel-jest/node_modules/chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-jest/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/babel-jest/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/babel-jest/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/babel-jest/node_modules/supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-istanbul": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.0.0.tgz", + "integrity": "sha512-AF55rZXpe7trmEylbaE1Gv54wn6rwU03aptvRoVIGP8YykoSxqdVLV1TfwflBCE/QtHmqtP8SWlTENqbK8GCSQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^4.0.0", + "test-exclude": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-jest-hoist": { + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-25.2.6.tgz", + "integrity": "sha512-qE2xjMathybYxjiGFJg0mLFrz0qNp83aNZycWDY/SuHiZNq+vQfRQtuINqyXyue1ELd8Rd+1OhFSLjms8msMbw==", + "dev": true, + "dependencies": { + "@types/babel__traverse": "^7.0.6" + }, + "engines": { + "node": ">= 8.3" + } + }, + "node_modules/babel-preset-current-node-syntax": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-0.1.2.tgz", + "integrity": "sha512-u/8cS+dEiK1SFILbOC8/rUI3ml9lboKuuMvZ/4aQnQmhecQAgPw5ew066C1ObnEAUmlx7dv/s2z52psWEtLNiw==", + "dev": true, + "dependencies": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.8.3", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/babel-preset-jest": { + "version": "25.3.0", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-25.3.0.tgz", + "integrity": "sha512-tjdvLKNMwDI9r+QWz9sZUQGTq1dpoxjUqFUpEasAc7MOtHg9XuLT2fx0udFG+k1nvMV0WvHHVAN7VmCZ+1Zxbw==", + "dev": true, + "dependencies": { + "babel-plugin-jest-hoist": "^25.2.6", + "babel-preset-current-node-syntax": "^0.1.2" + }, + "engines": { + "node": ">= 8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "node_modules/base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dependencies": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base/node_modules/is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "deprecated": "Please upgrade to v1.0.1", + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base/node_modules/is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "deprecated": "Please upgrade to v1.0.1", + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base/node_modules/is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dependencies": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base64-js": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", + "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==" + }, + "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=", + "dependencies": { + "tweetnacl": "^0.14.3" + } + }, + "node_modules/bignumber.js": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-7.2.1.tgz", + "integrity": "sha512-S4XzBk5sMB+Rcb/LNcpzXr57VRTxgAvaAEDAl1AwRx27j00hT84O6OkteE7u8UB3NuaaygCRrEpqox4uDOrbdQ==", + "engines": { + "node": "*" + } + }, + "node_modules/bl": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/bl/-/bl-3.0.1.tgz", + "integrity": "sha512-jrCW5ZhfQ/Vt07WX1Ngs+yn9BDqPL/gw28S7s9H6QK/gupnizNzJAss5akW20ISgOrbLTlXOOCTJeNUQqruAWQ==", + "dependencies": { + "readable-stream": "^3.0.1" + } + }, + "node_modules/bl/node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/block-stream2": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/block-stream2/-/block-stream2-2.1.0.tgz", + "integrity": "sha512-suhjmLI57Ewpmq00qaygS8UgEq2ly2PCItenIyhMqVjo4t4pGzqMvfgJuX8iWTeSDdfSSqS6j38fL4ToNL7Pfg==", + "license": "MIT", + "dependencies": { + "readable-stream": "^3.4.0" + } + }, + "node_modules/block-stream2/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/body-parser": { + "version": "1.20.3", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", + "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.13.0", + "raw-body": "2.5.2", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "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==", + "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": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/body-parser/node_modules/qs": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", + "dependencies": { + "side-channel": "^1.0.6" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/bowser": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.11.0.tgz", + "integrity": "sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==" + }, + "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==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dependencies": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/braces/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/browser-or-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/browser-or-node/-/browser-or-node-2.1.1.tgz", + "integrity": "sha512-8CVjaLJGuSKMVTxJ2DpBl5XnlNDiT4cQFeuCJJrvJmts9YrTZDizTX7PjC2s6W4x+MBGZeEY6dGMrF04/6Hgqg==", + "license": "MIT" + }, + "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-resolve": { + "version": "1.11.3", + "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.3.tgz", + "integrity": "sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ==", + "dev": true, + "dependencies": { + "resolve": "1.1.7" + } + }, + "node_modules/browser-resolve/node_modules/resolve": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", + "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", + "dev": true + }, + "node_modules/browserify-zlib": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.1.4.tgz", + "integrity": "sha1-uzX4pRn2AOD6a4SFJByXnQFB+y0=", + "dependencies": { + "pako": "~0.2.0" + } + }, + "node_modules/bs-logger": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", + "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", + "dev": true, + "dependencies": { + "fast-json-stable-stringify": "2.x" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "dev": true, + "dependencies": { + "node-int64": "^0.4.0" + } + }, + "node_modules/buffer-crc32": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-1.0.0.tgz", + "integrity": "sha512-Db1SbgBS/fg/392AblrMJk97KggmvYhr4pB5ZIMTWtaivCPMWLkmb7m21cJvpvgK+J3nsU2CmmixNBZx4vFj/w==", + "license": "MIT", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/buffer-equal-constant-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "integrity": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=" + }, + "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==" + }, + "node_modules/builtin-modules": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", + "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/byline": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/byline/-/byline-5.0.0.tgz", + "integrity": "sha1-dBxSFkaOrcRXsDQQEYrXfejB3bE=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dependencies": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/call-bind": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", + "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.0", + "es-define-property": "^1.0.0", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.1.tgz", + "integrity": "sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.3.tgz", + "integrity": "sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "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/capture-exit": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-2.0.0.tgz", + "integrity": "sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g==", + "dev": true, + "dependencies": { + "rsvp": "^4.8.4" + }, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" + }, + "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/ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", + "dev": true + }, + "node_modules/class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "dependencies": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "node_modules/co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "dev": true, + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" + } + }, + "node_modules/collect-v8-coverage": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", + "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==", + "dev": true + }, + "node_modules/collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "dependencies": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "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==", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "node_modules/component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" + }, + "node_modules/compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "dependencies": { + "mime-db": ">= 1.43.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "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=" + }, + "node_modules/concat-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz", + "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==", + "engines": [ + "node >= 6.0" + ], + "dependencies": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.0.2", + "typedarray": "^0.0.6" + } + }, + "node_modules/concat-stream/node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/configstore": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-4.0.0.tgz", + "integrity": "sha512-CmquAXFBocrzaSM8mtGPMM/HiWmyIpr4CcJl/rgY2uCObZ/S7cKU0silxslqJejl+t/T9HS8E0PUNQD81JGUEQ==", + "dependencies": { + "dot-prop": "^4.1.0", + "graceful-fs": "^4.1.2", + "make-dir": "^1.0.0", + "unique-string": "^1.0.0", + "write-file-atomic": "^2.0.0", + "xdg-basedir": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-disposition/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/convert-source-map": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", + "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.1" + } + }, + "node_modules/cookie": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", + "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": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" + }, + "node_modules/cookiejar": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.4.tgz", + "integrity": "sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==", + "dev": true + }, + "node_modules/copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "engines": { + "node": ">=0.10.0" + } + }, + "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=" + }, + "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/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/crypto-js": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-3.3.0.tgz", + "integrity": "sha512-DIT51nX0dCfKltpRiXV+/TVZq+Qq2NgF4644+K7Ttnla7zEzqc+kjJyiB96BHNyUTBxyjzRcZYpUdZa+QAqi6Q==" + }, + "node_modules/crypto-random-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", + "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=", + "engines": { + "node": ">=4" + } + }, + "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.2.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.2.0.tgz", + "integrity": "sha512-sEb3XFPx3jNnCAMtqrXPDeSgQr+jojtCeNf8cvMNMh1cG970+lljssvQDzPq6lmmJu2Vhqood/gtEomBiHOGnA==", + "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/dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dependencies": { + "assert-plus": "^1.0.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/data-urls": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-1.1.0.tgz", + "integrity": "sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ==", + "dev": true, + "dependencies": { + "abab": "^2.0.0", + "whatwg-mimetype": "^2.2.0", + "whatwg-url": "^7.0.0" + } + }, + "node_modules/date-and-time": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/date-and-time/-/date-and-time-0.6.3.tgz", + "integrity": "sha512-lcWy3AXDRJOD7MplwZMmNSRM//kZtJaLz4n6D1P5z9wEmZGBKhJRBIr1Xs9KNQJmdXPblvgffynYji4iylUTcA==" + }, + "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)", + "dependencies": { + "ms": "^2.1.1" + } + }, + "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/decode-uri-component": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", + "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==", + "engines": { + "node": ">=0.10" + } + }, + "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=" + }, + "node_modules/deepmerge": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", + "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dependencies": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/define-property/node_modules/is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "deprecated": "Please upgrade to v1.0.1", + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/define-property/node_modules/is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "deprecated": "Please upgrade to v1.0.1", + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/define-property/node_modules/is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dependencies": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "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=", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/diff-sequences": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-24.9.0.tgz", + "integrity": "sha512-Dj6Wk3tWyTE+Fo1rW8v0Xhwk80um6yFYKbuAxc9c3EZxIHFDYwbi34Uk42u1CdnIiVorvt4RmlSDjIPyzGC2ew==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/domexception": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-1.0.1.tgz", + "integrity": "sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==", + "deprecated": "Use your platform's native DOMException instead", + "dev": true, + "dependencies": { + "webidl-conversions": "^4.0.2" + } + }, + "node_modules/dot-prop": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.1.tgz", + "integrity": "sha512-l0p4+mIuJIua0mhxGoh4a+iNL9bmeK5DvnSVQa6T0OhrVmaEa1XScX5Etc673FePCJOArq/4Pa2cLGODUWTPOQ==", + "dependencies": { + "is-obj": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/duplexify": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", + "dependencies": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + } + }, + "node_modules/ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "dependencies": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "node_modules/ecdsa-sig-formatter": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", + "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + }, + "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": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/encoding": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz", + "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=", + "dependencies": { + "iconv-lite": "~0.4.13" + } + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/ent": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", + "integrity": "sha1-6WQhkyWiHQX0RGai9obtbOX13R0=" + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es6-promise": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", + "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==" + }, + "node_modules/es6-promisify": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", + "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", + "dependencies": { + "es6-promise": "^4.0.3" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + }, + "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": "1.14.1", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.1.tgz", + "integrity": "sha512-Bmt7NcRySdIfNPfU2ZoXDrrXsG9ZjvDxcAlMfDUgRBjLOWTuIACXPBFJH7Z+cLb40JeQco5toikyc9t9P8E9SQ==", + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=4.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "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==", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "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==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/eventemitter3": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.0.tgz", + "integrity": "sha512-qerSRB0p+UDEssxTtm6EDKcE7W4OaoisfIMl4CngyEhjpYglocpNg6UEqCvemdGhosAsg4sO2dXJOdyBifPGCg==" + }, + "node_modules/exec-sh": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.3.4.tgz", + "integrity": "sha512-sEFIkc61v75sWeOe72qyrqg2Qg0OuLESziUDk/O/z2qgS15y2gWVFrI6f2Qn/qw/0/NCfCEsmNA4zOjkwEZT1A==", + "dev": true + }, + "node_modules/execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "dev": true, + "dependencies": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dependencies": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/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/expand-brackets/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "node_modules/expect": { + "version": "25.3.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-25.3.0.tgz", + "integrity": "sha512-buboTXML2h/L0Kh44Ys2Cx49mX20ISc5KDirkxIs3Q9AJv0kazweUAbukegr+nHDOvFRKmxdojjIHCjqAceYfg==", + "dev": true, + "dependencies": { + "@jest/types": "^25.3.0", + "ansi-styles": "^4.0.0", + "jest-get-type": "^25.2.6", + "jest-matcher-utils": "^25.3.0", + "jest-message-util": "^25.3.0", + "jest-regex-util": "^25.2.6" + }, + "engines": { + "node": ">= 8.3" + } + }, + "node_modules/expect/node_modules/@jest/types": { + "version": "25.3.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-25.3.0.tgz", + "integrity": "sha512-UkaDNewdqXAmCDbN2GlUM6amDKS78eCqiw/UmF5nE0mmLTd6moJkiZJML/X52Ke3LH7Swhw883IRXq8o9nWjVw==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^15.0.0", + "chalk": "^3.0.0" + }, + "engines": { + "node": ">= 8.3" + } + }, + "node_modules/expect/node_modules/@types/yargs": { + "version": "15.0.4", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.4.tgz", + "integrity": "sha512-9T1auFmbPZoxHz0enUFlUuKRy3it01R+hlggyVUMtnCTQRunsQYifnSGb8hET4Xo8yiC0o0r1paW3ud5+rbURg==", + "dev": true, + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/expect/node_modules/ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "dependencies": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/expect/node_modules/chalk": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", - "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", - "requires": { + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/expect/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/expect/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/expect/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/expect/node_modules/jest-get-type": { + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-25.2.6.tgz", + "integrity": "sha512-DxjtyzOHjObRM+sM1knti6or+eOgcGU4xVSb2HNP1TqO4ahsT+rqZg+nyqHWJSvWgKC5cG3QjGFBqxLghiF/Ig==", + "dev": true, + "engines": { + "node": ">= 8.3" + } + }, + "node_modules/expect/node_modules/supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/express": { + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/express/-/express-4.21.0.tgz", + "integrity": "sha512-VqcNGcj/Id5ZT1LZ/cfihi3ttTn+NJmkli2eZADigjq29qTlWi/hAQ43t/VLPq8+UX06FCEx3ByOYet6ZFblng==", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.3", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.6.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.3.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.3", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.10", + "proxy-addr": "~2.0.7", + "qs": "6.13.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.19.0", + "serve-static": "1.16.2", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "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==", + "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": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/express/node_modules/qs": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", + "dependencies": { + "side-channel": "^1.0.6" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/express/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extend-shallow/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dependencies": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob/node_modules/is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "deprecated": "Please upgrade to v1.0.1", + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob/node_modules/is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "deprecated": "Please upgrade to v1.0.1", + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob/node_modules/is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dependencies": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "engines": [ + "node >=0.6.0" + ] + }, + "node_modules/fast-deep-equal": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", + "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==" + }, + "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==" + }, + "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=" + }, + "node_modules/fast-text-encoding": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fast-text-encoding/-/fast-text-encoding-1.0.0.tgz", + "integrity": "sha512-R9bHCvweUxxwkDwhjav5vxpFvdPGlVngtqmx4pIZfSUhM/Q4NiIUHB456BAf+Q1Nwu3HEZYONtu+Rya+af4jiQ==" + }, + "node_modules/fast-xml-parser": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.4.1.tgz", + "integrity": "sha512-xkjOecfnKGkSsOwtZ5Pz7Us/T6mrbPQrq0nh+aCO5V9nk5NLWmasAHumTKjiPJPWANe+kAZ84Jc8ooJkzZ88Sw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + }, + { + "type": "paypal", + "url": "https://paypal.me/naturalintelligence" + } + ], + "dependencies": { + "strnum": "^1.0.5" + }, + "bin": { + "fxparser": "src/cli/cli.js" + } + }, + "node_modules/fb-watchman": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz", + "integrity": "sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==", + "dev": true, + "dependencies": { + "bser": "2.1.1" + } + }, + "node_modules/fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dependencies": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fill-range/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/filter-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/filter-obj/-/filter-obj-1.1.0.tgz", + "integrity": "sha512-8rXg1ZnX7xzy2NGDVkBVaAy+lSlPNwad13BtgSlLuxfIslyt5Vg64U7tFcCt4WS1R0hvtnQybT/IyCkGZ3DpXQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/finalhandler": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", + "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "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==", + "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": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/follow-redirects": { + "version": "1.15.6", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", + "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "license": "MIT", + "dependencies": { + "is-callable": "^1.1.3" + } + }, + "node_modules/for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "engines": { + "node": "*" + } + }, + "node_modules/form-data": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", + "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 0.12" + } + }, + "node_modules/formidable": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.2.2.tgz", + "integrity": "sha512-V8gLm+41I/8kguQ4/o1D3RIHRmhYFG4pnNyonvua+40rqcEmT4+V71yaZ3B457xbbgCsCfjSPi65u/W6vK1U5Q==", + "deprecated": "Please upgrade to latest, formidable@v2 or formidable@v3! Check these notes: https://bit.ly/2ZEqIau", + "dev": true, + "funding": { + "url": "https://ko-fi.com/tunnckoCore/commissions" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "dependencies": { + "map-cache": "^0.2.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "node_modules/fsevents": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.2.tgz", + "integrity": "sha512-R4wDiBwZ0KzpgOWetKDug1FZcYhqYnUYKtfZYt4mD5SBz76q0KR4Q9o7GIPamsVPGmW3EYPPJ0dOOjvx32ldZA==", + "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.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gaxios": { + "version": "1.8.4", + "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-1.8.4.tgz", + "integrity": "sha512-BoENMnu1Gav18HcpV9IleMPZ9exM+AvUjrAOV4Mzs/vfz2Lu/ABv451iEXByKiMPn2M140uul1txXCg83sAENw==", + "dependencies": { + "abort-controller": "^3.0.0", + "extend": "^3.0.2", + "https-proxy-agent": "^2.2.1", + "node-fetch": "^2.3.0" + } + }, + "node_modules/gcp-metadata": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-1.0.0.tgz", + "integrity": "sha512-Q6HrgfrCQeEircnNP3rCcEgiDv7eF9+1B+1MMgpE190+/+0mjQR8PxeOaRgxZWmdDAF9EIryHB9g1moPiw1SbQ==", + "dependencies": { + "gaxios": "^1.0.2", + "json-bigint": "^0.3.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/gcs-resumable-upload": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/gcs-resumable-upload/-/gcs-resumable-upload-1.1.0.tgz", + "integrity": "sha512-uBz7uHqp44xjSDzG3kLbOYZDjxxR/UAGbB47A0cC907W6yd2LkcyFDTHg+bjivkHMwiJlKv4guVWcjPCk2zScg==", + "deprecated": "gcs-resumable-upload is deprecated. Support will end on 11/01/2023", + "dependencies": { + "abort-controller": "^2.0.2", + "configstore": "^4.0.0", + "gaxios": "^1.5.0", + "google-auth-library": "^3.0.0", + "pumpify": "^1.5.1", + "stream-events": "^1.0.4" + }, + "bin": { + "gcs-upload": "build/src/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/gcs-resumable-upload/node_modules/abort-controller": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-2.0.3.tgz", + "integrity": "sha512-EPSq5wr2aFyAZ1PejJB32IX9Qd4Nwus+adnp7STYFM5/23nLPBazqZ1oor6ZqbH+4otaaGXTlC8RN5hq3C8w9Q==", + "dependencies": { "event-target-shim": "^5.0.0" + }, + "engines": { + "node": ">=6.5" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.1", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.1.tgz", + "integrity": "sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "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.2.7", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.7.tgz", + "integrity": "sha512-VW6Pxhsrk0KAOqs3WEd0klDiF/+V7gQOpAvY1jVU/LHmaD/kQO4523aiJuikX/QAKYiW6x8Jh+RJej1almdtCA==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "function-bind": "^1.1.2", + "get-proto": "^1.0.0", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/get-stream/node_modules/pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dependencies": { + "assert-plus": "^1.0.0" + } + }, + "node_modules/glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "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": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/google-auth-library": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-3.1.2.tgz", + "integrity": "sha512-cDQMzTotwyWMrg5jRO7q0A4TL/3GWBgO7I7q5xGKNiiFf9SmGY/OJ1YsLMgI2MVHHsEGyrqYnbnmV1AE+Z6DnQ==", + "dependencies": { + "base64-js": "^1.3.0", + "fast-text-encoding": "^1.0.0", + "gaxios": "^1.2.1", + "gcp-metadata": "^1.0.0", + "gtoken": "^2.3.2", + "https-proxy-agent": "^2.2.1", + "jws": "^3.1.5", + "lru-cache": "^5.0.0", + "semver": "^5.5.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/google-p12-pem": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/google-p12-pem/-/google-p12-pem-1.0.4.tgz", + "integrity": "sha512-SwLAUJqUfTB2iS+wFfSS/G9p7bt4eWcc2LyfvmUXe7cWp6p3mpxDo6LLI29MXdU6wvPcQ/up298X7GMC5ylAlA==", + "deprecated": "Package is no longer maintained", + "dependencies": { + "node-forge": "^0.8.0", + "pify": "^4.0.0" + }, + "bin": { + "gp12-pem": "build/src/bin/gp12-pem.js" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", + "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==" + }, + "node_modules/growly": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", + "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=", + "dev": true, + "optional": true + }, + "node_modules/gtoken": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-2.3.3.tgz", + "integrity": "sha512-EaB49bu/TCoNeQjhCYKI/CurooBKkGxIqFHsWABW0b25fobBYVTMe84A8EBVVZhl8emiUdNypil9huMOTmyAnw==", + "dependencies": { + "gaxios": "^1.0.4", + "google-p12-pem": "^1.0.0", + "jws": "^3.1.5", + "mime": "^2.2.0", + "pify": "^4.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/gunzip-maybe": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/gunzip-maybe/-/gunzip-maybe-1.4.1.tgz", + "integrity": "sha512-qtutIKMthNJJgeHQS7kZ9FqDq59/Wn0G2HYCRNjpup7yKfVI6/eqwpmroyZGFoCYaG+sW6psNVb4zoLADHpp2g==", + "dependencies": { + "browserify-zlib": "^0.1.4", + "is-deflate": "^1.0.0", + "is-gzip": "^1.0.0", + "peek-stream": "^1.1.0", + "pumpify": "^1.3.3", + "through2": "^2.0.3" + }, + "bin": { + "gunzip-maybe": "bin.js" + } + }, + "node_modules/gunzip-maybe/node_modules/through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "node_modules/har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "engines": { + "node": ">=4" + } + }, + "node_modules/har-validator": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", + "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", + "deprecated": "this library is no longer supported", + "dependencies": { + "ajv": "^6.5.5", + "har-schema": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "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-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "requires": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" + "node_modules/has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "dependencies": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", "dependencies": { - "mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" - }, - "mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "requires": { - "mime-db": "1.52.0" - } - } + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "acorn": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.1.tgz", - "integrity": "sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg==", + "node_modules/has-values/node_modules/kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/hash-stream-validation": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/hash-stream-validation/-/hash-stream-validation-0.2.2.tgz", + "integrity": "sha512-cMlva5CxWZOrlS/cY0C+9qAzesn5srhFA8IT1VPiHc9bWWBLkJfEUIZr7MWoi89oOOGmpg8ymchaOjiArsGu5A==", + "dependencies": { + "through2": "^2.0.0" + } + }, + "node_modules/hash-stream-validation/node_modules/through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/html-encoding-sniffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz", + "integrity": "sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==", + "dev": true, + "dependencies": { + "whatwg-encoding": "^1.0.1" + } + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", "dev": true }, - "acorn-globals": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.3.4.tgz", - "integrity": "sha512-clfQEh21R+D0leSbUdWf3OcfqyaCSAQ8Ryq00bofSekfr9W8u1jyYZo6ir0xu9Gtcf7BjcHJpnbZH7JOCpP60A==", + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "dependencies": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/http-proxy-middleware": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.18.0.tgz", + "integrity": "sha512-Fs25KVMPAIIcgjMZkVHJoKg9VcXcC1C8yb9JUgeDvVXY0S/zgVIhMb+qVswDIgtJe2DfckMSY2d6TuTEutlk6Q==", + "dependencies": { + "http-proxy": "^1.16.2", + "is-glob": "^4.0.0", + "lodash": "^4.17.5", + "micromatch": "^3.1.9" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "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": "2.2.4", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz", + "integrity": "sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg==", + "dependencies": { + "agent-base": "^4.3.0", + "debug": "^3.1.0" + }, + "engines": { + "node": ">= 4.5.0" + } + }, + "node_modules/human-signals": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", + "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", + "dev": true, + "engines": { + "node": ">=8.12.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==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/import-local": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.0.2.tgz", + "integrity": "sha512-vjL3+w0oulAVZ0hBHnxa/Nm5TAurf9YLQJDhqRZyqb+VKGOB6LU8t9H1Nr5CIo16vh9XfJTOoHwU0B71S557gA==", + "dev": true, + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "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=", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/interpret": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.2.0.tgz", + "integrity": "sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/ip-regex": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", + "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "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==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "deprecated": "Please upgrade to v0.1.7", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-accessor-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-arguments": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.2.0.tgz", + "integrity": "sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-ci": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", + "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", + "dev": true, + "dependencies": { + "ci-info": "^2.0.0" + }, + "bin": { + "is-ci": "bin.js" + } + }, + "node_modules/is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "deprecated": "Please upgrade to v0.1.5", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-data-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-deflate": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-deflate/-/is-deflate-1.0.0.tgz", + "integrity": "sha1-yGKQHDwWH7CdrHzcfnhPgOmPLxQ=" + }, + "node_modules/is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-descriptor/node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "engines": { + "node": ">=0.10.0" + } + }, + "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=", + "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-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", "dev": true, - "requires": { - "acorn": "^6.0.1", - "acorn-walk": "^6.0.1" + "engines": { + "node": ">=6" + } + }, + "node_modules/is-generator-function": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.0.tgz", + "integrity": "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "get-proto": "^1.0.0", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", "dependencies": { - "acorn": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz", - "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==", - "dev": true - } + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" } }, - "acorn-walk": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.2.0.tgz", - "integrity": "sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA==", - "dev": true + "node_modules/is-gzip": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-gzip/-/is-gzip-1.0.0.tgz", + "integrity": "sha1-bKiwe5nHeZgCWQDlVc7Y7YCHmoM=", + "engines": { + "node": ">=0.10.0" + } }, - "agent-base": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", - "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==", - "requires": { - "es6-promisify": "^5.0.0" + "node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" } }, - "ajv": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.0.tgz", - "integrity": "sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw==", - "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" + "node_modules/is-number/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" } }, - "ansi-escapes": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz", - "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==", - "dev": true, - "requires": { - "type-fest": "^0.11.0" + "node_modules/is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", + "engines": { + "node": ">=0.10.0" } }, - "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 + "node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } }, - "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" + "node_modules/is-regex": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "anymatch": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", - "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", - "dev": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" + "node_modules/is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "engines": { + "node": ">=0.10.0" } }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "requires": { - "sprintf-js": "~1.0.2" + "node_modules/is-stream-ended": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-stream-ended/-/is-stream-ended-0.1.4.tgz", + "integrity": "sha512-xj0XPvmr7bQFTvirqnFr50o0hQIh6ZItDqloxt5aJrR4NQsYeSsyFQERYGCAzfindAcnKjINnwEEgLx4IqVzQw==" + }, + "node_modules/is-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", + "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", + "license": "MIT", + "dependencies": { + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=" + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" }, - "arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==" + "node_modules/is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "engines": { + "node": ">=0.10.0" + } }, - "arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=" + "node_modules/is-wsl": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.1.1.tgz", + "integrity": "sha512-umZHcSrwlDHo2TGMXv0DZ8dIUGunZ2Iv68YZnrmCiBPkZ4aaOhtv7pXJKeki9k3qJ3RJr0cDyitcl5wEH3AYog==", + "dev": true, + "optional": true, + "engines": { + "node": ">=8" + } }, - "array-equal": { + "node_modules/isarray": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz", - "integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "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 }, - "array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "engines": { + "node": ">=0.10.0" + } }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=" + "node_modules/isomorphic-ws": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/isomorphic-ws/-/isomorphic-ws-4.0.1.tgz", + "integrity": "sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==", + "peerDependencies": { + "ws": "*" + } }, - "arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=" + "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=" }, - "asn1": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", - "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", - "requires": { - "safer-buffer": "~2.1.0" + "node_modules/istanbul-lib-coverage": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", + "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==", + "dev": true, + "engines": { + "node": ">=8" } }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" + "node_modules/istanbul-lib-instrument": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.1.tgz", + "integrity": "sha512-imIchxnodll7pvQBYOqUu88EufLCU56LMeFPZZM/fJZ1irYcYdqroaV+ACK1Ila8ls09iEYArp+nqyC6lW1Vfg==", + "dev": true, + "dependencies": { + "@babel/core": "^7.7.5", + "@babel/parser": "^7.7.5", + "@babel/template": "^7.7.4", + "@babel/traverse": "^7.7.4", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.0.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } }, - "assign-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=" + "node_modules/istanbul-lib-instrument/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } }, - "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 + "node_modules/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "dev": true, + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } }, - "async": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", - "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", - "requires": { - "lodash": "^4.17.14" + "node_modules/istanbul-lib-report/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" } }, - "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==" + "node_modules/istanbul-lib-report/node_modules/make-dir": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.0.2.tgz", + "integrity": "sha512-rYKABKutXa6vXTXhoV18cBE7PaewPXHe/Bdq4v+ZLMhxbWApkFFplT0LcbMW+6BbjnQXzZ/sAvSE/JdguApG5w==", + "dev": true, + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + "node_modules/istanbul-lib-report/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } }, - "atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==" + "node_modules/istanbul-lib-report/node_modules/supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } }, - "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=" + "node_modules/istanbul-lib-source-maps": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz", + "integrity": "sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=8" + } }, - "aws4": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.9.1.tgz", - "integrity": "sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug==" + "node_modules/istanbul-lib-source-maps/node_modules/debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "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" + } }, - "axios": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.0.tgz", - "integrity": "sha512-EZ1DYihju9pwVB+jg67ogm+Tmqc6JmhamRN6I4Zt8DfZu5lbcQGw3ozH9lFejSJgs/ibaef3A9PMXPLeefFGJg==", - "requires": { - "follow-redirects": "^1.15.0", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" + "node_modules/istanbul-reports": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.2.tgz", + "integrity": "sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw==", + "dev": true, + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest": { + "version": "25.3.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-25.3.0.tgz", + "integrity": "sha512-iKd5ShQSHzFT5IL/6h5RZJhApgqXSoPxhp5HEi94v6OAw9QkF8T7X+liEU2eEHJ1eMFYTHmeWLrpBWulsDpaUg==", + "dev": true, "dependencies": { - "form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - } - } + "@jest/core": "^25.3.0", + "import-local": "^3.0.2", + "jest-cli": "^25.3.0" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": ">= 8.3" + } + }, + "node_modules/jest-changed-files": { + "version": "25.3.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-25.3.0.tgz", + "integrity": "sha512-eqd5hyLbUjIVvLlJ3vQ/MoPxsxfESVXG9gvU19XXjKzxr+dXmZIqCXiY0OiYaibwlHZBJl2Vebkc0ADEMzCXew==", + "dev": true, + "dependencies": { + "@jest/types": "^25.3.0", + "execa": "^3.2.0", + "throat": "^5.0.0" + }, + "engines": { + "node": ">= 8.3" } }, - "babel-jest": { + "node_modules/jest-changed-files/node_modules/@jest/types": { "version": "25.3.0", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-25.3.0.tgz", - "integrity": "sha512-qiXeX1Cmw4JZ5yQ4H57WpkO0MZ61Qj+YnsVUwAMnDV5ls+yHon11XjarDdgP7H8lTmiEi6biiZA8y3Tmvx6pCg==", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-25.3.0.tgz", + "integrity": "sha512-UkaDNewdqXAmCDbN2GlUM6amDKS78eCqiw/UmF5nE0mmLTd6moJkiZJML/X52Ke3LH7Swhw883IRXq8o9nWjVw==", "dev": true, - "requires": { - "@jest/transform": "^25.3.0", - "@jest/types": "^25.3.0", - "@types/babel__core": "^7.1.7", - "babel-plugin-istanbul": "^6.0.0", - "babel-preset-jest": "^25.3.0", - "chalk": "^3.0.0", - "slash": "^3.0.0" - }, "dependencies": { - "@jest/types": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-25.3.0.tgz", - "integrity": "sha512-UkaDNewdqXAmCDbN2GlUM6amDKS78eCqiw/UmF5nE0mmLTd6moJkiZJML/X52Ke3LH7Swhw883IRXq8o9nWjVw==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^15.0.0", - "chalk": "^3.0.0" - } - }, - "@types/yargs": { - "version": "15.0.4", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.4.tgz", - "integrity": "sha512-9T1auFmbPZoxHz0enUFlUuKRy3it01R+hlggyVUMtnCTQRunsQYifnSGb8hET4Xo8yiC0o0r1paW3ud5+rbURg==", - "dev": true, - "requires": { - "@types/yargs-parser": "*" - } - }, - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "dev": true, - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "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 - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^15.0.0", + "chalk": "^3.0.0" + }, + "engines": { + "node": ">= 8.3" } }, - "babel-plugin-istanbul": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.0.0.tgz", - "integrity": "sha512-AF55rZXpe7trmEylbaE1Gv54wn6rwU03aptvRoVIGP8YykoSxqdVLV1TfwflBCE/QtHmqtP8SWlTENqbK8GCSQ==", + "node_modules/jest-changed-files/node_modules/@types/yargs": { + "version": "15.0.4", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.4.tgz", + "integrity": "sha512-9T1auFmbPZoxHz0enUFlUuKRy3it01R+hlggyVUMtnCTQRunsQYifnSGb8hET4Xo8yiC0o0r1paW3ud5+rbURg==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-instrument": "^4.0.0", - "test-exclude": "^6.0.0" + "dependencies": { + "@types/yargs-parser": "*" } }, - "babel-plugin-jest-hoist": { - "version": "25.2.6", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-25.2.6.tgz", - "integrity": "sha512-qE2xjMathybYxjiGFJg0mLFrz0qNp83aNZycWDY/SuHiZNq+vQfRQtuINqyXyue1ELd8Rd+1OhFSLjms8msMbw==", + "node_modules/jest-changed-files/node_modules/ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", "dev": true, - "requires": { - "@types/babel__traverse": "^7.0.6" + "dependencies": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "babel-preset-current-node-syntax": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-0.1.2.tgz", - "integrity": "sha512-u/8cS+dEiK1SFILbOC8/rUI3ml9lboKuuMvZ/4aQnQmhecQAgPw5ew066C1ObnEAUmlx7dv/s2z52psWEtLNiw==", + "node_modules/jest-changed-files/node_modules/chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", "dev": true, - "requires": { - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-bigint": "^7.8.3", - "@babel/plugin-syntax-class-properties": "^7.8.3", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.8.3", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" } }, - "babel-preset-jest": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-25.3.0.tgz", - "integrity": "sha512-tjdvLKNMwDI9r+QWz9sZUQGTq1dpoxjUqFUpEasAc7MOtHg9XuLT2fx0udFG+k1nvMV0WvHHVAN7VmCZ+1Zxbw==", + "node_modules/jest-changed-files/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, - "requires": { - "babel-plugin-jest-hoist": "^25.2.6", - "babel-preset-current-node-syntax": "^0.1.2" + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" } }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + "node_modules/jest-changed-files/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 }, - "base": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", - "requires": { - "cache-base": "^1.0.1", - "class-utils": "^0.3.5", - "component-emitter": "^1.2.1", - "define-property": "^1.0.0", - "isobject": "^3.0.1", - "mixin-deep": "^1.2.0", - "pascalcase": "^0.1.1" - }, + "node_modules/jest-changed-files/node_modules/cross-spawn": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.2.tgz", + "integrity": "sha512-PD6G8QG3S4FK/XCGFbEQrDqO2AnMMsy0meR7lerlIOHAAbkuavGU/pOqprrlvfTNjvowivTeBsjebAL0NSoMxw==", + "dev": true, "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" } }, - "base64-js": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", - "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==" - }, - "bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", - "requires": { - "tweetnacl": "^0.14.3" + "node_modules/jest-changed-files/node_modules/execa": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-3.4.0.tgz", + "integrity": "sha512-r9vdGQk4bmCuK1yKQu1KTwcT2zwfWdbdaXfCtAh+5nU/4fSX+JAb7vZGvI5naJrQlvONrEB20jeruESI69530g==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.0", + "get-stream": "^5.0.0", + "human-signals": "^1.1.1", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.0", + "onetime": "^5.1.0", + "p-finally": "^2.0.0", + "signal-exit": "^3.0.2", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": "^8.12.0 || >=9.7.0" } }, - "bignumber.js": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-7.2.1.tgz", - "integrity": "sha512-S4XzBk5sMB+Rcb/LNcpzXr57VRTxgAvaAEDAl1AwRx27j00hT84O6OkteE7u8UB3NuaaygCRrEpqox4uDOrbdQ==" - }, - "bl": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/bl/-/bl-3.0.1.tgz", - "integrity": "sha512-jrCW5ZhfQ/Vt07WX1Ngs+yn9BDqPL/gw28S7s9H6QK/gupnizNzJAss5akW20ISgOrbLTlXOOCTJeNUQqruAWQ==", - "requires": { - "readable-stream": "^3.0.1" - }, + "node_modules/jest-changed-files/node_modules/get-stream": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.1.0.tgz", + "integrity": "sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==", + "dev": true, "dependencies": { - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-changed-files/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" } }, - "block-stream2": { + "node_modules/jest-changed-files/node_modules/is-stream": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/block-stream2/-/block-stream2-2.0.0.tgz", - "integrity": "sha512-1oI+RHHUEo64xomy1ozLgVJetFlHkIfQfJzTBQrj6xWnEMEPooeo2fZoqFjp0yzfHMBrgxwgh70tKp6T17+i3g==", - "requires": { - "readable-stream": "^3.4.0" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", + "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", + "dev": true, + "engines": { + "node": ">=8" } }, - "body-parser": { - "version": "1.20.3", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", - "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", - "requires": { - "bytes": "3.1.2", - "content-type": "~1.0.5", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.13.0", - "raw-body": "2.5.2", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - }, + "node_modules/jest-changed-files/node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, "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": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "qs": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", - "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", - "requires": { - "side-channel": "^1.0.6" - } - } + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" } }, - "bowser": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.11.0.tgz", - "integrity": "sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==" - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "node_modules/jest-changed-files/node_modules/p-finally": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-2.0.1.tgz", + "integrity": "sha512-vpm09aKwq6H9phqRQzecoDpD8TmVyGw70qmWlyq5onxY7tqyTTFVvxMykxQSQKILBSFlbXpypIw2T1Ml7+DDtw==", + "dev": true, + "engines": { + "node": ">=8" } }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - } + "node_modules/jest-changed-files/node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" } }, - "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-resolve": { - "version": "1.11.3", - "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.3.tgz", - "integrity": "sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ==", + "node_modules/jest-changed-files/node_modules/pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", "dev": true, - "requires": { - "resolve": "1.1.7" - }, "dependencies": { - "resolve": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", - "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", - "dev": true - } + "end-of-stream": "^1.1.0", + "once": "^1.3.1" } }, - "browserify-zlib": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.1.4.tgz", - "integrity": "sha1-uzX4pRn2AOD6a4SFJByXnQFB+y0=", - "requires": { - "pako": "~0.2.0" + "node_modules/jest-changed-files/node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" } }, - "bs-logger": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", - "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", + "node_modules/jest-changed-files/node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true, - "requires": { - "fast-json-stable-stringify": "2.x" + "engines": { + "node": ">=8" } }, - "bser": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", - "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "node_modules/jest-changed-files/node_modules/supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", "dev": true, - "requires": { - "node-int64": "^0.4.0" + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "buffer-equal-constant-time": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", - "integrity": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=" - }, - "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==" - }, - "builtin-modules": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", - "dev": true - }, - "byline": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/byline/-/byline-5.0.0.tgz", - "integrity": "sha1-dBxSFkaOrcRXsDQQEYrXfejB3bE=" - }, - "bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" - }, - "cache-base": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", - "requires": { - "collection-visit": "^1.0.0", - "component-emitter": "^1.2.1", - "get-value": "^2.0.6", - "has-value": "^1.0.0", - "isobject": "^3.0.1", - "set-value": "^2.0.0", - "to-object-path": "^0.3.0", - "union-value": "^1.0.0", - "unset-value": "^1.0.0" + "node_modules/jest-config": { + "version": "25.3.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-25.3.0.tgz", + "integrity": "sha512-CmF1JnNWFmoCSPC4tnU52wnVBpuxHjilA40qH/03IHxIevkjUInSMwaDeE6ACfxMPTLidBGBCO3EbxvzPbo8wA==", + "dev": true, + "dependencies": { + "@babel/core": "^7.1.0", + "@jest/test-sequencer": "^25.3.0", + "@jest/types": "^25.3.0", + "babel-jest": "^25.3.0", + "chalk": "^3.0.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.1", + "jest-environment-jsdom": "^25.3.0", + "jest-environment-node": "^25.3.0", + "jest-get-type": "^25.2.6", + "jest-jasmine2": "^25.3.0", + "jest-regex-util": "^25.2.6", + "jest-resolve": "^25.3.0", + "jest-util": "^25.3.0", + "jest-validate": "^25.3.0", + "micromatch": "^4.0.2", + "pretty-format": "^25.3.0", + "realpath-native": "^2.0.0" + }, + "engines": { + "node": ">= 8.3" } }, - "call-bind": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", - "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", - "requires": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.1" + "node_modules/jest-config/node_modules/@jest/types": { + "version": "25.3.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-25.3.0.tgz", + "integrity": "sha512-UkaDNewdqXAmCDbN2GlUM6amDKS78eCqiw/UmF5nE0mmLTd6moJkiZJML/X52Ke3LH7Swhw883IRXq8o9nWjVw==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^15.0.0", + "chalk": "^3.0.0" + }, + "engines": { + "node": ">= 8.3" } }, - "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 - }, - "capture-exit": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-2.0.0.tgz", - "integrity": "sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g==", + "node_modules/jest-config/node_modules/@types/yargs": { + "version": "15.0.4", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.4.tgz", + "integrity": "sha512-9T1auFmbPZoxHz0enUFlUuKRy3it01R+hlggyVUMtnCTQRunsQYifnSGb8hET4Xo8yiC0o0r1paW3ud5+rbURg==", "dev": true, - "requires": { - "rsvp": "^4.8.4" + "dependencies": { + "@types/yargs-parser": "*" } }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "node_modules/jest-config/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, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "engines": { + "node": ">=8" } }, - "ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", - "dev": true - }, - "class-utils": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", - "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", - "requires": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "static-extend": "^0.1.1" - }, + "node_modules/jest-config/node_modules/ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "requires": { - "is-descriptor": "^0.1.0" - } - } + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "node_modules/jest-config/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, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" } }, - "co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", - "dev": true - }, - "collect-v8-coverage": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", - "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==", - "dev": true - }, - "collection-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", - "requires": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" + "node_modules/jest-config/node_modules/chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" } }, - "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==", + "node_modules/jest-config/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, - "requires": { - "color-name": "1.1.3" + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" } }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "node_modules/jest-config/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 }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "requires": { - "delayed-stream": "~1.0.0" + "node_modules/jest-config/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" } }, - "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true - }, - "component-emitter": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", - "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" + "node_modules/jest-config/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" + } }, - "compressible": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", - "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", - "requires": { - "mime-db": ">= 1.43.0 < 2" + "node_modules/jest-config/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" } }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + "node_modules/jest-config/node_modules/jest-get-type": { + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-25.2.6.tgz", + "integrity": "sha512-DxjtyzOHjObRM+sM1knti6or+eOgcGU4xVSb2HNP1TqO4ahsT+rqZg+nyqHWJSvWgKC5cG3QjGFBqxLghiF/Ig==", + "dev": true, + "engines": { + "node": ">= 8.3" + } }, - "concat-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz", - "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==", - "requires": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.0.2", - "typedarray": "^0.0.6" - }, + "node_modules/jest-config/node_modules/micromatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", + "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "dev": true, "dependencies": { - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } + "braces": "^3.0.1", + "picomatch": "^2.0.5" + }, + "engines": { + "node": ">=8" } }, - "configstore": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/configstore/-/configstore-4.0.0.tgz", - "integrity": "sha512-CmquAXFBocrzaSM8mtGPMM/HiWmyIpr4CcJl/rgY2uCObZ/S7cKU0silxslqJejl+t/T9HS8E0PUNQD81JGUEQ==", - "requires": { - "dot-prop": "^4.1.0", - "graceful-fs": "^4.1.2", - "make-dir": "^1.0.0", - "unique-string": "^1.0.0", - "write-file-atomic": "^2.0.0", - "xdg-basedir": "^3.0.0" + "node_modules/jest-config/node_modules/pretty-format": { + "version": "25.3.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.3.0.tgz", + "integrity": "sha512-wToHwF8bkQknIcFkBqNfKu4+UZqnrLn/Vr+wwKQwwvPzkBfDDKp/qIabFqdgtoi5PEnM8LFByVsOrHoa3SpTVA==", + "dev": true, + "dependencies": { + "@jest/types": "^25.3.0", + "ansi-regex": "^5.0.0", + "ansi-styles": "^4.0.0", + "react-is": "^16.12.0" + }, + "engines": { + "node": ">= 8.3" } }, - "content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", - "requires": { - "safe-buffer": "5.2.1" - }, + "node_modules/jest-config/node_modules/supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, "dependencies": { - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" - } + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==" + "node_modules/jest-config/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" + } }, - "convert-source-map": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", - "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", + "node_modules/jest-diff": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-24.9.0.tgz", + "integrity": "sha512-qMfrTs8AdJE2iqrTp0hzh7kTd2PQWrsFyj9tORoKmu32xjPjeE4NyjVRDz8ybYwqS2ik8N4hsIpiVTyFeo2lBQ==", "dev": true, - "requires": { - "safe-buffer": "~5.1.1" + "dependencies": { + "chalk": "^2.0.1", + "diff-sequences": "^24.9.0", + "jest-get-type": "^24.9.0", + "pretty-format": "^24.9.0" + }, + "engines": { + "node": ">= 6" } }, - "cookie": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", - "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==" + "node_modules/jest-docblock": { + "version": "25.3.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-25.3.0.tgz", + "integrity": "sha512-aktF0kCar8+zxRHxQZwxMy70stc9R1mOmrLsT5VO3pIT0uzGRSDAXxSlz4NqQWpuLjPpuMhPRl7H+5FRsvIQAg==", + "dev": true, + "dependencies": { + "detect-newline": "^3.0.0" + }, + "engines": { + "node": ">= 8.3" + } }, - "cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" + "node_modules/jest-each": { + "version": "25.3.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-25.3.0.tgz", + "integrity": "sha512-aBfS4VOf/Qs95yUlX6d6WBv0szvOcTkTTyCIaLuQGj4bSHsT+Wd9dDngVHrCe5uytxpN8VM+NAloI6nbPjXfXw==", + "dev": true, + "dependencies": { + "@jest/types": "^25.3.0", + "chalk": "^3.0.0", + "jest-get-type": "^25.2.6", + "jest-util": "^25.3.0", + "pretty-format": "^25.3.0" + }, + "engines": { + "node": ">= 8.3" + } }, - "cookiejar": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.4.tgz", - "integrity": "sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==", - "dev": true + "node_modules/jest-each/node_modules/@jest/types": { + "version": "25.3.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-25.3.0.tgz", + "integrity": "sha512-UkaDNewdqXAmCDbN2GlUM6amDKS78eCqiw/UmF5nE0mmLTd6moJkiZJML/X52Ke3LH7Swhw883IRXq8o9nWjVw==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^15.0.0", + "chalk": "^3.0.0" + }, + "engines": { + "node": ">= 8.3" + } }, - "copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=" + "node_modules/jest-each/node_modules/@types/yargs": { + "version": "15.0.4", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.4.tgz", + "integrity": "sha512-9T1auFmbPZoxHz0enUFlUuKRy3it01R+hlggyVUMtnCTQRunsQYifnSGb8hET4Xo8yiC0o0r1paW3ud5+rbURg==", + "dev": true, + "dependencies": { + "@types/yargs-parser": "*" + } }, - "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=" + "node_modules/jest-each/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" + } }, - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "node_modules/jest-each/node_modules/ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", "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": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-each/node_modules/chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-each/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": { - "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" - } - } + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" } }, - "crypto-js": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-3.3.0.tgz", - "integrity": "sha512-DIT51nX0dCfKltpRiXV+/TVZq+Qq2NgF4644+K7Ttnla7zEzqc+kjJyiB96BHNyUTBxyjzRcZYpUdZa+QAqi6Q==" + "node_modules/jest-each/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 }, - "crypto-random-string": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", - "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=" + "node_modules/jest-each/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" + } }, - "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/jest-each/node_modules/jest-get-type": { + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-25.2.6.tgz", + "integrity": "sha512-DxjtyzOHjObRM+sM1knti6or+eOgcGU4xVSb2HNP1TqO4ahsT+rqZg+nyqHWJSvWgKC5cG3QjGFBqxLghiF/Ig==", + "dev": true, + "engines": { + "node": ">= 8.3" + } }, - "cssstyle": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.2.0.tgz", - "integrity": "sha512-sEb3XFPx3jNnCAMtqrXPDeSgQr+jojtCeNf8cvMNMh1cG970+lljssvQDzPq6lmmJu2Vhqood/gtEomBiHOGnA==", + "node_modules/jest-each/node_modules/pretty-format": { + "version": "25.3.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.3.0.tgz", + "integrity": "sha512-wToHwF8bkQknIcFkBqNfKu4+UZqnrLn/Vr+wwKQwwvPzkBfDDKp/qIabFqdgtoi5PEnM8LFByVsOrHoa3SpTVA==", "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 - } + "@jest/types": "^25.3.0", + "ansi-regex": "^5.0.0", + "ansi-styles": "^4.0.0", + "react-is": "^16.12.0" + }, + "engines": { + "node": ">= 8.3" } }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "requires": { - "assert-plus": "^1.0.0" + "node_modules/jest-each/node_modules/supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "data-urls": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-1.1.0.tgz", - "integrity": "sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ==", + "node_modules/jest-environment-jsdom": { + "version": "25.3.0", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-25.3.0.tgz", + "integrity": "sha512-jdE4bQN+k2QEZ9sWOxsqDJvMzbdFSCN/4tw8X0TQaCqyzKz58PyEf41oIr4WO7ERdp7WaJGBSUKF7imR3UW1lg==", "dev": true, - "requires": { - "abab": "^2.0.0", - "whatwg-mimetype": "^2.2.0", - "whatwg-url": "^7.0.0" + "dependencies": { + "@jest/environment": "^25.3.0", + "@jest/fake-timers": "^25.3.0", + "@jest/types": "^25.3.0", + "jest-mock": "^25.3.0", + "jest-util": "^25.3.0", + "jsdom": "^15.2.1" + }, + "engines": { + "node": ">= 8.3" } }, - "date-and-time": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/date-and-time/-/date-and-time-0.6.3.tgz", - "integrity": "sha512-lcWy3AXDRJOD7MplwZMmNSRM//kZtJaLz4n6D1P5z9wEmZGBKhJRBIr1Xs9KNQJmdXPblvgffynYji4iylUTcA==" + "node_modules/jest-environment-jsdom/node_modules/@jest/types": { + "version": "25.3.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-25.3.0.tgz", + "integrity": "sha512-UkaDNewdqXAmCDbN2GlUM6amDKS78eCqiw/UmF5nE0mmLTd6moJkiZJML/X52Ke3LH7Swhw883IRXq8o9nWjVw==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^15.0.0", + "chalk": "^3.0.0" + }, + "engines": { + "node": ">= 8.3" + } }, - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "requires": { - "ms": "^2.1.1" + "node_modules/jest-environment-jsdom/node_modules/@types/yargs": { + "version": "15.0.4", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.4.tgz", + "integrity": "sha512-9T1auFmbPZoxHz0enUFlUuKRy3it01R+hlggyVUMtnCTQRunsQYifnSGb8hET4Xo8yiC0o0r1paW3ud5+rbURg==", + "dev": true, + "dependencies": { + "@types/yargs-parser": "*" } }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true + "node_modules/jest-environment-jsdom/node_modules/ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "dependencies": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } }, - "decode-uri-component": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", - "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==" + "node_modules/jest-environment-jsdom/node_modules/chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } }, - "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=" + "node_modules/jest-environment-jsdom/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" + } }, - "deepmerge": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", - "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", + "node_modules/jest-environment-jsdom/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 }, - "define-data-property": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", - "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", - "requires": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "gopd": "^1.0.1" + "node_modules/jest-environment-jsdom/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" } }, - "define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "requires": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - }, + "node_modules/jest-environment-jsdom/node_modules/supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, "dependencies": { - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" - }, - "depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" - }, - "destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==" - }, - "detect-newline": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", - "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", - "dev": true - }, - "diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true + "node_modules/jest-environment-node": { + "version": "25.3.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-25.3.0.tgz", + "integrity": "sha512-XO09S29Nx1NU7TiMPHMoDIkxoGBuKSTbE+sHp0gXbeLDXhIdhysUI25kOqFFSD9AuDgvPvxWCXrvNqiFsOH33g==", + "dev": true, + "dependencies": { + "@jest/environment": "^25.3.0", + "@jest/fake-timers": "^25.3.0", + "@jest/types": "^25.3.0", + "jest-mock": "^25.3.0", + "jest-util": "^25.3.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">= 8.3" + } }, - "diff-sequences": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-24.9.0.tgz", - "integrity": "sha512-Dj6Wk3tWyTE+Fo1rW8v0Xhwk80um6yFYKbuAxc9c3EZxIHFDYwbi34Uk42u1CdnIiVorvt4RmlSDjIPyzGC2ew==", - "dev": true + "node_modules/jest-environment-node/node_modules/@jest/types": { + "version": "25.3.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-25.3.0.tgz", + "integrity": "sha512-UkaDNewdqXAmCDbN2GlUM6amDKS78eCqiw/UmF5nE0mmLTd6moJkiZJML/X52Ke3LH7Swhw883IRXq8o9nWjVw==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^15.0.0", + "chalk": "^3.0.0" + }, + "engines": { + "node": ">= 8.3" + } }, - "domexception": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/domexception/-/domexception-1.0.1.tgz", - "integrity": "sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==", + "node_modules/jest-environment-node/node_modules/@types/yargs": { + "version": "15.0.4", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.4.tgz", + "integrity": "sha512-9T1auFmbPZoxHz0enUFlUuKRy3it01R+hlggyVUMtnCTQRunsQYifnSGb8hET4Xo8yiC0o0r1paW3ud5+rbURg==", "dev": true, - "requires": { - "webidl-conversions": "^4.0.2" + "dependencies": { + "@types/yargs-parser": "*" } }, - "dot-prop": { + "node_modules/jest-environment-node/node_modules/ansi-styles": { "version": "4.2.1", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.1.tgz", - "integrity": "sha512-l0p4+mIuJIua0mhxGoh4a+iNL9bmeK5DvnSVQa6T0OhrVmaEa1XScX5Etc673FePCJOArq/4Pa2cLGODUWTPOQ==", - "requires": { - "is-obj": "^1.0.0" + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "dependencies": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "duplexify": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", - "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", - "requires": { - "end-of-stream": "^1.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.0.0", - "stream-shift": "^1.0.0" + "node_modules/jest-environment-node/node_modules/chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" } }, - "ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", - "requires": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" + "node_modules/jest-environment-node/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" } }, - "ecdsa-sig-formatter": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", - "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", - "requires": { - "safe-buffer": "^5.0.1" + "node_modules/jest-environment-node/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/jest-environment-node/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" } }, - "ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + "node_modules/jest-environment-node/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } }, - "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/jest-environment-node/node_modules/supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } }, - "encodeurl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", - "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==" + "node_modules/jest-get-type": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-24.9.0.tgz", + "integrity": "sha512-lUseMzAley4LhIcpSP9Jf+fTrQ4a1yHQwLNeeVa2cEmbCGeoZAtYPOIv8JaxLD/sUpKxetKGP+gsHl8f8TSj8Q==", + "dev": true, + "engines": { + "node": ">= 6" + } }, - "encoding": { - "version": "0.1.12", - "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz", - "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=", - "requires": { - "iconv-lite": "~0.4.13" + "node_modules/jest-haste-map": { + "version": "25.3.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-25.3.0.tgz", + "integrity": "sha512-LjXaRa+F8wwtSxo9G+hHD/Cp63PPQzvaBL9XCVoJD2rrcJO0Zr2+YYzAFWWYJ5GlPUkoaJFJtOuk0sL6MJY80A==", + "dev": true, + "dependencies": { + "@jest/types": "^25.3.0", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.3", + "jest-serializer": "^25.2.6", + "jest-util": "^25.3.0", + "jest-worker": "^25.2.6", + "micromatch": "^4.0.2", + "sane": "^4.0.3", + "walker": "^1.0.7", + "which": "^2.0.2" + }, + "engines": { + "node": ">= 8.3" + }, + "optionalDependencies": { + "fsevents": "^2.1.2" } }, - "end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "requires": { - "once": "^1.4.0" + "node_modules/jest-haste-map/node_modules/@jest/types": { + "version": "25.3.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-25.3.0.tgz", + "integrity": "sha512-UkaDNewdqXAmCDbN2GlUM6amDKS78eCqiw/UmF5nE0mmLTd6moJkiZJML/X52Ke3LH7Swhw883IRXq8o9nWjVw==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^15.0.0", + "chalk": "^3.0.0" + }, + "engines": { + "node": ">= 8.3" } }, - "ent": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", - "integrity": "sha1-6WQhkyWiHQX0RGai9obtbOX13R0=" - }, - "es-define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", - "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", - "requires": { - "get-intrinsic": "^1.2.4" + "node_modules/jest-haste-map/node_modules/@types/yargs": { + "version": "15.0.4", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.4.tgz", + "integrity": "sha512-9T1auFmbPZoxHz0enUFlUuKRy3it01R+hlggyVUMtnCTQRunsQYifnSGb8hET4Xo8yiC0o0r1paW3ud5+rbURg==", + "dev": true, + "dependencies": { + "@types/yargs-parser": "*" } }, - "es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==" - }, - "es6-error": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", - "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==" + "node_modules/jest-haste-map/node_modules/ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "dependencies": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } }, - "es6-promise": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", - "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==" + "node_modules/jest-haste-map/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" + } }, - "es6-promisify": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", - "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", - "requires": { - "es6-promise": "^4.0.3" + "node_modules/jest-haste-map/node_modules/chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" } }, - "escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + "node_modules/jest-haste-map/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" + } }, - "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=", + "node_modules/jest-haste-map/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 }, - "escodegen": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.1.tgz", - "integrity": "sha512-Bmt7NcRySdIfNPfU2ZoXDrrXsG9ZjvDxcAlMfDUgRBjLOWTuIACXPBFJH7Z+cLb40JeQco5toikyc9t9P8E9SQ==", - "requires": { - "esprima": "^4.0.1", - "estraverse": "^4.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1", - "source-map": "~0.6.1" + "node_modules/jest-haste-map/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" } }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" - }, - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==" - }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" - }, - "etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==" - }, - "event-target-shim": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", - "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==" - }, - "eventemitter3": { + "node_modules/jest-haste-map/node_modules/has-flag": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.0.tgz", - "integrity": "sha512-qerSRB0p+UDEssxTtm6EDKcE7W4OaoisfIMl4CngyEhjpYglocpNg6UEqCvemdGhosAsg4sO2dXJOdyBifPGCg==" - }, - "exec-sh": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.3.4.tgz", - "integrity": "sha512-sEFIkc61v75sWeOe72qyrqg2Qg0OuLESziUDk/O/z2qgS15y2gWVFrI6f2Qn/qw/0/NCfCEsmNA4zOjkwEZT1A==", - "dev": true + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } }, - "execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "node_modules/jest-haste-map/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, - "requires": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" + "engines": { + "node": ">=0.12.0" } }, - "exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", - "dev": true + "node_modules/jest-haste-map/node_modules/micromatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", + "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "dev": true, + "dependencies": { + "braces": "^3.0.1", + "picomatch": "^2.0.5" + }, + "engines": { + "node": ">=8" + } }, - "expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "requires": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" + "node_modules/jest-haste-map/node_modules/supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-haste-map/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": { - "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" - } - }, - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" } }, - "expect": { + "node_modules/jest-jasmine2": { "version": "25.3.0", - "resolved": "https://registry.npmjs.org/expect/-/expect-25.3.0.tgz", - "integrity": "sha512-buboTXML2h/L0Kh44Ys2Cx49mX20ISc5KDirkxIs3Q9AJv0kazweUAbukegr+nHDOvFRKmxdojjIHCjqAceYfg==", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-25.3.0.tgz", + "integrity": "sha512-NCYOGE6+HNzYFSui52SefgpsnIzvxjn6KAgqw66BdRp37xpMD/4kujDHLNW5bS5i53os5TcMn6jYrzQRO8VPrQ==", "dev": true, - "requires": { + "dependencies": { + "@babel/traverse": "^7.1.0", + "@jest/environment": "^25.3.0", + "@jest/source-map": "^25.2.6", + "@jest/test-result": "^25.3.0", "@jest/types": "^25.3.0", - "ansi-styles": "^4.0.0", - "jest-get-type": "^25.2.6", + "chalk": "^3.0.0", + "co": "^4.6.0", + "expect": "^25.3.0", + "is-generator-fn": "^2.0.0", + "jest-each": "^25.3.0", "jest-matcher-utils": "^25.3.0", "jest-message-util": "^25.3.0", - "jest-regex-util": "^25.2.6" + "jest-runtime": "^25.3.0", + "jest-snapshot": "^25.3.0", + "jest-util": "^25.3.0", + "pretty-format": "^25.3.0", + "throat": "^5.0.0" }, + "engines": { + "node": ">= 8.3" + } + }, + "node_modules/jest-jasmine2/node_modules/@jest/types": { + "version": "25.3.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-25.3.0.tgz", + "integrity": "sha512-UkaDNewdqXAmCDbN2GlUM6amDKS78eCqiw/UmF5nE0mmLTd6moJkiZJML/X52Ke3LH7Swhw883IRXq8o9nWjVw==", + "dev": true, "dependencies": { - "@jest/types": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-25.3.0.tgz", - "integrity": "sha512-UkaDNewdqXAmCDbN2GlUM6amDKS78eCqiw/UmF5nE0mmLTd6moJkiZJML/X52Ke3LH7Swhw883IRXq8o9nWjVw==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^15.0.0", - "chalk": "^3.0.0" - } - }, - "@types/yargs": { - "version": "15.0.4", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.4.tgz", - "integrity": "sha512-9T1auFmbPZoxHz0enUFlUuKRy3it01R+hlggyVUMtnCTQRunsQYifnSGb8hET4Xo8yiC0o0r1paW3ud5+rbURg==", - "dev": true, - "requires": { - "@types/yargs-parser": "*" - } - }, - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "dev": true, - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "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 - }, - "jest-get-type": { - "version": "25.2.6", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-25.2.6.tgz", - "integrity": "sha512-DxjtyzOHjObRM+sM1knti6or+eOgcGU4xVSb2HNP1TqO4ahsT+rqZg+nyqHWJSvWgKC5cG3QjGFBqxLghiF/Ig==", - "dev": true - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^15.0.0", + "chalk": "^3.0.0" + }, + "engines": { + "node": ">= 8.3" } }, - "express": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/express/-/express-4.21.0.tgz", - "integrity": "sha512-VqcNGcj/Id5ZT1LZ/cfihi3ttTn+NJmkli2eZADigjq29qTlWi/hAQ43t/VLPq8+UX06FCEx3ByOYet6ZFblng==", - "requires": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.3", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.6.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.3.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "merge-descriptors": "1.0.3", - "methods": "~1.1.2", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.10", - "proxy-addr": "~2.0.7", - "qs": "6.13.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.19.0", - "serve-static": "1.16.2", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" + "node_modules/jest-jasmine2/node_modules/@types/yargs": { + "version": "15.0.4", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.4.tgz", + "integrity": "sha512-9T1auFmbPZoxHz0enUFlUuKRy3it01R+hlggyVUMtnCTQRunsQYifnSGb8hET4Xo8yiC0o0r1paW3ud5+rbURg==", + "dev": true, + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/jest-jasmine2/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/jest-jasmine2/node_modules/ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "dependencies": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-jasmine2/node_modules/chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-jasmine2/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": { - "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": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "qs": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", - "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", - "requires": { - "side-channel": "^1.0.6" - } - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" - } + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" } }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + "node_modules/jest-jasmine2/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/jest-jasmine2/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/jest-jasmine2/node_modules/pretty-format": { + "version": "25.3.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.3.0.tgz", + "integrity": "sha512-wToHwF8bkQknIcFkBqNfKu4+UZqnrLn/Vr+wwKQwwvPzkBfDDKp/qIabFqdgtoi5PEnM8LFByVsOrHoa3SpTVA==", + "dev": true, + "dependencies": { + "@jest/types": "^25.3.0", + "ansi-regex": "^5.0.0", + "ansi-styles": "^4.0.0", + "react-is": "^16.12.0" + }, + "engines": { + "node": ">= 8.3" + } }, - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" + "node_modules/jest-jasmine2/node_modules/supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-leak-detector": { + "version": "25.3.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-25.3.0.tgz", + "integrity": "sha512-jk7k24dMIfk8LUSQQGN8PyOy9+J0NAfHZWiDmUDYVMctY8FLJQ1eQ8+PjMoN8PgwhLIggUqgYJnyRFvUz3jLRw==", + "dev": true, "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "requires": { - "is-plain-object": "^2.0.4" - } - } + "jest-get-type": "^25.2.6", + "pretty-format": "^25.3.0" + }, + "engines": { + "node": ">= 8.3" } }, - "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "requires": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" + "node_modules/jest-leak-detector/node_modules/@jest/types": { + "version": "25.3.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-25.3.0.tgz", + "integrity": "sha512-UkaDNewdqXAmCDbN2GlUM6amDKS78eCqiw/UmF5nE0mmLTd6moJkiZJML/X52Ke3LH7Swhw883IRXq8o9nWjVw==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^15.0.0", + "chalk": "^3.0.0" }, + "engines": { + "node": ">= 8.3" + } + }, + "node_modules/jest-leak-detector/node_modules/@types/yargs": { + "version": "15.0.4", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.4.tgz", + "integrity": "sha512-9T1auFmbPZoxHz0enUFlUuKRy3it01R+hlggyVUMtnCTQRunsQYifnSGb8hET4Xo8yiC0o0r1paW3ud5+rbURg==", + "dev": true, "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } + "@types/yargs-parser": "*" } }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" + "node_modules/jest-leak-detector/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" + } }, - "fast-deep-equal": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", - "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==" + "node_modules/jest-leak-detector/node_modules/ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "dependencies": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } }, - "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==" + "node_modules/jest-leak-detector/node_modules/chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" + "node_modules/jest-leak-detector/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" + } }, - "fast-text-encoding": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fast-text-encoding/-/fast-text-encoding-1.0.0.tgz", - "integrity": "sha512-R9bHCvweUxxwkDwhjav5vxpFvdPGlVngtqmx4pIZfSUhM/Q4NiIUHB456BAf+Q1Nwu3HEZYONtu+Rya+af4jiQ==" + "node_modules/jest-leak-detector/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 }, - "fast-xml-parser": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.4.1.tgz", - "integrity": "sha512-xkjOecfnKGkSsOwtZ5Pz7Us/T6mrbPQrq0nh+aCO5V9nk5NLWmasAHumTKjiPJPWANe+kAZ84Jc8ooJkzZ88Sw==", - "requires": { - "strnum": "^1.0.5" + "node_modules/jest-leak-detector/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" } }, - "fb-watchman": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz", - "integrity": "sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==", + "node_modules/jest-leak-detector/node_modules/jest-get-type": { + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-25.2.6.tgz", + "integrity": "sha512-DxjtyzOHjObRM+sM1knti6or+eOgcGU4xVSb2HNP1TqO4ahsT+rqZg+nyqHWJSvWgKC5cG3QjGFBqxLghiF/Ig==", "dev": true, - "requires": { - "bser": "2.1.1" + "engines": { + "node": ">= 8.3" } }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" + "node_modules/jest-leak-detector/node_modules/pretty-format": { + "version": "25.3.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.3.0.tgz", + "integrity": "sha512-wToHwF8bkQknIcFkBqNfKu4+UZqnrLn/Vr+wwKQwwvPzkBfDDKp/qIabFqdgtoi5PEnM8LFByVsOrHoa3SpTVA==", + "dev": true, + "dependencies": { + "@jest/types": "^25.3.0", + "ansi-regex": "^5.0.0", + "ansi-styles": "^4.0.0", + "react-is": "^16.12.0" }, + "engines": { + "node": ">= 8.3" + } + }, + "node_modules/jest-leak-detector/node_modules/supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - } + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "finalhandler": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", - "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", - "requires": { - "debug": "2.6.9", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" + "node_modules/jest-matcher-utils": { + "version": "25.3.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-25.3.0.tgz", + "integrity": "sha512-ZBUJ2fchNIZt+fyzkuCFBb8SKaU//Rln45augfUtbHaGyVxCO++ANARdBK9oPGXU3hEDgyy7UHnOP/qNOJXFUg==", + "dev": true, + "dependencies": { + "chalk": "^3.0.0", + "jest-diff": "^25.3.0", + "jest-get-type": "^25.2.6", + "pretty-format": "^25.3.0" }, + "engines": { + "node": ">= 8.3" + } + }, + "node_modules/jest-matcher-utils/node_modules/@jest/types": { + "version": "25.3.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-25.3.0.tgz", + "integrity": "sha512-UkaDNewdqXAmCDbN2GlUM6amDKS78eCqiw/UmF5nE0mmLTd6moJkiZJML/X52Ke3LH7Swhw883IRXq8o9nWjVw==", + "dev": true, "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": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - } + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^15.0.0", + "chalk": "^3.0.0" + }, + "engines": { + "node": ">= 8.3" } }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "node_modules/jest-matcher-utils/node_modules/@types/yargs": { + "version": "15.0.4", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.4.tgz", + "integrity": "sha512-9T1auFmbPZoxHz0enUFlUuKRy3it01R+hlggyVUMtnCTQRunsQYifnSGb8hET4Xo8yiC0o0r1paW3ud5+rbURg==", "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" + "dependencies": { + "@types/yargs-parser": "*" } }, - "follow-redirects": { - "version": "1.15.6", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", - "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==" + "node_modules/jest-matcher-utils/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" + } }, - "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=" + "node_modules/jest-matcher-utils/node_modules/ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "dependencies": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" + "node_modules/jest-matcher-utils/node_modules/chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } }, - "form-data": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", - "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" + "node_modules/jest-matcher-utils/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" } }, - "formidable": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.2.2.tgz", - "integrity": "sha512-V8gLm+41I/8kguQ4/o1D3RIHRmhYFG4pnNyonvua+40rqcEmT4+V71yaZ3B457xbbgCsCfjSPi65u/W6vK1U5Q==", + "node_modules/jest-matcher-utils/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 }, - "forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==" + "node_modules/jest-matcher-utils/node_modules/diff-sequences": { + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-25.2.6.tgz", + "integrity": "sha512-Hq8o7+6GaZeoFjtpgvRBUknSXNeJiCx7V9Fr94ZMljNiCr9n9L8H8aJqgWOQiDDGdyn29fRNcDdRVJ5fdyihfg==", + "dev": true, + "engines": { + "node": ">= 8.3" + } }, - "fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", - "requires": { - "map-cache": "^0.2.2" + "node_modules/jest-matcher-utils/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" } }, - "fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==" + "node_modules/jest-matcher-utils/node_modules/jest-diff": { + "version": "25.3.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-25.3.0.tgz", + "integrity": "sha512-vyvs6RPoVdiwARwY4kqFWd4PirPLm2dmmkNzKqo38uZOzJvLee87yzDjIZLmY1SjM3XR5DwsUH+cdQ12vgqi1w==", + "dev": true, + "dependencies": { + "chalk": "^3.0.0", + "diff-sequences": "^25.2.6", + "jest-get-type": "^25.2.6", + "pretty-format": "^25.3.0" + }, + "engines": { + "node": ">= 8.3" + } }, - "fs-constants": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" + "node_modules/jest-matcher-utils/node_modules/jest-get-type": { + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-25.2.6.tgz", + "integrity": "sha512-DxjtyzOHjObRM+sM1knti6or+eOgcGU4xVSb2HNP1TqO4ahsT+rqZg+nyqHWJSvWgKC5cG3QjGFBqxLghiF/Ig==", + "dev": true, + "engines": { + "node": ">= 8.3" + } }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + "node_modules/jest-matcher-utils/node_modules/pretty-format": { + "version": "25.3.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.3.0.tgz", + "integrity": "sha512-wToHwF8bkQknIcFkBqNfKu4+UZqnrLn/Vr+wwKQwwvPzkBfDDKp/qIabFqdgtoi5PEnM8LFByVsOrHoa3SpTVA==", + "dev": true, + "dependencies": { + "@jest/types": "^25.3.0", + "ansi-regex": "^5.0.0", + "ansi-styles": "^4.0.0", + "react-is": "^16.12.0" + }, + "engines": { + "node": ">= 8.3" + } }, - "fsevents": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.2.tgz", - "integrity": "sha512-R4wDiBwZ0KzpgOWetKDug1FZcYhqYnUYKtfZYt4mD5SBz76q0KR4Q9o7GIPamsVPGmW3EYPPJ0dOOjvx32ldZA==", + "node_modules/jest-matcher-utils/node_modules/supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", "dev": true, - "optional": true + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } }, - "function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==" + "node_modules/jest-message-util": { + "version": "25.3.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-25.3.0.tgz", + "integrity": "sha512-5QNy9Id4WxJbRITEbA1T1kem9bk7y2fD0updZMSTNHtbEDnYOGLDPAuFBhFgVmOZpv0n6OMdVkK+WhyXEPCcOw==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "@jest/types": "^25.3.0", + "@types/stack-utils": "^1.0.1", + "chalk": "^3.0.0", + "micromatch": "^4.0.2", + "slash": "^3.0.0", + "stack-utils": "^1.0.1" + }, + "engines": { + "node": ">= 8.3" + } }, - "gaxios": { - "version": "1.8.4", - "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-1.8.4.tgz", - "integrity": "sha512-BoENMnu1Gav18HcpV9IleMPZ9exM+AvUjrAOV4Mzs/vfz2Lu/ABv451iEXByKiMPn2M140uul1txXCg83sAENw==", - "requires": { - "abort-controller": "^3.0.0", - "extend": "^3.0.2", - "https-proxy-agent": "^2.2.1", - "node-fetch": "^2.3.0" + "node_modules/jest-message-util/node_modules/@jest/types": { + "version": "25.3.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-25.3.0.tgz", + "integrity": "sha512-UkaDNewdqXAmCDbN2GlUM6amDKS78eCqiw/UmF5nE0mmLTd6moJkiZJML/X52Ke3LH7Swhw883IRXq8o9nWjVw==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^15.0.0", + "chalk": "^3.0.0" + }, + "engines": { + "node": ">= 8.3" } }, - "gcp-metadata": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-1.0.0.tgz", - "integrity": "sha512-Q6HrgfrCQeEircnNP3rCcEgiDv7eF9+1B+1MMgpE190+/+0mjQR8PxeOaRgxZWmdDAF9EIryHB9g1moPiw1SbQ==", - "requires": { - "gaxios": "^1.0.2", - "json-bigint": "^0.3.0" + "node_modules/jest-message-util/node_modules/@types/yargs": { + "version": "15.0.4", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.4.tgz", + "integrity": "sha512-9T1auFmbPZoxHz0enUFlUuKRy3it01R+hlggyVUMtnCTQRunsQYifnSGb8hET4Xo8yiC0o0r1paW3ud5+rbURg==", + "dev": true, + "dependencies": { + "@types/yargs-parser": "*" } }, - "gcs-resumable-upload": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/gcs-resumable-upload/-/gcs-resumable-upload-1.1.0.tgz", - "integrity": "sha512-uBz7uHqp44xjSDzG3kLbOYZDjxxR/UAGbB47A0cC907W6yd2LkcyFDTHg+bjivkHMwiJlKv4guVWcjPCk2zScg==", - "requires": { - "abort-controller": "^2.0.2", - "configstore": "^4.0.0", - "gaxios": "^1.5.0", - "google-auth-library": "^3.0.0", - "pumpify": "^1.5.1", - "stream-events": "^1.0.4" - }, + "node_modules/jest-message-util/node_modules/ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, "dependencies": { - "abort-controller": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-2.0.3.tgz", - "integrity": "sha512-EPSq5wr2aFyAZ1PejJB32IX9Qd4Nwus+adnp7STYFM5/23nLPBazqZ1oor6ZqbH+4otaaGXTlC8RN5hq3C8w9Q==", - "requires": { - "event-target-shim": "^5.0.0" - } - } + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "gensync": { - "version": "1.0.0-beta.1", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.1.tgz", - "integrity": "sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg==", - "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.2.4", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", - "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", - "requires": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" + "node_modules/jest-message-util/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" } }, - "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "node_modules/jest-message-util/node_modules/chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", "dev": true, - "requires": { - "pump": "^3.0.0" + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-message-util/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": { - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - } + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" } }, - "get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=" + "node_modules/jest-message-util/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 }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "requires": { - "assert-plus": "^1.0.0" + "node_modules/jest-message-util/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" } }, - "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "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" + "node_modules/jest-message-util/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" } }, - "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true + "node_modules/jest-message-util/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" + } }, - "google-auth-library": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-3.1.2.tgz", - "integrity": "sha512-cDQMzTotwyWMrg5jRO7q0A4TL/3GWBgO7I7q5xGKNiiFf9SmGY/OJ1YsLMgI2MVHHsEGyrqYnbnmV1AE+Z6DnQ==", - "requires": { - "base64-js": "^1.3.0", - "fast-text-encoding": "^1.0.0", - "gaxios": "^1.2.1", - "gcp-metadata": "^1.0.0", - "gtoken": "^2.3.2", - "https-proxy-agent": "^2.2.1", - "jws": "^3.1.5", - "lru-cache": "^5.0.0", - "semver": "^5.5.0" + "node_modules/jest-message-util/node_modules/micromatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", + "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "dev": true, + "dependencies": { + "braces": "^3.0.1", + "picomatch": "^2.0.5" + }, + "engines": { + "node": ">=8" } }, - "google-p12-pem": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/google-p12-pem/-/google-p12-pem-1.0.4.tgz", - "integrity": "sha512-SwLAUJqUfTB2iS+wFfSS/G9p7bt4eWcc2LyfvmUXe7cWp6p3mpxDo6LLI29MXdU6wvPcQ/up298X7GMC5ylAlA==", - "requires": { - "node-forge": "^0.8.0", - "pify": "^4.0.0" + "node_modules/jest-message-util/node_modules/supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "requires": { - "get-intrinsic": "^1.1.3" + "node_modules/jest-message-util/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" } }, - "graceful-fs": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", - "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==" + "node_modules/jest-mock": { + "version": "25.3.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-25.3.0.tgz", + "integrity": "sha512-yRn6GbuqB4j3aYu+Z1ezwRiZfp0o9om5uOcBovVtkcRLeBCNP5mT0ysdenUsxAHnQUgGwPOE1wwhtQYe6NKirQ==", + "dev": true, + "dependencies": { + "@jest/types": "^25.3.0" + }, + "engines": { + "node": ">= 8.3" + } }, - "growly": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", - "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=", + "node_modules/jest-mock/node_modules/@jest/types": { + "version": "25.3.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-25.3.0.tgz", + "integrity": "sha512-UkaDNewdqXAmCDbN2GlUM6amDKS78eCqiw/UmF5nE0mmLTd6moJkiZJML/X52Ke3LH7Swhw883IRXq8o9nWjVw==", "dev": true, - "optional": true + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^15.0.0", + "chalk": "^3.0.0" + }, + "engines": { + "node": ">= 8.3" + } }, - "gtoken": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-2.3.3.tgz", - "integrity": "sha512-EaB49bu/TCoNeQjhCYKI/CurooBKkGxIqFHsWABW0b25fobBYVTMe84A8EBVVZhl8emiUdNypil9huMOTmyAnw==", - "requires": { - "gaxios": "^1.0.4", - "google-p12-pem": "^1.0.0", - "jws": "^3.1.5", - "mime": "^2.2.0", - "pify": "^4.0.0" + "node_modules/jest-mock/node_modules/@types/yargs": { + "version": "15.0.4", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.4.tgz", + "integrity": "sha512-9T1auFmbPZoxHz0enUFlUuKRy3it01R+hlggyVUMtnCTQRunsQYifnSGb8hET4Xo8yiC0o0r1paW3ud5+rbURg==", + "dev": true, + "dependencies": { + "@types/yargs-parser": "*" } }, - "gunzip-maybe": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/gunzip-maybe/-/gunzip-maybe-1.4.1.tgz", - "integrity": "sha512-qtutIKMthNJJgeHQS7kZ9FqDq59/Wn0G2HYCRNjpup7yKfVI6/eqwpmroyZGFoCYaG+sW6psNVb4zoLADHpp2g==", - "requires": { - "browserify-zlib": "^0.1.4", - "is-deflate": "^1.0.0", - "is-gzip": "^1.0.0", - "peek-stream": "^1.1.0", - "pumpify": "^1.3.3", - "through2": "^2.0.3" - }, + "node_modules/jest-mock/node_modules/ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, "dependencies": { - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - } + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" + "node_modules/jest-mock/node_modules/chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } }, - "har-validator": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", - "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", - "requires": { - "ajv": "^6.5.5", - "har-schema": "^2.0.0" + "node_modules/jest-mock/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" } }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "node_modules/jest-mock/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 }, - "has-property-descriptors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", - "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", - "requires": { - "es-define-property": "^1.0.0" + "node_modules/jest-mock/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" } }, - "has-proto": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", - "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==" + "node_modules/jest-mock/node_modules/supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } }, - "has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" + "node_modules/jest-pnp-resolver": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.1.tgz", + "integrity": "sha512-pgFw2tm54fzgYvc/OHrnysABEObZCUNFnhjoRjaVOCN8NYc032/gVjPaHD4Aq6ApkSieWtfKAFQtmDKAmhupnQ==", + "dev": true, + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "jest-resolve": "*" + }, + "peerDependenciesMeta": { + "jest-resolve": { + "optional": true + } + } }, - "has-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", - "requires": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" + "node_modules/jest-regex-util": { + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-25.2.6.tgz", + "integrity": "sha512-KQqf7a0NrtCkYmZZzodPftn7fL1cq3GQAFVMn5Hg8uKx/fIenLEobNanUxb7abQ1sjADHBseG/2FGpsv/wr+Qw==", + "dev": true, + "engines": { + "node": ">= 8.3" } }, - "has-values": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", - "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", - "requires": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" + "node_modules/jest-resolve": { + "version": "25.3.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-25.3.0.tgz", + "integrity": "sha512-IHoQAAybulsJ+ZgWis+ekYKDAoFkVH5Nx/znpb41zRtpxj4fr2WNV9iDqavdSm8GIpMlsfZxbC/fV9DhW0q9VQ==", + "dev": true, + "dependencies": { + "@jest/types": "^25.3.0", + "browser-resolve": "^1.11.3", + "chalk": "^3.0.0", + "jest-pnp-resolver": "^1.2.1", + "realpath-native": "^2.0.0", + "resolve": "^1.15.1" }, + "engines": { + "node": ">= 8.3" + } + }, + "node_modules/jest-resolve-dependencies": { + "version": "25.3.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-25.3.0.tgz", + "integrity": "sha512-bDUlLYmHW+f7J7KgcY2lkq8EMRqKonRl0XoD4Wp5SJkgAxKJnsaIOlrrVNTfXYf+YOu3VCjm/Ac2hPF2nfsCIA==", + "dev": true, "dependencies": { - "kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "requires": { - "is-buffer": "^1.1.5" - } - } + "@jest/types": "^25.3.0", + "jest-regex-util": "^25.2.6", + "jest-snapshot": "^25.3.0" + }, + "engines": { + "node": ">= 8.3" } }, - "hash-stream-validation": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/hash-stream-validation/-/hash-stream-validation-0.2.2.tgz", - "integrity": "sha512-cMlva5CxWZOrlS/cY0C+9qAzesn5srhFA8IT1VPiHc9bWWBLkJfEUIZr7MWoi89oOOGmpg8ymchaOjiArsGu5A==", - "requires": { - "through2": "^2.0.0" + "node_modules/jest-resolve-dependencies/node_modules/@jest/types": { + "version": "25.3.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-25.3.0.tgz", + "integrity": "sha512-UkaDNewdqXAmCDbN2GlUM6amDKS78eCqiw/UmF5nE0mmLTd6moJkiZJML/X52Ke3LH7Swhw883IRXq8o9nWjVw==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^15.0.0", + "chalk": "^3.0.0" }, + "engines": { + "node": ">= 8.3" + } + }, + "node_modules/jest-resolve-dependencies/node_modules/@types/yargs": { + "version": "15.0.4", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.4.tgz", + "integrity": "sha512-9T1auFmbPZoxHz0enUFlUuKRy3it01R+hlggyVUMtnCTQRunsQYifnSGb8hET4Xo8yiC0o0r1paW3ud5+rbURg==", + "dev": true, + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/jest-resolve-dependencies/node_modules/ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, "dependencies": { - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - } + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "requires": { - "function-bind": "^1.1.2" + "node_modules/jest-resolve-dependencies/node_modules/chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" } }, - "html-encoding-sniffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz", - "integrity": "sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==", + "node_modules/jest-resolve-dependencies/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, - "requires": { - "whatwg-encoding": "^1.0.1" + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" } }, - "html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "node_modules/jest-resolve-dependencies/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 }, - "http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "requires": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - } - }, - "http-proxy": { - "version": "1.18.1", - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", - "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", - "requires": { - "eventemitter3": "^4.0.0", - "follow-redirects": "^1.0.0", - "requires-port": "^1.0.0" + "node_modules/jest-resolve-dependencies/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" } }, - "http-proxy-middleware": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.18.0.tgz", - "integrity": "sha512-Fs25KVMPAIIcgjMZkVHJoKg9VcXcC1C8yb9JUgeDvVXY0S/zgVIhMb+qVswDIgtJe2DfckMSY2d6TuTEutlk6Q==", - "requires": { - "http-proxy": "^1.16.2", - "is-glob": "^4.0.0", - "lodash": "^4.17.5", - "micromatch": "^3.1.9" + "node_modules/jest-resolve-dependencies/node_modules/supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" + "node_modules/jest-resolve/node_modules/@jest/types": { + "version": "25.3.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-25.3.0.tgz", + "integrity": "sha512-UkaDNewdqXAmCDbN2GlUM6amDKS78eCqiw/UmF5nE0mmLTd6moJkiZJML/X52Ke3LH7Swhw883IRXq8o9nWjVw==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^15.0.0", + "chalk": "^3.0.0" + }, + "engines": { + "node": ">= 8.3" } }, - "https-proxy-agent": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz", - "integrity": "sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg==", - "requires": { - "agent-base": "^4.3.0", - "debug": "^3.1.0" + "node_modules/jest-resolve/node_modules/@types/yargs": { + "version": "15.0.4", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.4.tgz", + "integrity": "sha512-9T1auFmbPZoxHz0enUFlUuKRy3it01R+hlggyVUMtnCTQRunsQYifnSGb8hET4Xo8yiC0o0r1paW3ud5+rbURg==", + "dev": true, + "dependencies": { + "@types/yargs-parser": "*" } }, - "human-signals": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", - "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", - "dev": true - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "requires": { - "safer-buffer": ">= 2.1.2 < 3" + "node_modules/jest-resolve/node_modules/ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "dependencies": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "import-local": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.0.2.tgz", - "integrity": "sha512-vjL3+w0oulAVZ0hBHnxa/Nm5TAurf9YLQJDhqRZyqb+VKGOB6LU8t9H1Nr5CIo16vh9XfJTOoHwU0B71S557gA==", + "node_modules/jest-resolve/node_modules/chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", "dev": true, - "requires": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" } }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "requires": { - "once": "^1.3.0", - "wrappy": "1" + "node_modules/jest-resolve/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" } }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "interpret": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.2.0.tgz", - "integrity": "sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw==" - }, - "ip-regex": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", - "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=", + "node_modules/jest-resolve/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 }, - "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==" + "node_modules/jest-resolve/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" + } }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "requires": { - "kind-of": "^3.0.2" - }, + "node_modules/jest-resolve/node_modules/supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" - }, - "is-ci": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", - "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", + "node_modules/jest-runner": { + "version": "25.3.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-25.3.0.tgz", + "integrity": "sha512-csDqSC9qGHYWDrzrElzEgFbteztFeZJmKhSgY5jlCIcN0+PhActzRNku0DA1Xa1HxGOb0/AfbP1EGJlP4fGPtA==", "dev": true, - "requires": { - "ci-info": "^2.0.0" + "dependencies": { + "@jest/console": "^25.3.0", + "@jest/environment": "^25.3.0", + "@jest/test-result": "^25.3.0", + "@jest/types": "^25.3.0", + "chalk": "^3.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.3", + "jest-config": "^25.3.0", + "jest-docblock": "^25.3.0", + "jest-haste-map": "^25.3.0", + "jest-jasmine2": "^25.3.0", + "jest-leak-detector": "^25.3.0", + "jest-message-util": "^25.3.0", + "jest-resolve": "^25.3.0", + "jest-runtime": "^25.3.0", + "jest-util": "^25.3.0", + "jest-worker": "^25.2.6", + "source-map-support": "^0.5.6", + "throat": "^5.0.0" + }, + "engines": { + "node": ">= 8.3" } }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "requires": { - "kind-of": "^3.0.2" - }, + "node_modules/jest-runner/node_modules/@jest/types": { + "version": "25.3.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-25.3.0.tgz", + "integrity": "sha512-UkaDNewdqXAmCDbN2GlUM6amDKS78eCqiw/UmF5nE0mmLTd6moJkiZJML/X52Ke3LH7Swhw883IRXq8o9nWjVw==", + "dev": true, "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^15.0.0", + "chalk": "^3.0.0" + }, + "engines": { + "node": ">= 8.3" } }, - "is-deflate": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-deflate/-/is-deflate-1.0.0.tgz", - "integrity": "sha1-yGKQHDwWH7CdrHzcfnhPgOmPLxQ=" + "node_modules/jest-runner/node_modules/@types/yargs": { + "version": "15.0.4", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.4.tgz", + "integrity": "sha512-9T1auFmbPZoxHz0enUFlUuKRy3it01R+hlggyVUMtnCTQRunsQYifnSGb8hET4Xo8yiC0o0r1paW3ud5+rbURg==", + "dev": true, + "dependencies": { + "@types/yargs-parser": "*" + } }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, + "node_modules/jest-runner/node_modules/ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" - } + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" + "node_modules/jest-runner/node_modules/chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" + "node_modules/jest-runner/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" + } }, - "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==", + "node_modules/jest-runner/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 }, - "is-generator-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", - "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", - "dev": true + "node_modules/jest-runner/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" + } }, - "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==", - "requires": { - "is-extglob": "^2.1.1" + "node_modules/jest-runner/node_modules/supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-runtime": { + "version": "25.3.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-25.3.0.tgz", + "integrity": "sha512-gn5KYB1wxXRM3nfw8fVpthFu60vxQUCr+ShGq41+ZBFF3DRHZRKj3HDWVAVB4iTNBj2y04QeAo5cZ/boYaPg0w==", + "dev": true, + "dependencies": { + "@jest/console": "^25.3.0", + "@jest/environment": "^25.3.0", + "@jest/source-map": "^25.2.6", + "@jest/test-result": "^25.3.0", + "@jest/transform": "^25.3.0", + "@jest/types": "^25.3.0", + "@types/yargs": "^15.0.0", + "chalk": "^3.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.3", + "jest-config": "^25.3.0", + "jest-haste-map": "^25.3.0", + "jest-message-util": "^25.3.0", + "jest-mock": "^25.3.0", + "jest-regex-util": "^25.2.6", + "jest-resolve": "^25.3.0", + "jest-snapshot": "^25.3.0", + "jest-util": "^25.3.0", + "jest-validate": "^25.3.0", + "realpath-native": "^2.0.0", + "slash": "^3.0.0", + "strip-bom": "^4.0.0", + "yargs": "^15.3.1" + }, + "bin": { + "jest-runtime": "bin/jest-runtime.js" + }, + "engines": { + "node": ">= 8.3" } }, - "is-gzip": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-gzip/-/is-gzip-1.0.0.tgz", - "integrity": "sha1-bKiwe5nHeZgCWQDlVc7Y7YCHmoM=" - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "requires": { - "kind-of": "^3.0.2" - }, + "node_modules/jest-runtime/node_modules/@jest/types": { + "version": "25.3.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-25.3.0.tgz", + "integrity": "sha512-UkaDNewdqXAmCDbN2GlUM6amDKS78eCqiw/UmF5nE0mmLTd6moJkiZJML/X52Ke3LH7Swhw883IRXq8o9nWjVw==", + "dev": true, "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^15.0.0", + "chalk": "^3.0.0" + }, + "engines": { + "node": ">= 8.3" } }, - "is-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", - "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=" - }, - "is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "requires": { - "isobject": "^3.0.1" + "node_modules/jest-runtime/node_modules/@types/yargs": { + "version": "15.0.4", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.4.tgz", + "integrity": "sha512-9T1auFmbPZoxHz0enUFlUuKRy3it01R+hlggyVUMtnCTQRunsQYifnSGb8hET4Xo8yiC0o0r1paW3ud5+rbURg==", + "dev": true, + "dependencies": { + "@types/yargs-parser": "*" } }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" - }, - "is-stream-ended": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-stream-ended/-/is-stream-ended-0.1.4.tgz", - "integrity": "sha512-xj0XPvmr7bQFTvirqnFr50o0hQIh6ZItDqloxt5aJrR4NQsYeSsyFQERYGCAzfindAcnKjINnwEEgLx4IqVzQw==" - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" - }, - "is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==" + "node_modules/jest-runtime/node_modules/ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "dependencies": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } }, - "is-wsl": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.1.1.tgz", - "integrity": "sha512-umZHcSrwlDHo2TGMXv0DZ8dIUGunZ2Iv68YZnrmCiBPkZ4aaOhtv7pXJKeki9k3qJ3RJr0cDyitcl5wEH3AYog==", + "node_modules/jest-runtime/node_modules/chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", "dev": true, - "optional": true + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + "node_modules/jest-runtime/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" + } }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "node_modules/jest-runtime/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 }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" - }, - "isomorphic-ws": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/isomorphic-ws/-/isomorphic-ws-4.0.1.tgz", - "integrity": "sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==" + "node_modules/jest-runtime/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" + } }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" + "node_modules/jest-runtime/node_modules/supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } }, - "istanbul-lib-coverage": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", - "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==", - "dev": true + "node_modules/jest-serializer": { + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-25.2.6.tgz", + "integrity": "sha512-RMVCfZsezQS2Ww4kB5HJTMaMJ0asmC0BHlnobQC6yEtxiFKIxohFA4QSXSabKwSggaNkqxn6Z2VwdFCjhUWuiQ==", + "dev": true, + "engines": { + "node": ">= 8.3" + } }, - "istanbul-lib-instrument": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.1.tgz", - "integrity": "sha512-imIchxnodll7pvQBYOqUu88EufLCU56LMeFPZZM/fJZ1irYcYdqroaV+ACK1Ila8ls09iEYArp+nqyC6lW1Vfg==", + "node_modules/jest-snapshot": { + "version": "25.3.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-25.3.0.tgz", + "integrity": "sha512-GGpR6Oro2htJPKh5RX4PR1xwo5jCEjtvSPLW1IS7N85y+2bWKbiknHpJJRKSdGXghElb5hWaeQASJI4IiRayGg==", "dev": true, - "requires": { - "@babel/core": "^7.7.5", - "@babel/parser": "^7.7.5", - "@babel/template": "^7.7.4", - "@babel/traverse": "^7.7.4", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.0.0", + "dependencies": { + "@babel/types": "^7.0.0", + "@jest/types": "^25.3.0", + "@types/prettier": "^1.19.0", + "chalk": "^3.0.0", + "expect": "^25.3.0", + "jest-diff": "^25.3.0", + "jest-get-type": "^25.2.6", + "jest-matcher-utils": "^25.3.0", + "jest-message-util": "^25.3.0", + "jest-resolve": "^25.3.0", + "make-dir": "^3.0.0", + "natural-compare": "^1.4.0", + "pretty-format": "^25.3.0", "semver": "^6.3.0" }, - "dependencies": { - "semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true - } + "engines": { + "node": ">= 8.3" } }, - "istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "node_modules/jest-snapshot/node_modules/@jest/types": { + "version": "25.3.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-25.3.0.tgz", + "integrity": "sha512-UkaDNewdqXAmCDbN2GlUM6amDKS78eCqiw/UmF5nE0mmLTd6moJkiZJML/X52Ke3LH7Swhw883IRXq8o9nWjVw==", "dev": true, - "requires": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^3.0.0", - "supports-color": "^7.1.0" - }, "dependencies": { - "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 - }, - "make-dir": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.0.2.tgz", - "integrity": "sha512-rYKABKutXa6vXTXhoV18cBE7PaewPXHe/Bdq4v+ZLMhxbWApkFFplT0LcbMW+6BbjnQXzZ/sAvSE/JdguApG5w==", - "dev": true, - "requires": { - "semver": "^6.0.0" - } - }, - "semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^15.0.0", + "chalk": "^3.0.0" + }, + "engines": { + "node": ">= 8.3" } }, - "istanbul-lib-source-maps": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz", - "integrity": "sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg==", + "node_modules/jest-snapshot/node_modules/@types/yargs": { + "version": "15.0.4", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.4.tgz", + "integrity": "sha512-9T1auFmbPZoxHz0enUFlUuKRy3it01R+hlggyVUMtnCTQRunsQYifnSGb8hET4Xo8yiC0o0r1paW3ud5+rbURg==", "dev": true, - "requires": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" - }, "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - } + "@types/yargs-parser": "*" } }, - "istanbul-reports": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.2.tgz", - "integrity": "sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw==", + "node_modules/jest-snapshot/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, - "requires": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" + "engines": { + "node": ">=8" } }, - "jest": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/jest/-/jest-25.3.0.tgz", - "integrity": "sha512-iKd5ShQSHzFT5IL/6h5RZJhApgqXSoPxhp5HEi94v6OAw9QkF8T7X+liEU2eEHJ1eMFYTHmeWLrpBWulsDpaUg==", + "node_modules/jest-snapshot/node_modules/ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", "dev": true, - "requires": { - "@jest/core": "^25.3.0", - "import-local": "^3.0.2", - "jest-cli": "^25.3.0" - }, "dependencies": { - "@jest/types": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-25.3.0.tgz", - "integrity": "sha512-UkaDNewdqXAmCDbN2GlUM6amDKS78eCqiw/UmF5nE0mmLTd6moJkiZJML/X52Ke3LH7Swhw883IRXq8o9nWjVw==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^15.0.0", - "chalk": "^3.0.0" - } - }, - "@types/yargs": { - "version": "15.0.4", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.4.tgz", - "integrity": "sha512-9T1auFmbPZoxHz0enUFlUuKRy3it01R+hlggyVUMtnCTQRunsQYifnSGb8hET4Xo8yiC0o0r1paW3ud5+rbURg==", - "dev": true, - "requires": { - "@types/yargs-parser": "*" - } - }, - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "dev": true, - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "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 - }, - "jest-cli": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-25.3.0.tgz", - "integrity": "sha512-XpNQPlW1tzpP7RGG8dxpkRegYDuLjzSiENu92+CYM87nEbmEPb3b4+yo8xcsHOnj0AG7DUt9b3uG8LuHI3MDzw==", - "dev": true, - "requires": { - "@jest/core": "^25.3.0", - "@jest/test-result": "^25.3.0", - "@jest/types": "^25.3.0", - "chalk": "^3.0.0", - "exit": "^0.1.2", - "import-local": "^3.0.2", - "is-ci": "^2.0.0", - "jest-config": "^25.3.0", - "jest-util": "^25.3.0", - "jest-validate": "^25.3.0", - "prompts": "^2.0.1", - "realpath-native": "^2.0.0", - "yargs": "^15.3.1" - } - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "jest-changed-files": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-25.3.0.tgz", - "integrity": "sha512-eqd5hyLbUjIVvLlJ3vQ/MoPxsxfESVXG9gvU19XXjKzxr+dXmZIqCXiY0OiYaibwlHZBJl2Vebkc0ADEMzCXew==", + "node_modules/jest-snapshot/node_modules/chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", "dev": true, - "requires": { - "@jest/types": "^25.3.0", - "execa": "^3.2.0", - "throat": "^5.0.0" - }, "dependencies": { - "@jest/types": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-25.3.0.tgz", - "integrity": "sha512-UkaDNewdqXAmCDbN2GlUM6amDKS78eCqiw/UmF5nE0mmLTd6moJkiZJML/X52Ke3LH7Swhw883IRXq8o9nWjVw==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^15.0.0", - "chalk": "^3.0.0" - } - }, - "@types/yargs": { - "version": "15.0.4", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.4.tgz", - "integrity": "sha512-9T1auFmbPZoxHz0enUFlUuKRy3it01R+hlggyVUMtnCTQRunsQYifnSGb8hET4Xo8yiC0o0r1paW3ud5+rbURg==", - "dev": true, - "requires": { - "@types/yargs-parser": "*" - } - }, - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "dev": true, - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "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 - }, - "cross-spawn": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.2.tgz", - "integrity": "sha512-PD6G8QG3S4FK/XCGFbEQrDqO2AnMMsy0meR7lerlIOHAAbkuavGU/pOqprrlvfTNjvowivTeBsjebAL0NSoMxw==", - "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "execa": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-3.4.0.tgz", - "integrity": "sha512-r9vdGQk4bmCuK1yKQu1KTwcT2zwfWdbdaXfCtAh+5nU/4fSX+JAb7vZGvI5naJrQlvONrEB20jeruESI69530g==", - "dev": true, - "requires": { - "cross-spawn": "^7.0.0", - "get-stream": "^5.0.0", - "human-signals": "^1.1.1", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.0", - "onetime": "^5.1.0", - "p-finally": "^2.0.0", - "signal-exit": "^3.0.2", - "strip-final-newline": "^2.0.0" - } - }, - "get-stream": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.1.0.tgz", - "integrity": "sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, - "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 - }, - "is-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", - "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", - "dev": true - }, - "npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, - "requires": { - "path-key": "^3.0.0" - } - }, - "p-finally": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-2.0.1.tgz", - "integrity": "sha512-vpm09aKwq6H9phqRQzecoDpD8TmVyGw70qmWlyq5onxY7tqyTTFVvxMykxQSQKILBSFlbXpypIw2T1Ml7+DDtw==", - "dev": true - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true - }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" } }, - "jest-config": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-25.3.0.tgz", - "integrity": "sha512-CmF1JnNWFmoCSPC4tnU52wnVBpuxHjilA40qH/03IHxIevkjUInSMwaDeE6ACfxMPTLidBGBCO3EbxvzPbo8wA==", + "node_modules/jest-snapshot/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, - "requires": { - "@babel/core": "^7.1.0", - "@jest/test-sequencer": "^25.3.0", - "@jest/types": "^25.3.0", - "babel-jest": "^25.3.0", - "chalk": "^3.0.0", - "deepmerge": "^4.2.2", - "glob": "^7.1.1", - "jest-environment-jsdom": "^25.3.0", - "jest-environment-node": "^25.3.0", - "jest-get-type": "^25.2.6", - "jest-jasmine2": "^25.3.0", - "jest-regex-util": "^25.2.6", - "jest-resolve": "^25.3.0", - "jest-util": "^25.3.0", - "jest-validate": "^25.3.0", - "micromatch": "^4.0.2", - "pretty-format": "^25.3.0", - "realpath-native": "^2.0.0" - }, "dependencies": { - "@jest/types": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-25.3.0.tgz", - "integrity": "sha512-UkaDNewdqXAmCDbN2GlUM6amDKS78eCqiw/UmF5nE0mmLTd6moJkiZJML/X52Ke3LH7Swhw883IRXq8o9nWjVw==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^15.0.0", - "chalk": "^3.0.0" - } - }, - "@types/yargs": { - "version": "15.0.4", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.4.tgz", - "integrity": "sha512-9T1auFmbPZoxHz0enUFlUuKRy3it01R+hlggyVUMtnCTQRunsQYifnSGb8hET4Xo8yiC0o0r1paW3ud5+rbURg==", - "dev": true, - "requires": { - "@types/yargs-parser": "*" - } - }, - "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.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "dev": true, - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.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" - } - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "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 - }, - "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" - } - }, - "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 - }, - "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 - }, - "jest-get-type": { - "version": "25.2.6", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-25.2.6.tgz", - "integrity": "sha512-DxjtyzOHjObRM+sM1knti6or+eOgcGU4xVSb2HNP1TqO4ahsT+rqZg+nyqHWJSvWgKC5cG3QjGFBqxLghiF/Ig==", - "dev": true - }, - "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", - "dev": true, - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.0.5" - } - }, - "pretty-format": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.3.0.tgz", - "integrity": "sha512-wToHwF8bkQknIcFkBqNfKu4+UZqnrLn/Vr+wwKQwwvPzkBfDDKp/qIabFqdgtoi5PEnM8LFByVsOrHoa3SpTVA==", - "dev": true, - "requires": { - "@jest/types": "^25.3.0", - "ansi-regex": "^5.0.0", - "ansi-styles": "^4.0.0", - "react-is": "^16.12.0" - } - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - }, - "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" - } - } + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" } }, - "jest-diff": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-24.9.0.tgz", - "integrity": "sha512-qMfrTs8AdJE2iqrTp0hzh7kTd2PQWrsFyj9tORoKmu32xjPjeE4NyjVRDz8ybYwqS2ik8N4hsIpiVTyFeo2lBQ==", + "node_modules/jest-snapshot/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/jest-snapshot/node_modules/diff-sequences": { + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-25.2.6.tgz", + "integrity": "sha512-Hq8o7+6GaZeoFjtpgvRBUknSXNeJiCx7V9Fr94ZMljNiCr9n9L8H8aJqgWOQiDDGdyn29fRNcDdRVJ5fdyihfg==", "dev": true, - "requires": { - "chalk": "^2.0.1", - "diff-sequences": "^24.9.0", - "jest-get-type": "^24.9.0", - "pretty-format": "^24.9.0" + "engines": { + "node": ">= 8.3" } }, - "jest-docblock": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-25.3.0.tgz", - "integrity": "sha512-aktF0kCar8+zxRHxQZwxMy70stc9R1mOmrLsT5VO3pIT0uzGRSDAXxSlz4NqQWpuLjPpuMhPRl7H+5FRsvIQAg==", + "node_modules/jest-snapshot/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, - "requires": { - "detect-newline": "^3.0.0" + "engines": { + "node": ">=8" } }, - "jest-each": { + "node_modules/jest-snapshot/node_modules/jest-diff": { "version": "25.3.0", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-25.3.0.tgz", - "integrity": "sha512-aBfS4VOf/Qs95yUlX6d6WBv0szvOcTkTTyCIaLuQGj4bSHsT+Wd9dDngVHrCe5uytxpN8VM+NAloI6nbPjXfXw==", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-25.3.0.tgz", + "integrity": "sha512-vyvs6RPoVdiwARwY4kqFWd4PirPLm2dmmkNzKqo38uZOzJvLee87yzDjIZLmY1SjM3XR5DwsUH+cdQ12vgqi1w==", "dev": true, - "requires": { - "@jest/types": "^25.3.0", + "dependencies": { "chalk": "^3.0.0", + "diff-sequences": "^25.2.6", "jest-get-type": "^25.2.6", - "jest-util": "^25.3.0", "pretty-format": "^25.3.0" }, + "engines": { + "node": ">= 8.3" + } + }, + "node_modules/jest-snapshot/node_modules/jest-get-type": { + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-25.2.6.tgz", + "integrity": "sha512-DxjtyzOHjObRM+sM1knti6or+eOgcGU4xVSb2HNP1TqO4ahsT+rqZg+nyqHWJSvWgKC5cG3QjGFBqxLghiF/Ig==", + "dev": true, + "engines": { + "node": ">= 8.3" + } + }, + "node_modules/jest-snapshot/node_modules/make-dir": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.0.2.tgz", + "integrity": "sha512-rYKABKutXa6vXTXhoV18cBE7PaewPXHe/Bdq4v+ZLMhxbWApkFFplT0LcbMW+6BbjnQXzZ/sAvSE/JdguApG5w==", + "dev": true, "dependencies": { - "@jest/types": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-25.3.0.tgz", - "integrity": "sha512-UkaDNewdqXAmCDbN2GlUM6amDKS78eCqiw/UmF5nE0mmLTd6moJkiZJML/X52Ke3LH7Swhw883IRXq8o9nWjVw==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^15.0.0", - "chalk": "^3.0.0" - } - }, - "@types/yargs": { - "version": "15.0.4", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.4.tgz", - "integrity": "sha512-9T1auFmbPZoxHz0enUFlUuKRy3it01R+hlggyVUMtnCTQRunsQYifnSGb8hET4Xo8yiC0o0r1paW3ud5+rbURg==", - "dev": true, - "requires": { - "@types/yargs-parser": "*" - } - }, - "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.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "dev": true, - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "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 - }, - "jest-get-type": { - "version": "25.2.6", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-25.2.6.tgz", - "integrity": "sha512-DxjtyzOHjObRM+sM1knti6or+eOgcGU4xVSb2HNP1TqO4ahsT+rqZg+nyqHWJSvWgKC5cG3QjGFBqxLghiF/Ig==", - "dev": true - }, - "pretty-format": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.3.0.tgz", - "integrity": "sha512-wToHwF8bkQknIcFkBqNfKu4+UZqnrLn/Vr+wwKQwwvPzkBfDDKp/qIabFqdgtoi5PEnM8LFByVsOrHoa3SpTVA==", - "dev": true, - "requires": { - "@jest/types": "^25.3.0", - "ansi-regex": "^5.0.0", - "ansi-styles": "^4.0.0", - "react-is": "^16.12.0" - } - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "jest-environment-jsdom": { + "node_modules/jest-snapshot/node_modules/pretty-format": { "version": "25.3.0", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-25.3.0.tgz", - "integrity": "sha512-jdE4bQN+k2QEZ9sWOxsqDJvMzbdFSCN/4tw8X0TQaCqyzKz58PyEf41oIr4WO7ERdp7WaJGBSUKF7imR3UW1lg==", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.3.0.tgz", + "integrity": "sha512-wToHwF8bkQknIcFkBqNfKu4+UZqnrLn/Vr+wwKQwwvPzkBfDDKp/qIabFqdgtoi5PEnM8LFByVsOrHoa3SpTVA==", "dev": true, - "requires": { - "@jest/environment": "^25.3.0", - "@jest/fake-timers": "^25.3.0", + "dependencies": { "@jest/types": "^25.3.0", - "jest-mock": "^25.3.0", - "jest-util": "^25.3.0", - "jsdom": "^15.2.1" + "ansi-regex": "^5.0.0", + "ansi-styles": "^4.0.0", + "react-is": "^16.12.0" }, + "engines": { + "node": ">= 8.3" + } + }, + "node_modules/jest-snapshot/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/jest-snapshot/node_modules/supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, "dependencies": { - "@jest/types": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-25.3.0.tgz", - "integrity": "sha512-UkaDNewdqXAmCDbN2GlUM6amDKS78eCqiw/UmF5nE0mmLTd6moJkiZJML/X52Ke3LH7Swhw883IRXq8o9nWjVw==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^15.0.0", - "chalk": "^3.0.0" - } - }, - "@types/yargs": { - "version": "15.0.4", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.4.tgz", - "integrity": "sha512-9T1auFmbPZoxHz0enUFlUuKRy3it01R+hlggyVUMtnCTQRunsQYifnSGb8hET4Xo8yiC0o0r1paW3ud5+rbURg==", - "dev": true, - "requires": { - "@types/yargs-parser": "*" - } - }, - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "dev": true, - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "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 - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "jest-environment-node": { + "node_modules/jest-util": { "version": "25.3.0", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-25.3.0.tgz", - "integrity": "sha512-XO09S29Nx1NU7TiMPHMoDIkxoGBuKSTbE+sHp0gXbeLDXhIdhysUI25kOqFFSD9AuDgvPvxWCXrvNqiFsOH33g==", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-25.3.0.tgz", + "integrity": "sha512-dc625P/KS/CpWTJJJxKc4bA3A6c+PJGBAqS8JTJqx4HqPoKNqXg/Ec8biL2Z1TabwK7E7Ilf0/ukSEXM1VwzNA==", "dev": true, - "requires": { - "@jest/environment": "^25.3.0", - "@jest/fake-timers": "^25.3.0", + "dependencies": { "@jest/types": "^25.3.0", - "jest-mock": "^25.3.0", - "jest-util": "^25.3.0", - "semver": "^6.3.0" + "chalk": "^3.0.0", + "is-ci": "^2.0.0", + "make-dir": "^3.0.0" }, - "dependencies": { - "@jest/types": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-25.3.0.tgz", - "integrity": "sha512-UkaDNewdqXAmCDbN2GlUM6amDKS78eCqiw/UmF5nE0mmLTd6moJkiZJML/X52Ke3LH7Swhw883IRXq8o9nWjVw==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^15.0.0", - "chalk": "^3.0.0" - } - }, - "@types/yargs": { - "version": "15.0.4", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.4.tgz", - "integrity": "sha512-9T1auFmbPZoxHz0enUFlUuKRy3it01R+hlggyVUMtnCTQRunsQYifnSGb8hET4Xo8yiC0o0r1paW3ud5+rbURg==", - "dev": true, - "requires": { - "@types/yargs-parser": "*" - } - }, - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "dev": true, - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "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 - }, - "semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } + "engines": { + "node": ">= 8.3" } }, - "jest-get-type": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-24.9.0.tgz", - "integrity": "sha512-lUseMzAley4LhIcpSP9Jf+fTrQ4a1yHQwLNeeVa2cEmbCGeoZAtYPOIv8JaxLD/sUpKxetKGP+gsHl8f8TSj8Q==", - "dev": true - }, - "jest-haste-map": { + "node_modules/jest-util/node_modules/@jest/types": { "version": "25.3.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-25.3.0.tgz", - "integrity": "sha512-LjXaRa+F8wwtSxo9G+hHD/Cp63PPQzvaBL9XCVoJD2rrcJO0Zr2+YYzAFWWYJ5GlPUkoaJFJtOuk0sL6MJY80A==", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-25.3.0.tgz", + "integrity": "sha512-UkaDNewdqXAmCDbN2GlUM6amDKS78eCqiw/UmF5nE0mmLTd6moJkiZJML/X52Ke3LH7Swhw883IRXq8o9nWjVw==", "dev": true, - "requires": { - "@jest/types": "^25.3.0", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "fsevents": "^2.1.2", - "graceful-fs": "^4.2.3", - "jest-serializer": "^25.2.6", - "jest-util": "^25.3.0", - "jest-worker": "^25.2.6", - "micromatch": "^4.0.2", - "sane": "^4.0.3", - "walker": "^1.0.7", - "which": "^2.0.2" + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^15.0.0", + "chalk": "^3.0.0" }, + "engines": { + "node": ">= 8.3" + } + }, + "node_modules/jest-util/node_modules/@types/yargs": { + "version": "15.0.4", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.4.tgz", + "integrity": "sha512-9T1auFmbPZoxHz0enUFlUuKRy3it01R+hlggyVUMtnCTQRunsQYifnSGb8hET4Xo8yiC0o0r1paW3ud5+rbURg==", + "dev": true, "dependencies": { - "@jest/types": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-25.3.0.tgz", - "integrity": "sha512-UkaDNewdqXAmCDbN2GlUM6amDKS78eCqiw/UmF5nE0mmLTd6moJkiZJML/X52Ke3LH7Swhw883IRXq8o9nWjVw==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^15.0.0", - "chalk": "^3.0.0" - } - }, - "@types/yargs": { - "version": "15.0.4", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.4.tgz", - "integrity": "sha512-9T1auFmbPZoxHz0enUFlUuKRy3it01R+hlggyVUMtnCTQRunsQYifnSGb8hET4Xo8yiC0o0r1paW3ud5+rbURg==", - "dev": true, - "requires": { - "@types/yargs-parser": "*" - } - }, - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "dev": true, - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.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" - } - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "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 - }, - "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" - } - }, - "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 - }, - "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 - }, - "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", - "dev": true, - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.0.5" - } - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - }, - "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" - } - } + "@types/yargs-parser": "*" } }, - "jest-jasmine2": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-25.3.0.tgz", - "integrity": "sha512-NCYOGE6+HNzYFSui52SefgpsnIzvxjn6KAgqw66BdRp37xpMD/4kujDHLNW5bS5i53os5TcMn6jYrzQRO8VPrQ==", + "node_modules/jest-util/node_modules/ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", "dev": true, - "requires": { - "@babel/traverse": "^7.1.0", - "@jest/environment": "^25.3.0", - "@jest/source-map": "^25.2.6", - "@jest/test-result": "^25.3.0", - "@jest/types": "^25.3.0", - "chalk": "^3.0.0", - "co": "^4.6.0", - "expect": "^25.3.0", - "is-generator-fn": "^2.0.0", - "jest-each": "^25.3.0", - "jest-matcher-utils": "^25.3.0", - "jest-message-util": "^25.3.0", - "jest-runtime": "^25.3.0", - "jest-snapshot": "^25.3.0", - "jest-util": "^25.3.0", - "pretty-format": "^25.3.0", - "throat": "^5.0.0" + "dependencies": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-util/node_modules/chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, "dependencies": { - "@jest/types": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-25.3.0.tgz", - "integrity": "sha512-UkaDNewdqXAmCDbN2GlUM6amDKS78eCqiw/UmF5nE0mmLTd6moJkiZJML/X52Ke3LH7Swhw883IRXq8o9nWjVw==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^15.0.0", - "chalk": "^3.0.0" - } - }, - "@types/yargs": { - "version": "15.0.4", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.4.tgz", - "integrity": "sha512-9T1auFmbPZoxHz0enUFlUuKRy3it01R+hlggyVUMtnCTQRunsQYifnSGb8hET4Xo8yiC0o0r1paW3ud5+rbURg==", - "dev": true, - "requires": { - "@types/yargs-parser": "*" - } - }, - "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.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "dev": true, - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "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 - }, - "pretty-format": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.3.0.tgz", - "integrity": "sha512-wToHwF8bkQknIcFkBqNfKu4+UZqnrLn/Vr+wwKQwwvPzkBfDDKp/qIabFqdgtoi5PEnM8LFByVsOrHoa3SpTVA==", - "dev": true, - "requires": { - "@jest/types": "^25.3.0", - "ansi-regex": "^5.0.0", - "ansi-styles": "^4.0.0", - "react-is": "^16.12.0" - } - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" } }, - "jest-leak-detector": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-25.3.0.tgz", - "integrity": "sha512-jk7k24dMIfk8LUSQQGN8PyOy9+J0NAfHZWiDmUDYVMctY8FLJQ1eQ8+PjMoN8PgwhLIggUqgYJnyRFvUz3jLRw==", + "node_modules/jest-util/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, - "requires": { - "jest-get-type": "^25.2.6", - "pretty-format": "^25.3.0" + "dependencies": { + "color-name": "~1.1.4" }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-util/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/jest-util/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/jest-util/node_modules/make-dir": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.0.2.tgz", + "integrity": "sha512-rYKABKutXa6vXTXhoV18cBE7PaewPXHe/Bdq4v+ZLMhxbWApkFFplT0LcbMW+6BbjnQXzZ/sAvSE/JdguApG5w==", + "dev": true, "dependencies": { - "@jest/types": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-25.3.0.tgz", - "integrity": "sha512-UkaDNewdqXAmCDbN2GlUM6amDKS78eCqiw/UmF5nE0mmLTd6moJkiZJML/X52Ke3LH7Swhw883IRXq8o9nWjVw==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^15.0.0", - "chalk": "^3.0.0" - } - }, - "@types/yargs": { - "version": "15.0.4", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.4.tgz", - "integrity": "sha512-9T1auFmbPZoxHz0enUFlUuKRy3it01R+hlggyVUMtnCTQRunsQYifnSGb8hET4Xo8yiC0o0r1paW3ud5+rbURg==", - "dev": true, - "requires": { - "@types/yargs-parser": "*" - } - }, - "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.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "dev": true, - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "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 - }, - "jest-get-type": { - "version": "25.2.6", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-25.2.6.tgz", - "integrity": "sha512-DxjtyzOHjObRM+sM1knti6or+eOgcGU4xVSb2HNP1TqO4ahsT+rqZg+nyqHWJSvWgKC5cG3QjGFBqxLghiF/Ig==", - "dev": true - }, - "pretty-format": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.3.0.tgz", - "integrity": "sha512-wToHwF8bkQknIcFkBqNfKu4+UZqnrLn/Vr+wwKQwwvPzkBfDDKp/qIabFqdgtoi5PEnM8LFByVsOrHoa3SpTVA==", - "dev": true, - "requires": { - "@jest/types": "^25.3.0", - "ansi-regex": "^5.0.0", - "ansi-styles": "^4.0.0", - "react-is": "^16.12.0" - } - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-util/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/jest-util/node_modules/supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "jest-matcher-utils": { + "node_modules/jest-validate": { "version": "25.3.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-25.3.0.tgz", - "integrity": "sha512-ZBUJ2fchNIZt+fyzkuCFBb8SKaU//Rln45augfUtbHaGyVxCO++ANARdBK9oPGXU3hEDgyy7UHnOP/qNOJXFUg==", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-25.3.0.tgz", + "integrity": "sha512-3WuXgIZ4HXUvW6gk9twFFkT9j6zUorKnF2oEY8VEsHb7x5LGvVlN3WUsbqazVKuyXwvikO2zFJ/YTySMsMje2w==", "dev": true, - "requires": { + "dependencies": { + "@jest/types": "^25.3.0", + "camelcase": "^5.3.1", "chalk": "^3.0.0", - "jest-diff": "^25.3.0", "jest-get-type": "^25.2.6", + "leven": "^3.1.0", "pretty-format": "^25.3.0" }, - "dependencies": { - "@jest/types": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-25.3.0.tgz", - "integrity": "sha512-UkaDNewdqXAmCDbN2GlUM6amDKS78eCqiw/UmF5nE0mmLTd6moJkiZJML/X52Ke3LH7Swhw883IRXq8o9nWjVw==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^15.0.0", - "chalk": "^3.0.0" - } - }, - "@types/yargs": { - "version": "15.0.4", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.4.tgz", - "integrity": "sha512-9T1auFmbPZoxHz0enUFlUuKRy3it01R+hlggyVUMtnCTQRunsQYifnSGb8hET4Xo8yiC0o0r1paW3ud5+rbURg==", - "dev": true, - "requires": { - "@types/yargs-parser": "*" - } - }, - "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.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "dev": true, - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "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 - }, - "diff-sequences": { - "version": "25.2.6", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-25.2.6.tgz", - "integrity": "sha512-Hq8o7+6GaZeoFjtpgvRBUknSXNeJiCx7V9Fr94ZMljNiCr9n9L8H8aJqgWOQiDDGdyn29fRNcDdRVJ5fdyihfg==", - "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 - }, - "jest-diff": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-25.3.0.tgz", - "integrity": "sha512-vyvs6RPoVdiwARwY4kqFWd4PirPLm2dmmkNzKqo38uZOzJvLee87yzDjIZLmY1SjM3XR5DwsUH+cdQ12vgqi1w==", - "dev": true, - "requires": { - "chalk": "^3.0.0", - "diff-sequences": "^25.2.6", - "jest-get-type": "^25.2.6", - "pretty-format": "^25.3.0" - } - }, - "jest-get-type": { - "version": "25.2.6", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-25.2.6.tgz", - "integrity": "sha512-DxjtyzOHjObRM+sM1knti6or+eOgcGU4xVSb2HNP1TqO4ahsT+rqZg+nyqHWJSvWgKC5cG3QjGFBqxLghiF/Ig==", - "dev": true - }, - "pretty-format": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.3.0.tgz", - "integrity": "sha512-wToHwF8bkQknIcFkBqNfKu4+UZqnrLn/Vr+wwKQwwvPzkBfDDKp/qIabFqdgtoi5PEnM8LFByVsOrHoa3SpTVA==", - "dev": true, - "requires": { - "@jest/types": "^25.3.0", - "ansi-regex": "^5.0.0", - "ansi-styles": "^4.0.0", - "react-is": "^16.12.0" - } - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } + "engines": { + "node": ">= 8.3" } }, - "jest-message-util": { + "node_modules/jest-validate/node_modules/@jest/types": { "version": "25.3.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-25.3.0.tgz", - "integrity": "sha512-5QNy9Id4WxJbRITEbA1T1kem9bk7y2fD0updZMSTNHtbEDnYOGLDPAuFBhFgVmOZpv0n6OMdVkK+WhyXEPCcOw==", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-25.3.0.tgz", + "integrity": "sha512-UkaDNewdqXAmCDbN2GlUM6amDKS78eCqiw/UmF5nE0mmLTd6moJkiZJML/X52Ke3LH7Swhw883IRXq8o9nWjVw==", "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "@jest/types": "^25.3.0", - "@types/stack-utils": "^1.0.1", - "chalk": "^3.0.0", - "micromatch": "^4.0.2", - "slash": "^3.0.0", - "stack-utils": "^1.0.1" + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^15.0.0", + "chalk": "^3.0.0" }, + "engines": { + "node": ">= 8.3" + } + }, + "node_modules/jest-validate/node_modules/@types/yargs": { + "version": "15.0.4", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.4.tgz", + "integrity": "sha512-9T1auFmbPZoxHz0enUFlUuKRy3it01R+hlggyVUMtnCTQRunsQYifnSGb8hET4Xo8yiC0o0r1paW3ud5+rbURg==", + "dev": true, + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/jest-validate/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/jest-validate/node_modules/ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, "dependencies": { - "@jest/types": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-25.3.0.tgz", - "integrity": "sha512-UkaDNewdqXAmCDbN2GlUM6amDKS78eCqiw/UmF5nE0mmLTd6moJkiZJML/X52Ke3LH7Swhw883IRXq8o9nWjVw==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^15.0.0", - "chalk": "^3.0.0" - } - }, - "@types/yargs": { - "version": "15.0.4", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.4.tgz", - "integrity": "sha512-9T1auFmbPZoxHz0enUFlUuKRy3it01R+hlggyVUMtnCTQRunsQYifnSGb8hET4Xo8yiC0o0r1paW3ud5+rbURg==", - "dev": true, - "requires": { - "@types/yargs-parser": "*" - } - }, - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "dev": true, - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.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" - } - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "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 - }, - "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" - } - }, - "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 - }, - "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 - }, - "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", - "dev": true, - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.0.5" - } - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - }, - "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" - } - } + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "jest-mock": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-25.3.0.tgz", - "integrity": "sha512-yRn6GbuqB4j3aYu+Z1ezwRiZfp0o9om5uOcBovVtkcRLeBCNP5mT0ysdenUsxAHnQUgGwPOE1wwhtQYe6NKirQ==", + "node_modules/jest-validate/node_modules/chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", "dev": true, - "requires": { - "@jest/types": "^25.3.0" + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-validate/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": { - "@jest/types": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-25.3.0.tgz", - "integrity": "sha512-UkaDNewdqXAmCDbN2GlUM6amDKS78eCqiw/UmF5nE0mmLTd6moJkiZJML/X52Ke3LH7Swhw883IRXq8o9nWjVw==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^15.0.0", - "chalk": "^3.0.0" - } - }, - "@types/yargs": { - "version": "15.0.4", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.4.tgz", - "integrity": "sha512-9T1auFmbPZoxHz0enUFlUuKRy3it01R+hlggyVUMtnCTQRunsQYifnSGb8hET4Xo8yiC0o0r1paW3ud5+rbURg==", - "dev": true, - "requires": { - "@types/yargs-parser": "*" - } - }, - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "dev": true, - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "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 - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" } }, - "jest-pnp-resolver": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.1.tgz", - "integrity": "sha512-pgFw2tm54fzgYvc/OHrnysABEObZCUNFnhjoRjaVOCN8NYc032/gVjPaHD4Aq6ApkSieWtfKAFQtmDKAmhupnQ==", + "node_modules/jest-validate/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 }, - "jest-regex-util": { + "node_modules/jest-validate/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/jest-validate/node_modules/jest-get-type": { "version": "25.2.6", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-25.2.6.tgz", - "integrity": "sha512-KQqf7a0NrtCkYmZZzodPftn7fL1cq3GQAFVMn5Hg8uKx/fIenLEobNanUxb7abQ1sjADHBseG/2FGpsv/wr+Qw==", - "dev": true + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-25.2.6.tgz", + "integrity": "sha512-DxjtyzOHjObRM+sM1knti6or+eOgcGU4xVSb2HNP1TqO4ahsT+rqZg+nyqHWJSvWgKC5cG3QjGFBqxLghiF/Ig==", + "dev": true, + "engines": { + "node": ">= 8.3" + } }, - "jest-resolve": { + "node_modules/jest-validate/node_modules/pretty-format": { "version": "25.3.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-25.3.0.tgz", - "integrity": "sha512-IHoQAAybulsJ+ZgWis+ekYKDAoFkVH5Nx/znpb41zRtpxj4fr2WNV9iDqavdSm8GIpMlsfZxbC/fV9DhW0q9VQ==", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.3.0.tgz", + "integrity": "sha512-wToHwF8bkQknIcFkBqNfKu4+UZqnrLn/Vr+wwKQwwvPzkBfDDKp/qIabFqdgtoi5PEnM8LFByVsOrHoa3SpTVA==", "dev": true, - "requires": { + "dependencies": { "@jest/types": "^25.3.0", - "browser-resolve": "^1.11.3", - "chalk": "^3.0.0", - "jest-pnp-resolver": "^1.2.1", - "realpath-native": "^2.0.0", - "resolve": "^1.15.1" + "ansi-regex": "^5.0.0", + "ansi-styles": "^4.0.0", + "react-is": "^16.12.0" }, - "dependencies": { - "@jest/types": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-25.3.0.tgz", - "integrity": "sha512-UkaDNewdqXAmCDbN2GlUM6amDKS78eCqiw/UmF5nE0mmLTd6moJkiZJML/X52Ke3LH7Swhw883IRXq8o9nWjVw==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^15.0.0", - "chalk": "^3.0.0" - } - }, - "@types/yargs": { - "version": "15.0.4", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.4.tgz", - "integrity": "sha512-9T1auFmbPZoxHz0enUFlUuKRy3it01R+hlggyVUMtnCTQRunsQYifnSGb8hET4Xo8yiC0o0r1paW3ud5+rbURg==", - "dev": true, - "requires": { - "@types/yargs-parser": "*" - } - }, - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "dev": true, - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "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 - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } + "engines": { + "node": ">= 8.3" } }, - "jest-resolve-dependencies": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-25.3.0.tgz", - "integrity": "sha512-bDUlLYmHW+f7J7KgcY2lkq8EMRqKonRl0XoD4Wp5SJkgAxKJnsaIOlrrVNTfXYf+YOu3VCjm/Ac2hPF2nfsCIA==", + "node_modules/jest-validate/node_modules/supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", "dev": true, - "requires": { - "@jest/types": "^25.3.0", - "jest-regex-util": "^25.2.6", - "jest-snapshot": "^25.3.0" - }, "dependencies": { - "@jest/types": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-25.3.0.tgz", - "integrity": "sha512-UkaDNewdqXAmCDbN2GlUM6amDKS78eCqiw/UmF5nE0mmLTd6moJkiZJML/X52Ke3LH7Swhw883IRXq8o9nWjVw==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^15.0.0", - "chalk": "^3.0.0" - } - }, - "@types/yargs": { - "version": "15.0.4", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.4.tgz", - "integrity": "sha512-9T1auFmbPZoxHz0enUFlUuKRy3it01R+hlggyVUMtnCTQRunsQYifnSGb8hET4Xo8yiC0o0r1paW3ud5+rbURg==", - "dev": true, - "requires": { - "@types/yargs-parser": "*" - } - }, - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "dev": true, - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "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 - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "jest-runner": { + "node_modules/jest-watcher": { "version": "25.3.0", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-25.3.0.tgz", - "integrity": "sha512-csDqSC9qGHYWDrzrElzEgFbteztFeZJmKhSgY5jlCIcN0+PhActzRNku0DA1Xa1HxGOb0/AfbP1EGJlP4fGPtA==", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-25.3.0.tgz", + "integrity": "sha512-dtFkfidFCS9Ucv8azOg2hkiY3sgJEHeTLtGFHS+jfBEE7eRtrO6+2r1BokyDkaG2FOD7485r/SgpC1MFAENfeA==", "dev": true, - "requires": { - "@jest/console": "^25.3.0", - "@jest/environment": "^25.3.0", + "dependencies": { "@jest/test-result": "^25.3.0", "@jest/types": "^25.3.0", + "ansi-escapes": "^4.2.1", "chalk": "^3.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.3", - "jest-config": "^25.3.0", - "jest-docblock": "^25.3.0", - "jest-haste-map": "^25.3.0", - "jest-jasmine2": "^25.3.0", - "jest-leak-detector": "^25.3.0", - "jest-message-util": "^25.3.0", - "jest-resolve": "^25.3.0", - "jest-runtime": "^25.3.0", "jest-util": "^25.3.0", - "jest-worker": "^25.2.6", - "source-map-support": "^0.5.6", - "throat": "^5.0.0" + "string-length": "^3.1.0" }, - "dependencies": { - "@jest/types": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-25.3.0.tgz", - "integrity": "sha512-UkaDNewdqXAmCDbN2GlUM6amDKS78eCqiw/UmF5nE0mmLTd6moJkiZJML/X52Ke3LH7Swhw883IRXq8o9nWjVw==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^15.0.0", - "chalk": "^3.0.0" - } - }, - "@types/yargs": { - "version": "15.0.4", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.4.tgz", - "integrity": "sha512-9T1auFmbPZoxHz0enUFlUuKRy3it01R+hlggyVUMtnCTQRunsQYifnSGb8hET4Xo8yiC0o0r1paW3ud5+rbURg==", - "dev": true, - "requires": { - "@types/yargs-parser": "*" - } - }, - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "dev": true, - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "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 - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } + "engines": { + "node": ">= 8.3" } }, - "jest-runtime": { + "node_modules/jest-watcher/node_modules/@jest/types": { "version": "25.3.0", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-25.3.0.tgz", - "integrity": "sha512-gn5KYB1wxXRM3nfw8fVpthFu60vxQUCr+ShGq41+ZBFF3DRHZRKj3HDWVAVB4iTNBj2y04QeAo5cZ/boYaPg0w==", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-25.3.0.tgz", + "integrity": "sha512-UkaDNewdqXAmCDbN2GlUM6amDKS78eCqiw/UmF5nE0mmLTd6moJkiZJML/X52Ke3LH7Swhw883IRXq8o9nWjVw==", "dev": true, - "requires": { - "@jest/console": "^25.3.0", - "@jest/environment": "^25.3.0", - "@jest/source-map": "^25.2.6", - "@jest/test-result": "^25.3.0", - "@jest/transform": "^25.3.0", - "@jest/types": "^25.3.0", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", "@types/yargs": "^15.0.0", - "chalk": "^3.0.0", - "collect-v8-coverage": "^1.0.0", - "exit": "^0.1.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.3", - "jest-config": "^25.3.0", - "jest-haste-map": "^25.3.0", - "jest-message-util": "^25.3.0", - "jest-mock": "^25.3.0", - "jest-regex-util": "^25.2.6", - "jest-resolve": "^25.3.0", - "jest-snapshot": "^25.3.0", - "jest-util": "^25.3.0", - "jest-validate": "^25.3.0", - "realpath-native": "^2.0.0", - "slash": "^3.0.0", - "strip-bom": "^4.0.0", - "yargs": "^15.3.1" + "chalk": "^3.0.0" }, + "engines": { + "node": ">= 8.3" + } + }, + "node_modules/jest-watcher/node_modules/@types/yargs": { + "version": "15.0.4", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.4.tgz", + "integrity": "sha512-9T1auFmbPZoxHz0enUFlUuKRy3it01R+hlggyVUMtnCTQRunsQYifnSGb8hET4Xo8yiC0o0r1paW3ud5+rbURg==", + "dev": true, "dependencies": { - "@jest/types": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-25.3.0.tgz", - "integrity": "sha512-UkaDNewdqXAmCDbN2GlUM6amDKS78eCqiw/UmF5nE0mmLTd6moJkiZJML/X52Ke3LH7Swhw883IRXq8o9nWjVw==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^15.0.0", - "chalk": "^3.0.0" - } - }, - "@types/yargs": { - "version": "15.0.4", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.4.tgz", - "integrity": "sha512-9T1auFmbPZoxHz0enUFlUuKRy3it01R+hlggyVUMtnCTQRunsQYifnSGb8hET4Xo8yiC0o0r1paW3ud5+rbURg==", - "dev": true, - "requires": { - "@types/yargs-parser": "*" - } - }, - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "dev": true, - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "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 - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } + "@types/yargs-parser": "*" } }, - "jest-serializer": { - "version": "25.2.6", - "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-25.2.6.tgz", - "integrity": "sha512-RMVCfZsezQS2Ww4kB5HJTMaMJ0asmC0BHlnobQC6yEtxiFKIxohFA4QSXSabKwSggaNkqxn6Z2VwdFCjhUWuiQ==", + "node_modules/jest-watcher/node_modules/ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "dependencies": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-watcher/node_modules/chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-watcher/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/jest-watcher/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 }, - "jest-snapshot": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-25.3.0.tgz", - "integrity": "sha512-GGpR6Oro2htJPKh5RX4PR1xwo5jCEjtvSPLW1IS7N85y+2bWKbiknHpJJRKSdGXghElb5hWaeQASJI4IiRayGg==", + "node_modules/jest-watcher/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, - "requires": { - "@babel/types": "^7.0.0", - "@jest/types": "^25.3.0", - "@types/prettier": "^1.19.0", - "chalk": "^3.0.0", - "expect": "^25.3.0", - "jest-diff": "^25.3.0", - "jest-get-type": "^25.2.6", - "jest-matcher-utils": "^25.3.0", - "jest-message-util": "^25.3.0", - "jest-resolve": "^25.3.0", - "make-dir": "^3.0.0", - "natural-compare": "^1.4.0", - "pretty-format": "^25.3.0", - "semver": "^6.3.0" + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-watcher/node_modules/supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-worker": { + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-25.2.6.tgz", + "integrity": "sha512-FJn9XDUSxcOR4cwDzRfL1z56rUofNTFs539FGASpd50RHdb6EVkhxQqktodW2mI49l+W3H+tFJDotCHUQF6dmA==", + "dev": true, "dependencies": { - "@jest/types": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-25.3.0.tgz", - "integrity": "sha512-UkaDNewdqXAmCDbN2GlUM6amDKS78eCqiw/UmF5nE0mmLTd6moJkiZJML/X52Ke3LH7Swhw883IRXq8o9nWjVw==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^15.0.0", - "chalk": "^3.0.0" - } - }, - "@types/yargs": { - "version": "15.0.4", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.4.tgz", - "integrity": "sha512-9T1auFmbPZoxHz0enUFlUuKRy3it01R+hlggyVUMtnCTQRunsQYifnSGb8hET4Xo8yiC0o0r1paW3ud5+rbURg==", - "dev": true, - "requires": { - "@types/yargs-parser": "*" - } - }, - "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.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "dev": true, - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "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 - }, - "diff-sequences": { - "version": "25.2.6", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-25.2.6.tgz", - "integrity": "sha512-Hq8o7+6GaZeoFjtpgvRBUknSXNeJiCx7V9Fr94ZMljNiCr9n9L8H8aJqgWOQiDDGdyn29fRNcDdRVJ5fdyihfg==", - "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 - }, - "jest-diff": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-25.3.0.tgz", - "integrity": "sha512-vyvs6RPoVdiwARwY4kqFWd4PirPLm2dmmkNzKqo38uZOzJvLee87yzDjIZLmY1SjM3XR5DwsUH+cdQ12vgqi1w==", - "dev": true, - "requires": { - "chalk": "^3.0.0", - "diff-sequences": "^25.2.6", - "jest-get-type": "^25.2.6", - "pretty-format": "^25.3.0" - } - }, - "jest-get-type": { - "version": "25.2.6", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-25.2.6.tgz", - "integrity": "sha512-DxjtyzOHjObRM+sM1knti6or+eOgcGU4xVSb2HNP1TqO4ahsT+rqZg+nyqHWJSvWgKC5cG3QjGFBqxLghiF/Ig==", - "dev": true - }, - "make-dir": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.0.2.tgz", - "integrity": "sha512-rYKABKutXa6vXTXhoV18cBE7PaewPXHe/Bdq4v+ZLMhxbWApkFFplT0LcbMW+6BbjnQXzZ/sAvSE/JdguApG5w==", - "dev": true, - "requires": { - "semver": "^6.0.0" - } - }, - "pretty-format": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.3.0.tgz", - "integrity": "sha512-wToHwF8bkQknIcFkBqNfKu4+UZqnrLn/Vr+wwKQwwvPzkBfDDKp/qIabFqdgtoi5PEnM8LFByVsOrHoa3SpTVA==", - "dev": true, - "requires": { - "@jest/types": "^25.3.0", - "ansi-regex": "^5.0.0", - "ansi-styles": "^4.0.0", - "react-is": "^16.12.0" - } - }, - "semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } + "merge-stream": "^2.0.0", + "supports-color": "^7.0.0" + }, + "engines": { + "node": ">= 8.3" + } + }, + "node_modules/jest-worker/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/jest-worker/node_modules/supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest/node_modules/@jest/types": { + "version": "25.3.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-25.3.0.tgz", + "integrity": "sha512-UkaDNewdqXAmCDbN2GlUM6amDKS78eCqiw/UmF5nE0mmLTd6moJkiZJML/X52Ke3LH7Swhw883IRXq8o9nWjVw==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^15.0.0", + "chalk": "^3.0.0" + }, + "engines": { + "node": ">= 8.3" } }, - "jest-util": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-25.3.0.tgz", - "integrity": "sha512-dc625P/KS/CpWTJJJxKc4bA3A6c+PJGBAqS8JTJqx4HqPoKNqXg/Ec8biL2Z1TabwK7E7Ilf0/ukSEXM1VwzNA==", + "node_modules/jest/node_modules/@types/yargs": { + "version": "15.0.4", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.4.tgz", + "integrity": "sha512-9T1auFmbPZoxHz0enUFlUuKRy3it01R+hlggyVUMtnCTQRunsQYifnSGb8hET4Xo8yiC0o0r1paW3ud5+rbURg==", "dev": true, - "requires": { - "@jest/types": "^25.3.0", - "chalk": "^3.0.0", - "is-ci": "^2.0.0", - "make-dir": "^3.0.0" - }, "dependencies": { - "@jest/types": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-25.3.0.tgz", - "integrity": "sha512-UkaDNewdqXAmCDbN2GlUM6amDKS78eCqiw/UmF5nE0mmLTd6moJkiZJML/X52Ke3LH7Swhw883IRXq8o9nWjVw==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^15.0.0", - "chalk": "^3.0.0" - } - }, - "@types/yargs": { - "version": "15.0.4", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.4.tgz", - "integrity": "sha512-9T1auFmbPZoxHz0enUFlUuKRy3it01R+hlggyVUMtnCTQRunsQYifnSGb8hET4Xo8yiC0o0r1paW3ud5+rbURg==", - "dev": true, - "requires": { - "@types/yargs-parser": "*" - } - }, - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "dev": true, - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "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 - }, - "make-dir": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.0.2.tgz", - "integrity": "sha512-rYKABKutXa6vXTXhoV18cBE7PaewPXHe/Bdq4v+ZLMhxbWApkFFplT0LcbMW+6BbjnQXzZ/sAvSE/JdguApG5w==", - "dev": true, - "requires": { - "semver": "^6.0.0" - } - }, - "semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } + "@types/yargs-parser": "*" } }, - "jest-validate": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-25.3.0.tgz", - "integrity": "sha512-3WuXgIZ4HXUvW6gk9twFFkT9j6zUorKnF2oEY8VEsHb7x5LGvVlN3WUsbqazVKuyXwvikO2zFJ/YTySMsMje2w==", + "node_modules/jest/node_modules/ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", "dev": true, - "requires": { - "@jest/types": "^25.3.0", - "camelcase": "^5.3.1", - "chalk": "^3.0.0", - "jest-get-type": "^25.2.6", - "leven": "^3.1.0", - "pretty-format": "^25.3.0" + "dependencies": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest/node_modules/chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, "dependencies": { - "@jest/types": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-25.3.0.tgz", - "integrity": "sha512-UkaDNewdqXAmCDbN2GlUM6amDKS78eCqiw/UmF5nE0mmLTd6moJkiZJML/X52Ke3LH7Swhw883IRXq8o9nWjVw==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^15.0.0", - "chalk": "^3.0.0" - } - }, - "@types/yargs": { - "version": "15.0.4", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.4.tgz", - "integrity": "sha512-9T1auFmbPZoxHz0enUFlUuKRy3it01R+hlggyVUMtnCTQRunsQYifnSGb8hET4Xo8yiC0o0r1paW3ud5+rbURg==", - "dev": true, - "requires": { - "@types/yargs-parser": "*" - } - }, - "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.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "dev": true, - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "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 - }, - "jest-get-type": { - "version": "25.2.6", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-25.2.6.tgz", - "integrity": "sha512-DxjtyzOHjObRM+sM1knti6or+eOgcGU4xVSb2HNP1TqO4ahsT+rqZg+nyqHWJSvWgKC5cG3QjGFBqxLghiF/Ig==", - "dev": true - }, - "pretty-format": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.3.0.tgz", - "integrity": "sha512-wToHwF8bkQknIcFkBqNfKu4+UZqnrLn/Vr+wwKQwwvPzkBfDDKp/qIabFqdgtoi5PEnM8LFByVsOrHoa3SpTVA==", - "dev": true, - "requires": { - "@jest/types": "^25.3.0", - "ansi-regex": "^5.0.0", - "ansi-styles": "^4.0.0", - "react-is": "^16.12.0" - } - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest/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" } }, - "jest-watcher": { + "node_modules/jest/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/jest/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/jest/node_modules/jest-cli": { "version": "25.3.0", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-25.3.0.tgz", - "integrity": "sha512-dtFkfidFCS9Ucv8azOg2hkiY3sgJEHeTLtGFHS+jfBEE7eRtrO6+2r1BokyDkaG2FOD7485r/SgpC1MFAENfeA==", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-25.3.0.tgz", + "integrity": "sha512-XpNQPlW1tzpP7RGG8dxpkRegYDuLjzSiENu92+CYM87nEbmEPb3b4+yo8xcsHOnj0AG7DUt9b3uG8LuHI3MDzw==", "dev": true, - "requires": { + "dependencies": { + "@jest/core": "^25.3.0", "@jest/test-result": "^25.3.0", "@jest/types": "^25.3.0", - "ansi-escapes": "^4.2.1", "chalk": "^3.0.0", + "exit": "^0.1.2", + "import-local": "^3.0.2", + "is-ci": "^2.0.0", + "jest-config": "^25.3.0", "jest-util": "^25.3.0", - "string-length": "^3.1.0" + "jest-validate": "^25.3.0", + "prompts": "^2.0.1", + "realpath-native": "^2.0.0", + "yargs": "^15.3.1" }, - "dependencies": { - "@jest/types": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-25.3.0.tgz", - "integrity": "sha512-UkaDNewdqXAmCDbN2GlUM6amDKS78eCqiw/UmF5nE0mmLTd6moJkiZJML/X52Ke3LH7Swhw883IRXq8o9nWjVw==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^15.0.0", - "chalk": "^3.0.0" - } - }, - "@types/yargs": { - "version": "15.0.4", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.4.tgz", - "integrity": "sha512-9T1auFmbPZoxHz0enUFlUuKRy3it01R+hlggyVUMtnCTQRunsQYifnSGb8hET4Xo8yiC0o0r1paW3ud5+rbURg==", - "dev": true, - "requires": { - "@types/yargs-parser": "*" - } - }, - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "dev": true, - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "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 - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": ">= 8.3" } }, - "jest-worker": { - "version": "25.2.6", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-25.2.6.tgz", - "integrity": "sha512-FJn9XDUSxcOR4cwDzRfL1z56rUofNTFs539FGASpd50RHdb6EVkhxQqktodW2mI49l+W3H+tFJDotCHUQF6dmA==", + "node_modules/jest/node_modules/supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", "dev": true, - "requires": { - "merge-stream": "^2.0.0", - "supports-color": "^7.0.0" - }, "dependencies": { - "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 - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "js-tokens": { + "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 }, - "js-yaml": { + "node_modules/js-yaml": { "version": "3.13.1", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", - "requires": { + "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" } }, - "jsbn": { + "node_modules/jsbn": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" }, - "jsdom": { + "node_modules/jsdom": { "version": "15.2.1", "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-15.2.1.tgz", "integrity": "sha512-fAl1W0/7T2G5vURSyxBzrJ1LSdQn6Tr5UX/xD4PXDx/PDgwygedfW6El/KIj3xJ7FU61TTYnc/l/B7P49Eqt6g==", "dev": true, - "requires": { + "dependencies": { "abab": "^2.0.0", "acorn": "^7.1.0", "acorn-globals": "^4.3.2", @@ -8074,256 +10061,342 @@ "ws": "^7.0.0", "xml-name-validator": "^3.0.0" }, + "engines": { + "node": ">=8" + }, + "peerDependencies": { + "canvas": "^2.5.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "node_modules/jsdom/node_modules/tough-cookie": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-3.0.1.tgz", + "integrity": "sha512-yQyJ0u4pZsv9D4clxO69OEjLWYw+jbgspjTue4lTQZLfV0c5l1VmK2y1JK8E9ahdpltPOaAThPcp5nKPUgSnsg==", + "dev": true, "dependencies": { - "tough-cookie": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-3.0.1.tgz", - "integrity": "sha512-yQyJ0u4pZsv9D4clxO69OEjLWYw+jbgspjTue4lTQZLfV0c5l1VmK2y1JK8E9ahdpltPOaAThPcp5nKPUgSnsg==", - "dev": true, - "requires": { - "ip-regex": "^2.1.0", - "psl": "^1.1.28", - "punycode": "^2.1.1" - } + "ip-regex": "^2.1.0", + "psl": "^1.1.28", + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsdom/node_modules/ws": { + "version": "7.4.6", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", + "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", + "dev": true, + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true }, - "ws": { - "version": "7.4.6", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", - "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", - "dev": true + "utf-8-validate": { + "optional": true } } }, - "jsesc": { + "node_modules/jsesc": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } }, - "json-bigint": { + "node_modules/json-bigint": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-0.3.0.tgz", "integrity": "sha1-DM2RLEuCcNBfBW+9E4FLU9OCWx4=", - "requires": { + "dependencies": { "bignumber.js": "^7.0.0" } }, - "json-schema": { + "node_modules/json-schema": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" }, - "json-schema-traverse": { + "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==" }, - "json-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-stream/-/json-stream-1.0.0.tgz", - "integrity": "sha1-GjhU4o0rvuqzHMfd9oPS3cVlJwg=" - }, - "json-stringify-safe": { + "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=" }, - "json5": { + "node_modules/json5": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } }, - "jsonpath": { + "node_modules/jsonpath": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/jsonpath/-/jsonpath-1.0.2.tgz", "integrity": "sha512-rmzlgFZiQPc6q4HDyK8s9Qb4oxBnI5sF61y/Co5PV0lc3q2bIuRsNdueVbhoSHdKM4fxeimphOAtfz47yjCfeA==", - "requires": { + "hasInstallScript": true, + "dependencies": { "esprima": "1.2.2", "static-eval": "2.0.2", "underscore": "1.7.0" + } + }, + "node_modules/jsonpath/node_modules/esprima": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.2.2.tgz", + "integrity": "sha1-dqD9Zvz+FU/SkmZ9wmQBl1CxZXs=", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" }, - "dependencies": { - "esprima": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.2.2.tgz", - "integrity": "sha1-dqD9Zvz+FU/SkmZ9wmQBl1CxZXs=" - }, - "underscore": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.7.0.tgz", - "integrity": "sha1-a7rwh3UA02vjTsqlhODbn+8DUgk=" - } + "engines": { + "node": ">=0.4.0" } }, - "jsprim": { + "node_modules/jsonpath/node_modules/underscore": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.7.0.tgz", + "integrity": "sha1-a7rwh3UA02vjTsqlhODbn+8DUgk=" + }, + "node_modules/jsprim": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", - "requires": { + "engines": [ + "node >=0.6.0" + ], + "dependencies": { "assert-plus": "1.0.0", "extsprintf": "1.3.0", "json-schema": "0.2.3", "verror": "1.10.0" } }, - "jwa": { + "node_modules/jwa": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", - "requires": { + "dependencies": { "buffer-equal-constant-time": "1.0.1", "ecdsa-sig-formatter": "1.0.11", "safe-buffer": "^5.0.1" } }, - "jws": { + "node_modules/jws": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", - "requires": { + "dependencies": { "jwa": "^1.4.1", "safe-buffer": "^5.0.1" } }, - "kind-of": { + "node_modules/kind-of": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "engines": { + "node": ">=0.10.0" + } }, - "kleur": { + "node_modules/kleur": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", - "dev": true + "dev": true, + "engines": { + "node": ">=6" + } }, - "leven": { + "node_modules/leven": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", - "dev": true + "dev": true, + "engines": { + "node": ">=6" + } }, - "levn": { + "node_modules/levn": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", - "requires": { + "dependencies": { "prelude-ls": "~1.1.2", "type-check": "~0.3.2" + }, + "engines": { + "node": ">= 0.8.0" } }, - "locate-path": { + "node_modules/locate-path": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, - "requires": { + "dependencies": { "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" } }, - "lodash": { + "node_modules/lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, - "lodash.memoize": { + "node_modules/lodash.memoize": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=", "dev": true }, - "lodash.sortby": { + "node_modules/lodash.sortby": { "version": "4.7.0", "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=", "dev": true }, - "lolex": { + "node_modules/lolex": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/lolex/-/lolex-5.1.2.tgz", "integrity": "sha512-h4hmjAvHTmd+25JSwrtTIuwbKdwg5NzZVRMLn9saij4SZaepCrTCxPr35H/3bjwfMJtN+t3CX8672UIkglz28A==", "dev": true, - "requires": { + "dependencies": { "@sinonjs/commons": "^1.7.0" } }, - "lru-cache": { + "node_modules/lru-cache": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "requires": { + "dependencies": { "yallist": "^3.0.2" } }, - "make-dir": { + "node_modules/make-dir": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", - "requires": { + "dependencies": { "pify": "^3.0.0" }, - "dependencies": { - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" - } + "engines": { + "node": ">=4" + } + }, + "node_modules/make-dir/node_modules/pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "engines": { + "node": ">=4" } }, - "make-error": { + "node_modules/make-error": { "version": "1.3.6", "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", "dev": true }, - "makeerror": { + "node_modules/makeerror": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz", "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=", "dev": true, - "requires": { + "dependencies": { "tmpl": "1.0.x" } }, - "map-cache": { + "node_modules/map-cache": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=" + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "engines": { + "node": ">=0.10.0" + } }, - "map-visit": { + "node_modules/map-visit": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", - "requires": { + "dependencies": { "object-visit": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" } }, - "media-typer": { + "node_modules/media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==" + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "engines": { + "node": ">= 0.6" + } }, - "merge-descriptors": { + "node_modules/merge-descriptors": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", - "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==" + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "merge-stream": { + "node_modules/merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", "dev": true }, - "methods": { + "node_modules/methods": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", + "engines": { + "node": ">= 0.6" + } }, - "micromatch": { + "node_modules/micromatch": { "version": "3.1.10", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "requires": { + "dependencies": { "arr-diff": "^4.0.0", "array-unique": "^0.3.2", "braces": "^2.3.1", @@ -8337,106 +10410,193 @@ "regex-not": "^1.0.0", "snapdragon": "^0.8.1", "to-regex": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" } }, - "mime": { + "node_modules/mime": { "version": "2.4.4", "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.4.tgz", - "integrity": "sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA==" + "integrity": "sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } }, - "mime-db": { + "node_modules/mime-db": { "version": "1.43.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.43.0.tgz", - "integrity": "sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ==" + "integrity": "sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ==", + "engines": { + "node": ">= 0.6" + } }, - "mime-types": { - "version": "2.1.26", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.26.tgz", - "integrity": "sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ==", - "requires": { - "mime-db": "1.43.0" + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" } }, - "mimic-fn": { + "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==" + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "engines": { + "node": ">=6" + } }, - "minimatch": { + "node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "requires": { + "dependencies": { "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" } }, - "minimist": { + "node_modules/minimist": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", - "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==" - }, - "minio": { - "version": "7.0.14", - "resolved": "https://registry.npmjs.org/minio/-/minio-7.0.14.tgz", - "integrity": "sha512-rXY8EdUNbmImwhiIdid0HePuaxBL6WtMG+tZZKuBaiY0vx7c/DmljldH8xZUSjh9jl4hIDh35Ifu4W35yGOL/g==", - "requires": { - "async": "^3.1.0", - "block-stream2": "^2.0.0", - "es6-error": "^4.1.1", - "json-stream": "^1.0.0", - "lodash": "^4.14.2", - "mime-types": "^2.1.14", - "mkdirp": "^0.5.1", - "querystring": "0.2.0", - "through2": "^3.0.1", - "xml": "^1.0.0", - "xml2js": "^0.4.15" + "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minio": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/minio/-/minio-8.0.3.tgz", + "integrity": "sha512-+FIYQ+HZ5GrBjEmIYienRgEikqaTWAflXIV5lJOtUzfYxn3NvjQx7BsJSORXExlqgzWxKTWsqkyk2wiyFjs9/w==", + "license": "Apache-2.0", + "dependencies": { + "async": "^3.2.4", + "block-stream2": "^2.1.0", + "browser-or-node": "^2.1.1", + "buffer-crc32": "^1.0.0", + "eventemitter3": "^5.0.1", + "fast-xml-parser": "^4.4.1", + "ipaddr.js": "^2.0.1", + "lodash": "^4.17.21", + "mime-types": "^2.1.35", + "query-string": "^7.1.3", + "stream-json": "^1.8.0", + "through2": "^4.0.2", + "web-encoding": "^1.1.5", + "xml2js": "^0.5.0 || ^0.6.2" + }, + "engines": { + "node": "^16 || ^18 || >=20" + } + }, + "node_modules/minio/node_modules/async": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", + "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", + "license": "MIT" + }, + "node_modules/minio/node_modules/eventemitter3": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", + "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", + "license": "MIT" + }, + "node_modules/minio/node_modules/ipaddr.js": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.2.0.tgz", + "integrity": "sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==", + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/minio/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/minio/node_modules/through2": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", + "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", + "license": "MIT", "dependencies": { - "async": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.0.tgz", - "integrity": "sha512-TR2mEZFVOj2pLStYxLht7TyfuRzaydfpxr3k9RpHIzMgw7A64dzsdqCxH1WJyQdoe8T10nDXd9wnEigmiuHIZw==" - } + "readable-stream": "3" } }, - "mixin-deep": { + "node_modules/mixin-deep": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", - "requires": { + "dependencies": { "for-in": "^1.0.2", "is-extendable": "^1.0.1" }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mixin-deep/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "requires": { - "is-plain-object": "^2.0.4" - } - } + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" } }, - "mkdirp": { + "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==", - "requires": { + "dev": true, + "dependencies": { "minimist": "^1.2.5" + }, + "bin": { + "mkdirp": "bin/cmd.js" } }, - "ms": { + "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==" }, - "nanomatch": { + "node_modules/nanomatch": { "version": "1.2.13", "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", - "requires": { + "dependencies": { "arr-diff": "^4.0.0", "array-unique": "^0.3.2", "define-property": "^2.0.2", @@ -8448,504 +10608,666 @@ "regex-not": "^1.0.0", "snapdragon": "^0.8.1", "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" } }, - "natural-compare": { + "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 }, - "negotiator": { + "node_modules/negotiator": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==" + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "engines": { + "node": ">= 0.6" + } }, - "nice-try": { + "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-fetch": { + "node_modules/node-fetch": { "version": "2.6.7", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", - "requires": { + "dependencies": { "whatwg-url": "^5.0.0" }, - "dependencies": { - "tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" - }, - "webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" - }, - "whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "requires": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true } } }, - "node-forge": { + "node_modules/node-fetch/node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, + "node_modules/node-fetch/node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, + "node_modules/node-fetch/node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/node-forge": { "version": "0.8.5", "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.8.5.tgz", - "integrity": "sha512-vFMQIWt+J/7FLNyKouZ9TazT74PRV3wgv9UT4cRjC8BffxFbKXkgIWR42URCPSnHm/QDz6BOlb2Q0U4+VQT67Q==" + "integrity": "sha512-vFMQIWt+J/7FLNyKouZ9TazT74PRV3wgv9UT4cRjC8BffxFbKXkgIWR42URCPSnHm/QDz6BOlb2Q0U4+VQT67Q==", + "engines": { + "node": ">= 4.5.0" + } }, - "node-int64": { + "node_modules/node-int64": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=", "dev": true }, - "node-modules-regexp": { + "node_modules/node-modules-regexp": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz", "integrity": "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "node-notifier": { + "node_modules/node-notifier": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-6.0.0.tgz", "integrity": "sha512-SVfQ/wMw+DesunOm5cKqr6yDcvUTDl/yc97ybGHMrteNEY6oekXpNpS3lZwgLlwz0FLgHoiW28ZpmBHUDg37cw==", "dev": true, "optional": true, - "requires": { + "dependencies": { "growly": "^1.3.0", "is-wsl": "^2.1.1", "semver": "^6.3.0", "shellwords": "^0.1.1", "which": "^1.3.1" - }, + } + }, + "node_modules/node-notifier/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "optional": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/node-notifier/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "optional": true, "dependencies": { - "semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "optional": true - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "optional": true, - "requires": { - "isexe": "^2.0.0" - } - } + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" } }, - "normalize-path": { + "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 + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "npm-run-path": { + "node_modules/npm-run-path": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", "dev": true, - "requires": { + "dependencies": { "path-key": "^2.0.0" + }, + "engines": { + "node": ">=4" } }, - "nwsapi": { + "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 }, - "oauth-sign": { + "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==" + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "engines": { + "node": "*" + } }, - "object-copy": { + "node_modules/object-copy": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", - "requires": { + "dependencies": { "copy-descriptor": "^0.1.0", "define-property": "^0.2.5", "kind-of": "^3.0.3" }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" } }, - "object-inspect": { + "node_modules/object-inspect": { "version": "1.13.2", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", - "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==" + "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "object-visit": { + "node_modules/object-visit": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", - "requires": { + "dependencies": { "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "object.pick": { + "node_modules/object.pick": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", - "requires": { + "dependencies": { "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" } }, - "on-finished": { + "node_modules/on-finished": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "requires": { + "dependencies": { "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" } }, - "once": { + "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "requires": { + "dependencies": { "wrappy": "1" } }, - "onetime": { + "node_modules/onetime": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz", "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==", - "requires": { + "dependencies": { "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" } }, - "optionator": { + "node_modules/optionator": { "version": "0.8.3", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", - "requires": { + "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" } }, - "p-each-series": { + "node_modules/p-each-series": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-2.1.0.tgz", "integrity": "sha512-ZuRs1miPT4HrjFa+9fRfOFXxGJfORgelKV9f9nNOWw2gl6gVsRaVDOQP0+MI0G0wGKns1Yacsu0GjOFbTK0JFQ==", - "dev": true + "dev": true, + "engines": { + "node": ">=8" + } }, - "p-finally": { + "node_modules/p-finally": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", - "dev": true + "dev": true, + "engines": { + "node": ">=4" + } }, - "p-limit": { + "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, - "requires": { + "dependencies": { "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "p-locate": { + "node_modules/p-locate": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, - "requires": { + "dependencies": { "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" } }, - "p-try": { + "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 + "dev": true, + "engines": { + "node": ">=6" + } }, - "pako": { + "node_modules/pako": { "version": "0.2.9", "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", "integrity": "sha1-8/dSL073gjSNqBYbrZ7P1Rv4OnU=" }, - "parse5": { + "node_modules/parse5": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.0.tgz", "integrity": "sha512-fxNG2sQjHvlVAYmzBZS9YlDp6PTSSDwa98vkD4QgVDDCAo84z5X1t5XyJQ62ImdLXx5NdIIfihey6xpum9/gRQ==", "dev": true }, - "parseurl": { + "node_modules/parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "engines": { + "node": ">= 0.8" + } }, - "pascalcase": { + "node_modules/pascalcase": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=" + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "engines": { + "node": ">=0.10.0" + } }, - "path-exists": { + "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true + "dev": true, + "engines": { + "node": ">=8" + } }, - "path-is-absolute": { + "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=" + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "engines": { + "node": ">=0.10.0" + } }, - "path-key": { + "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 + "dev": true, + "engines": { + "node": ">=4" + } }, - "path-parse": { + "node_modules/path-parse": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" }, - "path-to-regexp": { - "version": "0.1.10", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.10.tgz", - "integrity": "sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w==" + "node_modules/path-to-regexp": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", + "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", + "license": "MIT" }, - "peek-stream": { + "node_modules/peek-stream": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/peek-stream/-/peek-stream-1.1.3.tgz", "integrity": "sha512-FhJ+YbOSBb9/rIl2ZeE/QHEsWn7PqNYt8ARAY3kIgNGOk13g9FGyIY6JIl/xB/3TFRVoTv5as0l11weORrTekA==", - "requires": { + "dependencies": { "buffer-from": "^1.0.0", "duplexify": "^3.5.0", "through2": "^2.0.3" - }, + } + }, + "node_modules/peek-stream/node_modules/through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", "dependencies": { - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - } + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" } }, - "performance-now": { + "node_modules/performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" }, - "picomatch": { + "node_modules/picomatch": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", - "dev": true + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } }, - "pify": { + "node_modules/pify": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==" + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "engines": { + "node": ">=6" + } }, - "pirates": { + "node_modules/pirates": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.1.tgz", "integrity": "sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA==", "dev": true, - "requires": { + "dependencies": { "node-modules-regexp": "^1.0.0" + }, + "engines": { + "node": ">= 6" } }, - "pkg-dir": { + "node_modules/pkg-dir": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", "dev": true, - "requires": { + "dependencies": { "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "pn": { + "node_modules/pn": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/pn/-/pn-1.1.0.tgz", "integrity": "sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==", "dev": true }, - "portable-fetch": { + "node_modules/portable-fetch": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/portable-fetch/-/portable-fetch-3.0.0.tgz", "integrity": "sha1-PL9KptvFpXNLQcBBnJJzMTv9mtg=", - "requires": { + "dependencies": { "node-fetch": "^1.0.1", "whatwg-fetch": ">=0.10.0" - }, + } + }, + "node_modules/portable-fetch/node_modules/node-fetch": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz", + "integrity": "sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==", "dependencies": { - "node-fetch": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz", - "integrity": "sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==", - "requires": { - "encoding": "^0.1.11", - "is-stream": "^1.0.1" - } - } + "encoding": "^0.1.11", + "is-stream": "^1.0.1" } }, - "posix-character-classes": { + "node_modules/posix-character-classes": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", - "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=" + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/possible-typed-array-names": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", + "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } }, - "prelude-ls": { + "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=" + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "engines": { + "node": ">= 0.8.0" + } }, - "prettier": { + "node_modules/prettier": { "version": "1.19.1", "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.19.1.tgz", "integrity": "sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew==", - "dev": true + "dev": true, + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=4" + } }, - "pretty-format": { + "node_modules/pretty-format": { "version": "24.9.0", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-24.9.0.tgz", "integrity": "sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA==", "dev": true, - "requires": { + "dependencies": { "@jest/types": "^24.9.0", "ansi-regex": "^4.0.0", "ansi-styles": "^3.2.0", "react-is": "^16.8.4" + }, + "engines": { + "node": ">= 6" } }, - "process-nextick-args": { + "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==" }, - "prompts": { + "node_modules/prompts": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.3.2.tgz", "integrity": "sha512-Q06uKs2CkNYVID0VqwfAl9mipo99zkBv/n2JtWY89Yxa3ZabWSrs0e2KTudKVa3peLUvYXMefDqIleLPVUBZMA==", "dev": true, - "requires": { + "dependencies": { "kleur": "^3.0.3", "sisteransi": "^1.0.4" + }, + "engines": { + "node": ">= 6" } }, - "proxy-addr": { + "node_modules/proxy-addr": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", - "requires": { + "dependencies": { "forwarded": "0.2.0", "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" } }, - "proxy-from-env": { + "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==" }, - "psl": { + "node_modules/psl": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/psl/-/psl-1.7.0.tgz", "integrity": "sha512-5NsSEDv8zY70ScRnOTn7bK7eanl2MvFrOrS/R6x+dBt5g1ghnj9Zv90kO8GwT8gxcu2ANyFprnFYB85IogIJOQ==" }, - "pump": { + "node_modules/pump": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", - "requires": { + "dependencies": { "end-of-stream": "^1.1.0", "once": "^1.3.1" } }, - "pumpify": { + "node_modules/pumpify": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", - "requires": { + "dependencies": { "duplexify": "^3.6.0", "inherits": "^2.0.3", "pump": "^2.0.0" } }, - "punycode": { + "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==" + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "engines": { + "node": ">=6" + } }, - "qs": { + "node_modules/qs": { "version": "6.5.3", "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", - "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==" + "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", + "engines": { + "node": ">=0.6" + } }, - "querystring": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=" + "node_modules/query-string": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-7.1.3.tgz", + "integrity": "sha512-hh2WYhq4fi8+b+/2Kg9CEge4fDPvHS534aOOvOZeQ3+Vf2mCFsaFBYj0i+iXcAq6I9Vzp5fjMFBlONvayDC1qg==", + "license": "MIT", + "dependencies": { + "decode-uri-component": "^0.2.2", + "filter-obj": "^1.1.0", + "split-on-first": "^1.0.0", + "strict-uri-encode": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "range-parser": { + "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==" + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "engines": { + "node": ">= 0.6" + } }, - "raw-body": { + "node_modules/raw-body": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", - "requires": { + "dependencies": { "bytes": "3.1.2", "http-errors": "2.0.0", "iconv-lite": "0.4.24", "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" } }, - "react-is": { + "node_modules/react-is": { "version": "16.12.0", "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.12.0.tgz", "integrity": "sha512-rPCkf/mWBtKc97aLL9/txD8DZdemK0vkA3JMLShjlJB3Pj3s+lpf1KaBzMfQrAmhMQB0n1cU/SUGgKKBCe837Q==", "dev": true }, - "readable-stream": { + "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==", - "requires": { + "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", "isarray": "~1.0.0", @@ -8955,50 +11277,66 @@ "util-deprecate": "~1.0.1" } }, - "realpath-native": { + "node_modules/realpath-native": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/realpath-native/-/realpath-native-2.0.0.tgz", "integrity": "sha512-v1SEYUOXXdbBZK8ZuNgO4TBjamPsiSgcFr0aP+tEKpQZK8vooEUqV6nm6Cv502mX4NF2EfsnVqtNAHG+/6Ur1Q==", - "dev": true + "dev": true, + "engines": { + "node": ">=8" + } }, - "rechoir": { + "node_modules/rechoir": { "version": "0.6.2", "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", - "requires": { + "dependencies": { "resolve": "^1.1.6" + }, + "engines": { + "node": ">= 0.10" } }, - "regex-not": { + "node_modules/regex-not": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", - "requires": { + "dependencies": { "extend-shallow": "^3.0.2", "safe-regex": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "remove-trailing-separator": { + "node_modules/remove-trailing-separator": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", "dev": true }, - "repeat-element": { + "node_modules/repeat-element": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", - "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==" + "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", + "engines": { + "node": ">=0.10.0" + } }, - "repeat-string": { + "node_modules/repeat-string": { "version": "1.6.1", "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "engines": { + "node": ">=0.10" + } }, - "request": { + "node_modules/request": { "version": "2.88.2", "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", - "requires": { + "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", + "dependencies": { "aws-sign2": "~0.7.0", "aws4": "^1.8.0", "caseless": "~0.12.0", @@ -9020,147 +11358,210 @@ "tunnel-agent": "^0.6.0", "uuid": "^3.3.2" }, - "dependencies": { - "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==", - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - } - } + "engines": { + "node": ">= 6" } }, - "request-promise-core": { + "node_modules/request-promise-core": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.3.tgz", "integrity": "sha512-QIs2+ArIGQVp5ZYbWD5ZLCY29D5CfWizP8eWnm8FoGD1TX61veauETVQbrV60662V0oFBkrDOuaBI8XgtuyYAQ==", "dev": true, - "requires": { + "dependencies": { "lodash": "^4.17.15" + }, + "engines": { + "node": ">=0.10.0" + }, + "peerDependencies": { + "request": "^2.34" } }, - "request-promise-native": { + "node_modules/request-promise-native": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.8.tgz", "integrity": "sha512-dapwLGqkHtwL5AEbfenuzjTYg35Jd6KPytsC2/TLkVMz8rm+tNt72MGUWT1RP/aYawMpN6HqbNGBQaRcBtjQMQ==", + "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, - "requires": { + "dependencies": { "request-promise-core": "1.1.3", "stealthy-require": "^1.1.1", "tough-cookie": "^2.3.3" + }, + "engines": { + "node": ">=0.12.0" + }, + "peerDependencies": { + "request": "^2.34" + } + }, + "node_modules/request/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==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 0.12" } }, - "require-directory": { + "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 + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "require-main-filename": { + "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 }, - "requires-port": { + "node_modules/requires-port": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=" }, - "resolve": { + "node_modules/resolve": { "version": "1.15.1", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.1.tgz", "integrity": "sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w==", - "requires": { + "dependencies": { "path-parse": "^1.0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "resolve-cwd": { + "node_modules/resolve-cwd": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", "dev": true, - "requires": { + "dependencies": { "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" } }, - "resolve-from": { + "node_modules/resolve-from": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true + "dev": true, + "engines": { + "node": ">=8" + } }, - "resolve-url": { + "node_modules/resolve-url": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=" + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "deprecated": "https://github.com/lydell/resolve-url#deprecated" }, - "ret": { + "node_modules/ret": { "version": "0.1.15", "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==" + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "engines": { + "node": ">=0.12" + } }, - "retry-request": { + "node_modules/retry-request": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/retry-request/-/retry-request-4.1.1.tgz", "integrity": "sha512-BINDzVtLI2BDukjWmjAIRZ0oglnCAkpP2vQjM3jdLhmT62h0xnQgciPwBRDAvHqpkPT2Wo1XuUyLyn6nbGrZQQ==", - "requires": { + "dependencies": { "debug": "^4.1.1", "through2": "^3.0.1" }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/retry-request/node_modules/debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "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)", "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "requires": { - "ms": "^2.1.1" - } - } + "ms": "^2.1.1" } }, - "rimraf": { + "node_modules/rimraf": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", "dev": true, - "requires": { + "dependencies": { "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "rsvp": { + "node_modules/rsvp": { "version": "4.8.5", "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz", "integrity": "sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==", - "dev": true + "dev": true, + "engines": { + "node": "6.* || >= 7.*" + } }, - "safe-buffer": { + "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==" }, - "safe-regex": { + "node_modules/safe-regex": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", - "requires": { + "dependencies": { "ret": "~0.1.10" } }, - "safer-buffer": { + "node_modules/safe-regex-test": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", + "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-regex": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, - "sane": { + "node_modules/sane": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/sane/-/sane-4.1.0.tgz", "integrity": "sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA==", + "deprecated": "some dependency vulnerabilities fixed, support for node < 10 dropped, and newer ECMAScript syntax/features added", "dev": true, - "requires": { + "dependencies": { "@cnakazawa/watch": "^1.0.3", "anymatch": "^2.0.0", "capture-exit": "^2.0.0", @@ -9171,52 +11572,66 @@ "minimist": "^1.1.1", "walker": "~1.0.5" }, + "bin": { + "sane": "src/cli.js" + }, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/sane/node_modules/anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, "dependencies": { - "anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", - "dev": true, - "requires": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" - } - }, - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, - "requires": { - "remove-trailing-separator": "^1.0.1" - } - } + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" } }, - "sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" + "node_modules/sane/node_modules/normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "dependencies": { + "remove-trailing-separator": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sax": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz", + "integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==", + "license": "ISC" }, - "saxes": { + "node_modules/saxes": { "version": "3.1.11", "resolved": "https://registry.npmjs.org/saxes/-/saxes-3.1.11.tgz", "integrity": "sha512-Ydydq3zC+WYDJK1+gRxRapLIED9PWeSuuS41wqyoRmzvhhh9nc+QQrVMKJYzJFULazeGhzSV0QleN2wD3boh2g==", "dev": true, - "requires": { + "dependencies": { "xmlchars": "^2.1.1" + }, + "engines": { + "node": ">=8" } }, - "semver": { + "node_modules/semver": { "version": "5.7.2", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==" + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "bin": { + "semver": "bin/semver" + } }, - "send": { + "node_modules/send": { "version": "0.19.0", "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", - "requires": { + "dependencies": { "debug": "2.6.9", "depd": "2.0.0", "destroy": "1.2.0", @@ -9231,165 +11646,204 @@ "range-parser": "~1.2.1", "statuses": "2.0.1" }, + "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==", "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" - }, - "dependencies": { - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - } - } - }, - "encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==" - }, - "mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" - }, - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - } + "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": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/send/node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "engines": { + "node": ">= 0.8" + } + }, + "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==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" } }, - "serve-static": { + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/serve-static": { "version": "1.16.2", "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", - "requires": { + "dependencies": { "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "parseurl": "~1.3.3", "send": "0.19.0" + }, + "engines": { + "node": ">= 0.8.0" } }, - "set-blocking": { + "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 }, - "set-function-length": { + "node_modules/set-function-length": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", - "requires": { + "dependencies": { "define-data-property": "^1.1.4", "es-errors": "^1.3.0", "function-bind": "^1.1.2", "get-intrinsic": "^1.2.4", "gopd": "^1.0.1", "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" } }, - "set-value": { + "node_modules/set-value": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", - "requires": { + "dependencies": { "extend-shallow": "^2.0.1", "is-extendable": "^0.1.1", "is-plain-object": "^2.0.3", "split-string": "^3.0.1" }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/set-value/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - } + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "setprototypeof": { + "node_modules/setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" }, - "shebang-command": { + "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, - "requires": { + "dependencies": { "shebang-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "shebang-regex": { + "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 + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "shelljs": { + "node_modules/shelljs": { "version": "0.8.3", "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.3.tgz", "integrity": "sha512-fc0BKlAWiLpwZljmOvAOTE/gXawtCoNrP5oaY7KIaQbbyHeQVg01pSEuEGvGh3HEdBU4baCD7wQBwADmM/7f7A==", - "requires": { + "dependencies": { "glob": "^7.0.0", "interpret": "^1.0.0", "rechoir": "^0.6.2" + }, + "bin": { + "shjs": "bin/shjs" + }, + "engines": { + "node": ">=4" } }, - "shellwords": { + "node_modules/shellwords": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==", "dev": true, "optional": true }, - "side-channel": { + "node_modules/side-channel": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", - "requires": { + "dependencies": { "call-bind": "^1.0.7", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.4", "object-inspect": "^1.13.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "signal-exit": { + "node_modules/signal-exit": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" }, - "sisteransi": { + "node_modules/sisteransi": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", "dev": true }, - "slash": { + "node_modules/slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true + "dev": true, + "engines": { + "node": ">=8" + } }, - "snakeize": { + "node_modules/snakeize": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/snakeize/-/snakeize-0.1.0.tgz", "integrity": "sha1-EMCI2LWOsHazIpu1oE4jLOEmQi0=" }, - "snapdragon": { + "node_modules/snapdragon": { "version": "0.8.2", "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", - "requires": { + "dependencies": { "base": "^0.11.1", "debug": "^2.2.0", "define-property": "^0.2.5", @@ -9399,117 +11853,151 @@ "source-map-resolve": "^0.5.0", "use": "^3.1.0" }, - "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" - } - }, - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - } + "engines": { + "node": ">=0.10.0" } }, - "snapdragon-node": { + "node_modules/snapdragon-node": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", - "requires": { + "dependencies": { "define-property": "^1.0.0", "isobject": "^3.0.0", "snapdragon-util": "^3.0.1" }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node/node_modules/is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "deprecated": "Please upgrade to v1.0.1", + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node/node_modules/is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "deprecated": "Please upgrade to v1.0.1", + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node/node_modules/is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dependencies": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" } }, - "snapdragon-util": { + "node_modules/snapdragon-util": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", - "requires": { + "dependencies": { "kind-of": "^3.2.0" }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-util/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/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/snapdragon/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "node_modules/snapdragon/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "engines": { + "node": ">=0.10.0" } }, - "source-map": { + "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==" + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "devOptional": true, + "engines": { + "node": ">=0.10.0" + } }, - "source-map-resolve": { + "node_modules/source-map-resolve": { "version": "0.5.3", "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", - "requires": { + "deprecated": "See https://github.com/lydell/source-map-resolve#deprecated", + "dependencies": { "atob": "^2.1.2", "decode-uri-component": "^0.2.0", "resolve-url": "^0.2.1", @@ -9517,47 +12005,60 @@ "urix": "^0.1.0" } }, - "source-map-support": { + "node_modules/source-map-support": { "version": "0.5.16", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.16.tgz", "integrity": "sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ==", "dev": true, - "requires": { + "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" } }, - "source-map-url": { + "node_modules/source-map-url": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", - "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=" + "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", + "deprecated": "See https://github.com/lydell/source-map-url#deprecated" }, - "split-array-stream": { + "node_modules/split-array-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/split-array-stream/-/split-array-stream-2.0.0.tgz", "integrity": "sha512-hmMswlVY91WvGMxs0k8MRgq8zb2mSen4FmDNc5AFiTWtrBpdZN6nwD6kROVe4vNL+ywrvbCKsWVCnEd4riELIg==", - "requires": { + "dependencies": { "is-stream-ended": "^0.1.4" } }, - "split-string": { + "node_modules/split-on-first": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/split-on-first/-/split-on-first-1.1.0.tgz", + "integrity": "sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/split-string": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", - "requires": { + "dependencies": { "extend-shallow": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "sprintf-js": { + "node_modules/sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" }, - "sshpk": { + "node_modules/sshpk": { "version": "1.16.1", "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", - "requires": { + "dependencies": { "asn1": "~0.2.3", "assert-plus": "^1.0.0", "bcrypt-pbkdf": "^1.0.0", @@ -9567,156 +12068,222 @@ "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" } }, - "stack-utils": { + "node_modules/stack-utils": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-1.0.2.tgz", "integrity": "sha512-MTX+MeG5U994cazkjd/9KNAapsHnibjMLnfXodlkXw76JEea0UiNzrqidzo1emMwk7w5Qhc9jd4Bn9TBb1MFwA==", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "static-eval": { + "node_modules/static-eval": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/static-eval/-/static-eval-2.0.2.tgz", "integrity": "sha512-N/D219Hcr2bPjLxPiV+TQE++Tsmrady7TqAJugLy7Xk1EumfDWS/f5dtBbkRCGE7wKKXuYockQoj8Rm2/pVKyg==", - "requires": { + "dependencies": { "escodegen": "^1.8.1" } }, - "static-extend": { + "node_modules/static-extend": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", - "requires": { + "dependencies": { "define-property": "^0.2.5", "object-copy": "^0.1.0" }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "requires": { - "is-descriptor": "^0.1.0" - } - } + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "statuses": { + "node_modules/statuses": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "engines": { + "node": ">= 0.8" + } }, - "stealthy-require": { + "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 + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "stream-events": { + "node_modules/stream-chain": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/stream-chain/-/stream-chain-2.2.5.tgz", + "integrity": "sha512-1TJmBx6aSWqZ4tx7aTpBDXK0/e2hhcNSTV8+CbFJtDjbb+I1mZ8lHit0Grw9GRT+6JbIrrDd8esncgBi8aBXGA==", + "license": "BSD-3-Clause" + }, + "node_modules/stream-events": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/stream-events/-/stream-events-1.0.5.tgz", "integrity": "sha512-E1GUzBSgvct8Jsb3v2X15pjzN1tYebtbLaMg+eBOUOAxgbLoSbT2NS91ckc5lJD1KfLjId+jXJRgo0qnV5Nerg==", - "requires": { + "dependencies": { "stubs": "^3.0.0" } }, - "stream-shift": { + "node_modules/stream-json": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/stream-json/-/stream-json-1.9.1.tgz", + "integrity": "sha512-uWkjJ+2Nt/LO9Z/JyKZbMusL8Dkh97uUBTv3AJQ74y07lVahLY4eEFsPsE97pxYBwr8nnjMAIch5eqI0gPShyw==", + "license": "BSD-3-Clause", + "dependencies": { + "stream-chain": "^2.2.5" + } + }, + "node_modules/stream-shift": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==" }, - "string-length": { + "node_modules/strict-uri-encode": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz", + "integrity": "sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "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==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/string-length": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/string-length/-/string-length-3.1.0.tgz", "integrity": "sha512-Ttp5YvkGm5v9Ijagtaz1BnN+k9ObpvS0eIBblPMp2YWL8FBmi9qblQ9fexc2k/CXFgrTIteU3jAw3payCnwSTA==", "dev": true, - "requires": { + "dependencies": { "astral-regex": "^1.0.0", "strip-ansi": "^5.2.0" }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-length/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": { - "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" - } - } + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" } }, - "string-width": { + "node_modules/string-width": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", "dev": true, - "requires": { + "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" } }, - "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==", - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "strip-ansi": { + "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, - "requires": { + "dependencies": { "ansi-regex": "^5.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 - } + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi/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" } }, - "strip-bom": { + "node_modules/strip-bom": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", - "dev": true + "dev": true, + "engines": { + "node": ">=8" + } }, - "strip-eof": { + "node_modules/strip-eof": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "strip-final-newline": { + "node_modules/strip-final-newline": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true + "dev": true, + "engines": { + "node": ">=6" + } }, - "strnum": { + "node_modules/strnum": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz", "integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==" }, - "stubs": { + "node_modules/stubs": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/stubs/-/stubs-3.0.0.tgz", "integrity": "sha1-6NK6H6nJBXAwPAMLaQD31fiavls=" }, - "superagent": { + "node_modules/superagent": { "version": "3.8.3", "resolved": "https://registry.npmjs.org/superagent/-/superagent-3.8.3.tgz", "integrity": "sha512-GLQtLMCoEIK4eDv6OGtkOoSMt3D+oq0y3dsxMuYuDvaNUvuT8eFBuLmfR0iYYzHC1e8hpzC6ZsxbuP6DIalMFA==", + "deprecated": "Please upgrade to v9.0.0+ as we have fixed a public vulnerability with formidable dependency. Note that v9.0.0+ requires Node.js v14.18.0+. See https://github.com/ladjs/superagent/pull/1800 for insight. This project is supported and maintained by the team at Forward Email @ https://forwardemail.net", "dev": true, - "requires": { + "dependencies": { "component-emitter": "^1.2.0", "cookiejar": "^2.1.0", "debug": "^3.1.0", @@ -9728,215 +12295,264 @@ "qs": "^6.5.1", "readable-stream": "^2.3.5" }, - "dependencies": { - "mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "dev": true - } + "engines": { + "node": ">= 4.0" + } + }, + "node_modules/superagent/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" } }, - "supertest": { + "node_modules/supertest": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/supertest/-/supertest-4.0.2.tgz", "integrity": "sha512-1BAbvrOZsGA3YTCWqbmh14L0YEq0EGICX/nBnfkfVJn7SrxQV1I3pMYjSzG9y/7ZU2V9dWqyqk2POwxlb09duQ==", "dev": true, - "requires": { + "dependencies": { "methods": "^1.1.2", "superagent": "^3.8.3" + }, + "engines": { + "node": ">=6.0.0" } }, - "supports-color": { + "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, - "requires": { + "dependencies": { "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" } }, - "supports-hyperlinks": { + "node_modules/supports-hyperlinks": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.1.0.tgz", "integrity": "sha512-zoE5/e+dnEijk6ASB6/qrK+oYdm2do1hjoLWrqUC/8WEIW1gbxFcKuBof7sW8ArN6e+AYvsE8HBGiVRWL/F5CA==", "dev": true, - "requires": { + "dependencies": { "has-flag": "^4.0.0", "supports-color": "^7.0.0" }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-hyperlinks/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/supports-hyperlinks/node_modules/supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, "dependencies": { - "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 - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "symbol-tree": { + "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 }, - "tar-stream": { + "node_modules/tar-stream": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.1.0.tgz", "integrity": "sha512-+DAn4Nb4+gz6WZigRzKEZl1QuJVOLtAwwF+WUxy1fJ6X63CaGaUAxJRD2KEn1OMfcbCjySTYpNC6WmfQoIEOdw==", - "requires": { + "dependencies": { "bl": "^3.0.0", "end-of-stream": "^1.4.1", "fs-constants": "^1.0.0", "inherits": "^2.0.3", "readable-stream": "^3.1.1" - }, + } + }, + "node_modules/tar-stream/node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", "dependencies": { - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" } }, - "teeny-request": { + "node_modules/teeny-request": { "version": "3.11.3", "resolved": "https://registry.npmjs.org/teeny-request/-/teeny-request-3.11.3.tgz", "integrity": "sha512-CKncqSF7sH6p4rzCgkb/z/Pcos5efl0DmolzvlqRQUNcpRIruOhY9+T1FsIlyEbfWd7MsFpodROOwHYh2BaXzw==", - "requires": { + "dependencies": { "https-proxy-agent": "^2.2.1", "node-fetch": "^2.2.0", "uuid": "^3.3.2" } }, - "terminal-link": { + "node_modules/terminal-link": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", "dev": true, - "requires": { + "dependencies": { "ansi-escapes": "^4.2.1", "supports-hyperlinks": "^2.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "test-exclude": { + "node_modules/test-exclude": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", "dev": true, - "requires": { + "dependencies": { "@istanbuljs/schema": "^0.1.2", "glob": "^7.1.4", "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" } }, - "throat": { + "node_modules/throat": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz", "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==", "dev": true }, - "through2": { + "node_modules/through2": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/through2/-/through2-3.0.1.tgz", "integrity": "sha512-M96dvTalPT3YbYLaKaCuwu+j06D/8Jfib0o/PxbVt6Amhv3dUAtW6rTV1jPgJSBG83I/e04Y6xkVdVhSRhi0ww==", - "requires": { + "dependencies": { "readable-stream": "2 || 3" } }, - "tmpl": { + "node_modules/tmpl": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", "dev": true }, - "to-fast-properties": { + "node_modules/to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true + "dev": true, + "engines": { + "node": ">=4" + } }, - "to-object-path": { + "node_modules/to-object-path": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", - "requires": { + "dependencies": { "kind-of": "^3.0.2" }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-object-path/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" } }, - "to-regex": { + "node_modules/to-regex": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", - "requires": { + "dependencies": { "define-property": "^2.0.2", "extend-shallow": "^3.0.2", "regex-not": "^1.0.2", "safe-regex": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "to-regex-range": { + "node_modules/to-regex-range": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "requires": { + "dependencies": { "is-number": "^3.0.0", "repeat-string": "^1.6.1" + }, + "engines": { + "node": ">=0.10.0" } }, - "toidentifier": { + "node_modules/toidentifier": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "engines": { + "node": ">=0.6" + } }, - "tough-cookie": { + "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==", - "requires": { + "dependencies": { "psl": "^1.1.28", "punycode": "^2.1.1" + }, + "engines": { + "node": ">=0.8" } }, - "tr46": { + "node_modules/tr46": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=", "dev": true, - "requires": { + "dependencies": { "punycode": "^2.1.0" } }, - "ts-jest": { + "node_modules/ts-jest": { "version": "25.2.1", "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-25.2.1.tgz", "integrity": "sha512-TnntkEEjuXq/Gxpw7xToarmHbAafgCaAzOpnajnFC6jI7oo1trMzAHA04eWpc3MhV6+yvhE8uUBAmN+teRJh0A==", "dev": true, - "requires": { + "dependencies": { "bs-logger": "0.x", "buffer-from": "1.x", "fast-json-stable-stringify": "2.x", @@ -9947,19 +12563,28 @@ "resolve": "1.x", "semver": "^5.5", "yargs-parser": "^16.1.0" + }, + "bin": { + "ts-jest": "cli.js" + }, + "engines": { + "node": ">= 6" + }, + "peerDependencies": { + "jest": ">=25 <26" } }, - "tslib": { + "node_modules/tslib": { "version": "1.11.0", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.0.tgz", "integrity": "sha512-BmndXUtiTn/VDDrJzQE7Mm22Ix3PxgLltW9bSNLoeCY31gnG2OPx0QqJnuc9oMIKioYrz487i6K9o4Pdn0j+Kg==" }, - "tslint": { + "node_modules/tslint": { "version": "5.20.1", "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.20.1.tgz", "integrity": "sha512-EcMxhzCFt8k+/UP5r8waCf/lzmeSyVlqxqMEDQE7rWYiQky8KpIBz1JAoYXfROHrPZ1XXd43q8yQnULOLiBRQg==", "dev": true, - "requires": { + "dependencies": { "@babel/code-frame": "^7.0.0", "builtin-modules": "^1.1.1", "chalk": "^2.3.0", @@ -9973,416 +12598,565 @@ "semver": "^5.3.0", "tslib": "^1.8.0", "tsutils": "^2.29.0" + }, + "bin": { + "tslint": "bin/tslint" + }, + "engines": { + "node": ">=4.8.0" + }, + "peerDependencies": { + "typescript": ">=2.3.0-dev || >=2.4.0-dev || >=2.5.0-dev || >=2.6.0-dev || >=2.7.0-dev || >=2.8.0-dev || >=2.9.0-dev || >=3.0.0-dev || >= 3.1.0-dev || >= 3.2.0-dev" } }, - "tsutils": { + "node_modules/tsutils": { "version": "2.29.0", "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", "dev": true, - "requires": { + "dependencies": { "tslib": "^1.8.1" + }, + "peerDependencies": { + "typescript": ">=2.1.0 || >=2.1.0-dev || >=2.2.0-dev || >=2.3.0-dev || >=2.4.0-dev || >=2.5.0-dev || >=2.6.0-dev || >=2.7.0-dev || >=2.8.0-dev || >=2.9.0-dev || >= 3.0.0-dev || >= 3.1.0-dev" } }, - "tunnel-agent": { + "node_modules/tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "requires": { + "dependencies": { "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" } }, - "tweetnacl": { + "node_modules/tweetnacl": { "version": "0.14.5", "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" }, - "type-check": { + "node_modules/type-check": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", - "requires": { + "dependencies": { "prelude-ls": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" } }, - "type-detect": { + "node_modules/type-detect": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true + "dev": true, + "engines": { + "node": ">=4" + } }, - "type-fest": { + "node_modules/type-fest": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==", - "dev": true + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "type-is": { + "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==", - "requires": { + "dependencies": { "media-typer": "0.3.0", "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" } }, - "typedarray": { + "node_modules/typedarray": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" }, - "typedarray-to-buffer": { + "node_modules/typedarray-to-buffer": { "version": "3.1.5", "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", "dev": true, - "requires": { + "dependencies": { "is-typedarray": "^1.0.0" } }, - "typescript": { + "node_modules/typescript": { "version": "3.8.2", "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.8.2.tgz", "integrity": "sha512-EgOVgL/4xfVrCMbhYKUQTdF37SQn4Iw73H5BgCrF1Abdun7Kwy/QZsE/ssAy0y4LxBbvua3PIbFsbRczWWnDdQ==", - "dev": true + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } }, - "underscore": { + "node_modules/underscore": { "version": "1.9.2", "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.9.2.tgz", "integrity": "sha512-D39qtimx0c1fI3ya1Lnhk3E9nONswSKhnffBI0gME9C99fYOkNi04xs8K6pePLhvl1frbDemkaBQ5ikWllR2HQ==" }, - "union-value": { + "node_modules/union-value": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", - "requires": { + "dependencies": { "arr-union": "^3.1.0", "get-value": "^2.0.6", "is-extendable": "^0.1.1", "set-value": "^2.0.1" + }, + "engines": { + "node": ">=0.10.0" } }, - "unique-string": { + "node_modules/unique-string": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=", - "requires": { + "dependencies": { "crypto-random-string": "^1.0.0" + }, + "engines": { + "node": ">=4" } }, - "unpipe": { + "node_modules/unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==" + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "engines": { + "node": ">= 0.8" + } }, - "unset-value": { + "node_modules/unset-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", - "requires": { + "dependencies": { "has-value": "^0.3.1", "isobject": "^3.0.0" }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", "dependencies": { - "has-value": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", - "requires": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" - }, - "dependencies": { - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "requires": { - "isarray": "1.0.0" - } - } - } - }, - "has-values": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=" - } + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-value/node_modules/isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dependencies": { + "isarray": "1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "engines": { + "node": ">=0.10.0" } }, - "uri-js": { + "node_modules/uri-js": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", - "requires": { + "dependencies": { "punycode": "^2.1.0" } }, - "urix": { + "node_modules/urix": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=" + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "deprecated": "Please see https://github.com/lydell/urix#deprecated" }, - "use": { + "node_modules/use": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", - "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==" + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "engines": { + "node": ">=0.10.0" + } }, - "util-deprecate": { + "node_modules/util": { + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", + "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "is-arguments": "^1.0.4", + "is-generator-function": "^1.0.7", + "is-typed-array": "^1.1.3", + "which-typed-array": "^1.1.2" + } + }, + "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" }, - "utils-merge": { + "node_modules/utils-merge": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==" + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "engines": { + "node": ">= 0.4.0" + } }, - "uuid": { + "node_modules/uuid": { "version": "3.4.0", "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "bin": { + "uuid": "bin/uuid" + } }, - "v8-to-istanbul": { + "node_modules/v8-to-istanbul": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-4.1.3.tgz", "integrity": "sha512-sAjOC+Kki6aJVbUOXJbcR0MnbfjvBzwKZazEJymA2IX49uoOdEdk+4fBq5cXgYgiyKtAyrrJNtBZdOeDIF+Fng==", "dev": true, - "requires": { + "dependencies": { "@types/istanbul-lib-coverage": "^2.0.1", "convert-source-map": "^1.6.0", "source-map": "^0.7.3" }, - "dependencies": { - "source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", - "dev": true - } + "engines": { + "node": "8.x.x || >=10.10.0" + } + }, + "node_modules/v8-to-istanbul/node_modules/source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "dev": true, + "engines": { + "node": ">= 8" } }, - "vary": { + "node_modules/vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==" + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "engines": { + "node": ">= 0.8" + } }, - "verror": { + "node_modules/verror": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "requires": { + "engines": [ + "node >=0.6.0" + ], + "dependencies": { "assert-plus": "^1.0.0", "core-util-is": "1.0.2", "extsprintf": "^1.2.0" } }, - "w3c-hr-time": { + "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==", + "deprecated": "Use your platform's native performance.now() and performance.timeOrigin.", "dev": true, - "requires": { + "dependencies": { "browser-process-hrtime": "^1.0.0" } }, - "w3c-xmlserializer": { + "node_modules/w3c-xmlserializer": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-1.1.2.tgz", "integrity": "sha512-p10l/ayESzrBMYWRID6xbuCKh2Fp77+sA0doRuGn4tTIMrrZVeqfpKjXHY+oDh3K4nLdPgNwMTVP6Vp4pvqbNg==", "dev": true, - "requires": { + "dependencies": { "domexception": "^1.0.1", "webidl-conversions": "^4.0.2", "xml-name-validator": "^3.0.0" } }, - "walker": { + "node_modules/walker": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz", "integrity": "sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=", "dev": true, - "requires": { + "dependencies": { "makeerror": "1.0.x" } }, - "webidl-conversions": { + "node_modules/web-encoding": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/web-encoding/-/web-encoding-1.1.5.tgz", + "integrity": "sha512-HYLeVCdJ0+lBYV2FvNZmv3HJ2Nt0QYXqZojk3d9FJOLkwnuhzM9tmamh8d7HPM8QqjKH8DeHkFTx+CFlWpZZDA==", + "license": "MIT", + "dependencies": { + "util": "^0.12.3" + }, + "optionalDependencies": { + "@zxing/text-encoding": "0.9.0" + } + }, + "node_modules/webidl-conversions": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", "dev": true }, - "whatwg-encoding": { + "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, - "requires": { + "dependencies": { "iconv-lite": "0.4.24" } }, - "whatwg-fetch": { + "node_modules/whatwg-fetch": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.0.0.tgz", "integrity": "sha512-9GSJUgz1D4MfyKU7KRqwOjXCXTqWdFNvEr7eUBYchQiVc744mqK/MzXPNR2WsPkmkOa4ywfg8C2n8h+13Bey1Q==" }, - "whatwg-mimetype": { + "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 }, - "whatwg-url": { + "node_modules/whatwg-url": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", "dev": true, - "requires": { + "dependencies": { "lodash.sortby": "^4.7.0", "tr46": "^1.0.1", "webidl-conversions": "^4.0.2" } }, - "which": { + "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, - "requires": { + "dependencies": { "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" } }, - "which-module": { + "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 }, - "word-wrap": { + "node_modules/which-typed-array": { + "version": "1.1.18", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.18.tgz", + "integrity": "sha512-qEcY+KJYlWyLH9vNbsr6/5j59AXk5ni5aakf8ldzBvGde6Iz4sxZGkJyWSAueTG7QhOvNRYb1lDdFmL5Td0QKA==", + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/word-wrap": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.4.tgz", - "integrity": "sha512-2V81OA4ugVo5pRo46hAoD2ivUJx8jXmWXfUkY4KFNw0hEptvN0QfH3K4nHiwzGeKl5rFKedV48QVoqYavy4YpA==" + "integrity": "sha512-2V81OA4ugVo5pRo46hAoD2ivUJx8jXmWXfUkY4KFNw0hEptvN0QfH3K4nHiwzGeKl5rFKedV48QVoqYavy4YpA==", + "engines": { + "node": ">=0.10.0" + } }, - "wrap-ansi": { + "node_modules/wrap-ansi": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", "dev": true, - "requires": { + "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, "dependencies": { - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "dev": true, - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "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 - } + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/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" } }, - "wrappy": { + "node_modules/wrap-ansi/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/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, - "write-file-atomic": { + "node_modules/write-file-atomic": { "version": "2.4.3", "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz", "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==", - "requires": { + "dependencies": { "graceful-fs": "^4.1.11", "imurmurhash": "^0.1.4", "signal-exit": "^3.0.2" } }, - "ws": { + "node_modules/ws": { "version": "6.2.2", "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.2.tgz", "integrity": "sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==", - "requires": { + "dependencies": { "async-limiter": "~1.0.0" } }, - "xdg-basedir": { + "node_modules/xdg-basedir": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz", - "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=" - }, - "xml": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/xml/-/xml-1.0.1.tgz", - "integrity": "sha1-eLpyAgApxbyHuKgaPPzXS0ovweU=" + "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=", + "engines": { + "node": ">=4" + } }, - "xml-name-validator": { + "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 }, - "xml2js": { - "version": "0.4.23", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", - "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", - "requires": { + "node_modules/xml2js": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.6.2.tgz", + "integrity": "sha512-T4rieHaC1EXcES0Kxxj4JWgaUQHDk+qwHcYOCFHfiwKz7tOVPLq7Hjq9dM1WCMhylqMEfP7hMcOIChvotiZegA==", + "license": "MIT", + "dependencies": { "sax": ">=0.6.0", "xmlbuilder": "~11.0.0" + }, + "engines": { + "node": ">=4.0.0" } }, - "xmlbuilder": { + "node_modules/xmlbuilder": { "version": "11.0.1", "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", - "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==" + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", + "license": "MIT", + "engines": { + "node": ">=4.0" + } }, - "xmlchars": { + "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 }, - "xtend": { + "node_modules/xtend": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "engines": { + "node": ">=0.4" + } }, - "y18n": { + "node_modules/y18n": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.1.tgz", "integrity": "sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ==", "dev": true }, - "yallist": { + "node_modules/yallist": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" }, - "yargs": { + "node_modules/yargs": { "version": "15.3.1", "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.3.1.tgz", "integrity": "sha512-92O1HWEjw27sBfgmXiixJWT5hRBp2eobqXicLtPBIDBhYB+1HpwZlXmbW2luivBJHBzki+7VyCLRtAkScbTBQA==", "dev": true, - "requires": { + "dependencies": { "cliui": "^6.0.0", "decamelize": "^1.2.0", "find-up": "^4.1.0", @@ -10395,27 +13169,31 @@ "y18n": "^4.0.0", "yargs-parser": "^18.1.1" }, - "dependencies": { - "yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } + "engines": { + "node": ">=8" } }, - "yargs-parser": { + "node_modules/yargs-parser": { "version": "16.1.0", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-16.1.0.tgz", "integrity": "sha512-H/V41UNZQPkUMIT5h5hiwg4QKIY1RPvoBV4XcjUbRM8Bk2oKqqyZ0DIEbTFZB0XjbtSPG8SAa/0DxCQmiRgzKg==", "dev": true, - "requires": { + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + }, + "node_modules/yargs/node_modules/yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "dev": true, + "dependencies": { "camelcase": "^5.0.0", "decamelize": "^1.2.0" + }, + "engines": { + "node": ">=6" } } } diff --git a/frontend/server/package.json b/frontend/server/package.json index 01bf93dc04fa..b940daac6ee5 100644 --- a/frontend/server/package.json +++ b/frontend/server/package.json @@ -11,7 +11,7 @@ "gunzip-maybe": "^1.4.1", "http-proxy-middleware": "^0.18.0", "lodash": ">=4.17.21", - "minio": "~7.0.0", + "minio": "~8.0.3", "node-fetch": "^2.6.7", "peek-stream": "^1.1.3", "portable-fetch": "^3.0.0", @@ -23,7 +23,6 @@ "@types/gunzip-maybe": "^1.4.0", "@types/http-proxy-middleware": "^0.19.3", "@types/jest": "^24.9.1", - "@types/minio": "~7.0.3", "@types/node": "^14.14.20", "@types/node-fetch": "^2.1.2", "@types/supertest": "^2.0.8", @@ -36,6 +35,11 @@ "tslint": "^5.20.1", "typescript": "^3.6.4" }, + "overrides": { + "express": { + "path-to-regexp": "0.1.12" + } + }, "scripts": { "build": "tsc --project .", "format": "prettier --write './**/*.{ts,tsx}'", diff --git a/frontend/src/components/NewRunParametersV2.tsx b/frontend/src/components/NewRunParametersV2.tsx index 1fced87abf77..003873e9a8cf 100644 --- a/frontend/src/components/NewRunParametersV2.tsx +++ b/frontend/src/components/NewRunParametersV2.tsx @@ -205,7 +205,7 @@ function NewRunParametersV2(props: NewRunParametersProps) { let allParamtersWithDefault = true; let errMsg: string[] = []; Object.keys(specParameters).forEach(key => { - if (specParameters[key].defaultValue) { + if (specParameters[key].defaultValue !== undefined) { // TODO(zijianjoy): Make sure to consider all types of parameters. // Convert default value to string type first to avoid error from convertInput runtimeParametersWithDefault[key] = convertNonUserInputParamToString( diff --git a/frontend/src/pages/GettingStarted.test.tsx b/frontend/src/pages/GettingStarted.test.tsx index 58d4622e0e19..3d73fcbe5c27 100644 --- a/frontend/src/pages/GettingStarted.test.tsx +++ b/frontend/src/pages/GettingStarted.test.tsx @@ -28,7 +28,7 @@ describe(`${PATH_FRONTEND_CONFIG}`, () => { it(`should be in sync with ${PATH_BACKEND_CONFIG}, if not please run "npm run sync-backend-sample-config" to update.`, () => { const configBackend = require(PATH_BACKEND_CONFIG); const configFrontend = require(PATH_FRONTEND_CONFIG); - expect(configFrontend).toEqual(configBackend.map((sample: any) => sample.name)); + expect(configFrontend).toEqual(configBackend.pipelines.map((sample: any) => sample.name)); }); }); diff --git a/frontend/src/pages/NewRun.test.tsx b/frontend/src/pages/NewRun.test.tsx index db00f398f7cb..ffc2bd792473 100644 --- a/frontend/src/pages/NewRun.test.tsx +++ b/frontend/src/pages/NewRun.test.tsx @@ -1365,7 +1365,7 @@ describe('NewRun', () => { expect(updateBannerSpy).toHaveBeenLastCalledWith( expect.objectContaining({ - additionalInfo: 'Unexpected token o in JSON at position 1', + additionalInfo: 'Unexpected token \'o\', "not JSON" is not valid JSON', message: "Error: failed to parse the embedded pipeline's spec: not JSON. Click Details for more information.", mode: 'error', diff --git a/frontend/src/pages/PipelineDetails.test.tsx b/frontend/src/pages/PipelineDetails.test.tsx index 9f3f198fc211..d37dc20ba3d8 100644 --- a/frontend/src/pages/PipelineDetails.test.tsx +++ b/frontend/src/pages/PipelineDetails.test.tsx @@ -515,7 +515,7 @@ describe('PipelineDetails', () => { expect(updateBannerSpy).toHaveBeenCalledTimes(2); // Once to clear banner, once to show error expect(updateBannerSpy).toHaveBeenLastCalledWith( expect.objectContaining({ - additionalInfo: 'Unexpected token o in JSON at position 1', + additionalInfo: 'Unexpected token \'o\', "not valid JSON" is not valid JSON', message: `Failed to parse pipeline spec from run with ID: ${ testV1Run.run!.id }. Click Details for more information.`, diff --git a/frontend/src/pages/PipelineDetailsV2.tsx b/frontend/src/pages/PipelineDetailsV2.tsx index c61e2cfd7f3f..8f786685e5ae 100644 --- a/frontend/src/pages/PipelineDetailsV2.tsx +++ b/frontend/src/pages/PipelineDetailsV2.tsx @@ -13,8 +13,8 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import React, { useState } from 'react'; -import { Elements, FlowElement } from 'react-flow-renderer'; +import React, { MouseEvent as ReactMouseEvent, useState } from 'react'; +import { FlowElement } from 'react-flow-renderer'; import { V2beta1Pipeline, V2beta1PipelineVersion } from 'src/apisv2beta1/pipeline'; import MD2Tabs from 'src/atoms/MD2Tabs'; import { FlowElementDataBase } from 'src/components/graph/Constants'; @@ -25,6 +25,7 @@ import { StaticNodeDetailsV2 } from 'src/components/tabs/StaticNodeDetailsV2'; import { PipelineFlowElement } from 'src/lib/v2/StaticFlow'; import { commonCss, padding } from 'src/Css'; import DagCanvas from './v2/DagCanvas'; +import { Edge, Node } from 'react-flow-renderer/dist/types'; const TAB_NAMES = ['Graph', 'Pipeline Spec']; @@ -57,16 +58,6 @@ function PipelineDetailsV2({ setSubDagLayers(l); }; - const onSelectionChange = (elements: Elements | null) => { - if (!elements || elements?.length === 0) { - setSelectedNode(null); - return; - } - if (elements && elements.length === 1) { - setSelectedNode(elements[0]); - } - }; - const getNodeName = function(element: FlowElement | null): string { if (element && element.data && element.data.label) { return element.data.label; @@ -84,7 +75,9 @@ function PipelineDetailsV2({ layers={layers} onLayersUpdate={layerChange} elements={pipelineFlowElements} - onSelectionChange={onSelectionChange} + onElementClick={(event: ReactMouseEvent, element: Node | Edge) => + setSelectedNode(element) + } setFlowElements={() => {}} > onSelectionChange(null)} + onClose={() => setSelectedNode(null)} defaultWidth={'50%'} >
diff --git a/frontend/src/pages/RunDetailsV2.tsx b/frontend/src/pages/RunDetailsV2.tsx index dc99916415bb..43126fe94932 100644 --- a/frontend/src/pages/RunDetailsV2.tsx +++ b/frontend/src/pages/RunDetailsV2.tsx @@ -13,8 +13,8 @@ // limitations under the License. import * as React from 'react'; -import { useEffect, useState } from 'react'; -import { Elements, FlowElement } from 'react-flow-renderer'; +import { MouseEvent as ReactMouseEvent, useEffect, useState } from 'react'; +import { FlowElement } from 'react-flow-renderer'; import { useQuery } from 'react-query'; import { V2beta1Experiment } from 'src/apisv2beta1/experiment'; import { V2beta1Run, V2beta1RuntimeState, V2beta1RunStorageState } from 'src/apisv2beta1/run'; @@ -51,6 +51,7 @@ import { classes } from 'typestyle'; import { RunDetailsProps } from './RunDetails'; import { statusToIcon } from './StatusV2'; import DagCanvas from './v2/DagCanvas'; +import { Edge, Node } from 'react-flow-renderer/dist/types'; const QUERY_STALE_TIME = 10000; // 10000 milliseconds == 10 seconds. const QUERY_REFETCH_INTERNAL = 10000; // 10000 milliseconds == 10 seconds. @@ -140,18 +141,12 @@ export function RunDetailsV2(props: RunDetailsV2Props) { ); } - const onSelectionChange = (elements: Elements | null) => { - if (!elements || elements?.length === 0) { - setSelectedNode(null); - return; - } - if (elements && elements.length === 1) { - setSelectedNode(elements[0]); - if (data) { - setSelectedNodeMlmdInfo( - getNodeMlmdInfo(elements[0], data.executions, data.events, data.artifacts), - ); - } + const onElementSelection = (event: ReactMouseEvent, element: Node | Edge) => { + setSelectedNode(element); + if (data) { + setSelectedNodeMlmdInfo( + getNodeMlmdInfo(element, data.executions, data.events, data.artifacts), + ); } }; @@ -198,7 +193,7 @@ export function RunDetailsV2(props: RunDetailsV2Props) { layers={layers} onLayersUpdate={layerChange} elements={dynamicFlowElements} - onSelectionChange={onSelectionChange} + onElementClick={onElementSelection} setFlowElements={elems => setFlowElements(elems)} > @@ -207,7 +202,7 @@ export function RunDetailsV2(props: RunDetailsV2Props) { onSelectionChange(null)} + onClose={() => setSelectedNode(null)} defaultWidth={'50%'} > ; setFlowElements: (elements: Elements) => void; - onSelectionChange: (elements: Elements | null) => void; layers: string[]; onLayersUpdate: (layers: string[]) => void; + onElementClick: (event: ReactMouseEvent, element: Node | Edge) => void; } export default function DagCanvas({ elements, layers, onLayersUpdate, - onSelectionChange, setFlowElements, + onElementClick, }: DagCanvasProps) { const onLoad = (reactFlowInstance: OnLoadParams) => { reactFlowInstance.fitView(); @@ -71,7 +72,7 @@ export default function DagCanvas({ onLoad={onLoad} nodeTypes={NODE_TYPES} edgeTypes={{}} - onSelectionChange={onSelectionChange} + onElementClick={onElementClick} onNodeDragStop={(event, node) => { setFlowElements( elements.map(value => { diff --git a/go.mod b/go.mod index aeb6603c893a..3c3093bba2f7 100644 --- a/go.mod +++ b/go.mod @@ -47,7 +47,7 @@ require ( github.com/stretchr/testify v1.9.0 github.com/tektoncd/pipeline v0.54.0 gocloud.dev v0.23.0 - golang.org/x/net v0.25.0 + golang.org/x/net v0.33.0 golang.org/x/oauth2 v0.16.0 google.golang.org/genproto/googleapis/api v0.0.0-20231212172506-995d672761c0 google.golang.org/genproto/googleapis/rpc v0.0.0-20240102182953-50ed04b92917 diff --git a/go.sum b/go.sum index 1d53c021611b..7d11e769c820 100644 --- a/go.sum +++ b/go.sum @@ -1075,8 +1075,8 @@ golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= -golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= +golang.org/x/net v0.33.0 h1:74SYHlV8BIgHIFC/LrYkOGIwL19eTYXQ5wc6TBuO36I= +golang.org/x/net v0.33.0/go.mod h1:HXLR5J+9DxmrqMwG9qjGCxZ+zKXxBru04zlTvWlWuN4= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= diff --git a/hack/update-requirements.sh b/hack/update-requirements.sh index d7879ab26a44..382e95a82de1 100755 --- a/hack/update-requirements.sh +++ b/hack/update-requirements.sh @@ -16,7 +16,7 @@ # Usage: ./update_requirements.sh requirements.txt set -euo pipefail -IMAGE=${1:-"python:3.7"} +IMAGE=${1:-"python:3.9"} docker run -i --rm --entrypoint "" "$IMAGE" sh -c ' python3 -m pip install pip setuptools --quiet --upgrade python3 -m pip install pip-tools==6.14.0 --quiet diff --git a/hack/update-toc.sh b/hack/update-toc.sh new file mode 100644 index 000000000000..d0e1872c856a --- /dev/null +++ b/hack/update-toc.sh @@ -0,0 +1,32 @@ +#!/usr/bin/env bash + +# Copyright 2022 The Kubernetes Authors. +# +# 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. + +set -o errexit +set -o nounset +set -o pipefail + +# cd to the root path +ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd -P)" +cd "${ROOT}" + +echo "Updating tables of contents if necessary..." +# Update tables of contents if necessary. +find keps -name '*.md' \ + | grep -Fxvf hack/.notableofcontents \ + | xargs "${ROOT}/bin/mdtoc" --inplace --max-depth=5 || ( + echo "Failed generating TOC. If this failed silently and you are on mac, try 'brew install grep'" + exit 1 + ) diff --git a/images/README.md b/images/README.md new file mode 100644 index 000000000000..dafd12d59eee --- /dev/null +++ b/images/README.md @@ -0,0 +1,8 @@ +# KFP Architecture Diagram + +To make edits to the KFP architecture, do the following: + +1. Import kfp-cluster-wide-architecture.drawio.xml into your drawio environment. +2. Make any required updates to the architecture +3. Export a new png as well as xml of the diagram +4. Overwrite the existing files in this directory diff --git a/images/kfp-cluster-wide-architecture.drawio.xml b/images/kfp-cluster-wide-architecture.drawio.xml new file mode 100644 index 000000000000..f14fdc2503b9 --- /dev/null +++ b/images/kfp-cluster-wide-architecture.drawio.xml @@ -0,0 +1,270 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/images/kfp-cluster-wide-architecture.png b/images/kfp-cluster-wide-architecture.png new file mode 100644 index 0000000000000000000000000000000000000000..db5f912527a31b9e37696e9fa2d54fb7a77a96fd GIT binary patch literal 247490 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

{a_K=bwexe*h|c0T=!0s(yfQ3 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 z z4&=aD?1l=LCO!)S`vX=YyD8$K3`da6tMtn1+--gwi?#Zv9USt1+%O)+4IBQ$4TY}` zdB>kKzO46kxaZF;%1oQqB%9*P@aw7}@o0$i5X95l%{;1xl07p8YoE~l&j!6-jSODtT)f{TVkP6Ezh%S zGz(Z>c;NtOdXQDGRKuJ%enqOa4cZXk(iHj3)EEd_o1;fL1YubMv$yZf13>;C%R_nFV6***X z-g?8p#7l#qH)ji>H+g@WQL0_kd1jc~_95X(0M=sR)v-kE4gd7Ae7ML3_Z2?RAqRz#@0(cL+dupmC zqI`qPoUfBLm(Aw=$K-%VtE_Wugw3w=&qd3=8E_ykwcxd*gt+gD*WCdL^_kvQ2Y5i=6-k=<}Z+3 zN#0Y4B9TS%cEVWF76OxQ8x8A09emA1XZDbUZd`<(&rJHM9rA<4gP_&vN@7>#hw&?t zLqTK9$rI|vO+xgXu3r=c$WI;j4zWYmJ#4ayo(;FcT3O_vs7sQ>8w(dgMJW?mYMaNB zRzBFsUlUTQqa|X8Pm_)}0g_EFd1PM&tV7ECZ$ce{_4{Oz{-8z%5}L#I4_i$-lt}Jn z3QMWlcmuJ;vdCr2_hIRMmb1t^Qs49;9f~A_8Evo*Rg%z34IBjnXDQ+OB)r_^r)=u` z#Dwf=>@qxB`LVJ0%exD)hh-LpSV&Bp{i8uY23~mn>(h*QGdW`gk)CuxML6GNyF2vL z^&bl(BJN|Oc-;A0Ui7SA-EH zmz;-Aa`P7Ul!=Wboxt0i*!Rn4`TGT2xWZH%hhlX;1R)Y!O8EJz92y zdx5}s@;XSo&1}qBxO)!HcPkulO_l-M_C&L@TFfw@m&R5KlN&;nNsPRJ46qbfi|^rh z z#Q{xAd;)@za}WY{4u1|CLn{C{oDA80jBC9N4LsiE94<5C%}qti_9cxPjHU&-=Og)4 zPtX;ERVuiTs5%lNDyzl}d$hNG4O?&pWpOM}!Uk1IQ(a#kWuJRLo96dmgx@W#h>2#h zk4nHYA&8vs$D`g3206ZZdGoD{_0m>k?(s&!4rVlD1DG8u-5YvvnH)0K{g)h?%AMfA zYLzXj>9Zoh%DQGPhJl-3iXZ0a;bxH-rB&pc?9&4L7mxxxj^pgIm6F6{6r+F00ixhgvFYYL#KZ%ZJq=4Oiw)4Gl z<6k)=SG;%95ZdF5r&I-CuMCnB`P&@x1GwT-5Kt^Q#-w)w&F_z-nQ#s~$iq+z`oa!> zGXJ3gXBYQ9GirN7?T>x^M%RMXXqo zth2+TFn_rBl6@c(CX*rmKo)8kipck?!4t%D7PVgLfAi%_cd_x#9(DD$ zpGJvcb$f(E2G!}-Z+Y}(iJrc~OdgosSA|iPQPu3YTh>x)B9A&9K#2U3-7B{AjxFJQ zZ^SHU)M2`VKLU}zn*X#J0ox!JS{NM`2{WLW9CMc=e@A})i9a&K%*|=k`^7eWZr@Ng zTF&b186bb=P_?I~lxi>$p` z8Lo&_tm`B+U|~qzfI)_X?L2-REQJtAj&xGSGuD&%oI6p2hidxcX~u^(Jh zX4cXb;$`eLQRl)Yh8XJ@#SQ(V^pcqg2rmwsF4#-|IIH*;%pR5|_TrI{AZ?3r*h@MG zV+EKh{82!aj~=SvMG6XDHv>SyEAGct!E5y1WzID->UyxOe@raW89y9@@q_7%Cq4

#gs5-3G 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 literal 0 HcmV?d00001 diff --git a/kubernetes_platform/Makefile b/kubernetes_platform/Makefile index c84a6400f93f..5a7ab0fc3139 100644 --- a/kubernetes_platform/Makefile +++ b/kubernetes_platform/Makefile @@ -12,7 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -PREBUILT_REMOTE_IMAGE=gcr.io/ml-pipeline-test/api-generator:latest +PREBUILT_REMOTE_IMAGE=ghcr.io/kubeflow/kfp-api-generator:1.0 .PHONY: all all: golang python diff --git a/manifests/gcp_marketplace/chart/kubeflow-pipelines/templates/application.yaml b/manifests/gcp_marketplace/chart/kubeflow-pipelines/templates/application.yaml index 02fecf36fba4..ed7b566c6d30 100644 --- a/manifests/gcp_marketplace/chart/kubeflow-pipelines/templates/application.yaml +++ b/manifests/gcp_marketplace/chart/kubeflow-pipelines/templates/application.yaml @@ -12,7 +12,7 @@ metadata: spec: descriptor: type: Kubeflow Pipelines - version: 2.3.0 + version: 2.4.0 description: |- Reusable end-to-end ML workflow maintainers: diff --git a/manifests/gcp_marketplace/schema.yaml b/manifests/gcp_marketplace/schema.yaml index 7be834a0473b..702c69e43f86 100644 --- a/manifests/gcp_marketplace/schema.yaml +++ b/manifests/gcp_marketplace/schema.yaml @@ -1,9 +1,9 @@ x-google-marketplace: schemaVersion: v2 applicationApiVersion: v1beta1 - publishedVersion: 2.3.0 + publishedVersion: 2.4.0 publishedVersionMetadata: - releaseNote: Based on 2.3.0 version. + releaseNote: Based on 2.4.0 version. releaseTypes: - Feature recommended: false diff --git a/manifests/kustomize/base/cache-deployer/cache-deployer-deployment.yaml b/manifests/kustomize/base/cache-deployer/cache-deployer-deployment.yaml index d4c3ae3a8678..98b4e370a828 100644 --- a/manifests/kustomize/base/cache-deployer/cache-deployer-deployment.yaml +++ b/manifests/kustomize/base/cache-deployer/cache-deployer-deployment.yaml @@ -18,7 +18,7 @@ spec: spec: containers: - name: main - image: gcr.io/ml-pipeline/cache-deployer:dummy + image: ghcr.io/kubeflow/kfp-cache-deployer:dummy imagePullPolicy: Always env: - name: NAMESPACE_TO_WATCH diff --git a/manifests/kustomize/base/cache-deployer/kustomization.yaml b/manifests/kustomize/base/cache-deployer/kustomization.yaml index c34e0e80acdd..1d93aff21ccf 100644 --- a/manifests/kustomize/base/cache-deployer/kustomization.yaml +++ b/manifests/kustomize/base/cache-deployer/kustomization.yaml @@ -7,5 +7,5 @@ resources: commonLabels: app: cache-deployer images: - - name: gcr.io/ml-pipeline/cache-deployer - newTag: 2.3.0 + - name: ghcr.io/kubeflow/kfp-cache-deployer + newTag: 2.4.0 diff --git a/manifests/kustomize/base/cache/cache-deployment.yaml b/manifests/kustomize/base/cache/cache-deployment.yaml index 866cddb74c43..75289c89126e 100644 --- a/manifests/kustomize/base/cache/cache-deployment.yaml +++ b/manifests/kustomize/base/cache/cache-deployment.yaml @@ -26,7 +26,7 @@ spec: capabilities: drop: - ALL - image: gcr.io/ml-pipeline/cache-server:dummy + image: ghcr.io/kubeflow/kfp-cache-server:dummy env: - name: DEFAULT_CACHE_STALENESS valueFrom: diff --git a/manifests/kustomize/base/cache/kustomization.yaml b/manifests/kustomize/base/cache/kustomization.yaml index e530e519d65d..29776a6feea0 100644 --- a/manifests/kustomize/base/cache/kustomization.yaml +++ b/manifests/kustomize/base/cache/kustomization.yaml @@ -9,5 +9,5 @@ resources: commonLabels: app: cache-server images: - - name: gcr.io/ml-pipeline/cache-server - newTag: 2.3.0 + - name: ghcr.io/kubeflow/kfp-cache-server + newTag: 2.4.0 diff --git a/manifests/kustomize/base/installs/generic/pipeline-install-config.yaml b/manifests/kustomize/base/installs/generic/pipeline-install-config.yaml index 8f0c72086cbc..6a5acf2e4a15 100644 --- a/manifests/kustomize/base/installs/generic/pipeline-install-config.yaml +++ b/manifests/kustomize/base/installs/generic/pipeline-install-config.yaml @@ -11,7 +11,7 @@ data: until the changes take effect. A quick way to restart all deployments in a namespace: `kubectl rollout restart deployment -n `. appName: pipeline - appVersion: 2.3.0 + appVersion: 2.4.0 dbHost: mysql # relic to be removed after release dbPort: "3306" # relic to be removed after release dbType: mysql diff --git a/manifests/kustomize/base/installs/multi-user/pipelines-profile-controller/sync.py b/manifests/kustomize/base/installs/multi-user/pipelines-profile-controller/sync.py index 031a3fa268b7..e01f75b66b8f 100644 --- a/manifests/kustomize/base/installs/multi-user/pipelines-profile-controller/sync.py +++ b/manifests/kustomize/base/installs/multi-user/pipelines-profile-controller/sync.py @@ -36,9 +36,9 @@ def get_settings_from_env(controller_port=None, Settings are pulled from the all-caps version of the setting name. The following defaults are used if those environment variables are not set to enable backwards compatibility with previous versions of this script: - visualization_server_image: gcr.io/ml-pipeline/visualization-server + visualization_server_image: ghcr.io/kubeflow/kfp-visualization-server visualization_server_tag: value of KFP_VERSION environment variable - frontend_image: gcr.io/ml-pipeline/frontend + frontend_image: ghcr.io/kubeflow/kfp-frontend frontend_tag: value of KFP_VERSION environment variable disable_istio_sidecar: Required (no default) minio_access_key: Required (no default) @@ -51,11 +51,11 @@ def get_settings_from_env(controller_port=None, settings["visualization_server_image"] = \ visualization_server_image or \ - os.environ.get("VISUALIZATION_SERVER_IMAGE", "gcr.io/ml-pipeline/visualization-server") + os.environ.get("VISUALIZATION_SERVER_IMAGE", "ghcr.io/kubeflow/kfp-visualization-server") settings["frontend_image"] = \ frontend_image or \ - os.environ.get("FRONTEND_IMAGE", "gcr.io/ml-pipeline/frontend") + os.environ.get("FRONTEND_IMAGE", "ghcr.io/kubeflow/kfp-frontend") # Look for specific tags for each image first, falling back to # previously used KFP_VERSION environment variable for backwards diff --git a/manifests/kustomize/base/installs/multi-user/pipelines-profile-controller/test_sync.py b/manifests/kustomize/base/installs/multi-user/pipelines-profile-controller/test_sync.py index 50362d60fdb6..7fb504f62593 100644 --- a/manifests/kustomize/base/installs/multi-user/pipelines-profile-controller/test_sync.py +++ b/manifests/kustomize/base/installs/multi-user/pipelines-profile-controller/test_sync.py @@ -49,8 +49,8 @@ DATA_MISSING_PIPELINE_ENABLED = {"parent": {}, "children": {}} # Default values when environments are not explicit -DEFAULT_FRONTEND_IMAGE = "gcr.io/ml-pipeline/frontend" -DEFAULT_VISUALIZATION_IMAGE = "gcr.io/ml-pipeline/visualization-server" +DEFAULT_FRONTEND_IMAGE = "ghcr.io/kubeflow/kfp-frontend" +DEFAULT_VISUALIZATION_IMAGE = "ghcr.io/kubeflow/kfp-visualization-server" # Variables used for environment variable sets VISUALIZATION_SERVER_IMAGE = "vis-image" diff --git a/manifests/kustomize/base/installs/multi-user/scheduled-workflow/cluster-role.yaml b/manifests/kustomize/base/installs/multi-user/scheduled-workflow/cluster-role.yaml index fd868eaad075..45a10bb45eca 100644 --- a/manifests/kustomize/base/installs/multi-user/scheduled-workflow/cluster-role.yaml +++ b/manifests/kustomize/base/installs/multi-user/scheduled-workflow/cluster-role.yaml @@ -15,6 +15,12 @@ rules: - update - patch - delete +- apiGroups: + - pipelines.kubeflow.org + resources: + - runs + verbs: + - create - apiGroups: - kubeflow.org resources: diff --git a/manifests/kustomize/base/metadata/base/kustomization.yaml b/manifests/kustomize/base/metadata/base/kustomization.yaml index 178e86751cf2..5d3428b65635 100644 --- a/manifests/kustomize/base/metadata/base/kustomization.yaml +++ b/manifests/kustomize/base/metadata/base/kustomization.yaml @@ -9,5 +9,5 @@ resources: - metadata-envoy-service.yaml - metadata-grpc-sa.yaml images: - - name: gcr.io/ml-pipeline/metadata-envoy - newTag: 2.3.0 + - name: ghcr.io/kubeflow/kfp-metadata-envoy + newTag: 2.4.0 diff --git a/manifests/kustomize/base/metadata/base/metadata-envoy-deployment.yaml b/manifests/kustomize/base/metadata/base/metadata-envoy-deployment.yaml index 32ef611aebbf..3192d840d34e 100644 --- a/manifests/kustomize/base/metadata/base/metadata-envoy-deployment.yaml +++ b/manifests/kustomize/base/metadata/base/metadata-envoy-deployment.yaml @@ -18,7 +18,7 @@ spec: spec: containers: - name: container - image: gcr.io/ml-pipeline/metadata-envoy:dummy + image: ghcr.io/kubeflow/kfp-metadata-envoy:dummy ports: - name: md-envoy containerPort: 9090 diff --git a/manifests/kustomize/base/pipeline/kustomization.yaml b/manifests/kustomize/base/pipeline/kustomization.yaml index ce93725b61db..ae1a54621720 100644 --- a/manifests/kustomize/base/pipeline/kustomization.yaml +++ b/manifests/kustomize/base/pipeline/kustomization.yaml @@ -35,15 +35,15 @@ resources: - viewer-sa.yaml - kfp-launcher-configmap.yaml images: - - name: gcr.io/ml-pipeline/api-server - newTag: 2.3.0 - - name: gcr.io/ml-pipeline/persistenceagent - newTag: 2.3.0 - - name: gcr.io/ml-pipeline/scheduledworkflow - newTag: 2.3.0 - - name: gcr.io/ml-pipeline/frontend - newTag: 2.3.0 - - name: gcr.io/ml-pipeline/viewer-crd-controller - newTag: 2.3.0 - - name: gcr.io/ml-pipeline/visualization-server - newTag: 2.3.0 + - name: ghcr.io/kubeflow/kfp-api-server + newTag: 2.4.0 + - name: ghcr.io/kubeflow/kfp-persistence-agent + newTag: 2.4.0 + - name: ghcr.io/kubeflow/kfp-scheduled-workflow-controller + newTag: 2.4.0 + - name: ghcr.io/kubeflow/kfp-frontend + newTag: 2.4.0 + - name: ghcr.io/kubeflow/kfp-viewer-crd-controller + newTag: 2.4.0 + - name: ghcr.io/kubeflow/kfp-visualization-server + newTag: 2.4.0 diff --git a/manifests/kustomize/base/pipeline/metadata-writer/kustomization.yaml b/manifests/kustomize/base/pipeline/metadata-writer/kustomization.yaml index 97d46f3de39f..d11d47afca2f 100644 --- a/manifests/kustomize/base/pipeline/metadata-writer/kustomization.yaml +++ b/manifests/kustomize/base/pipeline/metadata-writer/kustomization.yaml @@ -6,5 +6,5 @@ resources: - metadata-writer-rolebinding.yaml - metadata-writer-sa.yaml images: - - name: gcr.io/ml-pipeline/metadata-writer - newTag: 2.3.0 + - name: ghcr.io/kubeflow/kfp-metadata-writer + newTag: 2.4.0 diff --git a/manifests/kustomize/base/pipeline/metadata-writer/metadata-writer-deployment.yaml b/manifests/kustomize/base/pipeline/metadata-writer/metadata-writer-deployment.yaml index 6e9f41e5f9b0..60408441ecb5 100644 --- a/manifests/kustomize/base/pipeline/metadata-writer/metadata-writer-deployment.yaml +++ b/manifests/kustomize/base/pipeline/metadata-writer/metadata-writer-deployment.yaml @@ -16,7 +16,7 @@ spec: spec: containers: - name: main - image: gcr.io/ml-pipeline/metadata-writer:dummy + image: ghcr.io/kubeflow/kfp-metadata-writer:dummy env: - name: NAMESPACE_TO_WATCH valueFrom: diff --git a/manifests/kustomize/base/pipeline/ml-pipeline-apiserver-deployment.yaml b/manifests/kustomize/base/pipeline/ml-pipeline-apiserver-deployment.yaml index 244d9e07b10c..1346314f7adf 100644 --- a/manifests/kustomize/base/pipeline/ml-pipeline-apiserver-deployment.yaml +++ b/manifests/kustomize/base/pipeline/ml-pipeline-apiserver-deployment.yaml @@ -109,7 +109,7 @@ spec: secretKeyRef: name: mlpipeline-minio-artifact key: secretkey - image: gcr.io/ml-pipeline/api-server:dummy + image: ghcr.io/kubeflow/kfp-api-server:dummy imagePullPolicy: IfNotPresent name: ml-pipeline-api-server ports: diff --git a/manifests/kustomize/base/pipeline/ml-pipeline-persistenceagent-deployment.yaml b/manifests/kustomize/base/pipeline/ml-pipeline-persistenceagent-deployment.yaml index 31a3d66a82d2..7d92df0b00e0 100644 --- a/manifests/kustomize/base/pipeline/ml-pipeline-persistenceagent-deployment.yaml +++ b/manifests/kustomize/base/pipeline/ml-pipeline-persistenceagent-deployment.yaml @@ -27,7 +27,7 @@ spec: value: "2" - name: LOG_LEVEL value: "info" - image: gcr.io/ml-pipeline/persistenceagent:dummy + image: ghcr.io/kubeflow/kfp-persistence-agent:dummy imagePullPolicy: IfNotPresent name: ml-pipeline-persistenceagent resources: diff --git a/manifests/kustomize/base/pipeline/ml-pipeline-scheduledworkflow-deployment.yaml b/manifests/kustomize/base/pipeline/ml-pipeline-scheduledworkflow-deployment.yaml index 5c5a05df80fb..6bec64a139a5 100644 --- a/manifests/kustomize/base/pipeline/ml-pipeline-scheduledworkflow-deployment.yaml +++ b/manifests/kustomize/base/pipeline/ml-pipeline-scheduledworkflow-deployment.yaml @@ -16,7 +16,7 @@ spec: cluster-autoscaler.kubernetes.io/safe-to-evict: "true" spec: containers: - - image: gcr.io/ml-pipeline/scheduledworkflow:dummy + - image: ghcr.io/kubeflow/kfp-scheduled-workflow-controller:dummy imagePullPolicy: IfNotPresent name: ml-pipeline-scheduledworkflow env: @@ -41,4 +41,15 @@ spec: capabilities: drop: - ALL + volumeMounts: + - mountPath: /var/run/secrets/kubeflow/tokens + name: scheduledworkflow-sa-token serviceAccountName: ml-pipeline-scheduledworkflow + volumes: + - name: scheduledworkflow-sa-token + projected: + sources: + - serviceAccountToken: + path: scheduledworkflow-sa-token + expirationSeconds: 3600 + audience: pipelines.kubeflow.org diff --git a/manifests/kustomize/base/pipeline/ml-pipeline-scheduledworkflow-role.yaml b/manifests/kustomize/base/pipeline/ml-pipeline-scheduledworkflow-role.yaml index 36729d74ed34..c6f4918f1d8e 100644 --- a/manifests/kustomize/base/pipeline/ml-pipeline-scheduledworkflow-role.yaml +++ b/manifests/kustomize/base/pipeline/ml-pipeline-scheduledworkflow-role.yaml @@ -30,6 +30,12 @@ rules: - update - patch - delete +- apiGroups: + - pipelines.kubeflow.org + resources: + - runs + verbs: + - create - apiGroups: - '' resources: diff --git a/manifests/kustomize/base/pipeline/ml-pipeline-ui-deployment.yaml b/manifests/kustomize/base/pipeline/ml-pipeline-ui-deployment.yaml index be27565c94b0..82bfd6736b45 100644 --- a/manifests/kustomize/base/pipeline/ml-pipeline-ui-deployment.yaml +++ b/manifests/kustomize/base/pipeline/ml-pipeline-ui-deployment.yaml @@ -20,7 +20,7 @@ spec: configMap: name: ml-pipeline-ui-configmap containers: - - image: gcr.io/ml-pipeline/frontend:dummy + - image: ghcr.io/kubeflow/kfp-frontend:dummy imagePullPolicy: IfNotPresent name: ml-pipeline-ui ports: @@ -62,6 +62,10 @@ spec: valueFrom: fieldRef: fieldPath: metadata.namespace + - name: ARGO_ARCHIVE_LOGS + value: "true" + - name: DISABLE_GKE_METADATA + value: "true" readinessProbe: exec: command: diff --git a/manifests/kustomize/base/pipeline/ml-pipeline-viewer-crd-deployment.yaml b/manifests/kustomize/base/pipeline/ml-pipeline-viewer-crd-deployment.yaml index fba7ec62e79d..9370ed9c51f8 100644 --- a/manifests/kustomize/base/pipeline/ml-pipeline-viewer-crd-deployment.yaml +++ b/manifests/kustomize/base/pipeline/ml-pipeline-viewer-crd-deployment.yaml @@ -16,7 +16,7 @@ spec: cluster-autoscaler.kubernetes.io/safe-to-evict: "true" spec: containers: - - image: gcr.io/ml-pipeline/viewer-crd-controller:dummy + - image: ghcr.io/kubeflow/kfp-viewer-crd-controller:dummy imagePullPolicy: Always name: ml-pipeline-viewer-crd env: diff --git a/manifests/kustomize/base/pipeline/ml-pipeline-visualization-deployment.yaml b/manifests/kustomize/base/pipeline/ml-pipeline-visualization-deployment.yaml index 095c74dc4dec..dc10badc46ef 100644 --- a/manifests/kustomize/base/pipeline/ml-pipeline-visualization-deployment.yaml +++ b/manifests/kustomize/base/pipeline/ml-pipeline-visualization-deployment.yaml @@ -16,7 +16,7 @@ spec: cluster-autoscaler.kubernetes.io/safe-to-evict: "true" spec: containers: - - image: gcr.io/ml-pipeline/visualization-server:dummy + - image: ghcr.io/kubeflow/kfp-visualization-server:dummy imagePullPolicy: IfNotPresent name: ml-pipeline-visualizationserver ports: diff --git a/manifests/kustomize/env/gcp/inverse-proxy/kustomization.yaml b/manifests/kustomize/env/gcp/inverse-proxy/kustomization.yaml index ff2bb2105810..67d97fc14de3 100644 --- a/manifests/kustomize/env/gcp/inverse-proxy/kustomization.yaml +++ b/manifests/kustomize/env/gcp/inverse-proxy/kustomization.yaml @@ -1,8 +1,8 @@ apiVersion: kustomize.config.k8s.io/v1beta1 kind: Kustomization images: - - name: gcr.io/ml-pipeline/inverse-proxy-agent - newTag: 2.3.0 + - name: ghcr.io/kubeflow/kfp-inverse-proxy-agent + newTag: 2.4.0 resources: - proxy-configmap.yaml - proxy-deployment.yaml diff --git a/manifests/kustomize/env/gcp/inverse-proxy/proxy-deployment.yaml b/manifests/kustomize/env/gcp/inverse-proxy/proxy-deployment.yaml index faf3e4730982..ef73ceeedcd0 100644 --- a/manifests/kustomize/env/gcp/inverse-proxy/proxy-deployment.yaml +++ b/manifests/kustomize/env/gcp/inverse-proxy/proxy-deployment.yaml @@ -15,7 +15,7 @@ spec: spec: hostNetwork: true containers: - - image: gcr.io/ml-pipeline/inverse-proxy-agent:dummy + - image: ghcr.io/kubeflow/kfp-inverse-proxy-agent:dummy imagePullPolicy: IfNotPresent name: proxy-agent serviceAccountName: proxy-agent-runner diff --git a/proposals/0000-kep-process/README.md b/proposals/0000-kep-process/README.md new file mode 100644 index 000000000000..6bba3144a303 --- /dev/null +++ b/proposals/0000-kep-process/README.md @@ -0,0 +1,150 @@ +# KEP-0000: Use KEPs to Propose and Document Enhancements to Kubeflow + + +- [KEP-0000: Use KEPs to Propose and Document Enhancements to Kubeflow](#kep-0000-use-keps-to-propose-and-document-enhancements-to-kubeflow) + - [Summary](#summary) + - [Motivation](#motivation) + - [Goals](#goals) + - [Non-Goals](#non-goals) + - [Proposal](#proposal) + - [Reference-Level Explanation](#reference-level-explanation) + - [What Type of Work Should Be Tracked by a KEP](#what-type-of-work-should-be-tracked-by-a-kep) + - [KEP Workflow](#kep-workflow) + - [Git and GitHub Implementation](#git-and-github-implementation) + - [KEP Editor Role](#kep-editor-role) + - [Prior Art](#prior-art) + - [Alternatives](#alternatives) + + +## Summary + +A standardized development process for Kubeflow Pipelines is proposed, in order to: + +- provide a common structure for proposing changes to Kubeflow Pipelines +- ensure that the motivation for a change is clear +- allow for the enumeration of stability milestones and stability graduation + criteria +- persist project information in a Version Control System (VCS) for future + contributors +- support the creation of _high-value, user-facing_ information such as: + - an overall project development roadmap + - motivation for impactful user-facing changes +- reserve GitHub issues for tracking work in flight, instead of creating "umbrella" + issues +- ensure community participants can successfully drive changes to + completion across one or more releases while stakeholders are adequately + represented throughout the process + +This process is supported by a unit of work of the Kubernetes Enhancement Proposal format, or KEP for short. +A KEP attempts to combine aspects of + +- a feature, and effort-tracking document +- a product requirements document +- a design document + +into one file. + +We are proposing usage of KEPs in Kubeflow Pipelines to be better aligne with the rest of Kubeflow, as well as the wider Kubernetes community. + +This proposal takes heavy inspiration from the [Kubernetes KEP Proposal](https://github.com/kubernetes/enhancements/blob/master/keps/sig-architecture/0000-kep-process/README.md) + +## Motivation + +Documenting proposals and enhancements are critical in managing the complexity and longevity of software projects. + +Some examples include: + +1. Capturing the "why" behind critical architectural choices, not just the what. + 1. This helps current and future team members understand the reasoning behind decisions, particularly when the rationale is no longer obvious. +2. Improve Communication and Collaboration. +3. Serve as a single source of truth for architectural decisions. +4. By documenting options and their trade-offs, KEPs encourage structured decision-making and transparency. +5. Enable Traceability +6. Create a decision history that allows new (and old) contributors to trace architectural choices back to their original context, assumptions, and goals + +### Goals + +- Capture the Why Behind Decisions +- Foster Clear Communication +- Enable Decision Traceability +- Encourage Thoughtful, Deliberate Decisions +- Preserve Institutional Knowledge + +### Non-Goals + +- Not a substitute for technical or user documentation +- Not a substitute or replacement for meaningful commit messages + +## Proposal + +A KEP is broken into sections which can be merged into source control +incrementally in order to support an iterative development process. The KEP process +is intended to create high-quality, uniform design and implementation documents +for maintainers to deliberate. Contributors proposing new KEPs should create a copy of the [template directory](../NNNN-kep-template/) and proceed as per the instructions in the template. + +## Reference-Level Explanation + +### What Type of Work Should Be Tracked by a KEP + +Roughly any user or operator facing enhancement should follow the KEP process. +If an enhancement would be described in either written or verbal communication +to anyone besides the KEP author or developer, then consider creating a KEP. + +Similarly, any technical effort (refactoring, major architectural change) that +will impact a large section of the development community should also be +communicated widely. The KEP process is suited for this even if it will have +zero impact on the typical user or operator. + +### KEP Workflow + +A KEP has the following states: + +- `provisional`: The KEP has been proposed and is actively being defined. + This is the starting state while the KEP is being fleshed out and actively defined and discussed. + The owning SIG has accepted that this work must be done. +- `implementable`: The approvers have approved this KEP for implementation. +- `implemented`: The KEP has been implemented and is no longer actively changed. +- `deferred`: The KEP is proposed but not actively being worked on. +- `rejected`: The approvers and authors have decided that this KEP is not moving forward. + The KEP is kept around as a historical document. +- `withdrawn`: The authors have withdrawn the KEP. +- `replaced`: The KEP has been replaced by a new KEP. + The `superseded-by` metadata value should point to the new KEP. + +### Git and GitHub Implementation + +KEPs are checked into the pipelines repo under the `/proposals` directory. + +New KEPs can be checked in with a file name in the form of `draft-YYYYMMDD-my-title.md`. +As significant work is done on the KEP, the authors can assign a KEP number. +No other changes should be put in that PR so that it can be approved quickly and minimize merge conflicts. +The KEP number can also be done as part of the initial submission if the PR is likely to be uncontested and merged quickly. + +### KEP Editor Role + +Taking a cue from the [Kubernetes KEP process](https://github.com/kubernetes/enhancements/blob/master/keps/sig-architecture/0000-kep-process/README.md) and [Python PEP process][], we define the role of a KEP editor. +The job of an KEP editor is likely very similar to the [PEP editor responsibilities][] and will hopefully provide another opportunity for people who do not write code daily to contribute to Kubernetes. + +In keeping with the PEP editors, who: + +> Read the PEP to check if it is ready: sound and complete. The ideas must make +> technical sense, even if they don't seem likely to be accepted. +> The title should accurately describe the content. +> Edit the PEP for language (spelling, grammar, sentence structure, etc.), markup +> (for reST PEPs), code style (examples should match PEP 8 & 7) + +KEP editors should generally not pass judgement on a KEP beyond editorial corrections. +KEP editors can also help inform authors about the process and otherwise help things move smoothly. + +[Python PEP process]: https://www.python.org/dev/peps/pep-0001/ +[PEP editor responsibilities]: https://www.python.org/dev/peps/pep-0001/#pep-editor-responsibilities-workflow + +### Prior Art + +Our usage of the KEP process (and most of this file) is almost entirely based on the +[Kubernetes KEP Process](https://github.com/kubernetes/enhancements/blob/master/keps/sig-architecture/0000-kep-process/README.md) + +## Alternatives + +Kubeflow Pipelines was previously using [ADRs](https://github.com/joelparkerhenderson/architecture-decision-record?tab=readme-ov-file#what-is-an-architecture-decision-record). However, we have elected to switch over to using KEPs so as to be better aligned with the +wider Kubeflow community diff --git a/proposals/NNNN-kep-template/README.md b/proposals/NNNN-kep-template/README.md new file mode 100644 index 000000000000..754909aa08c4 --- /dev/null +++ b/proposals/NNNN-kep-template/README.md @@ -0,0 +1,237 @@ +# KEP-NNNN: Your short, descriptive title + + + + + + +- [KEP-NNNN: Your short, descriptive title](#kep-nnnn-your-short-descriptive-title) + - [Summary](#summary) + - [Motivation](#motivation) + - [Goals](#goals) + - [Non-Goals](#non-goals) + - [Proposal](#proposal) + - [User Stories (Optional)](#user-stories-optional) + - [Story 1](#story-1) + - [Story 2](#story-2) + - [Notes/Constraints/Caveats (Optional)](#notesconstraintscaveats-optional) + - [Risks and Mitigations](#risks-and-mitigations) + - [Design Details](#design-details) + - [Test Plan](#test-plan) + - [Prerequisite testing updates](#prerequisite-testing-updates) + - [Unit Tests](#unit-tests) + - [Integration tests](#integration-tests) + - [Graduation Criteria](#graduation-criteria) + - [Implementation History](#implementation-history) + - [Drawbacks](#drawbacks) + - [Alternatives](#alternatives) + + +## Summary + + + +## Motivation + + + +### Goals + + + +### Non-Goals + + + +## Proposal + + + +### User Stories (Optional) + + + +#### Story 1 + +#### Story 2 + +### Notes/Constraints/Caveats (Optional) + + + +### Risks and Mitigations + + + +## Design Details + + + +### Test Plan + + + +[ ] I/we understand the owners of the involved components may require updates to +existing tests to make this code solid enough prior to committing the changes necessary +to implement this enhancement. + +#### Prerequisite testing updates + + + +#### Unit Tests + + + + + +- ``: `` - `` + +#### Integration tests + + + +### Graduation Criteria + + + +## Implementation History + + + +## Drawbacks + + + +## Alternatives + + diff --git a/samples/test/utils/kfp/samples/test/utils.py b/samples/test/utils/kfp/samples/test/utils.py index 0005f678d9b5..2cb18c29ba26 100644 --- a/samples/test/utils/kfp/samples/test/utils.py +++ b/samples/test/utils/kfp/samples/test/utils.py @@ -205,8 +205,7 @@ def main( ): """Test file CLI entrypoint used by Fire. To configure KFP endpoint, configure env vars following: - https://www.kubeflow.org/docs/components/pipelines/sdk/connect- - api/#configure-sdk-client-by-environment-variables. KFP UI endpoint can + https://www.kubeflow.org/docs/components/pipelines/user-guides/core-functions/connect-api/#configure-sdk-client-by-environment-variables. KFP UI endpoint can be configured by KF_PIPELINES_UI_ENDPOINT env var. :param pipeline_root: pipeline root that holds intermediate diff --git a/samples/v2/Makefile b/samples/v2/Makefile index e348b64fc32b..72015474d2b8 100644 --- a/samples/v2/Makefile +++ b/samples/v2/Makefile @@ -16,12 +16,12 @@ .PHONY: all all: @for f in $$(find . -name "*.py"); do \ - compiled="$${f%.*}_pipeline.json"; \ + compiled="$${f%.*}_pipeline.yaml"; \ echo "compiling $${f} to $${compiled}"; \ - dsl-compile-v2 --py "$${f}" --out $${compiled}""; \ + kfp dsl compile --py "$${f}" --output $${compiled}""; \ done # clean up all genereated pipeline job JSON files .PHONY: clean clean: - @find . -name "*.json" -exec rm {} \; + @find . -name "*.yaml" -exec rm {} \; diff --git a/samples/v2/pipeline_with_volume_no_cache.py b/samples/v2/pipeline_with_volume_no_cache.py new file mode 100644 index 000000000000..762d8efa66d6 --- /dev/null +++ b/samples/v2/pipeline_with_volume_no_cache.py @@ -0,0 +1,68 @@ +# Copyright 2023 The Kubeflow Authors +# +# 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. +"""Pipeline with no caching on volume creation, mount and deletion in v2 engine pipeline.""" +from kfp import dsl +from kfp import kubernetes + + +@dsl.component +def producer() -> str: + with open('/data/file.txt', 'w') as file: + file.write('Hello world') + with open('/data/file.txt', 'r') as file: + content = file.read() + print(content) + return content + + +@dsl.component +def consumer() -> str: + with open('/data/file.txt', 'r') as file: + content = file.read() + print(content) + return content + + +@dsl.pipeline +def pipeline_with_volume_no_cache(): + pvc1 = kubernetes.CreatePVC( + pvc_name_suffix='-my-pvc', + access_modes=['ReadWriteOnce'], + size='5Mi', + storage_class_name='standard', + ).set_caching_options(False) + + task1 = producer() + task2 = consumer().after(task1) + + kubernetes.mount_pvc( + task1, + pvc_name=pvc1.outputs['name'], + mount_path='/data', + ) + kubernetes.mount_pvc( + task2, + pvc_name=pvc1.outputs['name'], + mount_path='/data', + ) + + delete_pvc1 = kubernetes.DeletePVC( + pvc_name=pvc1.outputs['name']).after(task2).set_caching_options(False) + +if __name__ == '__main__': + # execute only if run as a script + from kfp import compiler + compiler.Compiler().compile( + pipeline_func=pipeline_with_volume, + package_path='pipeline_with_volume.json') \ No newline at end of file diff --git a/samples/v2/pipeline_with_volume_no_cache_test.py b/samples/v2/pipeline_with_volume_no_cache_test.py new file mode 100644 index 000000000000..b14caf73c4f7 --- /dev/null +++ b/samples/v2/pipeline_with_volume_no_cache_test.py @@ -0,0 +1,37 @@ +# Copyright 2021 The Kubeflow Authors +# +# 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. +from __future__ import annotations + +import unittest + +from kfp.samples.test.utils import KfpTask +from kfp.samples.test.utils import run_pipeline_func +from kfp.samples.test.utils import TestCase +import kfp_server_api + +from .pipeline_with_volume import pipeline_with_volume_no_cache + + +def verify(t: unittest.TestCase, run: kfp_server_api.ApiRun, + tasks: dict[str, KfpTask], **kwargs): + t.assertEqual(run.status, 'Succeeded') + + +if __name__ == '__main__': + run_pipeline_func([ + TestCase( + pipeline_func=pipeline_with_volume_no_cache, + verify_func=verify, + ), + ]) diff --git a/sdk/python/kfp/cli/utils/parsing_test.py b/sdk/python/kfp/cli/utils/parsing_test.py index 84eeef54741c..fa7588aace8c 100644 --- a/sdk/python/kfp/cli/utils/parsing_test.py +++ b/sdk/python/kfp/cli/utils/parsing_test.py @@ -128,7 +128,7 @@ def test_multiline(self): self.assertEqual( host_descr, - "Host name to use to talk to Kubeflow Pipelines. If not set, the in-cluster service DNS name will be used, which only works if the current environment is a pod in the same cluster (such as a Jupyter instance spawned by Kubeflow's JupyterHub). (`More information on connecting. `_)" + "Host name to use to talk to Kubeflow Pipelines. If not set, the in-cluster service DNS name will be used, which only works if the current environment is a pod in the same cluster (such as a Jupyter instance spawned by Kubeflow's JupyterHub). (`More information on connecting. `_)" ) diff --git a/sdk/python/kfp/client/client.py b/sdk/python/kfp/client/client.py index f88972363433..e4eba40a5f2e 100644 --- a/sdk/python/kfp/client/client.py +++ b/sdk/python/kfp/client/client.py @@ -105,7 +105,7 @@ class Client: host: Host name to use to talk to Kubeflow Pipelines. If not set, the in-cluster service DNS name will be used, which only works if the current environment is a pod in the same cluster (such as a - Jupyter instance spawned by Kubeflow's JupyterHub). (`More information on connecting. `_) + Jupyter instance spawned by Kubeflow's JupyterHub). (`More information on connecting. `_) client_id: Client ID used by Identity-Aware Proxy. namespace: Kubernetes namespace to use. Used for multi-user deployments. For single-user deployments, this should be left as ``None``. other_client_id: Client ID used to obtain the auth codes and refresh diff --git a/sdk/python/kfp/dsl/component_decorator.py b/sdk/python/kfp/dsl/component_decorator.py index f9392c14424a..c2dee355b161 100644 --- a/sdk/python/kfp/dsl/component_decorator.py +++ b/sdk/python/kfp/dsl/component_decorator.py @@ -54,7 +54,7 @@ def component(func: Optional[Callable] = None, a plain parameter, or a path to a file). base_image: Image to use when executing the Python function. It should contain a default Python interpreter that is compatible with KFP. - target_image: Image to when creating containerized components. + target_image: Image to use when creating containerized components. packages_to_install: List of packages to install before executing the Python function. These will always be installed at component runtime. pip_index_urls: Python Package Index base URLs from which to diff --git a/sdk/python/requirements.in b/sdk/python/requirements.in index 3bb3d73c57b0..7ea25b03c6c5 100644 --- a/sdk/python/requirements.in +++ b/sdk/python/requirements.in @@ -20,7 +20,7 @@ kfp-server-api>=2.1.0,<2.4.0 kubernetes>=8.0.0,<31 protobuf>=4.21.1,<5 PyYAML>=5.3,<7 -requests-toolbelt>=0.8.0,<1 +requests-toolbelt>=0.8.0,<2 tabulate>=0.8.6,<1 urllib3<2.0.0 diff --git a/sdk/python/requirements.txt b/sdk/python/requirements.txt index 7c532f43b757..65f6fa04f32e 100644 --- a/sdk/python/requirements.txt +++ b/sdk/python/requirements.txt @@ -4,25 +4,25 @@ # # pip-compile --no-emit-index-url requirements.in # -cachetools==5.4.0 +cachetools==5.5.0 # via google-auth -certifi==2024.7.4 +certifi==2024.8.30 # via # kfp-server-api # kubernetes # requests charset-normalizer==3.3.2 # via requests -click==8.1.3 +click==8.1.7 # via -r requirements.in docstring-parser==0.16 # via -r requirements.in -google-api-core==2.19.1 +google-api-core==2.19.2 # via # -r requirements.in # google-cloud-core # google-cloud-storage -google-auth==2.32.0 +google-auth==2.34.0 # via # -r requirements.in # google-api-core @@ -31,17 +31,17 @@ google-auth==2.32.0 # kubernetes google-cloud-core==2.4.1 # via google-cloud-storage -google-cloud-storage==2.18.0 +google-cloud-storage==2.18.2 # via -r requirements.in -google-crc32c==1.5.0 +google-crc32c==1.6.0 # via # google-cloud-storage # google-resumable-media -google-resumable-media==2.7.1 +google-resumable-media==2.7.2 # via google-cloud-storage -googleapis-common-protos==1.63.2 +googleapis-common-protos==1.65.0 # via google-api-core -idna==3.7 +idna==3.10 # via requests kfp-pipeline-spec==0.6.0 # via -r requirements.in @@ -55,24 +55,24 @@ oauthlib==3.2.2 # requests-oauthlib proto-plus==1.24.0 # via google-api-core -protobuf==4.25.4 +protobuf==4.25.5 # via # -r requirements.in # google-api-core # googleapis-common-protos # kfp-pipeline-spec # proto-plus -pyasn1==0.6.0 +pyasn1==0.6.1 # via # pyasn1-modules # rsa -pyasn1-modules==0.4.0 +pyasn1-modules==0.4.1 # via google-auth python-dateutil==2.9.0.post0 # via # kfp-server-api # kubernetes -pyyaml==6.0.1 +pyyaml==6.0.2 # via # -r requirements.in # kubernetes @@ -85,7 +85,7 @@ requests==2.32.3 # requests-toolbelt requests-oauthlib==2.0.0 # via kubernetes -requests-toolbelt==0.10.1 +requests-toolbelt==1.0.0 # via -r requirements.in rsa==4.9 # via google-auth @@ -96,7 +96,7 @@ six==1.16.0 # python-dateutil tabulate==0.9.0 # via -r requirements.in -urllib3==1.26.19 +urllib3==1.26.20 # via # -r requirements.in # kfp-server-api diff --git a/sdk/python/test_data/test_data_config.yaml b/sdk/python/test_data/test_data_config.yaml index 91aed116dc5d..369d4d609de0 100644 --- a/sdk/python/test_data/test_data_config.yaml +++ b/sdk/python/test_data/test_data_config.yaml @@ -86,6 +86,7 @@ pipelines: - module: pipeline_with_exit_handler name: my_pipeline execute: true + expected_state: FAILED - module: pipeline_with_env name: my_pipeline execute: true @@ -114,6 +115,7 @@ pipelines: - module: pipeline_with_multiple_exit_handlers name: my_pipeline execute: true + expected_state: FAILED - module: pipeline_with_parallelfor_parallelism name: my_pipeline execute: false diff --git a/test/README.md b/test/README.md index ec9cc7dd49f4..b68a52fbebfe 100644 --- a/test/README.md +++ b/test/README.md @@ -71,7 +71,7 @@ Tests are automatically triggered on GitHub when: GitHub Actions workflows are defined in the `.github/workflows/` directory. -### Reproducing CI Steps Locally +### Reproducing CI Steps Locally with Make Commands To replicate the steps locally: @@ -84,6 +84,10 @@ To replicate the steps locally: 3. To mimic the GitHub Actions environment, export any required environment variables found in the workflow files. +4. Install the necessary dependencies for the test by running the command `make setup-{test_name}`. The steps for setting up dependencies are defined in the `Makefile.setup.mk` file. + +5. Execute the test using command `make {test_name}` , all the test that can be run using Make commands are mentioned in `Makefile`. + * * * * * Troubleshooting diff --git a/test/frontend-integration-test/package-lock.json b/test/frontend-integration-test/package-lock.json index 9e4fcd1661e2..6843660caa2c 100644 --- a/test/frontend-integration-test/package-lock.json +++ b/test/frontend-integration-test/package-lock.json @@ -14,7 +14,7 @@ "@wdio/mocha-framework": "^8.3.0", "@wdio/selenium-standalone-service": "^8.3.2", "@wdio/spec-reporter": "^8.3.0", - "mocha": "^10.2.0", + "mocha": "^10.8.2", "wait-port": "^1.0.4", "webdriverio": "^8.3.2" } @@ -766,9 +766,9 @@ } }, "node_modules/ansi-colors": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", - "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", "engines": { "node": ">=6" } @@ -1704,9 +1704,9 @@ "integrity": "sha512-pmMDBKiRVjh0uKK6CT1WqZmM3hBVSgD+N2MrgyV1uNizAZMw4tx6i/RTc+/uCsKSCmg0xXx7arCP/OFcIwTsiQ==" }, "node_modules/diff": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", - "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz", + "integrity": "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==", "engines": { "node": ">=0.3.1" } @@ -3452,9 +3452,9 @@ } }, "node_modules/minimatch": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", - "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -3487,31 +3487,30 @@ "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==" }, "node_modules/mocha": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.2.0.tgz", - "integrity": "sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg==", + "version": "10.8.2", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.8.2.tgz", + "integrity": "sha512-VZlYo/WE8t1tstuRmqgeyBgCbJc/lEdopaa+axcKzTBJ+UIdlAB9XnmvTCAH4pwR4ElNInaedhEBmZD8iCSVEg==", "dependencies": { - "ansi-colors": "4.1.1", - "browser-stdout": "1.3.1", - "chokidar": "3.5.3", - "debug": "4.3.4", - "diff": "5.0.0", - "escape-string-regexp": "4.0.0", - "find-up": "5.0.0", - "glob": "7.2.0", - "he": "1.2.0", - "js-yaml": "4.1.0", - "log-symbols": "4.1.0", - "minimatch": "5.0.1", - "ms": "2.1.3", - "nanoid": "3.3.3", - "serialize-javascript": "6.0.0", - "strip-json-comments": "3.1.1", - "supports-color": "8.1.1", - "workerpool": "6.2.1", - "yargs": "16.2.0", - "yargs-parser": "20.2.4", - "yargs-unparser": "2.0.0" + "ansi-colors": "^4.1.3", + "browser-stdout": "^1.3.1", + "chokidar": "^3.5.3", + "debug": "^4.3.5", + "diff": "^5.2.0", + "escape-string-regexp": "^4.0.0", + "find-up": "^5.0.0", + "glob": "^8.1.0", + "he": "^1.2.0", + "js-yaml": "^4.1.0", + "log-symbols": "^4.1.0", + "minimatch": "^5.1.6", + "ms": "^2.1.3", + "serialize-javascript": "^6.0.2", + "strip-json-comments": "^3.1.1", + "supports-color": "^8.1.1", + "workerpool": "^6.5.1", + "yargs": "^16.2.0", + "yargs-parser": "^20.2.9", + "yargs-unparser": "^2.0.0" }, "bin": { "_mocha": "bin/_mocha", @@ -3519,10 +3518,41 @@ }, "engines": { "node": ">= 14.0.0" + } + }, + "node_modules/mocha/node_modules/debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/mocha/node_modules/glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mochajs" + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/ms": { @@ -3535,17 +3565,6 @@ "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==" }, - "node_modules/nanoid": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz", - "integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==", - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, "node_modules/node-fetch": { "version": "2.6.7", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", @@ -4226,17 +4245,6 @@ "minimatch": "^5.1.0" } }, - "node_modules/readdir-glob/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/readdirp": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", @@ -4645,9 +4653,9 @@ } }, "node_modules/serialize-javascript": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", - "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", "dependencies": { "randombytes": "^2.1.0" } @@ -5176,9 +5184,9 @@ } }, "node_modules/workerpool": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz", - "integrity": "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==" + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.5.1.tgz", + "integrity": "sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA==" }, "node_modules/wrap-ansi": { "version": "7.0.0", @@ -5260,9 +5268,9 @@ } }, "node_modules/yargs-parser": { - "version": "20.2.4", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", - "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", "engines": { "node": ">=10" } diff --git a/test/frontend-integration-test/package.json b/test/frontend-integration-test/package.json index 252256bc26a7..2ec61b38e886 100644 --- a/test/frontend-integration-test/package.json +++ b/test/frontend-integration-test/package.json @@ -9,7 +9,7 @@ "@wdio/mocha-framework": "^8.3.0", "@wdio/selenium-standalone-service": "^8.3.2", "@wdio/spec-reporter": "^8.3.0", - "mocha": "^10.2.0", + "mocha": "^10.8.2", "wait-port": "^1.0.4", "webdriverio": "^8.3.2" }, diff --git a/test/release/Dockerfile.release b/test/release/Dockerfile.release index 09d25adc4007..d405eabe6544 100644 --- a/test/release/Dockerfile.release +++ b/test/release/Dockerfile.release @@ -14,7 +14,7 @@ # Based on KFP backend api client generator dockerfile # Keep in sync with the version used in backend/api/Makefile -FROM gcr.io/ml-pipeline-test/api-generator@sha256:41fd3e60ba40430a4c3d87e03be817c5f63b2dfed23059ec9d6bca62ce0cc39c +FROM ghcr.io/kubeflow/kfp-api-generator:1.0 # install nvm & node 12 # Reference: https://stackoverflow.com/a/28390848 diff --git a/test/release/Makefile b/test/release/Makefile index cc3405992e1d..102fa0aa6a9e 100644 --- a/test/release/Makefile +++ b/test/release/Makefile @@ -12,7 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -REMOTE=gcr.io/ml-pipeline-test/release@sha256:ed1a4dbe536e7e161ad0d846b5681aacc0e0e7f285985cb1808c5c8987bcfeb0 +REMOTE=ghcr.io/kubeflow/kfp-release:1.0 CONTAINER_ENGINE ?= docker diff --git a/test/release/README.md b/test/release/README.md index 5d4763ba7b1f..df0fb498cb69 100644 --- a/test/release/README.md +++ b/test/release/README.md @@ -35,7 +35,7 @@ The script `./release.sh` is a wrapper The script `./bump-version-docker.sh` -1. Runs `./bump-version-in-place.sh` in gcr.io/ml-pipeline-test/release:latest image. +1. Runs `./bump-version-in-place.sh` in ghcr.io/kubeflow/kfp-release:$VERSION image. The script `./bump-version-in-place.sh` does the following: diff --git a/test/release/bump-version-docker.sh b/test/release/bump-version-docker.sh index 82190971b177..5cd4998f925f 100755 --- a/test/release/bump-version-docker.sh +++ b/test/release/bump-version-docker.sh @@ -31,7 +31,7 @@ if [[ -z "$TAG_NAME" ]]; then fi pushd "${REPO_ROOT}" -RELEASE_IMAGE=${RELEASE_IMAGE:-gcr.io/ml-pipeline-test/release@sha256:ed1a4dbe536e7e161ad0d846b5681aacc0e0e7f285985cb1808c5c8987bcfeb0} +RELEASE_IMAGE=${RELEASE_IMAGE:-ghcr.io/kubeflow/kfp-release:1.0} docker run -it --rm \ --user $(id -u):$(id -g) \ --mount type=bind,source="$(pwd)",target=/go/src/github.com/kubeflow/pipelines \ diff --git a/test/release/release.sh b/test/release/release.sh index 9984038f88ce..80323f86fba2 100755 --- a/test/release/release.sh +++ b/test/release/release.sh @@ -52,7 +52,7 @@ fi echo "Running the bump version script in cloned repo" echo -n "$TAG" > ./VERSION -PREBUILT_REMOTE_IMAGE=gcr.io/ml-pipeline-test/release@sha256:ed1a4dbe536e7e161ad0d846b5681aacc0e0e7f285985cb1808c5c8987bcfeb0 +PREBUILT_REMOTE_IMAGE=ghcr.io/kubeflow/kfp-release:1.0 pushd ./test/release make release-in-place popd diff --git a/test/sdk-execution-tests/sdk_execution_tests.py b/test/sdk-execution-tests/sdk_execution_tests.py index b05f185acbb0..2ee99fae888c 100644 --- a/test/sdk-execution-tests/sdk_execution_tests.py +++ b/test/sdk-execution-tests/sdk_execution_tests.py @@ -42,6 +42,7 @@ class TestCase: yaml_path: str function_name: str arguments: Dict[str, Any] + expected_state: str def create_test_case_parameters() -> List[TestCase]: @@ -60,6 +61,7 @@ def create_test_case_parameters() -> List[TestCase]: f'{test_case["module"]}.yaml'), function_name=test_case['name'], arguments=test_case.get('arguments'), + expected_state=test_case.get('expected_state', 'SUCCEEDED'), ) for test_case in test_group['test_cases'] if test_case['execute']) return parameters @@ -122,7 +124,7 @@ async def test(test_case: TestCase) -> None: f'Error triggering pipeline {test_case.name}.') from e api_run = await event_loop.run_in_executor(None, wait, run_result) - assert api_run.state == 'SUCCEEDED', f'Pipeline {test_case.name} ended with incorrect status: {api_run.state}. More info: {run_url}' + assert api_run.state == test_case.expected_state, f'Pipeline {test_case.name} ended with incorrect status: {api_run.state}. More info: {run_url}' if __name__ == '__main__': diff --git a/test/tools/project-cleaner/go.mod b/test/tools/project-cleaner/go.mod index 6203267e1ee2..27a2658eadea 100644 --- a/test/tools/project-cleaner/go.mod +++ b/test/tools/project-cleaner/go.mod @@ -1,12 +1,24 @@ module github.com/kubeflow/pipelines/test/tools/project-cleaner -go 1.21 +go 1.22 + +require ( + cloud.google.com/go v0.89.0 + google.golang.org/api v0.52.0 + google.golang.org/genproto v0.0.0-20210729151513-df9385d47c1b + gopkg.in/yaml.v2 v2.4.0 +) require ( - cloud.google.com/go v0.89.0 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect - golang.org/x/net v0.0.0-20210726213435-c6fcb2dbf985 // indirect - google.golang.org/api v0.52.0 // indirect - google.golang.org/genproto v0.0.0-20210729151513-df9385d47c1b // indirect - gopkg.in/yaml.v2 v2.4.0 // indirect + github.com/golang/protobuf v1.5.2 // indirect + github.com/googleapis/gax-go/v2 v2.0.5 // indirect + go.opencensus.io v0.23.0 // indirect + golang.org/x/net v0.33.0 // indirect + golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914 // indirect + golang.org/x/sys v0.28.0 // indirect + golang.org/x/text v0.21.0 // indirect + google.golang.org/appengine v1.6.7 // indirect + google.golang.org/grpc v1.39.0 // indirect + google.golang.org/protobuf v1.27.1 // indirect ) diff --git a/test/tools/project-cleaner/go.sum b/test/tools/project-cleaner/go.sum index 1c4d2e678abf..13a2e60e51a2 100644 --- a/test/tools/project-cleaner/go.sum +++ b/test/tools/project-cleaner/go.sum @@ -114,6 +114,7 @@ github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.6 h1:BKbKCqvP6I+rmFHt06ZmyQtvB8xAkWdhFyr0ZUNZcxQ= github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= @@ -147,8 +148,10 @@ github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1: github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= @@ -247,8 +250,8 @@ golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210726213435-c6fcb2dbf985 h1:4CSI6oo7cOjJKajidEljs9h+uP0rRZBPPPhcCbj5mw8= -golang.org/x/net v0.0.0-20210726213435-c6fcb2dbf985/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.33.0 h1:74SYHlV8BIgHIFC/LrYkOGIwL19eTYXQ5wc6TBuO36I= +golang.org/x/net v0.33.0/go.mod h1:HXLR5J+9DxmrqMwG9qjGCxZ+zKXxBru04zlTvWlWuN4= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -315,8 +318,9 @@ golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c h1:F1jZWGFhYfh0Ci55sIpILtKKK8p3i2/krTr0H1rg74I= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= +golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -325,8 +329,9 @@ golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.6 h1:aRYxNxv6iGQlyVaZmk6ZgYEDa+Jg18DxebPSrd6bg1M= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= +golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -384,6 +389,7 @@ golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= @@ -512,6 +518,7 @@ google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQ google.golang.org/protobuf v1.27.1 h1:SnqbnDw1V7RiZcXPx5MEeqPv2s79L9i7BJUlG/+RurQ= google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= diff --git a/test/tools/project-cleaner/main.go b/test/tools/project-cleaner/main.go index 7acd99ccd82d..97de3fd70fbc 100644 --- a/test/tools/project-cleaner/main.go +++ b/test/tools/project-cleaner/main.go @@ -19,7 +19,6 @@ import ( "encoding/json" "flag" "fmt" - "io/ioutil" "log" "os" "strings" @@ -226,7 +225,7 @@ func main() { } var r ResourceSpec - yamlFile, err := ioutil.ReadFile(*resourceSpec) + yamlFile, err := os.ReadFile(*resourceSpec) if err != nil { log.Fatalf("Error reading yaml file") } diff --git a/third_party/ml-metadata/go.mod b/third_party/ml-metadata/go.mod index 8d93804d678b..d764491d5104 100644 --- a/third_party/ml-metadata/go.mod +++ b/third_party/ml-metadata/go.mod @@ -9,8 +9,8 @@ require ( require ( github.com/golang/protobuf v1.5.2 // indirect - golang.org/x/net v0.0.0-20211216030914-fe4d6282115f // indirect - golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e // indirect - golang.org/x/text v0.3.7 // indirect + golang.org/x/net v0.33.0 // indirect + golang.org/x/sys v0.28.0 // indirect + golang.org/x/text v0.21.0 // indirect google.golang.org/genproto v0.0.0-20211221231510-d629cc9a93d5 // indirect ) diff --git a/third_party/ml-metadata/go.sum b/third_party/ml-metadata/go.sum index 28718c4664af..b28637c6bc3b 100644 --- a/third_party/ml-metadata/go.sum +++ b/third_party/ml-metadata/go.sum @@ -70,8 +70,8 @@ golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.0.0-20211216030914-fe4d6282115f h1:hEYJvxw1lSnWIl8X9ofsYMklzaDs90JI2az5YMd4fPM= -golang.org/x/net v0.0.0-20211216030914-fe4d6282115f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.33.0 h1:74SYHlV8BIgHIFC/LrYkOGIwL19eTYXQ5wc6TBuO36I= +golang.org/x/net v0.33.0/go.mod h1:HXLR5J+9DxmrqMwG9qjGCxZ+zKXxBru04zlTvWlWuN4= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -85,14 +85,14 @@ golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e h1:fLOSk5Q00efkSvAm+4xcoXD+RRmLmmulPn5I3Y9F2EM= -golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= +golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk= -golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= +golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=