From 1bffb0db542e41c645764078deb52a7e582025d9 Mon Sep 17 00:00:00 2001 From: igoroctaviano Date: Thu, 25 Nov 2021 12:15:47 -0300 Subject: [PATCH] Add bidirectional and ellipse annotations --- package-lock.json | 3695 ++++++++++------- package.json | 2 +- src/annotations/_AnnotationManager.js | 285 +- src/annotations/annotationInterface.js | 19 + src/annotations/markers/arrow.js | 8 +- src/annotations/markups/_MarkupManager.js | 111 +- .../markups/bidirectional/bidirectional.js | 397 ++ .../createAndAddShortAxisFeature.js | 40 + .../bidirectional/getDraggedHandleIndex.js | 28 + .../bidirectional/getShortAxisCoords.js | 79 + src/annotations/markups/bidirectional/id.js | 9 + .../markups/bidirectional/mathUtils.js | 188 + .../bidirectional/moveBidirectionalHandles.js | 154 + .../bidirectional/moveLongAxisEndHandle.js | 69 + .../bidirectional/moveLongAxisStartHandle.js | 69 + .../bidirectional/moveShortAxisEndHandle.js | 94 + .../bidirectional/moveShortAxisStartHandle.js | 98 + .../markups/bidirectional/updateMarkup.js | 25 + src/annotations/markups/ellipse/addFeature.js | 25 + .../ellipse/createAndAddEllipseFeature.js | 44 + .../createAndAddEllipseHandlesFeature.js | 43 + src/annotations/markups/ellipse/ellipse.js | 264 ++ .../getEllipsePolygonFromMovingLine.js | 30 + .../markups/ellipse/getFeatureById.js | 15 + .../markups/ellipse/getMeasurements.js | 78 + src/annotations/markups/ellipse/id.js | 9 + .../markups/ellipse/onSetFeatureStyle.js | 55 + .../markups/ellipse/removeFeature.js | 24 + src/annotations/markups/ellipse/styles.js | 53 + .../markups/ellipse/updateMarkup.js | 46 + src/annotations/markups/measurement.js | 71 +- src/annotations/markups/textEvaluation.js | 18 +- src/channel.js | 23 +- src/enums.js | 90 +- src/metadata.js | 34 +- src/renderingEngine.js | 18 +- src/scoord3dUtils.js | 20 +- src/utils.js | 2 +- src/viewer.js | 356 +- 39 files changed, 4782 insertions(+), 1906 deletions(-) create mode 100644 src/annotations/annotationInterface.js create mode 100644 src/annotations/markups/bidirectional/bidirectional.js create mode 100644 src/annotations/markups/bidirectional/createAndAddShortAxisFeature.js create mode 100644 src/annotations/markups/bidirectional/getDraggedHandleIndex.js create mode 100644 src/annotations/markups/bidirectional/getShortAxisCoords.js create mode 100644 src/annotations/markups/bidirectional/id.js create mode 100644 src/annotations/markups/bidirectional/mathUtils.js create mode 100644 src/annotations/markups/bidirectional/moveBidirectionalHandles.js create mode 100644 src/annotations/markups/bidirectional/moveLongAxisEndHandle.js create mode 100644 src/annotations/markups/bidirectional/moveLongAxisStartHandle.js create mode 100644 src/annotations/markups/bidirectional/moveShortAxisEndHandle.js create mode 100644 src/annotations/markups/bidirectional/moveShortAxisStartHandle.js create mode 100644 src/annotations/markups/bidirectional/updateMarkup.js create mode 100644 src/annotations/markups/ellipse/addFeature.js create mode 100644 src/annotations/markups/ellipse/createAndAddEllipseFeature.js create mode 100644 src/annotations/markups/ellipse/createAndAddEllipseHandlesFeature.js create mode 100644 src/annotations/markups/ellipse/ellipse.js create mode 100644 src/annotations/markups/ellipse/getEllipsePolygonFromMovingLine.js create mode 100644 src/annotations/markups/ellipse/getFeatureById.js create mode 100644 src/annotations/markups/ellipse/getMeasurements.js create mode 100644 src/annotations/markups/ellipse/id.js create mode 100644 src/annotations/markups/ellipse/onSetFeatureStyle.js create mode 100644 src/annotations/markups/ellipse/removeFeature.js create mode 100644 src/annotations/markups/ellipse/styles.js create mode 100644 src/annotations/markups/ellipse/updateMarkup.js diff --git a/package-lock.json b/package-lock.json index d6891186..ef010687 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,5 +1,6 @@ { "name": "dicom-microscopy-viewer", +<<<<<<< HEAD "version": "0.35.2", "lockfileVersion": 2, "requires": true, @@ -16130,6 +16131,11 @@ } } }, +======= + "version": "0.35.0", + "lockfileVersion": 1, + "requires": true, +>>>>>>> feat/bidirectional "dependencies": { "@babel/code-frame": { "version": "7.14.5", @@ -16168,6 +16174,32 @@ "lodash": "^4.17.19", "semver": "^6.3.0", "source-map": "^0.5.0" + }, + "dependencies": { + "convert-source-map": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", + "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.1" + } + }, + "debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } } }, "@babel/generator": { @@ -16250,6 +16282,39 @@ "lodash.debounce": "^4.0.8", "resolve": "^1.14.2", "semver": "^6.1.2" + }, + "dependencies": { + "debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "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==", + "dev": true + }, + "resolve": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", + "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", + "dev": true, + "requires": { + "is-core-module": "^2.2.0", + "path-parse": "^1.0.6" + } + } } }, "@babel/helper-explode-assignable-expression": { @@ -16436,9 +16501,9 @@ } }, "@babel/parser": { - "version": "7.15.6", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.15.6.tgz", - "integrity": "sha512-S/TSCcsRuCkmpUuoWijua0Snt+f3ewU/8spLo+4AXJCZfT0bVCzLD5MuOKdrx0mlAptbKzn5AdgEIIKXxXkz9Q==", + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.15.4.tgz", + "integrity": "sha512-xmzz+7fRpjrvDUj+GV7zfz/R3gSK2cOxGlazaXooxspCr539cbTXJKvBJzSVI2pPhcRGquoOtaIkKCsHQUiO3w==", "dev": true }, "@babel/plugin-proposal-async-generator-functions": { @@ -16523,16 +16588,16 @@ } }, "@babel/plugin-proposal-object-rest-spread": { - "version": "7.15.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.15.6.tgz", - "integrity": "sha512-qtOHo7A1Vt+O23qEAX+GdBpqaIuD3i9VRrWgCJeq7WO6H2d14EK3q11urj5Te2MAeK97nMiIdRpwd/ST4JFbNg==", + "version": "7.14.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.14.7.tgz", + "integrity": "sha512-082hsZz+sVabfmDWo1Oct1u1AgbKbUAyVgmX4otIc7bdsRgHBXwTwb3DpDmD4Eyyx6DNiuz5UAATT655k+kL5g==", "dev": true, "requires": { - "@babel/compat-data": "^7.15.0", - "@babel/helper-compilation-targets": "^7.15.4", + "@babel/compat-data": "^7.14.7", + "@babel/helper-compilation-targets": "^7.14.5", "@babel/helper-plugin-utils": "^7.14.5", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.15.4" + "@babel/plugin-transform-parameters": "^7.14.5" } }, "@babel/plugin-proposal-optional-catch-binding": { @@ -17146,12 +17211,29 @@ "@babel/types": "^7.15.4", "debug": "^4.1.0", "globals": "^11.1.0" + }, + "dependencies": { + "debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } } }, "@babel/types": { - "version": "7.15.6", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.15.6.tgz", - "integrity": "sha512-BPU+7QhqNjmWyDO0/vitH/CuhpV8ZmK1wpKva8nuyNF5MJfuRNWMc+hc14+u9xT93kvykMdncrJT19h74uB1Ig==", + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.15.4.tgz", + "integrity": "sha512-0f1HJFuGmmbrKTCZtbm3cU+b/AqdEYk5toj5iQur58xkVMlS0JWaKxTBSmCXd47uiN7vbcozAupm6Mvs80GNhw==", "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.14.9", @@ -17175,9 +17257,9 @@ } }, "@eslint/eslintrc": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.3.0.tgz", - "integrity": "sha512-1JTKgrOKAHVivSvOYw+sJOunkBjUOvjqWk1DPja7ZFhIS2mX/4EgTT8M7eTK9jrKhL/FvXXEbQwIs3pg1xp3dg==", + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.2.2.tgz", + "integrity": "sha512-EfB5OHNYp1F4px/LI/FEnGylop7nOqkQ1LRzCM0KccA2U8tvV8w01KBv37LbO7nW4H+YhKyo2LcJhRwjjV17QQ==", "dev": true, "requires": { "ajv": "^6.12.4", @@ -17187,11 +17269,20 @@ "ignore": "^4.0.6", "import-fresh": "^3.2.1", "js-yaml": "^3.13.1", - "lodash": "^4.17.20", + "lodash": "^4.17.19", "minimatch": "^3.0.4", "strip-json-comments": "^3.1.1" }, "dependencies": { + "debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, "globals": { "version": "12.4.0", "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", @@ -17201,10 +17292,10 @@ "type-fest": "^0.8.1" } }, - "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true } } @@ -17282,6 +17373,12 @@ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true + }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -17338,6 +17435,15 @@ "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": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -17363,12 +17469,72 @@ "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" + } + }, + "glob": { + "version": "7.1.7", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", + "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "graceful-fs": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", + "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==", + "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 }, + "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.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "dev": true, + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.2.3" + } + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true + }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -17377,6 +17543,15 @@ "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" + } } } }, @@ -17484,12 +17659,24 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, + "graceful-fs": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", + "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==", + "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 }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true + }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -17518,6 +17705,12 @@ "source-map": "^0.6.0" }, "dependencies": { + "graceful-fs": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", + "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==", + "dev": true + }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -17549,6 +17742,14 @@ "jest-haste-map": "^26.6.2", "jest-runner": "^26.6.3", "jest-runtime": "^26.6.3" + }, + "dependencies": { + "graceful-fs": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", + "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==", + "dev": true + } } }, "@jest/transform": { @@ -17583,6 +17784,15 @@ "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": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -17608,12 +17818,58 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, + "convert-source-map": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", + "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.1" + } + }, + "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" + } + }, + "graceful-fs": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", + "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==", + "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 }, + "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.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "dev": true, + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.2.3" + } + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true + }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -17628,6 +17884,15 @@ "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" + } } } }, @@ -17726,9 +17991,13 @@ "integrity": "sha1-FWUb1VOme4WB+zmIEMmK2Go0Uk4=" }, "@petamoriken/float16": { - "version": "3.4.11", - "resolved": "https://registry.npmjs.org/@petamoriken/float16/-/float16-3.4.11.tgz", - "integrity": "sha512-oVf38eZjdG7Wt5BXSK36M5Dcp6SnjNof+BFzhWnSghzKbJWj48XtcUVnxlkrzbYjX9mNYSyE00rC4rYUPpXVmA==" + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/@petamoriken/float16/-/float16-3.5.0.tgz", + "integrity": "sha512-jtw55sPmhLbTbkzBc3CsONW8ziluPNfQFECoumaWNSh0XqiSuGpwgoHnIXYQIHtr8gdPJr67csrS9+paMYmSXg==", + "requires": { + "lodash": ">=4.17.5 <5.0.0", + "lodash-es": ">=4.17.5 <5.0.0" + } }, "@sinonjs/commons": { "version": "1.8.3", @@ -17755,9 +18024,9 @@ "dev": true }, "@types/babel__core": { - "version": "7.1.16", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.16.tgz", - "integrity": "sha512-EAEHtisTMM+KaKwfWdC3oyllIqswlznXCIVCt7/oRNrh+DhgT4UEBNC/jlADNjvw7UnfbcdkGQcPVZ1xYiLcrQ==", + "version": "7.1.15", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.15.tgz", + "integrity": "sha512-bxlMKPDbY8x5h6HBwVzEOk2C8fb6SLfYQ5Jw3uBYuYF1lfWk/kbLd81la82vrIkBb0l+JdmrZaDikPrNxpS/Ew==", "dev": true, "requires": { "@babel/parser": "^7.1.0", @@ -17841,9 +18110,9 @@ "dev": true }, "@types/node": { - "version": "16.9.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.9.1.tgz", - "integrity": "sha512-QpLcX9ZSsq3YYUUnD3nFDY8H7wctAhQj/TFKL8Ya8v5fMm3CFXxo8zStsLAl780ltoYoo1WvKUVGBQK+1ifr7g==", + "version": "16.7.4", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.7.4.tgz", + "integrity": "sha512-25QXpDsTiDnl2rZGUenagVMwO46way8dOUdvoC3R3p+6TrbpxeJBo/v87BEG1IHI31Jhaa8lPeSHcqwxsVBeYQ==", "dev": true }, "@types/normalize-package-data": { @@ -17903,9 +18172,9 @@ } }, "acorn": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.5.0.tgz", - "integrity": "sha512-yXbYeFy+jUuYd3/CDcg2NkIYE991XYX/bje7LmjJigUciaeO1JR4XxXgCIV1/Zc/dRuFEyw1L0pbA+qynJkW5Q==", + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.3.1.tgz", + "integrity": "sha512-tLc0wSnatxAQHVHUapaHdz72pi9KUyHjq5KyHjGg9Y8Ifdc79pTh2XvI6I1/chZbnM7QtNKzh66ooDogPZSleA==", "dev": true }, "acorn-globals": { @@ -17916,22 +18185,13 @@ "requires": { "acorn": "^7.1.1", "acorn-walk": "^7.1.1" - }, - "dependencies": { - "acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "dev": true - } } }, "acorn-jsx": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "requires": {} + "dev": true }, "acorn-walk": { "version": "7.2.0", @@ -17939,15 +18199,6 @@ "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", "dev": true }, - "agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dev": true, - "requires": { - "debug": "4" - } - }, "ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", @@ -17979,12 +18230,20 @@ "dev": true, "requires": { "type-fest": "^0.21.3" + }, + "dependencies": { + "type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true + } } }, "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "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": { @@ -17997,13 +18256,13 @@ } }, "anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", "dev": true, "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" } }, "argparse": { @@ -18053,14 +18312,14 @@ "dev": true }, "array.prototype.flat": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.5.tgz", - "integrity": "sha512-KaYU+S+ndVqyUnignHftkwc58o3uVU1jzczILJ1tN2YaIZpFIKBiP/x/j97E5MVPsaCloPbqWLB/8qCTVvT2qg==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.4.tgz", + "integrity": "sha512-4470Xi3GAPAjZqFcljX2xzckv1qeKPizoNkiS0+O4IoPR2ZNpcjE0pkhdihlDouK+x6QOast26B4Q/O9DJnwSg==", "dev": true, "requires": { - "call-bind": "^1.0.2", + "call-bind": "^1.0.0", "define-properties": "^1.1.3", - "es-abstract": "^1.19.0" + "es-abstract": "^1.18.0-next.1" } }, "array.prototype.flatmap": { @@ -18076,23 +18335,14 @@ } }, "asn1.js": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", - "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", + "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", "dev": true, "requires": { "bn.js": "^4.0.0", "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0", - "safer-buffer": "^2.1.0" - }, - "dependencies": { - "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true - } + "minimalistic-assert": "^1.0.0" } }, "assign-symbols": { @@ -18102,9 +18352,9 @@ "dev": true }, "astral-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", + "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", "dev": true }, "asynckit": { @@ -18264,12 +18514,24 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, + "graceful-fs": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", + "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==", + "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 }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true + }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -18376,9 +18638,9 @@ } }, "balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", "dev": true }, "base": { @@ -18404,48 +18666,48 @@ "requires": { "is-descriptor": "^1.0.0" } - } - } - }, - "big.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", - "dev": true - }, - "bl": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/bl/-/bl-0.8.2.tgz", - "integrity": "sha1-yba8oI0bwuoA/Ir7Txpf0eHGbk4=", - "dev": true, - "requires": { - "readable-stream": "~1.0.26" - }, - "dependencies": { - "readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + }, + "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==", "dev": true, "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" + "kind-of": "^6.0.0" } }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true + "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==", + "dev": true, + "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==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } } } }, + "big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true + }, "bn.js": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.0.tgz", - "integrity": "sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw==", + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==", "dev": true }, "brace-expansion": { @@ -18459,12 +18721,32 @@ } }, "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", "dev": true, "requires": { - "fill-range": "^7.0.1" + "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=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } } }, "brorand": { @@ -18528,49 +18810,39 @@ } }, "browserify-rsa": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz", - "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", + "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", "dev": true, "requires": { - "bn.js": "^5.0.0", + "bn.js": "^4.1.0", "randombytes": "^2.0.1" } }, "browserify-sign": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz", - "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", + "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", "dev": true, "requires": { - "bn.js": "^5.1.1", - "browserify-rsa": "^4.0.1", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "elliptic": "^6.5.3", - "inherits": "^2.0.4", - "parse-asn1": "^5.1.5", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" - }, - "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==", - "dev": true - } + "bn.js": "^4.1.1", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.2", + "elliptic": "^6.0.0", + "inherits": "^2.0.1", + "parse-asn1": "^5.0.0" } }, "browserslist": { - "version": "4.17.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.17.0.tgz", - "integrity": "sha512-g2BJ2a0nEYvEFQC208q8mVAhfNwpZ5Mu8BwgtCdZKO3qx98HChmeg448fPdUzld8aFmfLgVh7yymqV+q1lJZ5g==", + "version": "4.16.8", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.8.tgz", + "integrity": "sha512-sc2m9ohR/49sWEbPj14ZSSZqp+kbi16aLao42Hmn3Z8FpjuMaq2xCA2l4zl9ITfyzvnvyE0hcg62YkIGKxgaNQ==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30001254", + "caniuse-lite": "^1.0.30001251", "colorette": "^1.3.0", - "electron-to-chromium": "^1.3.830", + "electron-to-chromium": "^1.3.811", "escalade": "^3.1.1", "node-releases": "^1.1.75" } @@ -18591,9 +18863,9 @@ "dev": true }, "buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", "dev": true }, "buffer-xor": { @@ -18667,19 +18939,25 @@ "caniuse-db": "^1.0.30000639", "electron-to-chromium": "^1.2.7" } + }, + "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 } } }, "caniuse-db": { - "version": "1.0.30001257", - "resolved": "https://registry.npmjs.org/caniuse-db/-/caniuse-db-1.0.30001257.tgz", - "integrity": "sha512-o4+MMmDwtATBUlIZ1TLK7+CcgK8S2uggA+IIwXI8wDQVPMHYc6Bes1VPvuCzSRFlFv41zWyemmC8EX9JJHeJzA==", + "version": "1.0.30001252", + "resolved": "https://registry.npmjs.org/caniuse-db/-/caniuse-db-1.0.30001252.tgz", + "integrity": "sha512-+Vyv92BCj8QTH3pxlxmhXdwqAD+OngU5Ev7OiXG/cfNhJIP3lSE5wxIwW2TFpRj02PE/mAZF8po6/ZTYEa9/tg==", "dev": true }, "caniuse-lite": { - "version": "1.0.30001257", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001257.tgz", - "integrity": "sha512-JN49KplOgHSXpIsVSF+LUyhD8PUp6xPpAXeRrrcBh4KBeP7W864jHn6RvzJgDlrReyeVjMFJL3PLpPvKIxlIHA==", + "version": "1.0.30001252", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001252.tgz", + "integrity": "sha512-I56jhWDGMtdILQORdusxBOH+Nl/KgQSdDmpJezYddnAkVOmnoU8zwjTV9xAjMIYxr0iPreEAVylCGcmHCjfaOw==", "dev": true }, "capture-exit": { @@ -18801,63 +19079,6 @@ "requires": { "is-descriptor": "^0.1.0" } - }, - "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=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "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=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - } - }, - "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==", - "dev": true } } }, @@ -18873,9 +19094,9 @@ } }, "clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", + "version": "0.1.19", + "resolved": "https://registry.npmjs.org/clone/-/clone-0.1.19.tgz", + "integrity": "sha1-YT+2hjmyaklKxTJT4Vsaa9iK2oU=", "dev": true }, "co": { @@ -18918,6 +19139,14 @@ "clone": "^1.0.2", "color-convert": "^1.3.0", "color-string": "^0.3.0" + }, + "dependencies": { + "clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", + "dev": true + } } }, "color-convert": { @@ -18945,9 +19174,9 @@ } }, "colorette": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.4.0.tgz", - "integrity": "sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.3.0.tgz", + "integrity": "sha512-ecORCqbSFP7Wm8Y6lyqMJjexBQqXSF7SSeaTyGGphogUjBlFP9m9o08wy86HL2uB7fMTxtOUzLMk7ogKcxMg1w==", "dev": true }, "colormin": { @@ -18994,46 +19223,41 @@ "dev": true }, "concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.5.2.tgz", + "integrity": "sha1-cIl4Yk2FavQaWnQd790mHadSwmY=", "dev": true, "requires": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" + "inherits": "~2.0.1", + "readable-stream": "~2.0.0", + "typedarray": "~0.0.5" }, "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "process-nextick-args": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", + "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", "dev": true }, "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==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.6.tgz", + "integrity": "sha1-j5A0HmilPMySh4jaz80Rs265t44=", "dev": true, "requires": { "core-util-is": "~1.0.0", - "inherits": "~2.0.3", + "inherits": "~2.0.1", "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", + "process-nextick-args": "~1.0.6", + "string_decoder": "~0.10.x", "util-deprecate": "~1.0.1" } }, "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true } } }, @@ -19054,14 +19278,16 @@ } } }, - "convert-source-map": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", - "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.1" - } + "contains-path": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", + "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=", + "dev": true + }, + "content-type-parser": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/content-type-parser/-/content-type-parser-1.0.2.tgz", + "integrity": "sha512-lM4l4CnMEwOLHAHr/P6MEZwZFPJFtAAKgL6pogbXmVZggIqXhdB6RbBtPOTsw2FcXwYhehRGERJmRrjOiIB8pQ==" }, "copy-descriptor": { "version": "0.1.1", @@ -19075,12 +19301,12 @@ "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==" }, "core-js-compat": { - "version": "3.17.3", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.17.3.tgz", - "integrity": "sha512-+in61CKYs4hQERiADCJsdgewpdl/X0GhEX77pjKgbeibXviIt2oxEjTc8O2fqHX8mDdBrDvX8MYD/RYsBv4OiA==", + "version": "3.17.2", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.17.2.tgz", + "integrity": "sha512-lHnt7A1Oqplebl5i0MrQyFv/yyEzr9p29OjlkcsFRDDgHwwQyVckfRGJ790qzXhkwM8ba4SFHHa2sO+T5f1zGg==", "dev": true, "requires": { - "browserslist": "^4.17.0", + "browserslist": "^4.16.8", "semver": "7.0.0" }, "dependencies": { @@ -19093,9 +19319,9 @@ } }, "core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", "dev": true }, "cosmiconfig": { @@ -19125,21 +19351,13 @@ } }, "create-ecdh": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", - "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", + "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", "dev": true, "requires": { "bn.js": "^4.1.0", - "elliptic": "^6.5.3" - }, - "dependencies": { - "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true - } + "elliptic": "^6.0.0" } }, "create-hash": { @@ -19170,14 +19388,24 @@ } }, "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", "dev": true, "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } } }, "crypto-browserify": { @@ -19484,6 +19712,13 @@ "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", "requires": { "ms": "2.1.2" + }, + "dependencies": { + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } } }, "decamelize": { @@ -19504,9 +19739,9 @@ "dev": true }, "deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", "dev": true }, "deepmerge": { @@ -19541,24 +19776,55 @@ "requires": { "is-descriptor": "^1.0.2", "isobject": "^3.0.1" - } - }, - "defined": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", - "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=", - "dev": true - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "dev": true - }, - "des.js": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", - "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", + }, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "defined": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", + "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=", + "dev": true + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true + }, + "des.js": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz", + "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=", "dev": true, "requires": { "inherits": "^2.0.1", @@ -19591,14 +19857,6 @@ "bn.js": "^4.1.0", "miller-rabin": "^4.0.0", "randombytes": "^2.0.0" - }, - "dependencies": { - "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true - } } }, "doctrine": { @@ -19628,32 +19886,24 @@ } }, "electron-to-chromium": { - "version": "1.3.839", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.839.tgz", - "integrity": "sha512-0O7uPs9LJNjQ/U5mW78qW8gXv9H6Ba3DHZ5/yt8aBsvomOWDkV3MddT7enUYvLQEUVOURjWmgJJWVZ3K98tIwQ==", + "version": "1.3.829", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.829.tgz", + "integrity": "sha512-5EXDbvsaLRxS1UOfRr8Hymp3dR42bvBNPgzVuPwUFj3v66bpvDUcNwwUywQUQYn/scz26/3Sgd3fNVGQOlVwvQ==", "dev": true }, "elliptic": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", - "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.3.tgz", + "integrity": "sha512-IMqzv5wNQf+E6aHeIqATs0tOLeOTwj1QKbRcS3jBbYkl5oLAserA8yJTT7/VyHUYG91PRmPyeQDObKLPpeS4dw==", "dev": true, "requires": { - "bn.js": "^4.11.9", - "brorand": "^1.1.0", + "bn.js": "^4.4.0", + "brorand": "^1.0.1", "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.1", - "inherits": "^2.0.4", - "minimalistic-assert": "^1.0.1", - "minimalistic-crypto-utils": "^1.0.1" - }, - "dependencies": { - "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true - } + "hmac-drbg": "^1.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.0" } }, "emittery": { @@ -19693,9 +19943,9 @@ } }, "errno": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", - "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", + "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", "dev": true, "requires": { "prr": "~1.0.1" @@ -19711,25 +19961,22 @@ } }, "es-abstract": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.1.tgz", - "integrity": "sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w==", + "version": "1.18.5", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.5.tgz", + "integrity": "sha512-DDggyJLoS91CkJjgauM5c0yZMjiD1uK3KcaCeAmffGwZ+ODWzOkPN4QwRbsK5DOFf06fywmyLci3ZD8jLGhVYA==", "dev": true, "requires": { "call-bind": "^1.0.2", "es-to-primitive": "^1.2.1", "function-bind": "^1.1.1", "get-intrinsic": "^1.1.1", - "get-symbol-description": "^1.0.0", "has": "^1.0.3", "has-symbols": "^1.0.2", "internal-slot": "^1.0.3", - "is-callable": "^1.2.4", + "is-callable": "^1.2.3", "is-negative-zero": "^2.0.1", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.1", - "is-string": "^1.0.7", - "is-weakref": "^1.0.1", + "is-regex": "^1.1.3", + "is-string": "^1.0.6", "object-inspect": "^1.11.0", "object-keys": "^1.1.1", "object.assign": "^4.1.2", @@ -19789,13 +20036,13 @@ } }, "eslint": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.18.0.tgz", - "integrity": "sha512-fbgTiE8BfUJZuBeq2Yi7J3RB3WGUQ9PNuNbmgi6jt9Iv8qrkxfy19Ds3OpL1Pm7zg3BtTVhvcUZbIRQ0wmSjAQ==", + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.13.0.tgz", + "integrity": "sha512-uCORMuOO8tUzJmsdRtrvcGq5qposf7Rw0LwkTJkoDbOycVQtQjmnhZSuLQnozLE4TmAzlMVV45eCHmQ1OpDKUQ==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", - "@eslint/eslintrc": "^0.3.0", + "@eslint/eslintrc": "^0.2.1", "ajv": "^6.10.0", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", @@ -19805,10 +20052,10 @@ "eslint-scope": "^5.1.1", "eslint-utils": "^2.1.0", "eslint-visitor-keys": "^2.0.0", - "espree": "^7.3.1", + "espree": "^7.3.0", "esquery": "^1.2.0", "esutils": "^2.0.2", - "file-entry-cache": "^6.0.0", + "file-entry-cache": "^5.0.1", "functional-red-black-tree": "^1.0.1", "glob-parent": "^5.0.0", "globals": "^12.1.0", @@ -19819,7 +20066,7 @@ "js-yaml": "^3.13.1", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.4.1", - "lodash": "^4.17.20", + "lodash": "^4.17.19", "minimatch": "^3.0.4", "natural-compare": "^1.4.0", "optionator": "^0.9.1", @@ -19828,7 +20075,7 @@ "semver": "^7.2.1", "strip-ansi": "^6.0.0", "strip-json-comments": "^3.1.0", - "table": "^6.0.4", + "table": "^5.2.3", "text-table": "^0.2.0", "v8-compile-cache": "^2.0.3" }, @@ -19867,6 +20114,35 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, "globals": { "version": "12.4.0", "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", @@ -19892,6 +20168,12 @@ "type-check": "~0.4.0" } }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, "optionator": { "version": "0.9.1", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", @@ -19906,6 +20188,12 @@ "word-wrap": "^1.2.3" } }, + "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 + }, "prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -19921,6 +20209,21 @@ "lru-cache": "^6.0.0" } }, + "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.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -19939,27 +20242,28 @@ "prelude-ls": "^1.2.1" } }, - "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } } } }, "eslint-config-standard": { - "version": "16.0.3", - "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-16.0.3.tgz", - "integrity": "sha512-x4fmJL5hGqNJKGHSjnLdgA6U6h1YW/G2dW9fA+cyVur4SK6lyue8+UgNKWlZtUDTXvgKDD/Oa3GQjmB5kjtVvg==", - "dev": true, - "requires": {} + "version": "16.0.2", + "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-16.0.2.tgz", + "integrity": "sha512-fx3f1rJDsl9bY7qzyX8SAtP8GBSk6MfXFaTfaGgk12aAYW4gJSyRm7dM790L6cbXv63fvjY4XeSzXnb4WM+SKw==", + "dev": true }, "eslint-config-standard-jsx": { "version": "10.0.0", "resolved": "https://registry.npmjs.org/eslint-config-standard-jsx/-/eslint-config-standard-jsx-10.0.0.tgz", "integrity": "sha512-hLeA2f5e06W1xyr/93/QJulN/rLbUVUmqTlexv9PRKHFwEC9ffJcH2LvJhMoEqYQBEYafedgGZXH2W8NUpt5lA==", - "dev": true, - "requires": {} + "dev": true }, "eslint-import-resolver-node": { "version": "0.3.6", @@ -19979,17 +20283,38 @@ "requires": { "ms": "^2.1.1" } + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "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==", + "dev": true + }, + "resolve": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", + "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", + "dev": true, + "requires": { + "is-core-module": "^2.2.0", + "path-parse": "^1.0.6" + } } } }, "eslint-module-utils": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.1.tgz", - "integrity": "sha512-fjoetBXQZq2tSTWZ9yWVl2KuFrTZZH3V+9iD1V1RfpDgxzJR+mPd/KZmMiA8gbPqdBzpNiEHOuT7IYEWxrH0zQ==", + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.6.2.tgz", + "integrity": "sha512-QG8pcgThYOuqxupd06oYTZoNOGaUdTY1PqK+oS6ElF6vs4pBdk/aYxFVQQXzcrAqp9m7cl7lb2ubazX+g16k2Q==", "dev": true, "requires": { "debug": "^3.2.7", - "find-up": "^2.1.0", "pkg-dir": "^2.0.0" }, "dependencies": { @@ -20021,6 +20346,12 @@ "path-exists": "^3.0.0" } }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, "p-limit": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", @@ -20073,26 +20404,24 @@ } }, "eslint-plugin-import": { - "version": "2.24.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.24.2.tgz", - "integrity": "sha512-hNVtyhiEtZmpsabL4neEj+6M5DCLgpYyG9nzJY8lZQeQXEn5UPW1DpUdsMHMXsq98dbNm7nt1w9ZMSVpfJdi8Q==", + "version": "2.22.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.22.1.tgz", + "integrity": "sha512-8K7JjINHOpH64ozkAhpT3sd+FswIZTfMZTjdx052pnWrgRCVfp8op9tbjpAk3DdUeI/Ba4C8OjdC0r90erHEOw==", "dev": true, "requires": { - "array-includes": "^3.1.3", - "array.prototype.flat": "^1.2.4", + "array-includes": "^3.1.1", + "array.prototype.flat": "^1.2.3", + "contains-path": "^0.1.0", "debug": "^2.6.9", - "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.6", - "eslint-module-utils": "^2.6.2", - "find-up": "^2.0.0", + "doctrine": "1.5.0", + "eslint-import-resolver-node": "^0.3.4", + "eslint-module-utils": "^2.6.0", "has": "^1.0.3", - "is-core-module": "^2.6.0", "minimatch": "^3.0.4", - "object.values": "^1.1.4", - "pkg-up": "^2.0.0", - "read-pkg-up": "^3.0.0", - "resolve": "^1.20.0", - "tsconfig-paths": "^3.11.0" + "object.values": "^1.1.1", + "read-pkg-up": "^2.0.0", + "resolve": "^1.17.0", + "tsconfig-paths": "^3.9.0" }, "dependencies": { "debug": { @@ -20105,12 +20434,13 @@ } }, "doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", + "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", "dev": true, "requires": { - "esutils": "^2.0.2" + "esutils": "^2.0.2", + "isarray": "^1.0.0" } }, "find-up": { @@ -20122,18 +20452,6 @@ "locate-path": "^2.0.0" } }, - "load-json-file": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", - "strip-bom": "^3.0.0" - } - }, "locate-path": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", @@ -20144,12 +20462,6 @@ "path-exists": "^3.0.0" } }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, "p-limit": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", @@ -20174,48 +20486,48 @@ "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", "dev": true }, - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", - "dev": true, - "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - } - }, "path-exists": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", "dev": true }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, "read-pkg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", - "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", + "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", "dev": true, "requires": { - "load-json-file": "^4.0.0", + "load-json-file": "^2.0.0", "normalize-package-data": "^2.3.2", - "path-type": "^3.0.0" + "path-type": "^2.0.0" } }, "read-pkg-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", - "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", + "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", "dev": true, "requires": { "find-up": "^2.0.0", - "read-pkg": "^3.0.0" + "read-pkg": "^2.0.0" } }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true + "resolve": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", + "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", + "dev": true, + "requires": { + "is-core-module": "^2.2.0", + "path-parse": "^1.0.6" + } } } }, @@ -20238,35 +20550,48 @@ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", "dev": true + }, + "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==", + "dev": true + }, + "resolve": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", + "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", + "dev": true, + "requires": { + "is-core-module": "^2.2.0", + "path-parse": "^1.0.6" + } } } }, "eslint-plugin-promise": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-5.1.0.tgz", - "integrity": "sha512-NGmI6BH5L12pl7ScQHbg7tvtk4wPxxj8yPHH47NvSmMtFneC077PSeY3huFj06ZWZvtbfxSPt3RuOQD5XcR4ng==", - "dev": true, - "requires": {} + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-4.2.1.tgz", + "integrity": "sha512-VoM09vT7bfA7D+upt+FjeBO5eHIJQBUWki1aPvB+vbNiHS3+oGIJGIeyBtKQTME6UPXXy3vV07OL1tHd3ANuDw==", + "dev": true }, "eslint-plugin-react": { - "version": "7.25.3", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.25.3.tgz", - "integrity": "sha512-ZMbFvZ1WAYSZKY662MBVEWR45VaBT6KSJCiupjrNlcdakB90juaZeDCbJq19e73JZQubqFtgETohwgAt8u5P6w==", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.21.5.tgz", + "integrity": "sha512-8MaEggC2et0wSF6bUeywF7qQ46ER81irOdWS4QWxnnlAEsnzeBevk1sWh7fhpCghPpXb+8Ks7hvaft6L/xsR6g==", "dev": true, "requires": { - "array-includes": "^3.1.3", - "array.prototype.flatmap": "^1.2.4", + "array-includes": "^3.1.1", + "array.prototype.flatmap": "^1.2.3", "doctrine": "^2.1.0", - "estraverse": "^5.2.0", + "has": "^1.0.3", "jsx-ast-utils": "^2.4.1 || ^3.0.0", - "minimatch": "^3.0.4", - "object.entries": "^1.1.4", - "object.fromentries": "^2.0.4", - "object.hasown": "^1.0.0", - "object.values": "^1.1.4", + "object.entries": "^1.1.2", + "object.fromentries": "^2.0.2", + "object.values": "^1.1.1", "prop-types": "^15.7.2", - "resolve": "^2.0.0-next.3", - "string.prototype.matchall": "^4.0.5" + "resolve": "^1.18.1", + "string.prototype.matchall": "^4.0.2" }, "dependencies": { "doctrine": { @@ -20278,10 +20603,16 @@ "esutils": "^2.0.2" } }, + "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==", + "dev": true + }, "resolve": { - "version": "2.0.0-next.3", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.3.tgz", - "integrity": "sha512-W8LucSynKUIDu9ylraa7ueVZ7hc0uAgJBxVsQSKOXOyle8a93qXhcz+XAXZ8bIq2d6i4Ehddn6Evt+0/UwKk6Q==", + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", + "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", "dev": true, "requires": { "is-core-module": "^2.2.0", @@ -20421,25 +20752,23 @@ "dev": true }, "execa": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", - "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", "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", - "signal-exit": "^3.0.2", - "strip-final-newline": "^2.0.0" - } - }, - "exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "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" + } + }, + "exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", "dev": true }, @@ -20484,75 +20813,6 @@ "requires": { "is-extendable": "^0.1.0" } - }, - "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=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "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=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - } - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true - }, - "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==", - "dev": true - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true } } }, @@ -20604,6 +20864,17 @@ "requires": { "assign-symbols": "^1.0.0", "is-extendable": "^1.0.1" + }, + "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==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } } }, "extglob": { @@ -20640,11 +20911,34 @@ "is-extendable": "^0.1.0" } }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } } } }, @@ -20682,12 +20976,12 @@ } }, "file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", + "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", "dev": true, "requires": { - "flat-cache": "^3.0.4" + "flat-cache": "^2.0.1" } }, "file-type": { @@ -20696,12 +20990,26 @@ "integrity": "sha512-uzk64HRpUZyTGZtVuvrjP0FYxzQrBf4rojot6J65YMEbwBLB0CWm0CLojVpwpmFmxcE/lkvYICgfcGozbBq6rw==" }, "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==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", "dev": true, "requires": { - "to-regex-range": "^5.0.1" + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } } }, "find-up": { @@ -20715,19 +21023,45 @@ } }, "flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", + "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", "dev": true, "requires": { - "flatted": "^3.1.0", - "rimraf": "^3.0.2" + "flatted": "^2.0.0", + "rimraf": "2.6.3", + "write": "1.0.3" + }, + "dependencies": { + "glob": { + "version": "7.1.7", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", + "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + } } }, "flatted": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.2.tgz", - "integrity": "sha512-JaTY/wtrcSyvXJl4IMFHPKyFur1sE9AUqc0QnhOaJ0CxHtAoIV8pYDzeEfAaNEtGkOfq4gr3LBFmdXW5mOQFnA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", + "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", "dev": true }, "flatten": { @@ -20790,13 +21124,6 @@ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", "dev": true }, - "fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "optional": true - }, "function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", @@ -20818,6 +21145,12 @@ "readable-stream": "~1.0.26-4" }, "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, "readable-stream": { "version": "1.0.34", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", @@ -20897,24 +21230,14 @@ "dev": true }, "get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", "dev": true, "requires": { "pump": "^3.0.0" } }, - "get-symbol-description": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", - "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" - } - }, "get-value": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", @@ -20927,9 +21250,9 @@ "integrity": "sha512-COb7LDz+SXaHtl/h4LeaFcNdJdAQSDeVqjiIihSXNrkWObZLhDI4hIkZC11Aeqp7bcE72clzB0BnDXr2SmslRA==" }, "glob": { - "version": "7.1.7", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", - "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", "dev": true, "requires": { "fs.realpath": "^1.0.0", @@ -20940,15 +21263,6 @@ "path-is-absolute": "^1.0.0" } }, - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - }, "globals": { "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", @@ -20956,9 +21270,9 @@ "dev": true }, "graceful-fs": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", - "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", + "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==", "dev": true }, "growly": { @@ -21042,26 +21356,6 @@ "kind-of": "^4.0.0" }, "dependencies": { - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, "kind-of": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", @@ -21074,28 +21368,19 @@ } }, "hash-base": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", - "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", + "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", "dev": true, "requires": { - "inherits": "^2.0.4", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" - }, - "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==", - "dev": true - } + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" } }, "hash.js": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", - "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.5.tgz", + "integrity": "sha512-eWI5HG9Np+eHV1KQhisXWwM+4EPPYe5dFX1UZZH7k/E3JzDEazVH+VGlZi6R94ZqImq+A3D1mCEtrFIfg/E7sA==", "dev": true, "requires": { "inherits": "^2.0.3", @@ -21149,16 +21434,32 @@ "@tootallnate/once": "1", "agent-base": "6", "debug": "4" - } - }, - "https-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", - "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", - "dev": true, - "requires": { - "agent-base": "6", - "debug": "4" + }, + "dependencies": { + "agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "requires": { + "debug": "4" + } + }, + "debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } } }, "human-signals": { @@ -21290,10 +21591,9 @@ } }, "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" }, "internal-slot": { "version": "1.0.3", @@ -21324,12 +21624,23 @@ "dev": true }, "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==", + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", "dev": true, "requires": { - "kind-of": "^6.0.0" + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } } }, "is-arrayish": { @@ -21387,16 +21698,27 @@ } }, "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==", + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", "dev": true, "requires": { - "kind-of": "^6.0.0" - } - }, - "is-date-object": { - "version": "1.0.5", + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-date-object": { + "version": "1.0.5", "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", "dev": true, @@ -21405,14 +21727,22 @@ } }, "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", "dev": true, "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "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==", + "dev": true + } } }, "is-directory": { @@ -21429,13 +21759,10 @@ "optional": true }, "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==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true }, "is-extglob": { "version": "2.1.1", @@ -21477,10 +21804,24 @@ "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 + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } }, "is-number-object": { "version": "1.0.6", @@ -21533,16 +21874,10 @@ "has-tostringtag": "^1.0.0" } }, - "is-shared-array-buffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz", - "integrity": "sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA==", - "dev": true - }, "is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", "dev": true }, "is-string": { @@ -21578,15 +21913,6 @@ "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", "dev": true }, - "is-weakref": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.1.tgz", - "integrity": "sha512-b2jKc2pQZjaeFYWEf7ScFj+Be1I+PXmlu572Q8coTXZ+LD/QQZ7ShPMst8h16riVgyXTQwUsFEl74mDvc/3MHQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.0" - } - }, "is-windows": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", @@ -21604,9 +21930,9 @@ } }, "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", "dev": true }, "isbuffer": { @@ -21684,6 +22010,21 @@ "source-map": "^0.6.1" }, "dependencies": { + "debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -21716,38 +22057,6 @@ "@jest/core": "^26.6.3", "import-local": "^3.0.2", "jest-cli": "^26.6.3" - } - }, - "jest-changed-files": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-26.6.2.tgz", - "integrity": "sha512-fDS7szLcY9sCtIip8Fjry9oGf3I2ht/QT21bAHm5Dmf0mD4X3ReNUf17y+bO6fR8WgbIZTlbyG1ak/53cbRzKQ==", - "dev": true, - "requires": { - "@jest/types": "^26.6.2", - "execa": "^4.0.0", - "throat": "^5.0.0" - } - }, - "jest-cli": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-26.6.3.tgz", - "integrity": "sha512-GF9noBSa9t08pSyl3CY4frMrqp+aQXFGFkf5hEPbh/pIUFYWMK6ZLTfbmadxJVcJrdRoChlWQsA2VkJcDFK8hg==", - "dev": true, - "requires": { - "@jest/core": "^26.6.3", - "@jest/test-result": "^26.6.2", - "@jest/types": "^26.6.2", - "chalk": "^4.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.4", - "import-local": "^3.0.2", - "is-ci": "^2.0.0", - "jest-config": "^26.6.3", - "jest-util": "^26.6.2", - "jest-validate": "^26.6.2", - "prompts": "^2.0.1", - "yargs": "^15.4.1" }, "dependencies": { "ansi-styles": { @@ -21784,12 +22093,39 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, + "graceful-fs": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", + "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==", + "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": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-26.6.3.tgz", + "integrity": "sha512-GF9noBSa9t08pSyl3CY4frMrqp+aQXFGFkf5hEPbh/pIUFYWMK6ZLTfbmadxJVcJrdRoChlWQsA2VkJcDFK8hg==", + "dev": true, + "requires": { + "@jest/core": "^26.6.3", + "@jest/test-result": "^26.6.2", + "@jest/types": "^26.6.2", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.4", + "import-local": "^3.0.2", + "is-ci": "^2.0.0", + "jest-config": "^26.6.3", + "jest-util": "^26.6.2", + "jest-validate": "^26.6.2", + "prompts": "^2.0.1", + "yargs": "^15.4.1" + } + }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -21801,6 +22137,101 @@ } } }, + "jest-changed-files": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-26.6.2.tgz", + "integrity": "sha512-fDS7szLcY9sCtIip8Fjry9oGf3I2ht/QT21bAHm5Dmf0mD4X3ReNUf17y+bO6fR8WgbIZTlbyG1ak/53cbRzKQ==", + "dev": true, + "requires": { + "@jest/types": "^26.6.2", + "execa": "^4.0.0", + "throat": "^5.0.0" + }, + "dependencies": { + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "execa": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", + "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", + "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", + "signal-exit": "^3.0.2", + "strip-final-newline": "^2.0.0" + } + }, + "get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "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" + } + }, + "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 + }, + "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 + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, "jest-config": { "version": "26.6.3", "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-26.6.3.tgz", @@ -21836,6 +22267,15 @@ "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": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -21861,12 +22301,43 @@ "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" + } + }, + "graceful-fs": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", + "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==", + "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 }, + "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.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "dev": true, + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.2.3" + } + }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -21875,6 +22346,15 @@ "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" + } } } }, @@ -22069,38 +22549,189 @@ "micromatch": "^4.0.2", "sane": "^4.0.3", "walker": "^1.0.7" - } - }, - "jest-jasmine2": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-26.6.3.tgz", - "integrity": "sha512-kPKUrQtc8aYwBV7CqBg5pu+tmYXlvFlSFYn18ev4gPFtrRzB15N2gW/Roew3187q2w2eHuu0MU9TJz6w0/nPEg==", - "dev": true, - "requires": { - "@babel/traverse": "^7.1.0", - "@jest/environment": "^26.6.2", - "@jest/source-map": "^26.6.2", - "@jest/test-result": "^26.6.2", - "@jest/types": "^26.6.2", - "@types/node": "*", - "chalk": "^4.0.0", - "co": "^4.6.0", - "expect": "^26.6.2", - "is-generator-fn": "^2.0.0", - "jest-each": "^26.6.2", - "jest-matcher-utils": "^26.6.2", - "jest-message-util": "^26.6.2", - "jest-runtime": "^26.6.3", - "jest-snapshot": "^26.6.2", - "jest-util": "^26.6.2", - "pretty-format": "^26.6.2", - "throat": "^5.0.0" }, "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "anymatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "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" + } + }, + "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" + } + }, + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "optional": true + }, + "graceful-fs": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", + "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==", + "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.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "dev": true, + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.2.3" + } + }, + "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 + }, + "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" + } + } + } + }, + "jest-jasmine2": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-26.6.3.tgz", + "integrity": "sha512-kPKUrQtc8aYwBV7CqBg5pu+tmYXlvFlSFYn18ev4gPFtrRzB15N2gW/Roew3187q2w2eHuu0MU9TJz6w0/nPEg==", + "dev": true, + "requires": { + "@babel/traverse": "^7.1.0", + "@jest/environment": "^26.6.2", + "@jest/source-map": "^26.6.2", + "@jest/test-result": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "expect": "^26.6.2", + "is-generator-fn": "^2.0.0", + "jest-each": "^26.6.2", + "jest-matcher-utils": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-runtime": "^26.6.3", + "jest-snapshot": "^26.6.2", + "jest-util": "^26.6.2", + "pretty-format": "^26.6.2", + "throat": "^5.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "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.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-jasmine2": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-26.6.3.tgz", + "integrity": "sha512-kPKUrQtc8aYwBV7CqBg5pu+tmYXlvFlSFYn18ev4gPFtrRzB15N2gW/Roew3187q2w2eHuu0MU9TJz6w0/nPEg==", + "dev": true, + "requires": { + "@babel/traverse": "^7.1.0", + "@jest/environment": "^26.6.2", + "@jest/source-map": "^26.6.2", + "@jest/test-result": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "expect": "^26.6.2", + "is-generator-fn": "^2.0.0", + "jest-each": "^26.6.2", + "jest-matcher-utils": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-runtime": "^26.6.3", + "jest-snapshot": "^26.6.2", + "jest-util": "^26.6.2", + "pretty-format": "^26.6.2", + "throat": "^5.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { "color-convert": "^2.0.1" @@ -22247,6 +22878,15 @@ "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": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -22272,12 +22912,49 @@ "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" + } + }, + "graceful-fs": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", + "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==", + "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 }, + "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.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "dev": true, + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.2.3" + } + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true + }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -22286,6 +22963,15 @@ "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" + } } } }, @@ -22303,8 +22989,7 @@ "version": "1.2.2", "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz", "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==", - "dev": true, - "requires": {} + "dev": true }, "jest-regex-util": { "version": "26.0.0", @@ -22362,12 +23047,40 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, + "graceful-fs": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", + "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==", + "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 }, + "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==", + "dev": true + }, + "resolve": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", + "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", + "dev": true, + "requires": { + "is-core-module": "^2.2.0", + "path-parse": "^1.0.6" + } + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true + }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -22452,6 +23165,12 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, + "graceful-fs": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", + "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==", + "dev": true + }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -22538,12 +23257,38 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, + "glob": { + "version": "7.1.7", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", + "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "graceful-fs": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", + "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==", + "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 }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true + }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -22563,6 +23308,14 @@ "requires": { "@types/node": "*", "graceful-fs": "^4.2.4" + }, + "dependencies": { + "graceful-fs": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", + "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==", + "dev": true + } } }, "jest-snapshot": { @@ -22623,6 +23376,12 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, + "graceful-fs": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", + "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==", + "dev": true + }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -22672,6 +23431,15 @@ "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": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -22697,12 +23465,43 @@ "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" + } + }, + "graceful-fs": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", + "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==", + "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 }, + "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.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "dev": true, + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.2.3" + } + }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -22711,6 +23510,15 @@ "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" + } } } }, @@ -22934,26 +23742,74 @@ "whatwg-url": "^8.5.0", "ws": "^7.4.6", "xml-name-validator": "^3.0.0" - } - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true - }, - "json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", - "dev": true - }, - "json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true - }, + }, + "dependencies": { + "acorn": { + "version": "8.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.4.1.tgz", + "integrity": "sha512-asabaBSkEKosYKMITunzX177CXxQ4Q8BSSzMTKD+FefUhipQC70gfW5SiUDhYQ3vk8G+81HqQk7Fv9OXwwn9KA==", + "dev": true + }, + "agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "requires": { + "debug": "4" + } + }, + "debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "https-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", + "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", + "dev": true, + "requires": { + "agent-base": "6", + "debug": "4" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "ws": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.4.tgz", + "integrity": "sha512-zP9z6GXm6zC27YtspwH99T3qTG7bBFv2VIkeHstMLrLlDJuzA7tQ5ls3OJ1hOGGCzTQPniNJoHXIAOS0Jljohg==", + "dev": true + } + } + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true + }, + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, + "json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, "json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", @@ -23027,6 +23883,12 @@ "readable-stream": "^1.0.26-4" }, "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, "readable-stream": { "version": "1.1.14", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", @@ -23062,6 +23924,14 @@ "octal": "^1.0.0", "once": "^1.3.0", "xtend": "^2.2.0" + }, + "dependencies": { + "xtend": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.2.0.tgz", + "integrity": "sha1-7vax8ZjByN6vrYsXZaBNrUoBxak=", + "dev": true + } } }, "level-fix-range": { @@ -23131,12 +24001,6 @@ "xtend": "~2.0.4" }, "dependencies": { - "clone": { - "version": "0.1.19", - "resolved": "https://registry.npmjs.org/clone/-/clone-0.1.19.tgz", - "integrity": "sha1-YT+2hjmyaklKxTJT4Vsaa9iK2oU=", - "dev": true - }, "level-fix-range": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/level-fix-range/-/level-fix-range-2.0.0.tgz", @@ -23184,6 +24048,21 @@ "xtend": "~3.0.0" }, "dependencies": { + "bl": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/bl/-/bl-0.8.2.tgz", + "integrity": "sha1-yba8oI0bwuoA/Ir7Txpf0eHGbk4=", + "dev": true, + "requires": { + "readable-stream": "~1.0.26" + } + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, "prr": { "version": "0.0.0", "resolved": "https://registry.npmjs.org/prr/-/prr-0.0.0.tgz", @@ -23245,32 +24124,30 @@ "dev": true }, "load-json-file": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-5.3.0.tgz", - "integrity": "sha512-cJGP40Jc/VXUsp8/OrnyKyTZ1y6v/dphm3bioS+RrKXjK2BB6wHUd6JptZEFDGgGahMT+InnZO5i1Ei9mpC8Bw==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", + "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", "dev": true, "requires": { - "graceful-fs": "^4.1.15", - "parse-json": "^4.0.0", - "pify": "^4.0.1", - "strip-bom": "^3.0.0", - "type-fest": "^0.3.0" + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "strip-bom": "^3.0.0" }, "dependencies": { "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", "dev": true, "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" + "error-ex": "^1.2.0" } }, "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", "dev": true }, "strip-bom": { @@ -23278,12 +24155,6 @@ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", "dev": true - }, - "type-fest": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.3.1.tgz", - "integrity": "sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ==", - "dev": true } } }, @@ -23321,8 +24192,12 @@ "lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "lodash-es": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", + "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==" }, "lodash.camelcase": { "version": "4.3.0", @@ -23341,18 +24216,6 @@ "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=", "dev": true }, - "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.truncate": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", - "integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=", - "dev": true - }, "lodash.uniq": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", @@ -23441,11 +24304,11 @@ "dev": true }, "mathjs": { - "version": "9.4.5", - "resolved": "https://registry.npmjs.org/mathjs/-/mathjs-9.4.5.tgz", - "integrity": "sha512-FbcPOwfo1RHzZq0CFsaxQr3Scp94BGQMd6S8zIEgj8PbxwqMREVOEKw2JdQg/BBjB1nGXOmH0hnuwUVXkla2rg==", + "version": "9.4.4", + "resolved": "https://registry.npmjs.org/mathjs/-/mathjs-9.4.4.tgz", + "integrity": "sha512-5EEJXnWOzLDgMHSFyw623nH+MTBZxquWwXtrzTsingOouJJ6UZG2VNO1lwH31IMt9aMno1axO6TYleIP4YSDaQ==", "requires": { - "@babel/runtime": "^7.15.4", + "@babel/runtime": "^7.14.6", "complex.js": "^2.0.15", "decimal.js": "^10.3.1", "escape-latex": "^1.2.0", @@ -23457,14 +24320,13 @@ } }, "md5.js": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", - "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.4.tgz", + "integrity": "sha1-6b296UogpawYsENA/Fdk1bCdkB0=", "dev": true, "requires": { "hash-base": "^3.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" + "inherits": "^2.0.1" } }, "merge-stream": { @@ -23474,13 +24336,24 @@ "dev": true }, "micromatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", - "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", "dev": true, "requires": { - "braces": "^3.0.1", - "picomatch": "^2.2.3" + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" } }, "miller-rabin": { @@ -23491,14 +24364,6 @@ "requires": { "bn.js": "^4.0.0", "brorand": "^1.0.1" - }, - "dependencies": { - "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true - } } }, "mime-db": { @@ -23556,6 +24421,17 @@ "requires": { "for-in": "^1.0.2", "is-extendable": "^1.0.1" + }, + "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==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } } }, "mkdirp": { @@ -23568,9 +24444,10 @@ } }, "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true }, "nanomatch": { "version": "1.2.13", @@ -23648,6 +24525,26 @@ "requires": { "lru-cache": "^6.0.0" } + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "optional": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "optional": true, + "requires": { + "isexe": "^2.0.0" + } } } }, @@ -23669,6 +24566,22 @@ "validate-npm-package-license": "^3.0.1" }, "dependencies": { + "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==", + "dev": true + }, + "resolve": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", + "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", + "dev": true, + "requires": { + "is-core-module": "^2.2.0", + "path-parse": "^1.0.6" + } + }, "semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", @@ -23678,10 +24591,13 @@ } }, "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 + "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" + } }, "normalize-range": { "version": "0.1.2", @@ -23702,12 +24618,12 @@ } }, "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==", + "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": { - "path-key": "^3.0.0" + "path-key": "^2.0.0" } }, "num2fraction": { @@ -23748,43 +24664,6 @@ "is-descriptor": "^0.1.0" } }, - "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=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } - }, - "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=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "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==", - "dev": true - } - } - }, "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", @@ -23852,16 +24731,6 @@ "has": "^1.0.3" } }, - "object.hasown": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.0.tgz", - "integrity": "sha512-MhjYRfj3GBlhSkDHo6QmvgjRLXQ2zndabdf3nX0yTyZK9rPfxb6uRpAac8HXNLy1GpqWtZ81Qh4v3uOls2sRAg==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1" - } - }, "object.pick": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", @@ -24009,16 +24878,16 @@ } }, "parse-asn1": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", - "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.1.tgz", + "integrity": "sha512-KPx7flKXg775zZpnp9SxJlz00gTd4BmJ2yJufSc44gMCRrRQ7NSzAcSJQfifuOLgW6bEi+ftrALtsgALeB2Adw==", "dev": true, "requires": { - "asn1.js": "^5.2.0", + "asn1.js": "^4.0.0", "browserify-aes": "^1.0.0", + "create-hash": "^1.1.0", "evp_bytestokey": "^1.0.0", - "pbkdf2": "^3.0.3", - "safe-buffer": "^5.1.1" + "pbkdf2": "^3.0.3" } }, "parse-headers": { @@ -24063,26 +24932,34 @@ "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==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", "dev": true }, "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==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", + "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=", "dev": true }, "path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", + "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", "dev": true, "requires": { - "pify": "^3.0.0" - } - }, + "pify": "^2.0.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + }, "pbf": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/pbf/-/pbf-3.2.1.tgz", @@ -24093,9 +24970,9 @@ } }, "pbkdf2": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", - "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", + "version": "3.0.16", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.16.tgz", + "integrity": "sha512-y4CXP3thSxqf7c0qmOF+9UeOTrifiVTIM+u7NWlq+PRsHbr7r7dpCmvzrZxa96JJUNi0Y5w9VqG5ZNeCVMoDcA==", "dev": true, "requires": { "create-hash": "^1.1.2", @@ -24145,6 +25022,19 @@ "locate-path": "^3.0.0" } }, + "load-json-file": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-5.3.0.tgz", + "integrity": "sha512-cJGP40Jc/VXUsp8/OrnyKyTZ1y6v/dphm3bioS+RrKXjK2BB6wHUd6JptZEFDGgGahMT+InnZO5i1Ei9mpC8Bw==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.15", + "parse-json": "^4.0.0", + "pify": "^4.0.1", + "strip-bom": "^3.0.0", + "type-fest": "^0.3.0" + } + }, "locate-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", @@ -24164,11 +25054,39 @@ "p-limit": "^2.0.0" } }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, "path-exists": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", "dev": true + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + }, + "type-fest": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.3.1.tgz", + "integrity": "sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ==", + "dev": true } } }, @@ -24181,66 +25099,6 @@ "find-up": "^4.0.0" } }, - "pkg-up": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-2.0.0.tgz", - "integrity": "sha1-yBmscoBZpGHKscOImivjxJoATX8=", - "dev": true, - "requires": { - "find-up": "^2.1.0" - }, - "dependencies": { - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "requires": { - "locate-path": "^2.0.0" - } - }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "dev": true, - "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - } - }, - "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, - "requires": { - "p-try": "^1.0.0" - } - }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "dev": true, - "requires": { - "p-limit": "^1.1.0" - } - }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", - "dev": true - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - } - } - }, "posix-character-classes": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", @@ -26502,12 +27360,6 @@ "integrity": "sha1-xrs4n5qVH4K9TrFpYAEFvS/5x3g=", "dev": true }, - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true - }, "progress": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", @@ -26567,25 +27419,16 @@ "dev": true }, "public-encrypt": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", - "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.2.tgz", + "integrity": "sha512-4kJ5Esocg8X3h8YgJsKAuoesBgB7mqH3eowiDzMUPKiRDDE7E/BqqZD1hnTByIaAFiwAw246YEltSq7tdrOH0Q==", "dev": true, "requires": { "bn.js": "^4.1.0", "browserify-rsa": "^4.0.0", "create-hash": "^1.1.0", "parse-asn1": "^5.0.0", - "randombytes": "^2.0.1", - "safe-buffer": "^5.1.2" - }, - "dependencies": { - "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true - } + "randombytes": "^2.0.1" } }, "pump": { @@ -26598,12 +27441,6 @@ "once": "^1.3.1" } }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true - }, "q": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", @@ -26626,9 +27463,9 @@ "integrity": "sha512-RKJ22hX8mHe3Y6wH/N3wCM6BWtjaxIyyUIkpHOvfFnxdI4yD4tBXEBKSbriGujF6jnSVkJrffuo6vxACiSSxIw==" }, "randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.6.tgz", + "integrity": "sha512-CIQ5OFxf4Jou6uOKe9t1AOgqpeU5fd70A8NPdHSGeYXqXsPe6peOwI0cUl88RWZ6sP1vPMV3avd/R6cZ5/sP1A==", "dev": true, "requires": { "safe-buffer": "^5.1.0" @@ -26687,21 +27524,12 @@ "find-up": "^4.1.0", "read-pkg": "^5.2.0", "type-fest": "^0.8.1" - }, - "dependencies": { - "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true - } } }, "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==", - "dev": true, "requires": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -26743,12 +27571,12 @@ "dev": true }, "regenerate-unicode-properties": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-9.0.0.tgz", - "integrity": "sha512-3E12UeNSPfjrgwjkR81m5J7Aw/T55Tu7nUyZVQYCKEOs+2dkxEY+DpPtZzO4YruuiPb7NkYLVcyJC4+zCbk5pA==", + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz", + "integrity": "sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA==", "dev": true, "requires": { - "regenerate": "^1.4.2" + "regenerate": "^1.4.0" } }, "regenerator-runtime": { @@ -26792,17 +27620,17 @@ "dev": true }, "regexpu-core": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.8.0.tgz", - "integrity": "sha512-1F6bYsoYiz6is+oz70NWur2Vlh9KWtswuRuzJOfeYUrfPX2o8n74AnUVaOGDbUqVGO9fNHu48/pjJO4sNVwsOg==", + "version": "4.7.1", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.1.tgz", + "integrity": "sha512-ywH2VUraA44DZQuRKzARmw6S66mr48pQVva4LBeRhcOltJ6hExvWly5ZjFLYo67xbIxb6W1q4bAGtgfEl20zfQ==", "dev": true, "requires": { - "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^9.0.0", - "regjsgen": "^0.5.2", - "regjsparser": "^0.7.0", - "unicode-match-property-ecmascript": "^2.0.0", - "unicode-match-property-value-ecmascript": "^2.0.0" + "regenerate": "^1.4.0", + "regenerate-unicode-properties": "^8.2.0", + "regjsgen": "^0.5.1", + "regjsparser": "^0.6.4", + "unicode-match-property-ecmascript": "^1.0.4", + "unicode-match-property-value-ecmascript": "^1.2.0" } }, "regjsgen": { @@ -26812,9 +27640,9 @@ "dev": true }, "regjsparser": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.7.0.tgz", - "integrity": "sha512-A4pcaORqmNMDVwUjWoTzuhwMGpP+NykpfqAsEgI1FSH/EzC7lrN5TMd+kN8YCovX+jMpu8eaqXgXPCa0g8FQNQ==", + "version": "0.6.9", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.9.tgz", + "integrity": "sha512-ZqbNRz1SNjLAiYuwY0zoXW8Ne675IX5q+YHioAGbCw4X96Mjl2+dcX9B2ciaeyYjViDAfvIjFpQjJgLttTEERQ==", "dev": true, "requires": { "jsesc": "~0.5.0" @@ -26835,9 +27663,9 @@ "dev": true }, "repeat-element": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz", - "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", + "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", "dev": true }, "repeat-string": { @@ -26871,13 +27699,12 @@ "dev": true }, "resolve": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", - "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.8.1.tgz", + "integrity": "sha512-AicPrAC7Qu1JxPCZ9ZgCZlY35QgFnNqc+0LtbRNxnVw4TXvjQ72wnuL9JQcEBgXkI9JM8MsT9kaQoHcpCRJOYA==", "dev": true, "requires": { - "is-core-module": "^2.2.0", - "path-parse": "^1.0.6" + "path-parse": "^1.0.5" } }, "resolve-cwd": { @@ -26915,15 +27742,6 @@ "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", "dev": true }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, "ripemd160": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", @@ -27021,9 +27839,9 @@ } }, "rollup-pluginutils": { - "version": "2.8.2", - "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz", - "integrity": "sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==", + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.8.1.tgz", + "integrity": "sha512-J5oAoysWar6GuZo0s+3bZ6sVZAC0pfqKz68De7ZgDi5z63jOVZn1uJL/+z1jeKHNbGII8kAyHF5q8LnxSX5lQg==", "dev": true, "requires": { "estree-walker": "^0.6.1" @@ -27084,224 +27902,6 @@ "micromatch": "^3.1.4", "minimist": "^1.1.1", "walker": "~1.0.5" - }, - "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" - } - }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "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=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", - "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" - } - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "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, - "requires": { - "pump": "^3.0.0" - } - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", - "dev": true - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - } - }, - "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" - } - }, - "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": { - "path-key": "^2.0.0" - } - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", - "dev": true - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "dev": true, - "requires": { - "shebang-regex": "^1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", - "dev": true - }, - "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=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - } - }, - "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" - } - } } }, "sax": { @@ -27356,12 +27956,6 @@ "requires": { "is-extendable": "^0.1.0" } - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true } } }, @@ -27376,18 +27970,18 @@ } }, "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==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", "dev": true, "requires": { - "shebang-regex": "^3.0.0" + "shebang-regex": "^1.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==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", "dev": true }, "shellwords": { @@ -27420,45 +28014,21 @@ "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", "dev": true }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - }, "slice-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", - "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", + "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", "dev": true, "requires": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" + "ansi-styles": "^3.2.0", + "astral-regex": "^1.0.0", + "is-fullwidth-code-point": "^2.0.0" }, "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "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==", + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", "dev": true } } @@ -27495,85 +28065,16 @@ "dev": true, "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=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "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=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "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=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - } - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true - }, - "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==", - "dev": true - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } } } }, @@ -27596,6 +28097,35 @@ "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } } } }, @@ -27667,9 +28197,9 @@ } }, "source-map-support": { - "version": "0.5.20", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.20.tgz", - "integrity": "sha512-n1lZZ8Ve4ksRqizaBQgxXDgKwttHDhyfQjA6YZZn8+AroHbsIz+JjwxQDxbp+7y5OYCI8t1Yk7etjD9CRd2hIw==", + "version": "0.5.19", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", + "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", "dev": true, "requires": { "buffer-from": "^1.0.0", @@ -27685,9 +28215,9 @@ } }, "source-map-url": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz", - "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==", + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", + "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", "dev": true }, "spdx-correct": { @@ -27738,13 +28268,12 @@ "dev": true }, "stack-utils": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.4.tgz", - "integrity": "sha512-ERg+H//lSSYlZhBIUu+wJnqg30AbyBbpZlIhcshpn7BNzpoRODZgfyr9J+8ERf3ooC6af3u7Lcl01nleau7MrA==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.3.tgz", + "integrity": "sha512-gL//fkxfWUsIlFL2Tl42Cl6+HFALEaB1FU76I/Fy+oZjRreP7OPMXFlGbxM7NQsI0ZpUfw76sHnv0WNYuTb7Iw==", "dev": true, "requires": { - "escape-string-regexp": "^2.0.0", - "source-map-support": "^0.5.20" + "escape-string-regexp": "^2.0.0" }, "dependencies": { "escape-string-regexp": { @@ -27756,18 +28285,18 @@ } }, "standard": { - "version": "16.0.4", - "resolved": "https://registry.npmjs.org/standard/-/standard-16.0.4.tgz", - "integrity": "sha512-2AGI874RNClW4xUdM+bg1LRXVlYLzTNEkHmTG5mhyn45OhbgwA+6znowkOGYy+WMb5HRyELvtNy39kcdMQMcYQ==", + "version": "16.0.3", + "resolved": "https://registry.npmjs.org/standard/-/standard-16.0.3.tgz", + "integrity": "sha512-70F7NH0hSkNXosXRltjSv6KpTAOkUkSfyu3ynyM5dtRUiLtR+yX9EGZ7RKwuGUqCJiX/cnkceVM6HTZ4JpaqDg==", "dev": true, "requires": { - "eslint": "~7.18.0", - "eslint-config-standard": "16.0.3", + "eslint": "~7.13.0", + "eslint-config-standard": "16.0.2", "eslint-config-standard-jsx": "10.0.0", - "eslint-plugin-import": "~2.24.2", + "eslint-plugin-import": "~2.22.1", "eslint-plugin-node": "~11.1.0", - "eslint-plugin-promise": "~5.1.0", - "eslint-plugin-react": "~7.25.1", + "eslint-plugin-promise": "~4.2.1", + "eslint-plugin-react": "~7.21.5", "standard-engine": "^14.0.1" } }, @@ -27801,63 +28330,6 @@ "requires": { "is-descriptor": "^0.1.0" } - }, - "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=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "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=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - } - }, - "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==", - "dev": true } } }, @@ -27867,23 +28339,6 @@ "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=", "dev": true }, - "string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dev": true, - "requires": { - "safe-buffer": "~5.2.0" - }, - "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==", - "dev": true - } - } - }, "string-hash": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/string-hash/-/string-hash-1.1.3.tgz", @@ -27907,14 +28362,14 @@ "dev": true }, "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", + "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", "dev": true, "requires": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "strip-ansi": "^6.0.0" } }, "string.prototype.matchall": { @@ -27953,13 +28408,28 @@ "define-properties": "^1.1.3" } }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "requires": { + "safe-buffer": "~5.2.0" + }, + "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==" + } + } + }, "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", "dev": true, "requires": { - "ansi-regex": "^5.0.1" + "ansi-regex": "^5.0.0" } }, "strip-bom": { @@ -28068,42 +28538,54 @@ "dev": true }, "table": { - "version": "6.7.2", - "resolved": "https://registry.npmjs.org/table/-/table-6.7.2.tgz", - "integrity": "sha512-UFZK67uvyNivLeQbVtkiUs8Uuuxv24aSL4/Vil2PJVtMgU8Lx0CYkP12uCGa3kjyQzOSgV1+z9Wkb82fCGsO0g==", + "version": "5.4.6", + "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", + "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", "dev": true, "requires": { - "ajv": "^8.0.1", - "lodash.clonedeep": "^4.5.0", - "lodash.truncate": "^4.4.2", - "slice-ansi": "^4.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1" + "ajv": "^6.10.2", + "lodash": "^4.17.14", + "slice-ansi": "^2.1.0", + "string-width": "^3.0.0" }, "dependencies": { - "ajv": { - "version": "8.6.3", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.6.3.tgz", - "integrity": "sha512-SMJOdDP6LqTkD0Uq8qLi+gMwSt0imXLSV080qFVwJCpH9U6Mb+SUGHAXM0KNbcBPguytWyvFxcHgMLe2D2XSpw==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - } + "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 }, - "json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", "dev": true }, - "require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", "dev": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "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" + } } } }, @@ -28126,6 +28608,22 @@ "@istanbuljs/schema": "^0.1.2", "glob": "^7.1.4", "minimatch": "^3.0.4" + }, + "dependencies": { + "glob": { + "version": "7.1.7", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", + "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + } } }, "text-table": { @@ -28152,6 +28650,22 @@ "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==", "dev": true }, + "through2": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/through2/-/through2-3.0.2.tgz", + "integrity": "sha512-enaDQ4MUyP2W6ZyT6EsMzqBPZaM/avg8iuo+l2d3QCs0J+6RaqkHV/2/lOwDTueBHeJ/2LG9lrLW3d5rWPucuQ==", + "requires": { + "inherits": "^2.0.4", + "readable-stream": "2 || 3" + }, + "dependencies": { + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + } + } + }, "tiny-emitter": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/tiny-emitter/-/tiny-emitter-2.1.0.tgz", @@ -28167,9 +28681,9 @@ } }, "tmpl": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", - "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz", + "integrity": "sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=", "dev": true }, "to-fast-properties": { @@ -28211,12 +28725,13 @@ } }, "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==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", "dev": true, "requires": { - "is-number": "^7.0.0" + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" } }, "tough-cookie": { @@ -28228,6 +28743,14 @@ "psl": "^1.1.33", "punycode": "^2.1.1", "universalify": "^0.1.2" + }, + "dependencies": { + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true + } } }, "tr46": { @@ -28237,6 +28760,14 @@ "dev": true, "requires": { "punycode": "^2.1.1" + }, + "dependencies": { + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true + } } }, "tsconfig-paths": { @@ -28268,6 +28799,14 @@ } } }, + "txml": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/txml/-/txml-3.2.5.tgz", + "integrity": "sha512-AtN8AgJLiDanttIXJaQlxH8/R0NOCNwto8kcO7BaxdLgsN9b7itM9lnTD7c2O3TadP+hHB9j7ra5XGFRPNnk/g==", + "requires": { + "through2": "^3.0.1" + } + }, "type-check": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", @@ -28284,9 +28823,9 @@ "dev": true }, "type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", "dev": true }, "typed-function": { @@ -28319,31 +28858,31 @@ } }, "unicode-canonical-property-names-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", - "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", + "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==", "dev": true }, "unicode-match-property-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", - "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz", + "integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==", "dev": true, "requires": { - "unicode-canonical-property-names-ecmascript": "^2.0.0", - "unicode-property-aliases-ecmascript": "^2.0.0" + "unicode-canonical-property-names-ecmascript": "^1.0.4", + "unicode-property-aliases-ecmascript": "^1.0.4" } }, "unicode-match-property-value-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.0.0.tgz", - "integrity": "sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz", + "integrity": "sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ==", "dev": true }, "unicode-property-aliases-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.0.0.tgz", - "integrity": "sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz", + "integrity": "sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg==", "dev": true }, "union-value": { @@ -28356,14 +28895,6 @@ "get-value": "^2.0.6", "is-extendable": "^0.1.1", "set-value": "^2.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true - } } }, "uniq": { @@ -28421,12 +28952,6 @@ "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", "dev": true - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true } } }, @@ -28437,6 +28962,14 @@ "dev": true, "requires": { "punycode": "^2.1.0" + }, + "dependencies": { + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true + } } }, "urix": { @@ -28454,8 +28987,7 @@ "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" }, "uuid": { "version": "8.3.2", @@ -28481,6 +29013,15 @@ "source-map": "^0.7.3" }, "dependencies": { + "convert-source-map": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", + "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.1" + } + }, "source-map": { "version": "0.7.3", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", @@ -28582,9 +29123,9 @@ "dev": true }, "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "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" @@ -28658,6 +29199,15 @@ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "dev": true }, + "write": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", + "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", + "dev": true, + "requires": { + "mkdirp": "^0.5.1" + } + }, "write-file-atomic": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", @@ -28681,13 +29231,6 @@ } } }, - "ws": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.5.tgz", - "integrity": "sha512-BAkMFcAzl8as1G/hArkxOxq3G7pjUqQ3gzYbLL0/5zNkph70e+lCoxBGnm6AW1+/aiNeV4fnKqZ8m4GZewmH2w==", - "dev": true, - "requires": {} - }, "xdg-basedir": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", @@ -28711,12 +29254,6 @@ "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", "dev": true }, - "xtend": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.2.0.tgz", - "integrity": "sha1-7vax8ZjByN6vrYsXZaBNrUoBxak=", - "dev": true - }, "y18n": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", diff --git a/package.json b/package.json index 093bad48..752bd763 100644 --- a/package.json +++ b/package.json @@ -61,7 +61,7 @@ "standard": "^16.0.3" }, "dependencies": { - "dcmjs": "^0.18", + "dcmjs": "^0.19.0", "dicomweb-client": "^0.8", "image-type": "^4.1", "mathjs": "^9.4", diff --git a/src/annotations/_AnnotationManager.js b/src/annotations/_AnnotationManager.js index 0f1e4e4f..0e099832 100644 --- a/src/annotations/_AnnotationManager.js +++ b/src/annotations/_AnnotationManager.js @@ -1,28 +1,34 @@ -import dcmjs from 'dcmjs' +import dcmjs from "dcmjs"; +import Feature from "ol/Feature"; -import _MarkupManager from './markups/_MarkupManager' +import _MarkupManager from "./markups/_MarkupManager"; /** Enums */ -import Enums from '../enums' +import Enums from "../enums"; /** Markers */ -import ArrowMarker, { format as arrowFormat } from './markers/arrow' +import ArrowMarker, { format as arrowFormat } from "./markers/arrow"; /** Markups */ import MeasurementMarkup, { - format as measurementFormat -} from './markups/measurement' + format as measurementFormat, +} from "./markups/measurement"; import TextEvaluationMarkup, { - format as textFormat -} from './markups/textEvaluation' + format as textFormat, +} from "./markups/textEvaluation"; /** Utils */ -import { areCodedConceptsEqual, getContentItemNameCodedConcept } from '../utils' +import { + areCodedConceptsEqual, + getContentItemNameCodedConcept, +} from "../utils"; +import ellipse from "./markups/ellipse/ellipse"; +import bidirectional from "./markups/bidirectional/bidirectional"; -const { Marker, Markup } = Enums +const { Marker, Markup } = Enums; class _AnnotationManager { - constructor ({ map, pyramid, drawingSource } = {}) { + constructor({ map, pyramid, drawingSource, features } = {}) { const markupManager = new _MarkupManager({ map, pyramid, @@ -30,22 +36,27 @@ class _AnnotationManager { formatters: { [Marker.Arrow]: arrowFormat, [Markup.Measurement]: measurementFormat, - [Markup.TextEvaluation]: textFormat - } - }) + [Markup.TextEvaluation]: textFormat, + }, + }); this.props = { map, pyramid, - markupManager - } + markupManager, + drawingSource, + features, + }; /** Markups */ - this[Markup.Measurement] = MeasurementMarkup(this.props) - this[Markup.TextEvaluation] = TextEvaluationMarkup(this.props) + this[Markup.Measurement] = MeasurementMarkup(this.props); + this[Markup.TextEvaluation] = TextEvaluationMarkup(this.props); /** Markers */ - this[Marker.Arrow] = ArrowMarker(this.props) + this[Marker.Arrow] = ArrowMarker(this.props); + + /** Init */ + this.onInit(); } /** @@ -54,26 +65,40 @@ class _AnnotationManager { * * @param {Feature} feature The feature */ - _addMeasurementsAndEvaluationsProperties (feature) { - const { measurements, evaluations } = feature.getProperties() + _addMeasurementsAndEvaluationsProperties(feature) { + const { measurements, evaluations } = feature.getProperties(); if (measurements && measurements.length) { - return measurements.some((measurement) => {// eslint-disable-line + return measurements.some((measurement) => { const SUPPORTED_MEASUREMENTS_CODED_CONCEPTS = [ new dcmjs.sr.coding.CodedConcept({ - meaning: 'Area', - value: '42798000', - schemeDesignator: 'SCT' + meaning: "Area", + value: "42798000", + schemeDesignator: "SCT", + }), + new dcmjs.sr.coding.CodedConcept({ + meaning: "Length", + value: "410668003", + schemeDesignator: "SCT", + }), + new dcmjs.sr.coding.CodedConcept({ + meaning: "Long Axis", + value: "G-A185", + schemeDesignator: "SRT", + }), + new dcmjs.sr.coding.CodedConcept({ + meaning: "Short Axis", + value: "G-A186", + schemeDesignator: "SRT", }), new dcmjs.sr.coding.CodedConcept({ - meaning: 'Length', - value: '410668003', - schemeDesignator: 'SCT' - }) - ] - const measurementCodedConcept = getContentItemNameCodedConcept( - measurement - ) + meaning: "AREA", + value: "G-D7FE", + schemeDesignator: "SRT", + }), + ]; + const measurementCodedConcept = + getContentItemNameCodedConcept(measurement); if ( SUPPORTED_MEASUREMENTS_CODED_CONCEPTS.some((codedConcept) => areCodedConceptsEqual(measurementCodedConcept, codedConcept) @@ -82,23 +107,22 @@ class _AnnotationManager { feature.set( Enums.InternalProperties.Markup, Enums.Markup.Measurement - ) + ); } - }) + }); } if (evaluations && evaluations.length) { - return evaluations.some((evaluation) => {// eslint-disable-line + return evaluations.some((evaluation) => { const SUPPORTED_EVALUATIONS_CODED_CONCEPTS = [ new dcmjs.sr.coding.CodedConcept({ - value: '112039', - meaning: 'Tracking Identifier', - schemeDesignator: 'DCM' - }) - ] - const evaluationCodedConcept = getContentItemNameCodedConcept( - evaluation - ) + value: "112039", + meaning: "Tracking Identifier", + schemeDesignator: "DCM", + }), + ]; + const evaluationCodedConcept = + getContentItemNameCodedConcept(evaluation); if ( SUPPORTED_EVALUATIONS_CODED_CONCEPTS.some((codedConcept) => areCodedConceptsEqual(codedConcept, evaluationCodedConcept) @@ -107,9 +131,9 @@ class _AnnotationManager { feature.set( Enums.InternalProperties.Markup, Enums.Markup.TextEvaluation - ) + ); } - }) + }); } } @@ -118,8 +142,8 @@ class _AnnotationManager { * * @param {boolean} isVisible */ - setVisible (isVisible) { - this.props.markupManager.setVisible(isVisible) + setVisible(isVisible) { + this.props.markupManager.setVisible(isVisible); } /** @@ -128,59 +152,156 @@ class _AnnotationManager { * @param {string} id The markup id * @param {boolean} isVisible The markup visibility */ - setMarkupVisibility (id, isVisible) { - this.props.markupManager.setVisibility(id, isVisible) + setMarkupVisibility(id, isVisible) { + const feature = this.props.drawingSource.getFeatureById(id); + if (feature) { + this.props.markupManager.setVisibility(id, isVisible); + } + } + + getNormalizedFeature(feature) { + return ( + bidirectional.getNormalizedFeature(feature, this.props) || + ellipse.getNormalizedFeature(feature, this.props) + ); + } + + getNormalizedFeatureId(feature) { + return ( + bidirectional.getNormalizedFeatureId(feature, this.props) || + ellipse.getNormalizedFeatureId(feature, this.props) + ); + } + + getMeasurements(feature) { + /** Annotations */ + return bidirectional + .getMeasurements(feature, this.props) + .concat(ellipse.getMeasurements(feature, this.props)); } - onAdd (feature) { + onAdd(feature) { /** * Add properties to ROI feature before triggering * markup and markers callbacks to keep UI in sync. */ - this._addMeasurementsAndEvaluationsProperties(feature) + this._addMeasurementsAndEvaluationsProperties(feature); + + /** Markups & Markers */ + this[Marker.Arrow].onAdd(feature, this.props); + this[Markup.Measurement].onAdd(feature, this.props); + this[Markup.TextEvaluation].onAdd(feature, this.props); + + /** Annotations */ + bidirectional.onAdd(feature, this.props); + ellipse.onAdd(feature, this.props); + } + + onInit() { + /** Markups & Markers */ + this[Marker.Arrow].onInit(this.props); + this[Markup.Measurement].onInit(this.props); + this[Markup.TextEvaluation].onInit(this.props); - this[Marker.Arrow].onAdd(feature) - this[Markup.Measurement].onAdd(feature) - this[Markup.TextEvaluation].onAdd(feature) + /** Annotations */ + bidirectional.onInit(this.props); + ellipse.onInit(this.props); } - onFailure (uid) { - this[Marker.Arrow].onFailure(uid) - this[Markup.Measurement].onFailure(uid) - this[Markup.TextEvaluation].onFailure(uid) + onFailure(uid) { + /** Markups & Markers */ + this[Marker.Arrow].onFailure(uid, this.props); + this[Markup.Measurement].onFailure(uid, this.props); + this[Markup.TextEvaluation].onFailure(uid, this.props); + + /** Annotations */ + bidirectional.onFailure(uid, this.props); + ellipse.onFailure(uid, this.props); + } + + onRemove(feature) { + /** Markups & Markers */ + this[Marker.Arrow].onRemove(feature, this.props); + this[Markup.Measurement].onRemove(feature, this.props); + this[Markup.TextEvaluation].onRemove(feature, this.props); + + /** Annotations */ + bidirectional.onRemove(feature, this.props); + ellipse.onRemove(feature, this.props); } - onRemove (feature) { - this[Marker.Arrow].onRemove(feature) - this[Markup.Measurement].onRemove(feature) - this[Markup.TextEvaluation].onRemove(feature) + onUpdate(feature) { + /** Markups & Markers */ + this[Marker.Arrow].onUpdate(feature, this.props); + this[Markup.Measurement].onUpdate(feature, this.props); + this[Markup.TextEvaluation].onUpdate(feature, this.props); + + /** Annotations */ + bidirectional.onUpdate(feature, this.props); + ellipse.onUpdate(feature, this.props); } - onUpdate (feature) { - this[Marker.Arrow].onUpdate(feature) - this[Markup.Measurement].onUpdate(feature) - this[Markup.TextEvaluation].onUpdate(feature) + onDrawStart(event, drawingOptions) { + this.props.drawingOptions = drawingOptions; + + /** Markups & Markers */ + this[Marker.Arrow].onDrawStart(event, this.props); + this[Markup.Measurement].onDrawStart(event, this.props); + this[Markup.TextEvaluation].onDrawStart(event, this.props); + + /** Annotations */ + bidirectional.onDrawStart(event, this.props); + ellipse.onDrawStart(event, this.props); } - onDrawStart (event) { - this[Marker.Arrow].onDrawStart(event) - this[Markup.Measurement].onDrawStart(event) - this[Markup.TextEvaluation].onDrawStart(event) + onDrawEnd(event, drawingOptions) { + this.props.drawingOptions = drawingOptions; + + /** Markups & Markers */ + this[Marker.Arrow].onDrawEnd(event, this.props); + this[Markup.Measurement].onDrawEnd(event, this.props); + this[Markup.TextEvaluation].onDrawEnd(event, this.props); + + /** Annotations */ + bidirectional.onDrawEnd(event, this.props); + ellipse.onDrawEnd(event, this.props); + + /** Managers */ + this.props.markupManager.onDrawEnd(event, this.props); } - onDrawEnd (event) { - this[Marker.Arrow].onDrawEnd(event) - this[Markup.Measurement].onDrawEnd(event) - this[Markup.TextEvaluation].onDrawEnd(event) - this.props.markupManager.onDrawEnd(event) + onDrawAbort(event) { + /** Markups & Markers */ + this[Marker.Arrow].onDrawAbort(event, this.props); + this[Markup.Measurement].onDrawAbort(event, this.props); + this[Markup.TextEvaluation].onDrawAbort(event, this.props); + + /** Annotations */ + bidirectional.onDrawAbort(event, this.props); + ellipse.onDrawAbort(event, this.props); + + /** Managers */ + this.props.markupManager.onDrawAbort(event, this.props); } - onDrawAbort (event) { - this[Marker.Arrow].onDrawAbort(event) - this[Markup.Measurement].onDrawAbort(event) - this[Markup.TextEvaluation].onDrawAbort(event) - this.props.markupManager.onDrawAbort(event) + onSetFeatureStyle(feature, styleOptions) { + /** Markups & Markers */ + this[Marker.Arrow].onSetFeatureStyle(feature, styleOptions, this.props); + this[Markup.Measurement].onSetFeatureStyle( + feature, + styleOptions, + this.props + ); + this[Markup.TextEvaluation].onSetFeatureStyle( + feature, + styleOptions, + this.props + ); + + /** Annotations */ + bidirectional.onSetFeatureStyle(feature, styleOptions, this.props); + ellipse.onSetFeatureStyle(feature, styleOptions, this.props); } } -export default _AnnotationManager +export default _AnnotationManager; diff --git a/src/annotations/annotationInterface.js b/src/annotations/annotationInterface.js new file mode 100644 index 00000000..41c10d00 --- /dev/null +++ b/src/annotations/annotationInterface.js @@ -0,0 +1,19 @@ +const annotationInterface = { + onAdd(feature) {}, + onInit() {}, + onFailure(uid) {}, + onRemove(feature) {}, + onUpdate(feature) {}, + onDrawStart(event, drawingOptions) {}, + onDrawEnd(event, drawingOptions) {}, + onDrawAbort(event) {}, + onSetFeatureStyle(feature, styleOptions) {}, + getMeasurements() { + return []; + }, + getNormalizedFeature() { + return null; + }, +}; + +export default annotationInterface; diff --git a/src/annotations/markers/arrow.js b/src/annotations/markers/arrow.js index aa3f7745..b73fd043 100644 --- a/src/annotations/markers/arrow.js +++ b/src/annotations/markers/arrow.js @@ -6,6 +6,7 @@ import Icon from 'ol/style/Icon' import Enums from '../../enums' import defaultStyles from '../styles' +import annotationInterface from '../annotationInterface' /** * Format arrow output. @@ -123,7 +124,7 @@ const _isArrow = (feature) => * @param {object} dependencies.markupManager Markup manager shared instance */ const ArrowMarker = ({ map, markupManager }) => { - return { + return Object.assign({}, annotationInterface, { onAdd: (feature) => { if (_isArrow(feature)) { _applyStyles(feature, map) @@ -160,10 +161,7 @@ const ArrowMarker = ({ map, markupManager }) => { markupManager.remove(uid) } }, - onUpdate: (feature) => {}, - onDrawEnd: ({ feature }) => {}, - onDrawAbort: ({ feature }) => {} - } + }) } export default ArrowMarker diff --git a/src/annotations/markups/_MarkupManager.js b/src/annotations/markups/_MarkupManager.js index 1a233afb..e36059d1 100644 --- a/src/annotations/markups/_MarkupManager.js +++ b/src/annotations/markups/_MarkupManager.js @@ -14,6 +14,8 @@ import { getUnitSuffix } from '../../utils' import { coordinateWithOffset } from '../../scoord3dUtils' import defaultStyles from '../styles' +const DEFAULT_MARKUP_OFFSET = 2; + class _MarkupManager { constructor ({ map, pyramid, drawingSource, formatters, onClick, onStyle } = {}) { this._map = map @@ -36,7 +38,7 @@ class _MarkupManager { source: new VectorSource({ features: this._links }) }) - this._markupsOverlay = new Overlay({ element: this._styleTag }) + this._markupsOverlay = new Overlay({ element: this._styleTag, stopEvent: true }) this._map.addOverlay(this._markupsOverlay) this._map.addLayer(this._linksVector) } @@ -57,6 +59,7 @@ class _MarkupManager { }) return } + this._markups.forEach((markup) => { this._map.addOverlay(markup.overlay) this._map.removeOverlay(markup.overlay) @@ -83,6 +86,15 @@ class _MarkupManager { return this._markups.get(id) } + /** + * Returns all markup overlays + * + * @return {array} The markup overlays + */ + getOverlays() { + return Array.from(this._markups.values()).map(v => v.overlay); + } + /** * Removes a markup and its link. * @@ -112,7 +124,19 @@ class _MarkupManager { } /** - * Set markup visibility. + * Update feature's presentation state property. + * + * @param {object} options + */ + updatePresentationState({ feature, coordinates }) { + feature.set(Enums.InternalProperties.PresentationState, { + markup: { + coordinates, + }, + }); + } + + /* Set markup visibility. * * @param {string} id The markup id * @param {boolean} isVisible The markup visibility @@ -144,14 +168,23 @@ class _MarkupManager { * * @param {object} options The options * @param {Feature} options.feature The feature to plug the measure markup + * @param {Style} options.style A custom style * @param {string} options.value The inner content of element + * @param {string} options.position The position * @param {boolean} options.isLinkable Create a link between feature and markup * @param {boolean} options.isDraggable Allow markup to be dragged * @param {array} offset Markup offset * @return {object} The markup object */ - create ({ feature, value = '', isLinkable = true, isDraggable = true }) { - const id = feature.getId() + create({ + feature, + style, + value = "", + position, + isLinkable = true, + isDraggable = true, + }) { + const id = feature.getId(); if (!id) { console.warn('Failed to create markup, feature id not found') return @@ -162,32 +195,44 @@ class _MarkupManager { return this.get(id) } - const markup = { id, isLinkable, isDraggable } + const markup = { id, isLinkable, isDraggable, style } const element = document.createElement('div') element.id = markup.isDraggable ? Enums.InternalProperties.Markup : '' element.className = 'ol-tooltip ol-tooltip-measure' element.innerText = value - const spacedCoordinate = coordinateWithOffset(feature) + const spacedCoordinate = coordinateWithOffset(feature, DEFAULT_MARKUP_OFFSET, this._map) + + element.onpointerdown = event => { + event.stopPropagation(); + } markup.element = element markup.overlay = new Overlay({ className: 'markup-container', positioning: 'center-center', - stopEvent: false, + stopEvent: true, dragging: false, - position: spacedCoordinate, - element: markup.element - }) + position: position || spacedCoordinate, + element: markup.element, + }); - this._map.addOverlay(markup.overlay) - this._markups.set(id, markup) + this.updatePresentationState({ + feature, + coordinates: position || spacedCoordinate, + }); + + this._map.addOverlay(markup.overlay); + this._markups.set(id, markup); this._drawLink(feature) this._wireInternalEvents(feature) - return markup + const isVisible = this._linksVector.getVisible(); + this.setVisible(isVisible); + + return markup; } /** @@ -204,6 +249,11 @@ class _MarkupManager { Enums.FeatureGeometryEvents.CHANGE, ({ target: geometry }) => { if (this.has(id)) { + const { isShortAxis, isLongAxis } = feature.getProperties(); + if (isShortAxis, isLongAxis) { + return; + } + const view = this._map.getView() const unitSuffix = getUnitSuffix(view) const format = this._getFormatter(feature) @@ -213,7 +263,6 @@ class _MarkupManager { value: output, coordinate: geometry.getLastCoordinate() }) - this._drawLink(feature) } } ) @@ -260,12 +309,16 @@ class _MarkupManager { markup.isDraggable ) { /** Doesn't need to have the offset */ - markup.overlay.setPosition(event.coordinate) - this._drawLink(feature) + markup.overlay.setPosition(event.coordinate); + this.updatePresentationState({ + feature, + coordinates: event.coordinate, + }); + this._drawLink(feature); } }) - this._map.on(Enums.MapEvents.POINTER_UP, () => { + markup.element.addEventListener(Enums.HTMLElementEvents.MOUSE_UP, () => { const markup = this.get(id) if ( markup && @@ -275,7 +328,7 @@ class _MarkupManager { dragPan.setActive(true) markup.overlay.set(dragProperty, false) } - }) + }); } onDrawAbort ({ feature }) { @@ -289,7 +342,8 @@ class _MarkupManager { * @returns {void} */ _styleTooltip (feature) { - const styleOptions = feature.get(Enums.InternalProperties.StyleOptions) + const marker = this.get(feature.getId()); + const styleOptions = marker && marker.style !== undefined ? marker.style : feature.get(Enums.InternalProperties.StyleOptions) if (styleOptions && styleOptions.stroke) { const { color } = styleOptions.stroke const tooltipColor = color || defaultStyles.stroke.color @@ -302,10 +356,16 @@ class _MarkupManager { styles.setStroke(stroke) link.setStyle(styles) } - const marker = this.get(feature.getId()) if (marker) { marker.element.style.color = tooltipColor } + /** + * This is necessary to resolve intermediary error: + * 'Two axis of Ellipse must have right angle' + * + * TODO: Resolve core problem. + */ + feature.changed(); } } @@ -321,6 +381,13 @@ class _MarkupManager { white-space: nowrap; font-size: 17px; font-weight: bold; + text-shadow: 0px 0px 20px rgba(225,225,225,0.6), + 0px 0px 20px rgb(225 225 225 / 60%), + 0px 0px 20px rgb(225 225 225 / 60%), + 0px 0px 20px rgb(225 225 225 / 60%), + 0px 0px 20px rgb(225 225 225 / 60%), + 0px 0px 20px rgb(225 225 225 / 60%), + 0px 0px 20px rgb(225 225 225 / 60%); } .ol-tooltip-measure { opacity: 1; } .ol-tooltip-static { color: ${color}; } @@ -372,10 +439,12 @@ class _MarkupManager { } if (coordinate) { - markup.overlay.setPosition(coordinateWithOffset(feature)) + const padding = (markup.element.offsetWidth + markup.element.offsetHeight) / 2; + markup.overlay.setPosition(coordinateWithOffset(feature, DEFAULT_MARKUP_OFFSET + padding, this._map)) } this._markups.set(id, markup) + this._drawLink(feature) } /** diff --git a/src/annotations/markups/bidirectional/bidirectional.js b/src/annotations/markups/bidirectional/bidirectional.js new file mode 100644 index 00000000..7569558a --- /dev/null +++ b/src/annotations/markups/bidirectional/bidirectional.js @@ -0,0 +1,397 @@ +import Draw from "ol/interaction/Draw"; +import Style from "ol/style/Style"; +import Stroke from "ol/style/Stroke"; +import dcmjs from "dcmjs"; + +import Enums from "../../../enums"; +import moveBidirectionalHandles from "./moveBidirectionalHandles"; +import getShortAxisCoords from "./getShortAxisCoords"; +import createAndAddShortAxisFeature from "./createAndAddShortAxisFeature"; +import updateMarkup from "./updateMarkup"; +import { getShortAxisId, getLongAxisId } from "./id"; +import getDraggedHandleIndex from "./getDraggedHandleIndex"; +import { distance } from "./mathUtils"; +import annotationInterface from "../../annotationInterface"; +import { getFeatureScoord3dLength } from "../../../scoord3dUtils"; + +const styles = { + stroke: { + color: "black", + width: 3, + }, +}; + +const getAxisStyle = (drawStyles) => { + const stroke = (drawStyles ? drawStyles : styles).stroke; + return new Style({ + stroke: new Stroke({ + color: stroke.color, + width: stroke.width, + }), + }); +}; + +const isDrawingBidirectional = (drawingOptions) => + drawingOptions.geometryType === Enums.GeometryType.Line && + drawingOptions[Enums.InternalProperties.Bidirectional] === true; + +const attachChangeEvents = (longAxisFeature, viewerProperties) => { + const { drawingSource, map, drawingOptions } = viewerProperties; + + longAxisFeature.setProperties({ isLongAxis: true }, true); + + const onLongAxisFeatureGeometryChange = () => { + const shortAxisCoords = getShortAxisCoords(longAxisFeature); + + const id = getShortAxisId(longAxisFeature); + const shortAxisFeature = drawingSource.getFeatureById(id); + + if (shortAxisFeature) { + const shortAxisGeometry = shortAxisFeature.getGeometry(); + shortAxisGeometry.setCoordinates(shortAxisCoords); + updateMarkup(shortAxisFeature, longAxisFeature, viewerProperties); + return; + } + + createAndAddShortAxisFeature( + longAxisFeature, + viewerProperties, + drawingOptions + ? getAxisStyle(drawingOptions[Enums.InternalProperties.StyleOptions]) + : getAxisStyle() + ); + }; + + const longAxisGeometry = longAxisFeature.getGeometry(); + + longAxisGeometry.on( + Enums.FeatureGeometryEvents.CHANGE, + onLongAxisFeatureGeometryChange + ); + + const interactions = map.getInteractions(); + const draw = interactions.getArray().find((i) => i instanceof Draw); + if (draw) { + const onDrawEndHandler = () => { + longAxisGeometry.un( + Enums.FeatureGeometryEvents.CHANGE, + onLongAxisFeatureGeometryChange + ); + draw.un(Enums.InteractionEvents.DRAW_END, onDrawEndHandler); + }; + draw.on(Enums.InteractionEvents.DRAW_END, onDrawEndHandler); + } +}; + +/** + * This is used to avoid changing features while + * dragging because of getClosestFeatureToCoordinate call + */ +let draggedFeature = null; +let draggedHandleIndex = null; +let isClickingAHandle = null; +let pointDownCoordinate = null; +let lastTranslatedCoord = null; + +const resetPointEventState = () => { + draggedFeature = null; + draggedHandleIndex = null; + isClickingAHandle = null; + pointDownCoordinate = null; + lastTranslatedCoord = null; +}; + +const updatePointerEventState = ({ coordinate }) => { + pointDownCoordinate = coordinate; + lastTranslatedCoord = coordinate; +}; + +const onPointerDragHandler = (event) => { + const viewerProperties = global.viewerProperties; + const { drawingSource } = viewerProperties; + + const handleCoordinate = event.coordinate; + const handle = { x: handleCoordinate[0], y: handleCoordinate[1] }; + + if (draggedFeature === null) { + draggedFeature = + drawingSource.getClosestFeatureToCoordinate(handleCoordinate); + } + + if (!draggedFeature) { + return; + } + + const { isLongAxis, isShortAxis } = draggedFeature.getProperties(); + const isBidirectional = isLongAxis || isShortAxis; + + if (!isBidirectional) { + return; + } + + const draggedFeatureGeometry = draggedFeature.getGeometry(); + + /** Check if clicking in the handles */ + if (isClickingAHandle === null) { + const [start, end] = draggedFeatureGeometry.getCoordinates(); + const distanceStart = distance( + { x: pointDownCoordinate[0], y: pointDownCoordinate[1] }, + { x: start[0], y: start[1] } + ); + const distanceEnd = distance( + { x: pointDownCoordinate[0], y: pointDownCoordinate[1] }, + { x: end[0], y: end[1] } + ); + const resolution = map.getView().getResolution(); + const proximity = 5 * resolution; + isClickingAHandle = Math.min(distanceStart, distanceEnd) <= proximity; + } + + /** If clicking outside handles, just stop event and translate */ + if (isClickingAHandle === false) { + const { subFeatures } = draggedFeature.getProperties(); + if (subFeatures && subFeatures.length > 0) { + subFeatures.forEach((subFeature) => { + const geometry = subFeature.getGeometry(); + const coords = lastTranslatedCoord; + + const deltaX = handleCoordinate[0] - coords[0]; + const deltaY = handleCoordinate[1] - coords[1]; + + geometry.translate(deltaX, deltaY); + draggedFeatureGeometry.translate(deltaX, deltaY); + + lastTranslatedCoord = event.coordinate; + }); + } + + event.stopPropagation(); + return; + } + + if (draggedHandleIndex === null) { + draggedHandleIndex = getDraggedHandleIndex(draggedFeature, handle); + } + + if (isLongAxis) { + const shortAxisFeatureId = getShortAxisId(draggedFeature); + const shortAxisFeature = drawingSource.getFeatureById(shortAxisFeatureId); + + updateMarkup(shortAxisFeature, draggedFeature, viewerProperties); + moveBidirectionalHandles( + handle, + draggedFeature, + viewerProperties, + event, + draggedHandleIndex + ); + return; + } + + if (isShortAxis) { + const longAxisFeatureId = getLongAxisId(draggedFeature); + const longAxisFeature = drawingSource.getFeatureById(longAxisFeatureId); + + updateMarkup(draggedFeature, longAxisFeature, viewerProperties); + moveBidirectionalHandles( + handle, + draggedFeature, + viewerProperties, + event, + draggedHandleIndex + ); + return; + } +}; + +const global = {}; + +const attachPointerEvents = (viewerProperties) => { + const { map } = viewerProperties; + global.viewerProperties = viewerProperties; + + map.on(Enums.MapEvents.POINTER_UP, resetPointEventState); + map.on(Enums.MapEvents.POINTER_DOWN, updatePointerEventState); + map.on(Enums.MapEvents.POINTER_DRAG, onPointerDragHandler); +}; + +const bidirectional = Object.assign({}, annotationInterface, { + onAdd: (feature, viewerProperties) => { + const { measurements } = feature.getProperties(); + + /** TODO: Remove long axis check. */ + if (measurements && JSON.stringify(measurements).includes("Long Axis")) { + attachChangeEvents(feature, viewerProperties); + createAndAddShortAxisFeature(feature, viewerProperties, getAxisStyle()); + attachPointerEvents(viewerProperties); + } + }, + onDrawStart: (event, viewerProperties) => { + const { drawingOptions } = viewerProperties; + if (isDrawingBidirectional(drawingOptions)) { + const longAxisFeature = event.feature; + attachChangeEvents(longAxisFeature, viewerProperties); + } + }, + getMeasurements: (feature, viewerProperties) => { + const { drawingSource, pyramid } = viewerProperties; + + const { isShortAxis, isLongAxis } = feature.getProperties(); + const isBidirectional = isShortAxis || isLongAxis; + + if (isBidirectional) { + let longAxisFeature; + let shortAxisFeature; + let shortAxisLength = 0; + let longAxisLength = 0; + let longAxis = { + point1: { + x: 0, + y: 0, + }, + point2: { + x: 0, + y: 0, + }, + }; + let shortAxis = { + point1: { + x: 0, + y: 0, + }, + point2: { + x: 0, + y: 0, + }, + }; + + if (isShortAxis) { + shortAxisFeature = feature; + shortAxisLength = getFeatureScoord3dLength(shortAxisFeature, pyramid); + const shortAxisCoords = shortAxisFeature.getGeometry().getCoordinates(); + shortAxis.point1.x = shortAxisCoords[0][0]; + shortAxis.point1.y = shortAxisCoords[0][1]; + shortAxis.point2.x = shortAxisCoords[1][0]; + shortAxis.point2.y = shortAxisCoords[1][1]; + + const longAxisFeatureId = getLongAxisId(shortAxisFeature); + longAxisFeature = drawingSource.getFeatureById(longAxisFeatureId); + + if (longAxisFeature) { + longAxisLength = getFeatureScoord3dLength(longAxisFeature, pyramid); + const longAxisCoords = longAxisFeature.getGeometry().getCoordinates(); + longAxis.point1.x = longAxisCoords[0][0]; + longAxis.point1.y = longAxisCoords[0][1]; + longAxis.point2.x = longAxisCoords[1][0]; + longAxis.point2.y = longAxisCoords[1][1]; + } + } + + if (isLongAxis) { + longAxisFeature = feature; + longAxisLength = getFeatureScoord3dLength(longAxisFeature, pyramid); + const longAxisCoords = longAxisFeature.getGeometry().getCoordinates(); + longAxis.point1.x = longAxisCoords[0][0]; + longAxis.point1.y = longAxisCoords[0][1]; + longAxis.point2.x = longAxisCoords[1][0]; + longAxis.point2.y = longAxisCoords[1][1]; + + const shortAxisFeatureId = getShortAxisId(longAxisFeature); + shortAxisFeature = drawingSource.getFeatureById(shortAxisFeatureId); + + if (shortAxisFeature) { + shortAxisLength = getFeatureScoord3dLength(shortAxisFeature, pyramid); + const shortAxisCoords = shortAxisFeature + .getGeometry() + .getCoordinates(); + shortAxis.point1.x = shortAxisCoords[0][0]; + shortAxis.point1.y = shortAxisCoords[0][1]; + shortAxis.point2.x = shortAxisCoords[1][0]; + shortAxis.point2.y = shortAxisCoords[1][1]; + } + } + + const bidirectional = new dcmjs.utilities.TID300.Bidirectional({ + longAxis, + shortAxis, + longAxisLength, + shortAxisLength, + }); + const contentItem = bidirectional.contentItem(); + const numContentItems = contentItem.filter( + (ci) => ci.ValueType === "NUM" + ); + return numContentItems.map((measurement) => { + /** Update format wrong in dcmjs */ + measurement.ConceptNameCodeSequence = [ + measurement.ConceptNameCodeSequence, + ]; + return measurement; + }); + } + return []; + }, + onDrawEnd: (event, viewerProperties) => { + const { isLongAxis, isShortAxis } = event.feature.getProperties(); + const isBidirectional = isLongAxis || isShortAxis; + if (isBidirectional) { + attachPointerEvents(viewerProperties); + } + }, + onRemove: (feature, { drawingSource }) => { + const { isLongAxis } = feature.getProperties(); + if (isLongAxis) { + /** + * TODO: This generate error noise because short axis is invisible feature + * and won't be available in the remove handlers elsewhere. + */ + const shortAxisFeatureId = getShortAxisId(feature); + const shortAxisFeature = drawingSource.getFeatureById(shortAxisFeatureId); + drawingSource.removeFeature(shortAxisFeature); + } + }, + onSetFeatureStyle: (feature, styleOptions, viewerProperties) => { + const { drawingSource } = viewerProperties; + const { isLongAxis, isShortAxis } = feature.getProperties(); + + const isBidirectional = isLongAxis || isShortAxis; + + if (!isBidirectional) { + return; + } + + if (isBidirectional) { + if (styleOptions.stroke) { + styles.stroke = Object.assign(styles.stroke, styleOptions.stroke); + } + } + + const axisStyle = getAxisStyle(); + + if (isLongAxis) { + feature.setStyle(axisStyle); + feature.set(Enums.InternalProperties.StyleOptions, styles); + + const shortAxisFeatureId = getShortAxisId(feature); + const shortAxisFeature = drawingSource.getFeatureById(shortAxisFeatureId); + if (shortAxisFeature) { + shortAxisFeature.setStyle(axisStyle); + shortAxisFeature.set(Enums.InternalProperties.StyleOptions, styles); + } + } + + if (isShortAxis) { + feature.setStyle(axisStyle); + feature.set(Enums.InternalProperties.StyleOptions, styles); + + const longAxisFeatureId = getLongAxisId(draggedFeature); + const longAxisFeature = drawingSource.getFeatureById(longAxisFeatureId); + if (longAxisFeature) { + longAxisFeature.setStyle(axisStyle); + longAxisFeature.set(Enums.InternalProperties.StyleOptions, styles); + } + } + } +}) + +export default bidirectional; diff --git a/src/annotations/markups/bidirectional/createAndAddShortAxisFeature.js b/src/annotations/markups/bidirectional/createAndAddShortAxisFeature.js new file mode 100644 index 00000000..639046d5 --- /dev/null +++ b/src/annotations/markups/bidirectional/createAndAddShortAxisFeature.js @@ -0,0 +1,40 @@ +import LineString from "ol/geom/LineString"; +import Feature from "ol/Feature"; + +import Enums from "../../../enums"; +import updateMarkup from "./updateMarkup"; +import { getShortAxisId } from "./id"; +import getShortAxisCoords from "./getShortAxisCoords"; + +const createAndAddShortAxisFeature = ( + longAxisFeature, + viewerProperties, + shortAxisStyle +) => { + const { drawingSource } = viewerProperties; + const id = getShortAxisId(longAxisFeature); + + const shortAxisCoords = getShortAxisCoords(longAxisFeature); + + const geometry = new LineString(shortAxisCoords); + const feature = new Feature({ geometry }); + feature.setId(id); + feature.setProperties( + { + isShortAxis: true, + [Enums.InternalProperties.IsSilentFeature]: true, + subFeatures: [longAxisFeature] + }, + true + ); + longAxisFeature.setProperties({ subFeatures: [feature] }, true); + feature.setStyle(shortAxisStyle); + + feature.on(Enums.FeatureGeometryEvents.CHANGE, () => + updateMarkup(feature, longAxisFeature, viewerProperties) + ); + + drawingSource.addFeature(feature); +}; + +export default createAndAddShortAxisFeature; diff --git a/src/annotations/markups/bidirectional/getDraggedHandleIndex.js b/src/annotations/markups/bidirectional/getDraggedHandleIndex.js new file mode 100644 index 00000000..60774a47 --- /dev/null +++ b/src/annotations/markups/bidirectional/getDraggedHandleIndex.js @@ -0,0 +1,28 @@ +import { distance } from "./mathUtils"; + +const getDraggedHandleIndex = (feature, handle) => { + const { isShortAxis, isLongAxis } = feature.getProperties(); + const coords = feature.getGeometry().getCoordinates(); + + const start = { x: coords[0][0], y: coords[0][1] }; + const end = { x: coords[1][0], y: coords[1][1] }; + + const distanceStart = distance(handle, start); + const distanceEnd = distance(handle, end); + + const axisHandle = distanceStart < distanceEnd ? "start" : "end"; + + if (isShortAxis === true && axisHandle === "start") { + return 1; + } else if (isShortAxis === true && axisHandle === "end") { + return 2; + } else if (isLongAxis === true && axisHandle === "start") { + return 3; + } else if (isLongAxis === true && axisHandle === "end") { + return 4; + } else { + return -1; + } +}; + +export default getDraggedHandleIndex; diff --git a/src/annotations/markups/bidirectional/getShortAxisCoords.js b/src/annotations/markups/bidirectional/getShortAxisCoords.js new file mode 100644 index 00000000..67a9acf0 --- /dev/null +++ b/src/annotations/markups/bidirectional/getShortAxisCoords.js @@ -0,0 +1,79 @@ +const getShortAxisCoords = (longAxisFeature, imageMetadata = {}) => { + const longAxisGeometry = longAxisFeature.getGeometry(); + const [startPoints, endPoints] = longAxisGeometry.getCoordinates(); + + const line = { + start: { x: startPoints[0], y: startPoints[1] }, + end: { x: endPoints[0], y: endPoints[1] }, + }; + + // getPixelSpacing (metadata) from scoord utils (image metadata) + const getLineVector = ( + columnPixelSpacing, + rowPixelSpacing, + startPoint, + endPoint + ) => { + const dx = (startPoint.x - endPoint.x) * columnPixelSpacing; + const dy = (startPoint.y - endPoint.y) * rowPixelSpacing; + const length = Math.sqrt(dx * dx + dy * dy); + const vectorX = dx / length; + const vectorY = dy / length; + + return { + x: vectorX, + y: vectorY, + length, + }; + }; + + let startX, startY, endX, endY; + + const { start, end } = line; + const { columnPixelSpacing = 1, rowPixelSpacing = 1 } = imageMetadata; + + if (start.x === end.x && start.y === end.y) { + startX = start.x; + startY = start.y; + endX = end.x; + endY = end.y; + } else { + // Mid point of long axis + const mid = { + x: (start.x + end.x) / 2, + y: (start.y + end.y) / 2, + }; + + // Inclination of the short axis + const vector = getLineVector( + columnPixelSpacing, + rowPixelSpacing, + start, + end + ); + + const shortAxisLength = vector.length / 2; + const rowMultiplier = shortAxisLength / (2 * rowPixelSpacing); + const columnMultiplier = shortAxisLength / (2 * columnPixelSpacing); + + startX = mid.x + columnMultiplier * vector.y; + startY = mid.y - rowMultiplier * vector.x; + endX = mid.x - columnMultiplier * vector.y; + endY = mid.y + rowMultiplier * vector.x; + } + + const shortAxis = { start: {}, end: {} }; + shortAxis.start.x = startX; + shortAxis.start.y = startY; + shortAxis.end.x = endX; + shortAxis.end.y = endY; + + const shortAxisCoords = [ + [shortAxis.start.x, shortAxis.start.y], + [shortAxis.end.x, shortAxis.end.y], + ]; + + return shortAxisCoords; +}; + +export default getShortAxisCoords; diff --git a/src/annotations/markups/bidirectional/id.js b/src/annotations/markups/bidirectional/id.js new file mode 100644 index 00000000..4f66a2ff --- /dev/null +++ b/src/annotations/markups/bidirectional/id.js @@ -0,0 +1,9 @@ +const SHORT_AXIS_ID_PREFIX = "short-axis-"; + +export const getShortAxisId = (longAxisFeature) => { + return SHORT_AXIS_ID_PREFIX + longAxisFeature.getId(); +}; + +export const getLongAxisId = (shortAxisFeature) => { + return shortAxisFeature.getId().split(SHORT_AXIS_ID_PREFIX)[1]; +}; diff --git a/src/annotations/markups/bidirectional/mathUtils.js b/src/annotations/markups/bidirectional/mathUtils.js new file mode 100644 index 00000000..a3099a4c --- /dev/null +++ b/src/annotations/markups/bidirectional/mathUtils.js @@ -0,0 +1,188 @@ +// Based on http://stackoverflow.com/questions/849211/shortest-distance-between-a-point-and-a-line-segment +export const sqr = (x) => { + return x * x; +}; + +export const dist2 = (v, w) => { + return sqr(v.x - w.x) + sqr(v.y - w.y); +}; + +export const distanceToPointSquared = (lineSegment, point) => { + const l2 = dist2(lineSegment.start, lineSegment.end); + + if (l2 === 0) { + return dist2(point, lineSegment.start); + } + const t = + ((point.x - lineSegment.start.x) * + (lineSegment.end.x - lineSegment.start.x) + + (point.y - lineSegment.start.y) * + (lineSegment.end.y - lineSegment.start.y)) / + l2; + + if (t < 0) { + return dist2(point, lineSegment.start); + } + if (t > 1) { + return dist2(point, lineSegment.end); + } + + const pt = { + x: lineSegment.start.x + t * (lineSegment.end.x - lineSegment.start.x), + y: lineSegment.start.y + t * (lineSegment.end.y - lineSegment.start.y), + }; + + return dist2(point, pt); +}; + +export const distanceToPoint = (lineSegment, point) => { + return Math.sqrt(distanceToPointSquared(lineSegment, point)); +}; + +export const midpoint = (x1, x2, y1, y2) => { + return [(x1 + x2) / 2, (y1 + y2) / 2]; +}; + +// Returns intersection points of two lines +export const intersectLine = (lineSegment1, lineSegment2) => { + const intersectionPoint = {}; + + let x1 = lineSegment1.start.x, + y1 = lineSegment1.start.y, + x2 = lineSegment1.end.x, + y2 = lineSegment1.end.y, + x3 = lineSegment2.start.x, + y3 = lineSegment2.start.y, + x4 = lineSegment2.end.x, + y4 = lineSegment2.end.y; + + // Coefficients of line equations + let a1, a2, b1, b2, c1, c2; + // Sign values + let r1, r2, r3, r4; + + // Intermediate values + let denom, num; + + // Compute a1, b1, c1, where line joining points 1 and 2 is "a1 x + b1 y + c1 = 0" + a1 = y2 - y1; + b1 = x1 - x2; + c1 = x2 * y1 - x1 * y2; + + // Compute r3 and r4 + r3 = a1 * x3 + b1 * y3 + c1; + r4 = a1 * x4 + b1 * y4 + c1; + + /* Check signs of r3 and r4. If both point 3 and point 4 lie on + * same side of line 1, the line segments do not intersect. + */ + + if (r3 !== 0 && r4 !== 0 && sign(r3) === sign(r4)) { + return; + } + + // Compute a2, b2, c2 + a2 = y4 - y3; + b2 = x3 - x4; + c2 = x4 * y3 - x3 * y4; + + // Compute r1 and r2 + r1 = a2 * x1 + b2 * y1 + c2; + r2 = a2 * x2 + b2 * y2 + c2; + + /* Check signs of r1 and r2. If both point 1 and point 2 lie + * on same side of second line segment, the line segments do + * not intersect. + */ + + if (r1 !== 0 && r2 !== 0 && sign(r1) === sign(r2)) { + return; + } + + /* Line segments intersect: compute intersection point. + */ + + denom = a1 * b2 - a2 * b1; + + /* The denom/2 is to get rounding instead of truncating. It + * is added or subtracted to the numerator, depending upon the + * sign of the numerator. + */ + + num = b1 * c2 - b2 * c1; + const x = parseFloat(num / denom); + + num = a2 * c1 - a1 * c2; + const y = parseFloat(num / denom); + + intersectionPoint.x = x; + intersectionPoint.y = y; + + return intersectionPoint; +}; + +// Returns sign of number +export const sign = (x) => { + return typeof x === "number" + ? x + ? x < 0 + ? -1 + : 1 + : x === x + ? 0 + : NaN + : NaN; +}; + +export const subtract = (lhs, rhs) => { + return { + x: lhs.x - rhs.x, + y: lhs.y - rhs.y, + }; +}; + +export const distance = (from, to) => { + return Math.sqrt(distanceSquared(from, to)); +}; + +export const distanceSquared = (from, to) => { + const delta = subtract(from, to); + return delta.x * delta.x + delta.y * delta.y; +}; + +export const getLineVector = ( + columnPixelSpacing, + rowPixelSpacing, + startPoint, + endPoint +) => { + const dx = (startPoint.x - endPoint.x) * columnPixelSpacing; + const dy = (startPoint.y - endPoint.y) * rowPixelSpacing; + const length = Math.sqrt(dx * dx + dy * dy); + const vectorX = dx / length; + const vectorY = dy / length; + + return { + x: vectorX, + y: vectorY, + length, + }; +}; + +export const createLine = (startPoint, endPoint) => { + return { + start: startPoint, + end: endPoint, + }; +}; + +export const getDistanceWithPixelSpacing = ( + columnPixelSpacing, + rowPixelSpacing, + startPoint, + endPoint +) => { + const calcX = (startPoint.x - endPoint.x) / rowPixelSpacing; + const calcY = (startPoint.y - endPoint.y) / columnPixelSpacing; + return Math.sqrt(calcX * calcX + calcY * calcY); +}; diff --git a/src/annotations/markups/bidirectional/moveBidirectionalHandles.js b/src/annotations/markups/bidirectional/moveBidirectionalHandles.js new file mode 100644 index 00000000..a0b5e097 --- /dev/null +++ b/src/annotations/markups/bidirectional/moveBidirectionalHandles.js @@ -0,0 +1,154 @@ +import { getLongAxisId, getShortAxisId } from "./id"; +import { distance, intersectLine } from "./mathUtils"; +import moveLongAxisEndHandle from "./moveLongAxisEndHandle"; +import moveLongAxisStartHandle from "./moveLongAxisStartHandle"; +import moveShortAxisEndHandle from "./moveShortAxisEndHandle"; +import moveShortAxisStartHandle from "./moveShortAxisStartHandle"; + +export default function ( + handle = { x: 0, y: 0 }, + currentFeature, + viewerProperties, + pointerEvent, + draggedHandleIndex +) { + const { drawingSource } = viewerProperties; + + let outOfBounds; + let intersection; + let d1; + let d2; + + const { isShortAxis, isLongAxis } = currentFeature.getProperties(); + + let longAxisFeature; + let shortAxisFeature; + + if (isShortAxis) { + shortAxisFeature = currentFeature; + const longAxisFeatureId = getLongAxisId(currentFeature); + longAxisFeature = drawingSource.getFeatureById(longAxisFeatureId); + } else if (isLongAxis) { + longAxisFeature = currentFeature; + const shortAxisFeatureId = getShortAxisId(currentFeature); + shortAxisFeature = drawingSource.getFeatureById(shortAxisFeatureId); + } + + const longAxisGeometry = longAxisFeature.getGeometry(); + const shortAxisGeometry = shortAxisFeature.getGeometry(); + + const longAxisCoords = longAxisGeometry.getCoordinates(); + const shortAxisCoords = shortAxisGeometry.getCoordinates(); + + let isShortAxisStartHandleChange = draggedHandleIndex === 1; + let isShortAxisEndHandleChange = draggedHandleIndex === 2; + let isLongAxisStartHandleChange = draggedHandleIndex === 3; + let isLongAxisEndHandleChange = draggedHandleIndex === 4; + + const longAxis = {}; + const shortAxis = {}; + + const start = { x: longAxisCoords[0][0], y: longAxisCoords[0][1] }; + const end = { x: longAxisCoords[1][0], y: longAxisCoords[1][1] }; + + const shortAxisStart = { + x: shortAxisCoords[0][0], + y: shortAxisCoords[0][1], + }; + const shortAxisEnd = { + x: shortAxisCoords[1][0], + y: shortAxisCoords[1][1], + }; + + const bidirectional = { start, end, shortAxisEnd, shortAxisStart }; + + if (isLongAxisStartHandleChange) { + moveLongAxisStartHandle( + handle, + shortAxisGeometry, + longAxisGeometry, + pointerEvent + ); + } else if (isLongAxisEndHandleChange) { + moveLongAxisEndHandle( + handle, + shortAxisGeometry, + longAxisGeometry, + pointerEvent + ); + } else if (isShortAxisStartHandleChange) { + outOfBounds = false; + + longAxis.start = { x: bidirectional.start.x, y: bidirectional.start.y }; + longAxis.end = { x: bidirectional.end.x, y: bidirectional.end.y }; + + shortAxis.start = { + x: bidirectional.shortAxisEnd.x, + y: bidirectional.shortAxisEnd.y, + }; + shortAxis.end = { x: handle.x, y: handle.y }; + + intersection = intersectLine(longAxis, shortAxis); + if (!intersection) { + shortAxis.end = { + x: bidirectional.shortAxisStart.x, + y: bidirectional.shortAxisStart.y, + }; + + intersection = intersectLine(longAxis, shortAxis); + + d1 = distance(intersection, bidirectional.start); + d2 = distance(intersection, bidirectional.end); + + if (!intersection || d1 < 3 || d2 < 3) { + outOfBounds = true; + } + } + + if (!outOfBounds) { + moveShortAxisStartHandle( + handle, + shortAxisGeometry, + longAxisGeometry, + pointerEvent + ); + } + } else if (isShortAxisEndHandleChange) { + outOfBounds = false; + + longAxis.start = { x: bidirectional.start.x, y: bidirectional.start.y }; + longAxis.end = { x: bidirectional.end.x, y: bidirectional.end.y }; + + shortAxis.start = { + x: bidirectional.shortAxisStart.x, + y: bidirectional.shortAxisStart.y, + }; + shortAxis.end = { x: handle.x, y: handle.y }; + + intersection = intersectLine(longAxis, shortAxis); + if (!intersection) { + shortAxis.end = { + x: bidirectional.shortAxisEnd.x, + y: bidirectional.shortAxisEnd.y, + }; + + intersection = intersectLine(longAxis, shortAxis); + + d1 = distance(intersection, bidirectional.start); + d2 = distance(intersection, bidirectional.end); + + if (!intersection || d1 < 3 || d2 < 3) { + outOfBounds = true; + } + } + + if (!outOfBounds) { + moveShortAxisEndHandle( + handle, + shortAxisGeometry, + longAxisGeometry, + pointerEvent + ); + } + } +} diff --git a/src/annotations/markups/bidirectional/moveLongAxisEndHandle.js b/src/annotations/markups/bidirectional/moveLongAxisEndHandle.js new file mode 100644 index 00000000..a7de388a --- /dev/null +++ b/src/annotations/markups/bidirectional/moveLongAxisEndHandle.js @@ -0,0 +1,69 @@ +import { distance, intersectLine } from "./mathUtils"; + +export default function (handle, shortAxisGeometry, longAxisGeometry, event) { + const shortAxisCoords = shortAxisGeometry.getCoordinates(); + const longAxisCoords = longAxisGeometry.getCoordinates(); + + const longAxis = { + start: { + x: longAxisCoords[0][0], + y: longAxisCoords[0][1], + }, + end: { + x: longAxisCoords[1][0], + y: longAxisCoords[1][1], + }, + }; + const shortAxis = { + start: { + x: shortAxisCoords[0][0], + y: shortAxisCoords[0][1], + }, + end: { + x: shortAxisCoords[1][0], + y: shortAxisCoords[1][1], + }, + }; + + const invisibleLine = { start: longAxis.start, end: handle }; + let pointIntersection = intersectLine(shortAxis, invisibleLine); + if (!pointIntersection) { + event.stopPropagation(); + return false; + } + + const intersection = intersectLine(longAxis, shortAxis); + + const distanceToLineP2 = distance(longAxis.start, intersection); + const newLineLength = distance(longAxis.start, handle); + + if (newLineLength <= distanceToLineP2) { + return false; + } + + const distanceFromShortAxisP1 = distance(shortAxis.start, intersection); + const distanceFromShortAxisP2 = distance(shortAxis.end, intersection); + + const dx = (longAxis.start.x - handle.x) / newLineLength; + const dy = (longAxis.start.y - handle.y) / newLineLength; + + const k = distanceToLineP2 / newLineLength; + + const newIntersection = { + x: longAxis.start.x + (handle.x - longAxis.start.x) * k, + y: longAxis.start.y + (handle.y - longAxis.start.y) * k, + }; + + shortAxis.start.x = newIntersection.x + distanceFromShortAxisP1 * dy; + shortAxis.start.y = newIntersection.y - distanceFromShortAxisP1 * dx; + + shortAxis.end.x = newIntersection.x - distanceFromShortAxisP2 * dy; + shortAxis.end.y = newIntersection.y + distanceFromShortAxisP2 * dx; + + shortAxisGeometry.setCoordinates([ + [shortAxis.start.x, shortAxis.start.y], + [shortAxis.end.x, shortAxis.end.y], + ]); + + return true; +} diff --git a/src/annotations/markups/bidirectional/moveLongAxisStartHandle.js b/src/annotations/markups/bidirectional/moveLongAxisStartHandle.js new file mode 100644 index 00000000..bfbdb334 --- /dev/null +++ b/src/annotations/markups/bidirectional/moveLongAxisStartHandle.js @@ -0,0 +1,69 @@ +import { distance, intersectLine } from "./mathUtils"; + +export default function (handle, shortAxisGeometry, longAxisGeometry, event) { + const shortAxisCoords = shortAxisGeometry.getCoordinates(); + const longAxisCoords = longAxisGeometry.getCoordinates(); + + const longAxis = { + start: { + x: longAxisCoords[0][0], + y: longAxisCoords[0][1], + }, + end: { + x: longAxisCoords[1][0], + y: longAxisCoords[1][1], + }, + }; + const shortAxis = { + start: { + x: shortAxisCoords[0][0], + y: shortAxisCoords[0][1], + }, + end: { + x: shortAxisCoords[1][0], + y: shortAxisCoords[1][1], + }, + }; + + const invisibleLine = { start: handle, end: longAxis.end }; + let pointIntersection = intersectLine(shortAxis, invisibleLine); + if (!pointIntersection) { + event.stopPropagation(); + return false; + } + + const intersection = intersectLine(longAxis, shortAxis); + + const distanceToLineP2 = distance(longAxis.end, intersection); + const newLineLength = distance(longAxis.end, handle); + + if (newLineLength <= distanceToLineP2) { + return false; + } + + const distanceFromShortAxisP1 = distance(shortAxis.start, intersection); + const distanceFromShortAxisP2 = distance(shortAxis.end, intersection); + + const dx = (longAxis.end.x - handle.x) / newLineLength; + const dy = (longAxis.end.y - handle.y) / newLineLength; + + const k = distanceToLineP2 / newLineLength; + + const newIntersection = { + x: longAxis.end.x + (handle.x - longAxis.end.x) * k, + y: longAxis.end.y + (handle.y - longAxis.end.y) * k, + }; + + shortAxis.start.x = newIntersection.x - distanceFromShortAxisP1 * dy; + shortAxis.start.y = newIntersection.y + distanceFromShortAxisP1 * dx; + + shortAxis.end.x = newIntersection.x + distanceFromShortAxisP2 * dy; + shortAxis.end.y = newIntersection.y - distanceFromShortAxisP2 * dx; + + shortAxisGeometry.setCoordinates([ + [shortAxis.start.x, shortAxis.start.y], + [shortAxis.end.x, shortAxis.end.y], + ]); + + return true; +} diff --git a/src/annotations/markups/bidirectional/moveShortAxisEndHandle.js b/src/annotations/markups/bidirectional/moveShortAxisEndHandle.js new file mode 100644 index 00000000..0c67e9b3 --- /dev/null +++ b/src/annotations/markups/bidirectional/moveShortAxisEndHandle.js @@ -0,0 +1,94 @@ +import { distance, distanceToPoint, intersectLine } from "./mathUtils"; + +export default function (handle, shortAxisGeometry, longAxisGeometry, event) { + const shortAxisCoords = shortAxisGeometry.getCoordinates(); + const longAxisCoords = longAxisGeometry.getCoordinates(); + + const longAxis = { + start: { + x: longAxisCoords[0][0], + y: longAxisCoords[0][1], + }, + end: { + x: longAxisCoords[1][0], + y: longAxisCoords[1][1], + }, + }; + const shortAxis = { + start: { + x: shortAxisCoords[0][0], + y: shortAxisCoords[0][1], + }, + end: { + x: shortAxisCoords[1][0], + y: shortAxisCoords[1][1], + }, + }; + + const invisibleLine = { start: shortAxis.start, end: handle }; + let pointIntersection = intersectLine(longAxis, invisibleLine); + if (!pointIntersection) { + event.stopPropagation(); + return false; + } + + const fudgeFactor = 1; + + const fixedPoint = shortAxis.start; + const movedPoint = handle; + + const distanceFromFixed = distanceToPoint(longAxis, fixedPoint); + const distanceFromMoved = distanceToPoint(longAxis, movedPoint); + + const distanceBetweenPoints = distance(fixedPoint, movedPoint); + + const total = distanceFromFixed + distanceFromMoved; + + if (distanceBetweenPoints <= distanceFromFixed) { + return false; + } + + const length = distance(longAxis.start, longAxis.end); + + const dx = (longAxis.start.x - longAxis.end.x) / length; + const dy = (longAxis.start.y - longAxis.end.y) / length; + + const adjustedLineP1 = { + x: longAxis.start.x - fudgeFactor * dx, + y: longAxis.start.y - fudgeFactor * dy, + }; + const adjustedLineP2 = { + x: longAxis.end.x + fudgeFactor * dx, + y: longAxis.end.y + fudgeFactor * dy, + }; + + shortAxis.start.x = movedPoint.x + total * dy; + shortAxis.start.y = movedPoint.y - total * dx; + shortAxis.end.x = movedPoint.x; + shortAxis.end.y = movedPoint.y; + + const intersection = intersectLine(longAxis, shortAxis); + + if (!intersection) { + if ( + distance(movedPoint, longAxis.start) > distance(movedPoint, longAxis.end) + ) { + shortAxis.end.x = adjustedLineP2.x - distanceFromMoved * dy; + shortAxis.end.y = adjustedLineP2.y + distanceFromMoved * dx; + shortAxis.start.x = shortAxis.end.x + total * dy; + shortAxis.start.y = shortAxis.end.y - total * dx; + } else { + shortAxis.end.x = adjustedLineP1.x - distanceFromMoved * dy; + shortAxis.end.y = adjustedLineP1.y + distanceFromMoved * dx; + shortAxis.start.x = shortAxis.end.x + total * dy; + shortAxis.start.y = shortAxis.end.y - total * dx; + } + } + + shortAxisGeometry.setCoordinates([ + [shortAxis.start.x, shortAxis.start.y], + [shortAxis.end.x, shortAxis.end.y], + ]); + + return true; +} diff --git a/src/annotations/markups/bidirectional/moveShortAxisStartHandle.js b/src/annotations/markups/bidirectional/moveShortAxisStartHandle.js new file mode 100644 index 00000000..42dd14e3 --- /dev/null +++ b/src/annotations/markups/bidirectional/moveShortAxisStartHandle.js @@ -0,0 +1,98 @@ +import { distance, distanceToPoint, intersectLine } from "./mathUtils"; + +export default function (handle, shortAxisGeometry, longAxisGeometry, event) { + const shortAxisCoords = shortAxisGeometry.getCoordinates(); + const longAxisCoords = longAxisGeometry.getCoordinates(); + + const longAxis = { + start: { + x: longAxisCoords[0][0], + y: longAxisCoords[0][1], + }, + end: { + x: longAxisCoords[1][0], + y: longAxisCoords[1][1], + }, + }; + const shortAxis = { + start: { + x: shortAxisCoords[0][0], + y: shortAxisCoords[0][1], + }, + end: { + x: shortAxisCoords[1][0], + y: shortAxisCoords[1][1], + }, + }; + + const invisibleLine = { start: handle, end: shortAxis.end }; + let pointIntersection = intersectLine(longAxis, invisibleLine); + if (!pointIntersection) { + event.stopPropagation(); + return false; + } + + const fudgeFactor = 1; + + const fixedPoint = shortAxis.end; + const movedPoint = handle; + + const distanceFromFixed = distanceToPoint(longAxis, fixedPoint); + const distanceFromMoved = distanceToPoint(longAxis, movedPoint); + + const distanceBetweenPoints = distance(fixedPoint, movedPoint); + + const total = distanceFromFixed + distanceFromMoved; + + if (distanceBetweenPoints <= distanceFromFixed) { + return false; + } + + const length = distance(longAxis.start, longAxis.end); + + if (length === 0) { + return false; + } + + const dx = (longAxis.start.x - longAxis.end.x) / length; + const dy = (longAxis.start.y - longAxis.end.y) / length; + + const adjustedLineP1 = { + x: longAxis.start.x - fudgeFactor * dx, + y: longAxis.start.y - fudgeFactor * dy, + }; + const adjustedLineP2 = { + x: longAxis.end.x + fudgeFactor * dx, + y: longAxis.end.y + fudgeFactor * dy, + }; + + shortAxis.start.x = movedPoint.x; + shortAxis.start.y = movedPoint.y; + shortAxis.end.x = movedPoint.x - total * dy; + shortAxis.end.y = movedPoint.y + total * dx; + + const intersection = intersectLine(longAxis, shortAxis); + + if (!intersection) { + if ( + distance(movedPoint, longAxis.start) > distance(movedPoint, longAxis.end) + ) { + shortAxis.start.x = adjustedLineP2.x + distanceFromMoved * dy; + shortAxis.start.y = adjustedLineP2.y - distanceFromMoved * dx; + shortAxis.end.x = shortAxis.start.x - total * dy; + shortAxis.end.y = shortAxis.start.y + total * dx; + } else { + shortAxis.start.x = adjustedLineP1.x + distanceFromMoved * dy; + shortAxis.start.y = adjustedLineP1.y - distanceFromMoved * dx; + shortAxis.end.x = shortAxis.start.x - total * dy; + shortAxis.end.y = shortAxis.start.y + total * dx; + } + } + + shortAxisGeometry.setCoordinates([ + [shortAxis.start.x, shortAxis.start.y], + [shortAxis.end.x, shortAxis.end.y], + ]); + + return true; +} diff --git a/src/annotations/markups/bidirectional/updateMarkup.js b/src/annotations/markups/bidirectional/updateMarkup.js new file mode 100644 index 00000000..e4d49d12 --- /dev/null +++ b/src/annotations/markups/bidirectional/updateMarkup.js @@ -0,0 +1,25 @@ +import { getFeatureScoord3dLength } from "../../../scoord3dUtils.js"; +import { getUnitSuffix } from "../../../utils.js"; + +const updateMarkup = ( + shortAxisFeature, + longAxisFeature, + { markupManager, map, pyramid } +) => { + const view = map.getView(); + const unitSuffix = getUnitSuffix(view); + const longAxisGeometry = longAxisFeature.getGeometry(); + const shortAxisLength = getFeatureScoord3dLength(shortAxisFeature, pyramid); + const longAxisLength = getFeatureScoord3dLength(longAxisFeature, pyramid); + const L = `L ${longAxisLength.toFixed(2)} ${unitSuffix}`; + const W = ` W ${shortAxisLength.toFixed(2)} ${unitSuffix}`; + const value = `${L}\n${W}`; + markupManager.update({ + feature: longAxisFeature, + value, + coordinate: longAxisGeometry.getLastCoordinate(), + }); + longAxisFeature.setProperties({ shortAxisLength: shortAxisLength.toFixed(2) }, true); +}; + +export default updateMarkup; diff --git a/src/annotations/markups/ellipse/addFeature.js b/src/annotations/markups/ellipse/addFeature.js new file mode 100644 index 00000000..217f759c --- /dev/null +++ b/src/annotations/markups/ellipse/addFeature.js @@ -0,0 +1,25 @@ +import { generateUID } from "../../../utils"; + +const addFeature = (feature, viewerProperties) => { + const { features, drawingSource } = viewerProperties; + + let featureId = feature.getId(); + if (!featureId) { + featureId = generateUID(); + } + + const getFeatureById = (features, id) => + features.getArray().find((f) => f.getId() === id); + + const featureFromDrawingSource = drawingSource.getFeatureById(featureId); + if (!featureFromDrawingSource) { + drawingSource.addFeature(feature); + } + + const featuresFromFeatures = getFeatureById(features, featureId); + if (!featuresFromFeatures) { + features.push(feature); + } +}; + +export default addFeature; diff --git a/src/annotations/markups/ellipse/createAndAddEllipseFeature.js b/src/annotations/markups/ellipse/createAndAddEllipseFeature.js new file mode 100644 index 00000000..e1e56675 --- /dev/null +++ b/src/annotations/markups/ellipse/createAndAddEllipseFeature.js @@ -0,0 +1,44 @@ +import { Feature } from "ol"; +import styles, { getEllipseStyle } from "./styles"; +import { getEllipseId } from "./id"; +import Enums from "../../../enums"; +import addFeature from "./addFeature"; +import updateMarkup from "./updateMarkup"; + +const createAndAddEllipseFeature = ( + ellipseHandlesFeature, + ellipseGeometry, + viewerProperties, + originalROIFeature +) => { + const { markupManager } = viewerProperties; + + const ellipseId = getEllipseId( + originalROIFeature ? originalROIFeature : ellipseHandlesFeature + ); + + const geometry = ellipseGeometry; + const ellipseFeature = new Feature({ geometry }); + ellipseFeature.setId(ellipseId); + ellipseFeature.setProperties( + { + isEllipseShape: true, + [Enums.InternalProperties.IsSilentFeature]: true, + [Enums.InternalProperties.ReadOnly]: true, + subFeatures: [ellipseHandlesFeature], + }, + true + ); + ellipseFeature.setStyle(getEllipseStyle(ellipseFeature)); + + /** Remove markup from handles to add a new one to ellipse */ + markupManager.remove(ellipseHandlesFeature.getId()); + markupManager.create({ feature: ellipseFeature, style: styles }); + + addFeature(ellipseFeature, viewerProperties); + + /** Add feature then update the markup */ + updateMarkup(ellipseHandlesFeature, viewerProperties); +}; + +export default createAndAddEllipseFeature; diff --git a/src/annotations/markups/ellipse/createAndAddEllipseHandlesFeature.js b/src/annotations/markups/ellipse/createAndAddEllipseHandlesFeature.js new file mode 100644 index 00000000..2b732aa0 --- /dev/null +++ b/src/annotations/markups/ellipse/createAndAddEllipseHandlesFeature.js @@ -0,0 +1,43 @@ +import LineString from "ol/geom/LineString"; +import { Feature } from "ol"; +import styles, { ellipseHandlesStyleFunction } from "./styles"; +import Enums from "../../../enums"; +import addFeature from "./addFeature"; +import onSetFeatureStyle from "./onSetFeatureStyle"; + +const createAndAddEllipseHandlesFeature = ( + ellipseROIFeature, + viewerProperties +) => { + const [coords] = ellipseROIFeature.getGeometry().getCoordinates(); + const middle = Math.round(coords.length / 2); + const padding = 700; /** TODO: Calculate based on radius */ + const paddedStart = [coords[0][0] + padding, coords[0][1] + padding]; + const paddedEnd = [coords[middle][0] - padding, coords[middle][1] - padding]; + const handles = new LineString([paddedStart, paddedEnd]); + const ellipseHandlesFeature = new Feature({ geometry: handles }); + ellipseHandlesFeature.setProperties( + { + isEllipseHandles: true, + [Enums.InternalProperties.CantBeTranslated]: true, + }, + true + ); + + /** Trigger style change to get styles from original ROI that is going to be deleted */ + onSetFeatureStyle( + ellipseHandlesFeature, + ellipseROIFeature.get(Enums.InternalProperties.StyleOptions), + viewerProperties + ); + + ellipseHandlesFeature.setStyle(ellipseHandlesStyleFunction); + ellipseHandlesFeature.set(Enums.InternalProperties.StyleOptions, styles); + ellipseHandlesFeature.setId(ellipseROIFeature.getId()); + + addFeature(ellipseHandlesFeature, viewerProperties); + + return ellipseHandlesFeature; +}; + +export default createAndAddEllipseHandlesFeature; \ No newline at end of file diff --git a/src/annotations/markups/ellipse/ellipse.js b/src/annotations/markups/ellipse/ellipse.js new file mode 100644 index 00000000..1a17a497 --- /dev/null +++ b/src/annotations/markups/ellipse/ellipse.js @@ -0,0 +1,264 @@ +import Enums from "../../../enums"; +import { distance } from "../bidirectional/mathUtils"; +import annotationInterface from "../../annotationInterface"; +import { getEllipseHandlesId, getEllipseId } from "./id"; +import onSetFeatureStyle from "./onSetFeatureStyle"; +import getMeasurements from "./getMeasurements"; +import updateMarkup from "./updateMarkup"; +import getEllipsePolygonFromMovingLine from "./getEllipsePolygonFromMovingLine"; +import createAndAddEllipseFeature from "./createAndAddEllipseFeature"; +import createAndAddEllipseHandlesFeature from "./createAndAddEllipseHandlesFeature"; +import removeFeature from "./removeFeature"; + +const isDrawingEllipse = (drawingOptions) => + drawingOptions.geometryType === Enums.GeometryType.Ellipse; + +const getFeatureById = (features, id) => { + return features.getArray().find((f) => f.getId() === id); +}; + +const drawEllipse = ( + feature, + fixedPoint, + movingPoint, + currentPoint, + viewerProperties +) => { + const { features } = viewerProperties; + + const ellipseId = getEllipseId(feature); + const ellipseFeature = getFeatureById(features, ellipseId); + + const ellipsePolygon = getEllipsePolygonFromMovingLine( + fixedPoint, + movingPoint, + currentPoint + ); + + if (!ellipseFeature) { + createAndAddEllipseFeature(feature, ellipsePolygon, viewerProperties); + } else { + const geometry = ellipseFeature.getGeometry(); + geometry.setCoordinates(ellipsePolygon.getCoordinates()); + } +}; + +/** + * This is used to avoid changing features while + * dragging because of getClosestFeatureToCoordinate call + */ +let draggedFeature = null; +let draggedHandle = null; + +const resetEventState = () => { + draggedFeature = null; + draggedHandle = null; +}; + +const global = {}; + +const onPointerDragHandler = (event) => { + const { viewerProperties } = global; + const { drawingSource } = viewerProperties; + + const handleCoordinate = event.coordinate; + const handle = { x: handleCoordinate[0], y: handleCoordinate[1] }; + + if (draggedFeature === null) { + draggedFeature = + drawingSource.getClosestFeatureToCoordinate(handleCoordinate); + } + + if (!draggedFeature) { + return; + } + + const { isEllipseHandles } = draggedFeature.getProperties(); + + if (!isEllipseHandles) { + return; + } + + const draggedFeatureGeometry = draggedFeature.getGeometry(); + const draggedGeomCoords = draggedFeatureGeometry.getCoordinates(); + + /** Disable dragging handle line */ + if ( + handleCoordinate[0] !== draggedGeomCoords[0][0] && + handleCoordinate[1] !== draggedGeomCoords[0][1] && + handleCoordinate[0] !== draggedGeomCoords[1][0] && + handleCoordinate[1] !== draggedGeomCoords[1][1] + ) { + return; + } + + if (draggedHandle === null) { + const start = { x: draggedGeomCoords[0][0], y: draggedGeomCoords[0][1] }; + const end = { x: draggedGeomCoords[1][0], y: draggedGeomCoords[1][1] }; + const distanceStart = distance(handle, start); + const distanceEnd = distance(handle, end); + draggedHandle = distanceStart < distanceEnd ? "start" : "end"; + } + + if (draggedHandle === "start") { + drawEllipse( + draggedFeature, + draggedGeomCoords[0], + draggedGeomCoords[1], + handleCoordinate, + viewerProperties + ); + return; + } + + if (draggedHandle === "end") { + drawEllipse( + draggedFeature, + draggedGeomCoords[1], + draggedGeomCoords[0], + handleCoordinate, + viewerProperties + ); + return; + } +}; + +const attachChangeEvents = (ellipseHandlesFeature, viewerProperties) => { + ellipseHandlesFeature.setProperties({ isEllipseHandles: true }, true); + + const ellipseHandlesGeometry = ellipseHandlesFeature.getGeometry(); + + const onEllipseHandlesGeometryChange = () => { + const [first, last] = ellipseHandlesGeometry.getCoordinates(); + drawEllipse(ellipseHandlesFeature, first, last, last, viewerProperties); + /** We use a different format than markup manager builtin change event. */ + updateMarkup(ellipseHandlesFeature, viewerProperties); + }; + + ellipseHandlesGeometry.on( + Enums.FeatureGeometryEvents.CHANGE, + onEllipseHandlesGeometryChange + ); +}; + +const attachPointerEvents = (viewerProperties) => { + const { map } = viewerProperties; + global.viewerProperties = viewerProperties; + map.on(Enums.MapEvents.POINTER_UP, resetEventState); + map.on(Enums.MapEvents.POINTER_DRAG, onPointerDragHandler); +}; + +const ellipse = Object.assign({}, annotationInterface, { + onAdd: (feature, viewerProperties) => { + const { measurements, isEllipseShape, isEllipseHandles } = + feature.getProperties(); + + /** TODO: Remove area code check. */ + const isEllipseROIFeature = + measurements && + JSON.stringify(measurements).includes("G-D7FE") && + !isEllipseShape && + !isEllipseHandles; + + if (isEllipseROIFeature) { + const ellipseROIFeature = feature; + removeFeature(ellipseROIFeature, viewerProperties); + + attachPointerEvents(viewerProperties); + const ellipseHandlesFeature = createAndAddEllipseHandlesFeature( + ellipseROIFeature, + viewerProperties + ); + attachChangeEvents(ellipseHandlesFeature, viewerProperties); + + const originalROIGeometry = ellipseROIFeature.getGeometry(); + createAndAddEllipseFeature( + ellipseHandlesFeature, + originalROIGeometry, + viewerProperties, + ellipseROIFeature + ); + } + }, + getNormalizedFeature: (feature, viewerProperties) => { + const { features } = viewerProperties; + const { isEllipseHandles, isEllipseShape } = feature.getProperties(); + + if (isEllipseHandles) { + const ellipseFeatureId = getEllipseId(feature); + const ellipseFeature = getFeatureById(features, ellipseFeatureId); + if (ellipseFeature) { + const ellipseFeatureClone = ellipseFeature.clone(); + ellipseFeatureClone.setId(feature.getId()); + return ellipseFeatureClone; + } + } + + if (isEllipseShape) { + const ellipseFeatureClone = feature.clone(); + ellipseFeatureClone.setId(getEllipseHandlesId(feature)); + return ellipseFeatureClone; + } + }, + onDrawEnd: (event, viewerProperties) => { + global.viewerProperties = viewerProperties; + attachPointerEvents(viewerProperties); + }, + onDrawStart: (event, viewerProperties) => { + const { drawingOptions } = viewerProperties; + if (isDrawingEllipse(drawingOptions)) { + const ellipseHandlesFeature = event.feature; + attachChangeEvents(ellipseHandlesFeature, viewerProperties); + } + }, + onRemove: (feature, viewerProperties) => { + const { markupManager, features } = viewerProperties; + const { isEllipseHandles, isEllipseShape } = feature.getProperties(); + if (isEllipseHandles) { + const ellipseFeatureId = getEllipseId(feature); + const ellipseFeature = getFeatureById(features, ellipseFeatureId); + if (ellipseFeature) { + markupManager.remove(ellipseFeature.getId()); + removeFeature(ellipseFeature, viewerProperties); + } + } + + if (isEllipseShape) { + const ellipseHandlesFeatureId = getEllipseHandlesId(feature); + const ellipseHandlesFeature = getFeatureById( + features, + ellipseHandlesFeatureId + ); + if (ellipseHandlesFeature) { + markupManager.remove(feature.getId()); + removeFeature(ellipseHandlesFeature, viewerProperties); + } + } + }, + getMeasurements, + onSetFeatureStyle, +}); + +export default ellipse; + +// TODO: Add built in highlighting of features +// let selected = null; +// map.on('pointermove', function (e) { +// if (selected !== null) { +// selected.setStyle(undefined); +// selected = null; +// } + +// map.forEachFeatureAtPixel(e.pixel, function (f) { +// selected = f; +// // add highlight +// // f.setStyle(highlightStyle); +// return true; +// }); + +// if (selected) { +// // add highlight +// } else { +// // remove highlight +// } +// }); diff --git a/src/annotations/markups/ellipse/getEllipsePolygonFromMovingLine.js b/src/annotations/markups/ellipse/getEllipsePolygonFromMovingLine.js new file mode 100644 index 00000000..102d35b9 --- /dev/null +++ b/src/annotations/markups/ellipse/getEllipsePolygonFromMovingLine.js @@ -0,0 +1,30 @@ +import { fromCircle } from "ol/geom/Polygon"; +import CircleGeometry from "ol/geom/Circle"; +import { midpoint } from "../bidirectional/mathUtils"; + +const getEllipsePolygonFromMovingLine = ( + fixedPoint, + movingPoint, + currentPoint +) => { + const mid = midpoint( + fixedPoint[0], + movingPoint[0], + fixedPoint[1], + movingPoint[1] + ); + + const center = mid; + const last = currentPoint; + const dx = center[0] - last[0]; + const dy = center[1] - last[1]; + let radius = Math.sqrt(dx * dx + dy * dy); + radius = radius > 0 ? radius : Number.MIN_SAFE_INTEGER; + const circle = new CircleGeometry(center, radius); + const polygon = fromCircle(circle); + polygon.scale(dx / radius, dy / radius); + + return polygon; +}; + +export default getEllipsePolygonFromMovingLine; diff --git a/src/annotations/markups/ellipse/getFeatureById.js b/src/annotations/markups/ellipse/getFeatureById.js new file mode 100644 index 00000000..4ebd3fda --- /dev/null +++ b/src/annotations/markups/ellipse/getFeatureById.js @@ -0,0 +1,15 @@ +const getFeatureById = (id, viewerProperties) => { + const { drawingSource, features } = viewerProperties; + + const featureFromFeatures = features.getArray().find((f) => f.getId() === id); + if (featureFromFeatures) { + return featureFromFeatures; + } + + const featureFromDrawingSource = drawingSource.getFeatureById(id); + if (featureFromDrawingSource) { + return featureFromDrawingSource; + } +}; + +export default getFeatureById; diff --git a/src/annotations/markups/ellipse/getMeasurements.js b/src/annotations/markups/ellipse/getMeasurements.js new file mode 100644 index 00000000..3c2f5a9c --- /dev/null +++ b/src/annotations/markups/ellipse/getMeasurements.js @@ -0,0 +1,78 @@ +import dcmjs from "dcmjs"; +import { getFeatureScoord3dArea } from "../../../scoord3dUtils"; +import getFeatureById from "./getFeatureById"; +import { getEllipseHandlesId, getEllipseId } from "./id"; + +const getMeasurements = (feature, viewerProperties) => { + const { pyramid } = viewerProperties; + + /** Get fresh feature or the one bring dawn */ + const freshFeature = getFeatureById(feature.getId(), viewerProperties) || feature; + + const { isEllipseHandles, isEllipseShape } = freshFeature.getProperties(); + const isEllipse = isEllipseHandles || isEllipseShape; + + if (isEllipse) { + let ellipseHandlesFeature; + let ellipseFeature; + let points = []; + let area = 0; + + const getEllipsePoints = (ellipseFeature) => + ellipseFeature + .getGeometry() + .getCoordinates() + .map((coordinate) => ({ + x: coordinate[0], + y: coordinate[1], + })); + + if (isEllipseHandles) { + ellipseHandlesFeature = freshFeature; + + const ellipseFeatureId = getEllipseId(ellipseHandlesFeature); + ellipseFeature = getFeatureById(ellipseFeatureId, viewerProperties); + + if (ellipseFeature) { + area = getFeatureScoord3dArea(ellipseFeature, pyramid); + points = getEllipsePoints(ellipseFeature); + } + } + + if (isEllipseShape) { + ellipseFeature = freshFeature; + + const ellipseHandlesFeatureId = getEllipseHandlesId(ellipseFeature); + ellipseHandlesFeature = getFeatureById(ellipseHandlesFeatureId, viewerProperties); + + area = getFeatureScoord3dArea(ellipseFeature, pyramid); + points = getEllipsePoints(ellipseFeature); + } + + const ellipse = new dcmjs.utilities.TID300.Ellipse({ + area, + points, + }); + + const contentItem = ellipse.contentItem(); + const numContentItems = contentItem.filter((ci) => ci.ValueType === "NUM"); + const measurements = numContentItems.map((measurement) => { + /** Update format wrong in dcmjs */ + measurement.ConceptNameCodeSequence = [ + measurement.ConceptNameCodeSequence, + ]; + return measurement; + }); + + if (ellipseFeature && ellipseHandlesFeature) { + /** Set measurements here because main feature (handle) doesn't have measurement. */ + ellipseFeature.setProperties({ measurements }, true); + ellipseHandlesFeature.setProperties({ measurements }, true); + } + + return measurements; + } + return []; +}; + +export default getMeasurements; diff --git a/src/annotations/markups/ellipse/id.js b/src/annotations/markups/ellipse/id.js new file mode 100644 index 00000000..8b91187c --- /dev/null +++ b/src/annotations/markups/ellipse/id.js @@ -0,0 +1,9 @@ +const ELLIPSE_ID_PREFIX = "ellipse-"; + +export const getEllipseId = (ellipseHandlesFeature) => { + return ELLIPSE_ID_PREFIX + ellipseHandlesFeature.getId(); +}; + +export const getEllipseHandlesId = (ellipseFeature) => { + return ellipseFeature.getId().split(ELLIPSE_ID_PREFIX)[1]; +}; diff --git a/src/annotations/markups/ellipse/onSetFeatureStyle.js b/src/annotations/markups/ellipse/onSetFeatureStyle.js new file mode 100644 index 00000000..b30dfaa2 --- /dev/null +++ b/src/annotations/markups/ellipse/onSetFeatureStyle.js @@ -0,0 +1,55 @@ +import Enums from "../../../enums"; +import { getEllipseHandlesId, getEllipseId } from "./id"; +import styles, { ellipseHandlesStyleFunction, getEllipseStyle } from "./styles"; + +const onSetFeatureStyle = (feature, styleOptions, viewerProperties) => { + const { drawingSource } = viewerProperties; + const { isEllipseHandles, isEllipse, isEllipseShape } = + feature.getProperties(); + + const isEllipseAnnotation = isEllipseHandles || isEllipse || isEllipseShape; + + if (!isEllipseAnnotation) { + return; + } + + if (isEllipseAnnotation) { + if (styleOptions.stroke) { + styles.stroke = Object.assign(styles.stroke, styleOptions.stroke); + } + + if (styleOptions.image) { + styles.image = Object.assign(styles.image, styleOptions.image); + } + } + + const ellipseStyle = getEllipseStyle(); + + if (isEllipseHandles || isEllipse) { + feature.setStyle(ellipseHandlesStyleFunction); + feature.set(Enums.InternalProperties.StyleOptions, styles); + + const ellipseFeatureId = getEllipseId(feature); + const ellipseFeature = drawingSource.getFeatureById(ellipseFeatureId); + if (ellipseFeature) { + ellipseFeature.setStyle(ellipseStyle); + ellipseFeature.set(Enums.InternalProperties.StyleOptions, styles); + } + } + + if (isEllipseShape) { + feature.setStyle(ellipseStyle); + feature.set(Enums.InternalProperties.StyleOptions, styles); + + const ellipseHandlesFeatureId = getEllipseHandlesId(feature); + const ellipseHandlesFeature = drawingSource.getFeatureById( + ellipseHandlesFeatureId + ); + if (ellipseHandlesFeature) { + ellipseHandlesFeature.setStyle(ellipseHandlesStyleFunction); + ellipseHandlesFeature.set(Enums.InternalProperties.StyleOptions, styles); + } + } +}; + +export default onSetFeatureStyle; diff --git a/src/annotations/markups/ellipse/removeFeature.js b/src/annotations/markups/ellipse/removeFeature.js new file mode 100644 index 00000000..8dac364c --- /dev/null +++ b/src/annotations/markups/ellipse/removeFeature.js @@ -0,0 +1,24 @@ +const removeFeature = (feature, viewerProperties) => { + const { features, drawingSource } = viewerProperties; + + const featureId = feature.getId(); + if (!featureId) { + return; + } + + const getFeatureById = (features, id) => { + return features.getArray().find((f) => f.getId() === id); + }; + + const featureFromDrawingSource = drawingSource.getFeatureById(featureId); + if (featureFromDrawingSource) { + drawingSource.removeFeature(feature); + } + + const featureFromFeatures = getFeatureById(features, featureId); + if (featureFromFeatures) { + features.remove(feature); + } +}; + +export default removeFeature; diff --git a/src/annotations/markups/ellipse/styles.js b/src/annotations/markups/ellipse/styles.js new file mode 100644 index 00000000..d5d3aa84 --- /dev/null +++ b/src/annotations/markups/ellipse/styles.js @@ -0,0 +1,53 @@ +import Style from "ol/style/Style"; +import Stroke from "ol/style/Stroke"; +import CircleStyle from "ol/style/Circle"; +import Point from "ol/geom/Point"; + +const styles = { + image: { + radius: 7, + }, + stroke: { + color: "black", + width: 3, + }, +}; + +export function ellipseHandlesStyleFunction(feature) { + const styles = []; + const featureGeometry = feature.getGeometry(); + + const type = featureGeometry.getType(); + if (type !== "LineString") { + return styles; + } + + const [start, end] = featureGeometry.getCoordinates(); + + styles.push(getHandleStyle(start)); + styles.push(getHandleStyle(end)); + + return styles; +} + +export const getHandleStyle = (coords) => + new Style({ + geometry: new Point(coords), + image: new CircleStyle({ + radius: styles.image.radius, + stroke: new Stroke({ + color: styles.stroke.color, + width: styles.stroke.width, + }), + }), + }); + +export const getEllipseStyle = () => + new Style({ + stroke: new Stroke({ + color: styles.stroke.color, + width: styles.stroke.width, + }), + }); + +export default styles; diff --git a/src/annotations/markups/ellipse/updateMarkup.js b/src/annotations/markups/ellipse/updateMarkup.js new file mode 100644 index 00000000..28c2ce10 --- /dev/null +++ b/src/annotations/markups/ellipse/updateMarkup.js @@ -0,0 +1,46 @@ +import { getFeatureScoord3dArea } from "../../../scoord3dUtils"; +import { getUnitSuffix } from "../../../utils"; +import { getEllipseId } from "./id"; + +const updateMarkup = ( + feature, + { markupManager, drawingSource, map, pyramid } +) => { + const ellipseFeatureId = getEllipseId(feature); + const ellipseFeature = drawingSource.getFeatureById(ellipseFeatureId); + if (ellipseFeature) { + const view = map.getView(); + const unitSuffix = getUnitSuffix(view); + const ellipseGeometry = ellipseFeature.getGeometry(); + const area = getFeatureScoord3dArea(ellipseFeature, pyramid); + + let sum = 0; + let count = 0; + let sumSquared = 0; + let min = 0; + let max = 0; + const pixels = ellipseGeometry.getCoordinates()[0].flat(); + for (let i = 0; i < pixels.length; i++) { + sum += pixels[i]; + sumSquared += pixels[i] * pixels[i]; + min = Math.min(min, pixels[i]); + max = Math.max(max, pixels[i]); + count++; + } + + const mean = sum / count; + const variance = sumSquared / count - mean * mean; + const stdDev = Math.sqrt(variance); + + const value1 = `Area: ${area.toFixed(2)} ${unitSuffix}`; + const value2 = `Mean: ${mean.toFixed(2)} Std Dev:${stdDev.toFixed(2)}`; + const value = `${value1}\n${value2}`; + markupManager.update({ + feature: ellipseFeature, + value, + coordinate: ellipseGeometry.getLastCoordinate(), + }); + } +}; + +export default updateMarkup; diff --git a/src/annotations/markups/measurement.js b/src/annotations/markups/measurement.js index daf87bc7..191c6d1e 100644 --- a/src/annotations/markups/measurement.js +++ b/src/annotations/markups/measurement.js @@ -1,9 +1,10 @@ -import Enums from '../../enums' -import { getUnitSuffix } from '../../utils' +import Enums from "../../enums"; +import { getUnitSuffix } from "../../utils"; import { getFeatureScoord3dArea, - getFeatureScoord3dLength -} from '../../scoord3dUtils.js' + getFeatureScoord3dLength, +} from "../../scoord3dUtils.js"; +import annotationInterface from "../annotationInterface"; /** * Format measure output. @@ -13,13 +14,13 @@ import { * @return {string} The formatted measure of this feature */ export const format = (feature, units, pyramid) => { - const area = getFeatureScoord3dArea(feature, pyramid) - const length = getFeatureScoord3dLength(feature, pyramid) - const value = length || area || 0 + const area = getFeatureScoord3dArea(feature, pyramid); + const length = getFeatureScoord3dLength(feature, pyramid); + const value = length || area || 0; return length ? `${value.toFixed(2)} ${units}` - : `${value.toFixed(2)} ${units}²` -} + : `${value.toFixed(2)} ${units}²`; +}; /** * Checks if feature has measurement markup properties. @@ -28,48 +29,56 @@ export const format = (feature, units, pyramid) => { * @returns {boolean} true if feature has measurement markup properties */ const _isMeasurement = (feature) => - Enums.Markup.Measurement === feature.get(Enums.InternalProperties.Markup) + Enums.Markup.Measurement === feature.get(Enums.InternalProperties.Markup); /** * Measurement markup definition. * - * @param {object} dependencies Shared dependencies - * @param {object} dependencies.map Viewer's map instance - * @param {object} dependencies.pyramid Pyramid metadata - * @param {object} dependencies.markupManager MarkupManager shared instance + * @param {object} viewerProperties Shared viewerProperties + * @param {object} viewerProperties.map Viewer's map instance + * @param {object} viewerProperties.drawingSource Viewer's drawing source + * @param {object} viewerProperties.pyramid Pyramid metadata + * @param {object} viewerProperties.markupManager MarkupManager shared instance */ -const MeasurementMarkup = ({ map, pyramid, markupManager }) => { - return { +const MeasurementMarkup = (viewerProperties) => { + const { map, pyramid, markupManager } = viewerProperties; + + return Object.assign({}, annotationInterface, { onAdd: (feature) => { if (_isMeasurement(feature)) { - const view = map.getView() - const unitSuffix = getUnitSuffix(view) + const isSilentFeature = feature.get(Enums.InternalProperties.IsSilentFeature) + if (isSilentFeature == true) { + return; + } + + const view = map.getView(); + const unitSuffix = getUnitSuffix(view); + const ps = feature.get(Enums.InternalProperties.PresentationState); markupManager.create({ feature, - value: format(feature, unitSuffix, pyramid) - }) + value: format(feature, unitSuffix, pyramid), + position: ps && ps.markup ? ps.markup.coordinates : null, + }); } }, onFailure: (uid) => { if (uid) { - markupManager.remove(uid) + markupManager.remove(uid); } }, onRemove: (feature) => { if (_isMeasurement(feature)) { - const featureId = feature.getId() - markupManager.remove(featureId) + const featureId = feature.getId(); + markupManager.remove(featureId); } }, - onDrawStart: ({ feature }) => { + onDrawStart: (event, drawingOptions) => { + const { feature } = event; if (_isMeasurement(feature)) { - markupManager.create({ feature }) + markupManager.create({ feature }); } }, - onUpdate: (feature) => {}, - onDrawEnd: ({ feature }) => {}, - onDrawAbort: ({ feature }) => {} - } -} + }); +}; -export default MeasurementMarkup +export default MeasurementMarkup; diff --git a/src/annotations/markups/textEvaluation.js b/src/annotations/markups/textEvaluation.js index cbc97359..aa89e793 100644 --- a/src/annotations/markups/textEvaluation.js +++ b/src/annotations/markups/textEvaluation.js @@ -4,6 +4,7 @@ import Style from 'ol/style/Style' import Circle from 'ol/style/Circle' import Enums from '../../enums' +import annotationInterface from '../annotationInterface' /** * Format free text output. @@ -67,15 +68,17 @@ const _hasMarker = (feature) => !!feature.get(Enums.InternalProperties.Marker) * @returns {void} */ const _onInteractionEventHandler = ({ feature, markupManager }) => { - const featureHasMarker = _hasMarker(feature) + const featureHasMarker = _hasMarker(feature); + const ps = feature.get(Enums.InternalProperties.PresentationState); markupManager.create({ feature, value: format(feature), isLinkable: featureHasMarker, - isDraggable: featureHasMarker - }) - _applyStyle(feature) -} + isDraggable: featureHasMarker, + position: ps && ps.markup ? ps.markup.coordinates : null, + }); + _applyStyle(feature); +}; /** * Text evaluation markup definition. @@ -84,7 +87,7 @@ const _onInteractionEventHandler = ({ feature, markupManager }) => { * @param {object} dependencies.markupManager MarkupManager shared instance */ const TextEvaluationMarkup = ({ markupManager }) => { - return { + return Object.assign({}, annotationInterface, { onAdd: (feature) => { if (_isTextEvaluation(feature)) { _onInteractionEventHandler({ feature, markupManager }) @@ -126,8 +129,7 @@ const TextEvaluationMarkup = ({ markupManager }) => { _onInteractionEventHandler({ feature, markupManager }) } }, - onDrawAbort: ({ feature }) => {} - } + }) } export default TextEvaluationMarkup diff --git a/src/channel.js b/src/channel.js index 1c26b6e9..cfb2c2b7 100644 --- a/src/channel.js +++ b/src/channel.js @@ -241,7 +241,6 @@ class _Channel { const sopInstanceUID = DICOMwebClient.utils.getSOPInstanceUIDFromUri(src) const frameNumbers = DICOMwebClient.utils.getFrameNumbersFromUri(src) - console.info(`retrieve frames ${frameNumbers}`) tile.needToRerender = false tile.isLoading = true @@ -302,7 +301,8 @@ class _Channel { } ) } else { - const jlsMediaType = 'image/jls' // decoded with CharLS + const jpegMediaType = 'image/jpeg' // decoded with libJPEG-turbo + const jpegTransferSyntaxUID = '1.2.840.10008.1.2.4.50' const jlsTransferSyntaxUIDlossless = '1.2.840.10008.1.2.4.80' const jlsTransferSyntaxUID = '1.2.840.10008.1.2.4.81' const jp2MediaType = 'image/jp2' // decoded with OpenJPEG @@ -311,9 +311,7 @@ class _Channel { const jpxMediaType = 'image/jpx' // decoded with OpenJPEG const jpxTransferSyntaxUIDlossless = '1.2.840.10008.1.2.4.92' const jpxTransferSyntaxUID = '1.2.840.10008.1.2.4.93' - const jpegMediaType = 'image/jpeg' // decoded with libJPEG-turbo - const jpegTransferSyntaxUID = '1.2.840.10008.1.2.4.50' - + const octetStreamMediaType = 'application/octet-stream' const octetStreamTransferSyntaxUID = '1.2.840.10008.1.2.1' @@ -323,6 +321,10 @@ class _Channel { sopInstanceUID, frameNumbers, mediaTypes: [ + { + mediaType: jpegMediaType, + transferSyntaxUID: jpegTransferSyntaxUID + }, { mediaType: jlsMediaType, transferSyntaxUID: jlsTransferSyntaxUIDlossless @@ -347,10 +349,6 @@ class _Channel { mediaType: jpxMediaType, transferSyntaxUID: jpxTransferSyntaxUID }, - { - mediaType: jpegMediaType, - transferSyntaxUID: jpegTransferSyntaxUID - } ] } @@ -490,9 +488,10 @@ class _Channel { image.FrameOfReferenceUID = image.metadata[0].FrameOfReferenceUID for (let i = 0; i < image.metadata.length; ++i) { if (image.FrameOfReferenceUID !== image.metadata[i].FrameOfReferenceUID) { - throw new Error('Optioncal Path ID ' + - image.blendingInformation.opticalPathIdentifier + - ' has volume microscopy images with different FrameOfReferenceUID') + const msg = `Optical Path ID ${image.opticalPathIdentifier} ` + + ` has volume microscopy images with FrameOfReferenceUID=${image.metadata[i].FrameOfReferenceUID}!=${image.FrameOfReferenceUID}`; + console.warn(msg); + // throw new Error(msg); } } diff --git a/src/enums.js b/src/enums.js index 55709f08..14818e08 100644 --- a/src/enums.js +++ b/src/enums.js @@ -1,49 +1,75 @@ export const InternalProperties = { - StyleOptions: 'styleOptions', - Markup: 'markup', - Marker: 'marker', - Label: 'label', - Measurements: 'measurements', - Evaluations: 'evaluations' -} + StyleOptions: "styleOptions", + Markup: "markup", + Marker: "marker", + Label: "label", + Measurements: "measurements", + Evaluations: "evaluations", + PresentationState: "presentationState", + Bidirectional: "bidirectional", + Ellipse: "isEllipse", + ReadOnly: "isReadOnly", + IsSilentFeature: "isSilent", + CantBeTranslated: "cantBeTranslated", + VertexEnabled: "vertexEnabled" +}; + +export const Bidirectional = { + IsShortAxis: "isShortAxis", + IsLongAxis: "isLongAxis", +}; export const Marker = { - Arrow: 'arrow' -} + Arrow: "arrow", +}; export const Markup = { - Measurement: 'measurement', - TextEvaluation: 'text' -} + Measurement: "measurement", + TextEvaluation: "text", +}; + +export const GeometryType = { + Line: "line", + Circle: "circle", + Ellipse: "ellipse", +}; export const FeatureEvents = { - PROPERTY_CHANGE: 'propertychange' -} + PROPERTY_CHANGE: "propertychange", +}; export const MapEvents = { - POINTER_MOVE: 'pointermove', - POINTER_UP: 'pointerup' -} + POINTER_MOVE: "pointermove", + POINTER_UP: "pointerup", + POINTER_DOWN: "pointerdown", + POINTER_DRAG: "pointerdrag", + MOVE_START: "movestart", + MOVE_END: "moveend" +}; export const HTMLElementEvents = { - MOUSE_DOWN: 'mousedown' -} + MOUSE_DOWN: "mousedown", + MOUSE_UP: "mouseup", + MOUSE_MOVE: "mousemove", +}; export const InteractionEvents = { - DRAW_START: 'drawstart', - DRAW_END: 'drawend', - DRAW_ABORT: 'drawabort', - TRANSLATE_START: 'translatestart', - MODIFY_START: 'modifystart' -} + DRAW_START: "drawstart", + DRAW_END: "drawend", + DRAW_ABORT: "drawabort", + TRANSLATE_START: "translatestart", + MODIFY_START: "modifystart", + MODIFY_END: "modifyend", + TRANSLATING: "translating", +}; export const FeatureGeometryEvents = { - CHANGE: 'change' -} + CHANGE: "change", +}; export const RelationshipTypes = { - HAS_OBS_CONTEXT: 'HAS OBS CONTEXT' -} + HAS_OBS_CONTEXT: "HAS OBS CONTEXT", +}; export default { Marker, @@ -54,5 +80,7 @@ export default { InteractionEvents, HTMLElementEvents, InternalProperties, - MapEvents -} + MapEvents, + GeometryType, + Bidirectional +}; diff --git a/src/metadata.js b/src/metadata.js index a3a88044..ae9e76ca 100644 --- a/src/metadata.js +++ b/src/metadata.js @@ -37,14 +37,14 @@ function getFrameMapping (metadata) { } else { const functionalGroups = metadata.PerFrameFunctionalGroupsSequence for (let j = 0; j < numberOfFrames; j++) { - const planePositions = functionalGroups[j].PlanePositionSlideSequence[0] - const rowPosition = planePositions.RowPositionInTotalImagePixelMatrix - const columnPosition = planePositions.ColumnPositionInTotalImagePixelMatrix - const rowIndex = Math.ceil(rowPosition / rows) - const colIndex = Math.ceil(columnPosition / columns) - const index = rowIndex + '-' + colIndex - const frameNumber = j + 1 - frameMapping[index] = `${sopInstanceUID}/frames/${frameNumber}` + const planePositions = functionalGroups[j].PlanePositionSlideSequence[0]; + const rowPosition = planePositions.RowPositionInTotalImagePixelMatrix; + const columnPosition = planePositions.ColumnPositionInTotalImagePixelMatrix; + const rowIndex = Math.ceil(rowPosition / rows); + const colIndex = Math.ceil(columnPosition / columns); + const index = rowIndex + '-' + colIndex; + const frameNumber = j + 1; + frameMapping[index] = `${sopInstanceUID}/frames/${frameNumber}`; } } return frameMapping @@ -136,7 +136,7 @@ function groupMonochromeInstances (metadata) { const pathIdentifier = microscopyImage.OpticalPathSequence[0].OpticalPathIdentifier const channel = channels.find(channel => { return channel[0].OpticalPathSequence[0].OpticalPathIdentifier === pathIdentifier - }) + }); if (channel) { channel.push(microscopyImage) @@ -176,17 +176,13 @@ function groupColorInstances (metadata) { microscopyImage.PhotometricInterpretation.includes('YBR') ) ) { - const opticalPathIdentifier = ( - microscopyImage - .OpticalPathSequence[0] - .OpticalPathIdentifier - ) + if( ! microscopyImage.OpticalPathSequence ) { + console.log('Microscopy slide missing optical path identifier'); + microscopyImage.OpticalPathSequence = [{OpticalPathIdentifier:'1'}]; + } + const opticalPathIdentifier = microscopyImage.OpticalPathSequence[0].OpticalPathIdentifier; const colorImage = colorImages.find(images => { - const currentOpticalPathIdentifier = ( - images[0] - .OpticalPathSequence[0] - .OpticalPathIdentifier - ) + const currentOpticalPathIdentifier = images[0].OpticalPathSequence[0].OpticalPathIdentifier; return currentOpticalPathIdentifier === opticalPathIdentifier }) diff --git a/src/renderingEngine.js b/src/renderingEngine.js index 7b4adbd2..c3235306 100644 --- a/src/renderingEngine.js +++ b/src/renderingEngine.js @@ -245,8 +245,8 @@ class RenderingEngine { color, opacity, columns, - rows - } = frameData + rows, + } = frameData; const signed = pixelRepresentation === 1 if (frames) { @@ -463,7 +463,13 @@ class RenderingEngine { const mediaType = imageTypeObject.mime let pixelData let decodedframeInfo - if (mediaType === 'image/jpeg') { + if (mediaType === 'image/png' || mediaType==='image/jpeg') { + return { + pixelData: undefined, + decodedframeInfo: undefined, + mediaType + } + } else if (mediaType === 'image/jpeg') { if (!jpegDecoder) { throw new Error( 'jpegDecoder was not initialized.' @@ -493,12 +499,6 @@ class RenderingEngine { const { decodedPixelData, frameInfo } = this._decodeInternal(jlsDecoder, fullEncodedBitStream) pixelData = decodedPixelData.slice(0) decodedframeInfo = frameInfo - } else if (mediaType === 'image/png') { - return { - pixelData: undefined, - decodedframeInfo: undefined, - mediaType - } } else { throw new Error( 'The media type ' + mediaType + ' is not supported by the offscreen render.' diff --git a/src/scoord3dUtils.js b/src/scoord3dUtils.js index 1afa7c8c..b61ba9a2 100644 --- a/src/scoord3dUtils.js +++ b/src/scoord3dUtils.js @@ -4,7 +4,6 @@ import { default as Circle, default as CircleGeometry } from 'ol/geom/Circle'// import { default as PolygonGeometry, fromCircle } from 'ol/geom/Polygon'// eslint-disable-line import { default as PointGeometry } from 'ol/geom/Point'// eslint-disable-line import { default as LineStringGeometry } from 'ol/geom/LineString'// eslint-disable-line - import { applyInverseTransform, applyTransform, @@ -196,17 +195,23 @@ function coordinateFormatScoord3d2Geometry (coordinates, pyramid) { * * @param {object} feature feature * @param {number} offset offset + * @param {object} map map * @returns {array} coordinates with offset * @private */ -function coordinateWithOffset (feature, offset = 70) { +function coordinateWithOffset (feature, offset, map) { const geometry = feature.getGeometry() const coordinates = geometry.getLastCoordinate() const [x, y] = coordinates + + const view = map.getView() + const resolution = view.getResolution() + const realOffset = offset * resolution + return !feature.get(Enums.InternalProperties.Marker) && feature.get(Enums.InternalProperties.Markup) === Enums.Markup.TextEvaluation ? coordinates - : [x - offset, y - offset] + : [x - realOffset, y - realOffset] } /** @@ -232,8 +237,9 @@ function getFeatureArea (feature) { * @private */ function getPixelSpacing (metadata) { - const functionalGroup = metadata.SharedFunctionalGroupsSequence[0] - const pixelMeasures = functionalGroup.PixelMeasuresSequence[0] + if(!metadata.SharedFunctionalGroupsSequence ) return metadata.PixelSpacing; + const functionalGroup = metadata.SharedFunctionalGroupsSequence[0]; + const pixelMeasures = functionalGroup.PixelMeasuresSequence[0]; return pixelMeasures.PixelSpacing } @@ -279,7 +285,7 @@ function coordinateFormatGeometry2Scoord3d (coordinates, pyramid) { spacing }) coordinates = coordinates.map((c) => { - const pixelCoord = [c[0], -(c[1] + 1)] + const pixelCoord = [c[0], (c[1] + 1)] const slideCoord = applyTransform({ coordinate: pixelCoord, affine }) return [slideCoord[0], slideCoord[1], 0] }) @@ -299,7 +305,7 @@ function coordinateFormatGeometry2Scoord3d (coordinates, pyramid) { */ function geometryCoordinates2scoord3dCoordinates (coordinates, pyramid) { return coordinateFormatGeometry2Scoord3d( - [coordinates[0], coordinates[1], coordinates[2]], + [coordinates[0], coordinates[1], coordinates[2] || 0], pyramid ) } diff --git a/src/utils.js b/src/utils.js index a1632063..e0946710 100644 --- a/src/utils.js +++ b/src/utils.js @@ -118,7 +118,7 @@ function buildTransform (options) { const offset = options.offset const spacing = options.spacing return [ - [orientation[0] * spacing[1], orientation[3] * spacing[0], offset[0]], + [-orientation[0] * spacing[1], -orientation[3] * spacing[0], offset[0]], [orientation[1] * spacing[1], orientation[4] * spacing[0], offset[1]], [0, 0, 1] ] diff --git a/src/viewer.js b/src/viewer.js index 3c93be5a..d71ed549 100644 --- a/src/viewer.js +++ b/src/viewer.js @@ -41,7 +41,7 @@ import dcmjs from 'dcmjs' import { VLWholeSlideMicroscopyImage, groupMonochromeInstances, - groupColorInstances + groupColorInstances, } from './metadata.js' import { ROI } from './roi.js' import { @@ -66,7 +66,7 @@ import { RenderingEngine } from './renderingEngine.js' import Enums from './enums' import _AnnotationManager from './annotations/_AnnotationManager' -function _getInteractionBindingCondition (bindings) { +function _getInteractionBindingCondition (bindings, condition = () => true) { const BUTTONS = { left: 1, middle: 4, @@ -125,7 +125,7 @@ function _getInteractionBindingCondition (bindings) { } return (event) => { - return _mouseButtonCondition(event) && _modifierKeyCondition(event) + return _mouseButtonCondition(event) && _modifierKeyCondition(event) && condition(event) } } @@ -262,8 +262,14 @@ function _getOpenLayersStyle (styleOptions) { * @param {object} properties.marker - ROI marker (this is used while we don't have presentation states) * @param {boolean} optSilent - Opt silent update */ -function _addROIPropertiesToFeature (feature, properties, optSilent) { - const { Label, Measurements, Evaluations, Marker } = Enums.InternalProperties +function _addROIPropertiesToFeature(feature, properties, optSilent) { + const { + Label, + Measurements, + Evaluations, + Marker, + PresentationState, + } = Enums.InternalProperties; if (properties[Label]) { feature.set(Label, properties[Label], optSilent) @@ -280,28 +286,33 @@ function _addROIPropertiesToFeature (feature, properties, optSilent) { if (properties[Marker]) { feature.set(Marker, properties[Marker], optSilent) } + + if (properties[PresentationState]) { + feature.set(PresentationState, properties[PresentationState], optSilent); + } } /** * Wire measurements and qualitative events to generate content items * based on feature properties and geometry changes * - * @param {object} map - The map instance * @param {object} feature - The feature instance - * @param {object} pyramid - The pyramid metadata + * @param {object} viewerProperties - The viewer properties + * @param {object} viewerProperties.map - The map + * @param {object} viewerProperties.drawingSource - The drawing source + * @param {object} viewerProperties.pyramid - The pyramid metadata * @returns {void} */ function _wireMeasurementsAndQualitativeEvaluationsEvents ( - map, feature, - pyramid + viewerProperties ) { /** * Update feature measurement properties first and then measurements */ - _updateFeatureMeasurements(map, feature, pyramid) + _updateFeatureMeasurements(feature, viewerProperties) feature.getGeometry().on(Enums.FeatureGeometryEvents.CHANGE, () => { - _updateFeatureMeasurements(map, feature, pyramid) + _updateFeatureMeasurements(feature, viewerProperties) }) /** @@ -320,10 +331,15 @@ function _wireMeasurementsAndQualitativeEvaluationsEvents ( * @returns {void} */ function _updateFeatureEvaluations (feature) { - const evaluations = feature.get(Enums.InternalProperties.Evaluations) || [] - const label = feature.get(Enums.InternalProperties.Label) + const { + [Enums.InternalProperties.Evaluations]: featureEvaluations, + [Enums.InternalProperties.Label]: featureLabel, + } = feature.getProperties(); - if (!label) return + const evaluations = featureEvaluations || []; + const label = featureLabel; + + if (!label) return; const evaluation = new dcmjs.sr.valueTypes.TextContentItem({ name: new dcmjs.sr.coding.CodedConcept({ @@ -352,19 +368,21 @@ function _updateFeatureEvaluations (feature) { /** * Generate feature measurements from its measurement properties * - * @param {object} map - The map instance * @param {object} feature - The feature instance - * @param {object} pyramid - The pyramid metadata + * @param {object} viewerProperties - The viewer properties + * @param {object} viewerProperties.map - The map + * @param {object} viewerProperties.drawingSource - The drawing source + * @param {object} viewerProperties.pyramid - The pyramid metadata * @returns {void} */ -function _updateFeatureMeasurements (map, feature, pyramid) { - if ( - Enums.Markup.Measurement !== feature.get(Enums.InternalProperties.Markup) - ) { - return +function _updateFeatureMeasurements (feature, viewerProperties) { + const { map, pyramid, annotationManager } = viewerProperties; + const featureMarkup = feature.get(Enums.InternalProperties.Markup); + + if (Enums.Markup.Measurement !== featureMarkup) { + return; } - const measurements = feature.get(Enums.InternalProperties.Measurements) || [] const area = getFeatureScoord3dArea(feature, pyramid) const length = getFeatureScoord3dLength(feature, pyramid) @@ -379,14 +397,21 @@ function _updateFeatureMeasurements (map, feature, pyramid) { km: 'kilometers' } - let measurement const view = map.getView() const unitSuffix = getUnitSuffix(view) const unitCodedConceptValue = unitSuffix const unitCodedConceptMeaning = unitSuffixToMeaningMap[unitSuffix] + const measurements = annotationManager.getMeasurements(feature); + if (measurements && measurements.length > 0) { + measurements.forEach(measurement => { + addOrUpdateMeasurement(feature, measurement); + }); + return; + } + if (area != null) { - measurement = new dcmjs.sr.valueTypes.NumContentItem({ + const measurement = new dcmjs.sr.valueTypes.NumContentItem({ name: new dcmjs.sr.coding.CodedConcept({ meaning: 'Area', value: '42798000', @@ -401,10 +426,12 @@ function _updateFeatureMeasurements (map, feature, pyramid) { }) ] }) + addOrUpdateMeasurement(feature, measurement); + return; } if (length != null) { - measurement = new dcmjs.sr.valueTypes.NumContentItem({ + const measurement = new dcmjs.sr.valueTypes.NumContentItem({ name: new dcmjs.sr.coding.CodedConcept({ meaning: 'Length', value: '410668003', @@ -419,9 +446,16 @@ function _updateFeatureMeasurements (map, feature, pyramid) { }) ] }) + addOrUpdateMeasurement(feature, measurement); + return; } +} +const addOrUpdateMeasurement = (feature, measurement) => { if (measurement) { + const featureMeasurements = feature.get(Enums.InternalProperties.Measurements); + const measurements = featureMeasurements || [] + const index = measurements.findIndex((m) => ( doContentItemsMatch(m, measurement) )) @@ -435,32 +469,7 @@ function _updateFeatureMeasurements (map, feature, pyramid) { feature.set(Enums.InternalProperties.Measurements, measurements) console.debug(`Measurements of feature (${feature.getId()}):`, measurements) } -} - -/** - * Updates the style of a feature. - * - * @param {object} styleOptions - Style options - * @param {object} styleOptions.stroke - Style options for the outline of the geometry - * @param {number[]} styleOptions.stroke.color - RGBA color of the outline - * @param {number} styleOptions.stroke.width - Width of the outline - * @param {object} styleOptions.fill - Style options for body the geometry - * @param {number[]} styleOptions.fill.color - RGBA color of the body - * @param {object} styleOptions.image - Style options for image - */ -function _setFeatureStyle (feature, styleOptions) { - if (styleOptions !== undefined) { - const style = _getOpenLayersStyle(styleOptions) - feature.setStyle(style) - - /** - * styleOptions is used internally by internal styled components like markers. - * This allows them to take priority over styling since OpenLayers swaps the styles - * completely in case of a setStyle happens. - */ - feature.set(Enums.InternalProperties.StyleOptions, styleOptions) - } -} +}; const _options = Symbol('options') const _controls = Symbol('controls') @@ -553,8 +562,6 @@ class VolumeImageViewer { if (e.element.getId() === undefined) { e.element.setId(generateUID()) } - - this[_annotationManager].onAdd(e.element) }) this[_features].on('remove', (e) => { @@ -594,11 +601,7 @@ class VolumeImageViewer { if (channelImage.TotalPixelMatrixFocalPlanes !== 1) { continue } else { - const opticalPathIdentifier = ( - channelImage - .OpticalPathSequence[0] - .OpticalPathIdentifier - ) + const opticalPathIdentifier = channelImage.OpticalPathSequence[0].OpticalPathIdentifier; const channel = this[_channels].find(channel => { const currentOpticalPathIdentifier = ( channel @@ -674,11 +677,7 @@ class VolumeImageViewer { } this[_colorImage] = { - opticalPathIdentifier: ( - colorImageMicroscopyImages[0] - .OpticalPathSequence[0] - .OpticalPathIdentifier - ), + opticalPathIdentifier: colorImageMicroscopyImages[0].OpticalPathSequence[0].OpticalPathIdentifier, metadata: [] } @@ -930,7 +929,8 @@ class VolumeImageViewer { this[_annotationManager] = new _AnnotationManager({ map: this[_map], pyramid: this[_pyramidMetadata], - drawingSource: this[_drawingSource] + drawingSource: this[_drawingSource], + features: this[_features] }) // This updates the tiles offscreen rendering when zoom is applied to the view. @@ -951,18 +951,18 @@ class VolumeImageViewer { } // This updates the tiles offscreen rendering when panning the view. - this[_map].on('pointermove', evt => { + this[_map].on(Enums.MapEvents.POINTER_MOVE, evt => { if (evt.dragging) { this._updateTilesRenderingAtPanning() } }) let startMoveZoom = 0 - this[_map].on('movestart', evt => { + this[_map].on(Enums.MapEvents.MOVE_START, evt => { startMoveZoom = Math.round(evt.frameState.viewState.zoom) }) - this[_map].on('moveend', evt => { + this[_map].on(Enums.MapEvents.MOVE_END, evt => { const endMoveZoom = Math.round(evt.frameState.viewState.zoom) if (endMoveZoom === startMoveZoom) { this._updateTilesRenderingAtPanning() @@ -1047,9 +1047,9 @@ class VolumeImageViewer { let url = this[_options].client.wadoURL + '/studies/' + this[_colorImage].pyramidMetadata[z].StudyInstanceUID + '/series/' + this[_colorImage].pyramidMetadata[z].SeriesInstanceUID + - '/instances/' + path - if (this[_options].retrieveRendered) { - url = url + '/rendered' + '/instances/' + path; + if ( this[_options].retrieveRendered) { + url = url + '/rendered'; } return url } @@ -1107,6 +1107,8 @@ class VolumeImageViewer { } else { // allowed mediaTypes: http://dicom.nema.org/medical/dicom/current/output/chtml/part18/sect_8.7.4.html // we use in order: jls, jp2, jpx, jpeg. Finally octet-stream if the first retrieve will fail. + const jpegMediaType = 'image/jpeg' + const jpegTransferSyntaxUID = '1.2.840.10008.1.2.4.50' const jlsMediaType = 'image/jls' const jlsTransferSyntaxUIDlossless = '1.2.840.10008.1.2.4.80' const jlsTransferSyntaxUID = '1.2.840.10008.1.2.4.81' @@ -1116,9 +1118,7 @@ class VolumeImageViewer { const jpxMediaType = 'image/jpx' const jpxTransferSyntaxUIDlossless = '1.2.840.10008.1.2.4.92' const jpxTransferSyntaxUID = '1.2.840.10008.1.2.4.93' - const jpegMediaType = 'image/jpeg' - const jpegTransferSyntaxUID = '1.2.840.10008.1.2.4.50' - + const octetStreamMediaType = 'application/octet-stream' const octetStreamTransferSyntaxUID = '1.2.840.10008.1.2.1' @@ -1128,13 +1128,13 @@ class VolumeImageViewer { sopInstanceUID, frameNumbers, mediaTypes: [ + { mediaType: jpegMediaType, transferSyntaxUID: jpegTransferSyntaxUID }, { mediaType: jlsMediaType, transferSyntaxUID: jlsTransferSyntaxUIDlossless }, { mediaType: jlsMediaType, transferSyntaxUID: jlsTransferSyntaxUID }, { mediaType: jp2MediaType, transferSyntaxUID: jp2TransferSyntaxUIDlossless }, { mediaType: jp2MediaType, transferSyntaxUID: jp2TransferSyntaxUID }, { mediaType: jpxMediaType, transferSyntaxUID: jpxTransferSyntaxUIDlossless }, { mediaType: jpxMediaType, transferSyntaxUID: jpxTransferSyntaxUID }, - { mediaType: jpegMediaType, transferSyntaxUID: jpegTransferSyntaxUID } ] } this[_options].client.retrieveInstanceFrames(retrieveOptions).then( @@ -1477,16 +1477,50 @@ class VolumeImageViewer { const container = this[_map].getTargetElement() this[_drawingSource].on(VectorEventType.ADDFEATURE, (e) => { + let feature = e.feature; + + /** + * Example: Silent until all features from a single annotation are done. + */ + const isSilentFeature = e.feature.get(Enums.InternalProperties.IsSilentFeature) + if (isSilentFeature == true) { + return; + } + + /** + * Some features are a composite of other features. + * This function gets the one (normalized) that will map into scoord coordinates. + */ + const normalizedFeature = this[_annotationManager].getNormalizedFeature(feature); + if (normalizedFeature) { + feature = normalizedFeature; + } + + /** Dont normalize when is annotation hook */ + this[_annotationManager].onAdd(e.feature) + + console.debug('ROI ADDED', feature); publish( container, EVENT.ROI_ADDED, - this._getROIFromFeature(e.feature, this[_pyramidMetadata]) + this._getROIFromFeature(feature, this[_pyramidMetadata]) ) }) this[_drawingSource].on(VectorEventType.CHANGEFEATURE, (e) => { - if (e.feature !== undefined || e.feature !== null) { - const geometry = e.feature.getGeometry() + let feature = e.feature; + + /** + * Some features are a composite of other features. + * This function gets the one (normalized) that will map into scoord coordinates. + */ + const normalizedFeature = this[_annotationManager].getNormalizedFeature(feature); + if (normalizedFeature) { + feature = normalizedFeature; + } + + if (feature !== undefined || feature !== null) { + const geometry = feature.getGeometry() const type = geometry.getType() // The first and last point of a polygon must be identical. The last point // is an implementation detail and is hidden from the user in the graphical @@ -1507,14 +1541,15 @@ class VolumeImageViewer { ) { coordinates[0][coordinates[0].length - 1] = firstPoint geometry.setCoordinates(coordinates, layout) - e.feature.setGeometry(geometry) + feature.setGeometry(geometry) } } } + publish( container, EVENT.ROI_MODIFIED, - this._getROIFromFeature(e.feature, this[_pyramidMetadata]) + this._getROIFromFeature(feature, this[_pyramidMetadata]) ) }) @@ -1527,6 +1562,32 @@ class VolumeImageViewer { }) } + /** + * Updates the style of a feature. + * + * @param {Feature} feature - Feature + * @param {object} styleOptions - Style options + * @param {object} styleOptions.stroke - Style options for the outline of the geometry + * @param {number[]} styleOptions.stroke.color - RGBA color of the outline + * @param {number} styleOptions.stroke.width - Width of the outline + * @param {object} styleOptions.fill - Style options for body the geometry + * @param {number[]} styleOptions.fill.color - RGBA color of the body + * @param {object} styleOptions.image - Style options for image + */ + setFeatureStyle (feature, styleOptions, optSilent = false) { + if (styleOptions !== undefined) { + const style = _getOpenLayersStyle(styleOptions); + feature.setStyle(style) + /** + * styleOptions is used internally by internal styled components like markers. + * This allows them to take priority over styling since OpenLayers swaps the styles + * completely in case of a setStyle happens. + */ + feature.set(Enums.InternalProperties.StyleOptions, styleOptions, optSilent) + this[_annotationManager].onSetFeatureStyle(feature, styleOptions); + } + } + /** Activates the draw interaction for graphic annotation of regions of interest. * @param {object} options - Drawing options * @param {string} options.geometryType - Name of the geometry type (point, circle, box, polygon, freehandPolygon, line, freehandLine) @@ -1556,6 +1617,14 @@ class VolumeImageViewer { type: 'Circle', geometryName: 'Circle' }, + ellipse: { + type: 'LineString', + geometryName: 'line', + isEllipse: true, + maxPoints: 1, + minPoints: 1, + [Enums.InternalProperties.VertexEnabled]: false + }, box: { type: 'Circle', geometryName: 'Box', @@ -1596,11 +1665,13 @@ class VolumeImageViewer { const internalDrawOptions = { source: this[_drawingSource] } const geometryDrawOptions = geometryOptionsMapping[options.geometryType] const builtInDrawOptions = { + [Enums.InternalProperties.Ellipse]: + geometryDrawOptions[Enums.InternalProperties.Ellipse], [Enums.InternalProperties.Marker]: options[Enums.InternalProperties.Marker], [Enums.InternalProperties.Markup]: options[Enums.InternalProperties.Markup], - vertexEnabled: options.vertexEnabled, + [Enums.InternalProperties.VertexEnabled]: options[Enums.InternalProperties.VertexEnabled], [Enums.InternalProperties.Label]: options[Enums.InternalProperties.Label] } const drawOptions = Object.assign( @@ -1620,7 +1691,7 @@ class VolumeImageViewer { * }, */ if (options.bindings) { - drawOptions.condition = _getInteractionBindingCondition(options.bindings) + drawOptions.condition = _getInteractionBindingCondition(options.bindings, drawOptions.condition) } this[_interactions].draw = new Draw(drawOptions) @@ -1631,17 +1702,21 @@ class VolumeImageViewer { event.feature.setId(generateUID()) /** Set external styles before calling internal annotation hooks */ - _setFeatureStyle( + this.setFeatureStyle( event.feature, options[Enums.InternalProperties.StyleOptions] ) - this[_annotationManager].onDrawStart(event) + this[_annotationManager].onDrawStart(event, options) _wireMeasurementsAndQualitativeEvaluationsEvents( - this[_map], event.feature, - this[_pyramidMetadata] + { + map: this[_map], + drawingSource: this[_drawingSource], + pyramid: this[_pyramidMetadata], + annotationManager: this[_annotationManager] + } ) }) @@ -1650,7 +1725,8 @@ class VolumeImageViewer { }) this[_interactions].draw.on(Enums.InteractionEvents.DRAW_END, (event) => { - this[_annotationManager].onDrawEnd(event) + this[_annotationManager].onDrawEnd(event, options) + publish( container, EVENT.ROI_DRAWN, @@ -1709,8 +1785,22 @@ class VolumeImageViewer { return this[_interactions].translate !== undefined } + /** + * Deactivates translate interaction. + * + * @returns {void} + */ + deactivateTranslateInteraction() { + console.info('deactivate "translate" interaction'); + if (this[_interactions].translate) { + this[_map].removeInteraction(this[_interactions].translate); + this[_interactions].translate = undefined; + } + } + /** - * Activates translate interaction. + * Activates select interaction. + * * * @param {Object} options - Translation options. */ @@ -1719,7 +1809,16 @@ class VolumeImageViewer { console.info('activate "translate" interaction') - const translateOptions = { layers: [this[_drawingLayer]] } + const translateOptions = { + layers: [this[_drawingLayer]], + filter: feature => { + return feature && feature.get(Enums.InternalProperties.CantBeTranslated) !== true + }, + condition: event => { + const feature = this[_drawingSource].getClosestFeatureToCoordinate(event.coordinate); + return feature && feature.get(Enums.InternalProperties.CantBeTranslated) !== true + }, + } /** * Get conditional mouse bindings @@ -1727,12 +1826,39 @@ class VolumeImageViewer { */ if (options.bindings) { translateOptions.condition = _getInteractionBindingCondition( - options.bindings + options.bindings, + options.condition ) } this[_interactions].translate = new Translate(translateOptions) + /** + * This allows feature with sub features to be translated together. + */ + let lastCoordinate = null; + map.on(Enums.MapEvents.POINTER_DOWN, ({ coordinate }) => lastCoordinate = coordinate); + map.on(Enums.MapEvents.POINTER_UP, () => lastCoordinate = null); + this[_interactions].translate.on(Enums.InteractionEvents.TRANSLATING, event => { + const newCoordinate = event.coordinate; + event.features.forEach(feature => { + const { subFeatures } = feature.getProperties(); + if (subFeatures && subFeatures.length > 0) { + subFeatures.forEach(subFeature => { + const geometry = subFeature.getGeometry(); + const coords = lastCoordinate; + + const deltaX = newCoordinate[0] - coords[0]; + const deltaY = newCoordinate[1] - coords[1]; + + geometry.translate(deltaX, deltaY); + + lastCoordinate = event.coordinate; + }); + } + }); + }); + this[_map].addInteraction(this[_interactions].translate) } @@ -1848,7 +1974,16 @@ class VolumeImageViewer { console.info('activate "select" interaction') - const selectOptions = { layers: [this[_drawingLayer]] } + const selectOptions = { + layers: [this[_drawingLayer]], + filter: feature => { + return feature && feature.get(Enums.InternalProperties.ReadOnly) !== true + }, + condition: event => { + const feature = this[_drawingSource].getClosestFeatureToCoordinate(event.coordinate); + return feature && feature.get(Enums.InternalProperties.ReadOnly) !== true + }, + } /** * Get conditional mouse bindings @@ -1856,7 +1991,8 @@ class VolumeImageViewer { */ if (options.bindings) { selectOptions.condition = _getInteractionBindingCondition( - options.bindings + options.bindings, + selectOptions.condition ) } @@ -1899,7 +2035,11 @@ class VolumeImageViewer { console.info('activate "drag pan" interaction') const dragPanOptions = { - features: this[_features] + features: this[_features], + condition: event => { + const feature = this[_drawingSource].getClosestFeatureToCoordinate(event.coordinate); + return feature && feature.get(Enums.InternalProperties.ReadOnly) !== true + }, } /** @@ -1908,7 +2048,8 @@ class VolumeImageViewer { */ if (options.bindings) { dragPanOptions.condition = _getInteractionBindingCondition( - options.bindings + options.bindings, + options.condition ) } @@ -1939,7 +2080,7 @@ class VolumeImageViewer { this.deactivateSnapInteraction() console.info('activate "snap" interaction') this[_interactions].snap = new Snap({ - source: this[_drawingSource] + source: this[_drawingSource], }) this[_map].addInteraction(this[_interactions].snap) @@ -1978,8 +2119,16 @@ class VolumeImageViewer { const modifyOptions = { features: this[_features], // TODO: or source, i.e. 'drawings'??? + condition: event => { + const feature = this[_drawingSource].getClosestFeatureToCoordinate(event.coordinate); + return feature && feature.get(Enums.InternalProperties.ReadOnly) !== true + }, insertVertexCondition: ({ feature }) => - feature && feature.get('vertexEnabled') === true + feature && feature.get(Enums.InternalProperties.VertexEnabled) === true, + condition: event => { + const feature = this[_drawingSource].getClosestFeatureToCoordinate(event.coordinate); + return feature && feature.get(Enums.InternalProperties.ReadOnly) !== true + } } /** @@ -1988,7 +2137,8 @@ class VolumeImageViewer { */ if (options.bindings) { modifyOptions.condition = _getInteractionBindingCondition( - options.bindings + options.bindings, + modifyOptions.condition ) } @@ -2137,14 +2287,20 @@ class VolumeImageViewer { feature.setId(roi.uid) _wireMeasurementsAndQualitativeEvaluationsEvents( - this[_map], feature, - this[_pyramidMetadata] + { + map: this[_map], + drawingSource: this[_drawingSource], + pyramid: this[_pyramidMetadata], + annotationManager: this[_annotationManager] + } ) + /** Style should be set before adding to features array which is tracked elsewhere */ + this.setFeatureStyle(feature, styleOptions) + this[_features].push(feature) - _setFeatureStyle(feature, styleOptions) const isVisible = Object.keys(styleOptions).length !== 0 this[_annotationManager].setMarkupVisibility(roi.uid, isVisible) } @@ -2188,7 +2344,7 @@ class VolumeImageViewer { this[_features].forEach((feature) => { const id = feature.getId() if (id === uid) { - _setFeatureStyle(feature, styleOptions) + this.setFeatureStyle(feature, styleOptions) const isVisible = Object.keys(styleOptions).length !== 0 this[_annotationManager].setMarkupVisibility(id, isVisible) }